diff --git a/pkgs/ffigen/.github/dependabot.yml b/pkgs/ffigen/.github/dependabot.yml
new file mode 100644
index 0000000..1603cdd
--- /dev/null
+++ b/pkgs/ffigen/.github/dependabot.yml
@@ -0,0 +1,9 @@
+# Dependabot configuration file.
+# See https://docs.github.com/en/code-security/dependabot/dependabot-version-updates
+version: 2
+
+updates:
+  - package-ecosystem: "github-actions"
+    directory: "/"
+    schedule:
+      interval: "monthly"
diff --git a/pkgs/ffigen/.github/workflows/test-package.yml b/pkgs/ffigen/.github/workflows/test-package.yml
index 3c4d535..8bcf6e6 100644
--- a/pkgs/ffigen/.github/workflows/test-package.yml
+++ b/pkgs/ffigen/.github/workflows/test-package.yml
@@ -13,49 +13,105 @@
   PUB_ENVIRONMENT: bot.github
 
 jobs:
-  # Check code formatting and static analysis on a single OS (linux).
+  # Check code formatting and static analysis on a single OS (macos).
   analyze:
-    runs-on: ubuntu-latest
+    runs-on: macos-latest
     strategy:
       fail-fast: false
       matrix:
-        sdk: [2.14.0]
+        sdk: [stable]
     steps:
-      - uses: actions/checkout@v2
-      - uses: dart-lang/setup-dart@v1.0
+      - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3
+      - uses: dart-lang/setup-dart@d6a63dab3335f427404425de0fbfed4686d93c4f
         with:
           sdk: ${{ matrix.sdk }}
       - id: install
         name: Install dependencies
-        run: dart pub get
+        run: dart pub get && dart pub get --directory="example/shared_bindings"
       - name: Check formatting
         run: dart format --output=none --set-exit-if-changed .
         if: always() && steps.install.outcome == 'success'
+      - name: Build test dylib and bindings
+        run: dart test/setup.dart
       - name: Analyze code
         run: dart analyze --fatal-infos
         if: always() && steps.install.outcome == 'success'
 
-  test:
+  test-linux:
     needs: analyze
-    # This job requires clang-10 which is the default on 20.04
-    runs-on: ubuntu-20.04
+    runs-on: ubuntu-22.04
     steps:
-      - uses: actions/checkout@v2
-      - uses: dart-lang/setup-dart@v1.0
+      - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3
+      - uses: dart-lang/setup-dart@d6a63dab3335f427404425de0fbfed4686d93c4f
         with:
-          sdk: 2.14.0
+          sdk: stable
       - name: Install dependencies
         run: dart pub get
-      - name: Install libclang-10-dev
-        run: sudo apt-get install libclang-10-dev
-      - name: Build test dylib
-        run: cd test/native_test && dart build_test_dylib.dart && cd ../..
+      - name: Install libclang-14-dev
+        run: sudo apt-get install libclang-14-dev
+      - name: Build test dylib and bindings
+        run: dart test/setup.dart
       - name: Run VM tests
-        run: dart test --platform vm
+        run: dart test --platform vm --concurrency=1
+
+  test-mac:
+    needs: analyze
+    runs-on: macos-latest
+    steps:
+      - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3
+      - uses: dart-lang/setup-dart@d6a63dab3335f427404425de0fbfed4686d93c4f
+        with:
+          sdk: stable
+      - name: Install dependencies
+        run: dart pub get
+      - name: Build test dylib and bindings
+        run: dart test/setup.dart
+      - name: Run VM tests
+        run: dart test --platform vm --concurrency=1
       - name: Collect coverage
         run: ./tool/coverage.sh
       - name: Upload coverage
-        uses: coverallsapp/github-action@v1.1.2
+        uses: coverallsapp/github-action@67662d24394fd74bffcf7b462d1b432814159afd
         with:
           github-token: ${{ secrets.GITHUB_TOKEN }}
           path-to-lcov: lcov.info
+
+  test-windows:
+    needs: analyze
+    runs-on: windows-latest
+    steps:
+      - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3
+      - uses: dart-lang/setup-dart@d6a63dab3335f427404425de0fbfed4686d93c4f
+        with:
+          sdk: stable
+      - name: Install dependencies
+        run: dart pub get
+      - name: Build test dylib and bindings
+        run: dart test/setup.dart
+      - name: Run VM tests
+        run: dart test --platform vm --concurrency=1
+
+  # Sanity check the latest `flutter create --template plugin_ffi`.
+  # This will break if we change the Flutter template or the generated code.
+  # But, getting libclang on the LUCI infrastructure has proven to be
+  # non-trivial. See discussion on
+  # https://github.com/flutter/flutter/issues/105513.
+  # If we need to change the generated code, we should temporarily disable this
+  # test, or temporarily disable the requirement for all bots to be green to
+  # merge PRs.
+  # Running this sanity check on one OS should be sufficient. Chosing Windows
+  # because it is the most likely to break.
+  test-windows-flutter:
+    needs: analyze
+    runs-on: windows-latest
+    steps:
+      - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3
+      - uses: subosito/flutter-action@48cafc24713cca54bbe03cdc3a423187d413aafa
+        with:
+          channel: 'master'
+      - name: Install dependencies
+        run: flutter pub get
+      - name: Build test dylib and bindings
+        run: dart test/setup.dart
+      - name: Run VM tests
+        run: flutter pub run test test_flutter/ --platform vm
diff --git a/pkgs/ffigen/.gitignore b/pkgs/ffigen/.gitignore
index 96f7b01..d9616e8 100644
--- a/pkgs/ffigen/.gitignore
+++ b/pkgs/ffigen/.gitignore
@@ -37,3 +37,8 @@
 # Files generated by tests for debugging purposes.
 test/debug_generated/*
 !test/debug_generated/readme.md
+lcov.info
+coverage.json
+
+# Files generated by various OSs.
+.DS_Store
diff --git a/pkgs/ffigen/CHANGELOG.md b/pkgs/ffigen/CHANGELOG.md
index 73861a3..e996b1c 100644
--- a/pkgs/ffigen/CHANGELOG.md
+++ b/pkgs/ffigen/CHANGELOG.md
@@ -1,3 +1,108 @@
+# 7.2.10
+
+- Generate parameter names in function pointer fields and typedefs.
+
+# 7.2.9
+
+- Detect LLVM installed using Scoop on Windows machines.
+
+# 7.2.8
+
+- Automatically generate `ignore_for_file: type=lint` if not specified in preamble.
+
+# 7.2.7
+
+- Fix some macros not being generated in some cases due to relative header paths.
+
+# 7.2.6
+
+- Fix path normalization behaviour for absolute paths and globs starting with `**`.
+
+# 7.2.5
+
+- Add support nested anonymous union/struct
+
+# 7.2.4
+
+- Add new supported typedef - `uintptr_t` (mapped to `ffi.UintPtr`).
+
+# 7.2.3
+
+- Change compiler option order so that user options can override built-in
+  options.
+
+# 7.2.2
+
+- Added newer versions of LLVM, to default `linuxDylibLocations`.
+
+# 7.2.1
+
+- Fix helper methods sometimes missing from NSString.
+
+# 7.2.0
+
+- Added support for sharing bindings using `symbol-file` config. (See `README.md`
+and examples/shared_bindings).
+
+# 7.1.0
+
+- Handle declarations with definition accessible from a different entry-point.
+
+# 7.0.0
+
+- Fix typedef include/exclude config.
+- Return `ObjCBlock` wrapper instead of raw pointer in more cases.
+
+# 7.0.0-dev
+
+- Relative paths in ffigen config files are now assumed to be relative to the
+  config file, rather than the working directory of the tool invocation.
+
+# 6.1.2
+
+- Fix bug where function bindings were not deduped correctly.
+
+# 6.1.1
+
+- _EXPERIMENTAL_ support for `FfiNative`. The API and output
+  might change at any point.
+
+# 6.1.0
+
+- Added `exclude-all-by-default` config flag, which changes the default behavior
+  of declaration filters to exclude everything, rather than include everything.
+
+# 6.0.2
+
+- Bump `package:ffi` to 2.0.1.
+
+# 6.0.1
+
+- Replace path separators in `include-directives` before matching file names.
+- Add more ways to find `libclang`.
+
+# 6.0.0
+- Removed config `dart-bool`. Booleans are now always generated with `bool`
+and `ffi.Bool` as it's Dart and C Type respectively.
+
+# 5.0.1
+
+- Add a the xcode tools llvm as default path on MacOS.
+
+# 5.0.0
+
+- Stable release targeting Dart 2.17, supporting ABI-specific integer types.
+- _EXPERIMENTAL_ support for ObjectiveC on MacOS hosts. The API and output
+  might change at any point. Feel free to report bugs if encountered.
+
+# 5.0.0-dev.1
+- Fixed invalid default dart types being generated for `size_t` and `wchar_t`.
+
+# 5.0.0-dev.0
+- Added support for generating ABI Specific integers.
+- Breaking: removed config keys - `size-map` and `typedef-map`.
+- Added config keys - `library-imports` and `type-map`.
+
 # 4.1.3
 - Analyzer fixes.
 
diff --git a/pkgs/ffigen/CONTRIBUTING.md b/pkgs/ffigen/CONTRIBUTING.md
new file mode 100644
index 0000000..1ef4cd9
--- /dev/null
+++ b/pkgs/ffigen/CONTRIBUTING.md
@@ -0,0 +1,35 @@
+# How to Contribute
+
+We'd love to accept your patches and contributions to this project. There are
+just a few small guidelines you need to follow.
+
+## Contributor License Agreement
+
+Contributions to this project must be accompanied by a Contributor License
+Agreement. You (or your employer) retain the copyright to your contribution;
+this simply gives us permission to use and redistribute your contributions as
+part of the project. Head over to <https://cla.developers.google.com/> to see
+your current agreements on file or to sign a new one.
+
+You generally only need to submit a CLA once, so if you've already submitted one
+(even if it was for a different project), you probably don't need to do it
+again.
+
+## Code reviews
+
+All submissions, including submissions by project members, require review. We
+use GitHub pull requests for this purpose. Consult
+[GitHub Help](https://help.github.com/articles/about-pull-requests/) for more
+information on using pull requests.
+
+## Process
+
+Some of our branching and releasing process is described on the
+[wiki](https://github.com/dart-lang/ffigen/wiki). Please familiarize yourself
+with the info there.
+
+## Community Guidelines
+
+This project follows [Google's Open Source Community
+Guidelines](https://opensource.google/conduct/) and the [Dart code of
+conduct](https://dart.dev/code-of-conduct).
diff --git a/pkgs/ffigen/LICENSE b/pkgs/ffigen/LICENSE
index 467a982..c7e642d 100644
--- a/pkgs/ffigen/LICENSE
+++ b/pkgs/ffigen/LICENSE
@@ -25,3 +25,6 @@
 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Code generated by FFIgen is owned by the owner of the input file used
+when generating it.
diff --git a/pkgs/ffigen/README.md b/pkgs/ffigen/README.md
index a4439bb..c4f5a02 100644
--- a/pkgs/ffigen/README.md
+++ b/pkgs/ffigen/README.md
@@ -4,7 +4,16 @@
 
 Binding generator for [FFI](https://dart.dev/guides/libraries/c-interop) bindings.
 
-> Note: ffigen only supports parsing `C` headers.
+> Note: ffigen only supports parsing `C` headers, not `C++` headers.
+
+This bindings generator can be used to call C code -- or code in another
+language that compiles to C modules that follow the C calling convention --
+such as Go or Rust. For more details, see:
+https://dart.dev/guides/libraries/c-interop
+
+ffigen also has experimental support for calling ObjC and Swift code;
+for details see:
+https://dart.dev/guides/libraries/objective-c-interop
 
 ## Example
 
@@ -22,13 +31,14 @@
 ```
 Output (_generated_bindings.dart_).
 ```dart
+import 'dart:ffi' as ffi;
 class NativeLibrary {
-  final Pointer<T> Function<T extends NativeType>(String symbolName)
+  final ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
       _lookup;
-  NativeLibrary(DynamicLibrary dynamicLibrary)
+  NativeLibrary(ffi.DynamicLibrary dynamicLibrary)
       : _lookup = dynamicLibrary.lookup;
   NativeLibrary.fromLookup(
-      Pointer<T> Function<T extends NativeType>(String symbolName)
+      ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
           lookup)
       : _lookup = lookup;
 
@@ -36,12 +46,14 @@
     return _sum(a, b);
   }
 
-  late final _sumPtr = _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Int32, ffi.Int32)>>('sum');
-  late final _sum = _sum_ptr.asFunction<int Function(int, int)>();
+  late final _sumPtr = _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Int, ffi.Int)>>('sum');
+  late final _sum = _sumPtr.asFunction<int Function(int, int)>();
+}
 }
 ```
 ## Using this package
 - Add `ffigen` under `dev_dependencies` in your `pubspec.yaml` (run `dart pub add -d ffigen`).
+- Add `package:ffi` under `dependencies` in your `pubspec.yaml` (run `dart pub add ffi`).
 - Install LLVM (see [Installing LLVM](#installing-llvm)).
 - Configurations must be provided in `pubspec.yaml` or in a custom YAML file (see [configurations](#configurations)).
 - Run the tool- `dart run ffigen`.
@@ -90,6 +102,12 @@
 ```yaml
 output: 'generated_bindings.dart'
 ```
+or
+```yaml
+output:
+  bindings: 'generated_bindings.dart'
+  ... 
+```
   </td>
   </tr>
   <tr>
@@ -182,7 +200,10 @@
   </td>
   </tr>
   <tr>
-    <td>functions<br><br>structs<br><br>unions<br><br>enums<br><br>unnamed-enums<br><br>macros<br><br>globals</td>
+    <td>
+      functions<br><br>structs<br><br>unions<br><br>enums<br><br>
+      unnamed-enums<br><br>macros<br><br>globals
+    </td>
     <td>Filters for declarations.<br><b>Default: all are included.</b><br><br>
     Options -<br>
     - Include/Exclude declarations.<br>
@@ -385,7 +406,7 @@
   </tr>
   <tr>
     <td>use-supported-typedefs</td>
-    <td>Should automatically map typedefs, E.g uint8_t => Uint8, int16_t => Int16 etc.<br>
+    <td>Should automatically map typedefs, E.g uint8_t => Uint8, int16_t => Int16, size_t => Size etc.<br>
     <b>Default: true</b>
     </td>
     <td>
@@ -396,18 +417,6 @@
   </td>
   </tr>
   <tr>
-    <td>dart-bool</td>
-    <td>Should generate dart `bool` instead of Uint8 for c99 bool in functions.<br>
-    <b>Default: true</b>
-    </td>
-    <td>
-
-```yaml
-dart-bool: true
-```
-  </td>
-  </tr>
-  <tr>
     <td>use-dart-handle</td>
     <td>Should map `Dart_Handle` to `Handle`.<br>
     <b>Default: true</b>
@@ -420,6 +429,21 @@
   </td>
   </tr>
   <tr>
+    <td>exclude-all-by-default</td>
+    <td>
+      When a declaration filter (eg `functions:` or `structs:`) is empty or
+      unset, it defaults to including everything. If this flag is enabled, the
+      default behavior is to exclude everything instead.<br>
+      <b>Default: false</b>
+    </td>
+    <td>
+
+```yaml
+exclude-all-by-default: true
+```
+  </td>
+  </tr>
+  <tr>
     <td>preamble</td>
     <td>Raw header of the file, pasted as-it-is.</td>
     <td>
@@ -431,63 +455,204 @@
 </td>
   </tr>
   <tr>
-    <td>typedef-map</td>
-    <td>Map typedefs to Native Types.<br> Values can only be
-    <i>Void, Uint8, Int8, Uint16, Int16, Uint32, Int32, Uint64, Int64, IntPtr, Float and Double.</i>
+    <td>library-imports</td>
+    <td>Specify library imports for use in type-map.<br><br>
+    Note: ffi (dart:ffi) is already available as a predefined import.
     </td>
     <td>
 
 ```yaml
-typedef-map:
-  'my_custom_type': 'IntPtr'
-  'size_t': 'Int64'
+library-imports:
+  custom_lib: 'package:some_pkg/some_file.dart'
 ```
   </td>
   </tr>
   <tr>
-    <td>size-map</td>
-    <td>Size of integers to use (in bytes).<br>
-    <b>The defaults (see example) <i>may</i> not be portable on all OS.
-    Do not change these unless absolutely sure.</b>
+    <td>type-map</td>
+    <td>Map types like integers, typedefs, structs,  unions to any other type.<br><br>
+    <b>Sub-fields</b> - <i>typedefs</i>, <i>structs</i>, <i>unions</i>, <i>ints</i><br><br>
+    <b><i>lib</i></b> must be specified in <i>library-imports</i> or be one of a predefined import.
     </td>
     <td>
 
 ```yaml
-# These are optional and also default,
-# Omitting any and the default
-# will be used.
-size-map:
-  char: 1
-  unsigned char: 1
-  short: 2
-  unsigned short: 2
-  int: 4
-  unsigned int: 4
-  long: 8
-  unsigned long: 8
-  long long: 8
-  unsigned long long: 8
-  enum: 4
+type-map:
+  'native-types': # Targets native types.
+    'char':
+      'lib': 'pkg_ffi' # predefined import.
+      'c-type': 'Char'
+      # For native-types dart-type can be be int, double or float
+      # but same otherwise.
+      'dart-type': 'int'
+    'int':
+      'lib': 'custom_lib'
+      'c-type': 'CustomType4'
+      'dart-type': 'int'
+  'typedefs': # Targets typedefs.
+    'my_type1':
+      'lib': 'custom_lib'
+      'c-type': 'CustomType'
+      'dart-type': 'CustomType'
+  'structs': # Targets structs.
+    'my_type2':
+      'lib': 'custom_lib'
+      'c-type': 'CustomType2'
+      'dart-type': 'CustomType2'
+  'unions': # Targets unions.
+    'my_type3':
+      'lib': 'custom_lib'
+      'c-type': 'CustomType3'
+      'dart-type': 'CustomType3'
 ```
   </td>
   </tr>
+  <tr>
+    <td>ffi-native</td>
+    <td>
+      <b>WARNING:</b> FfiNative support is EXPERIMENTAL. The API may change
+      in a breaking way without notice.
+      <br><br>
+      Generate `@FfiNative` bindings instead of bindings using `DynamicLibrary` or `lookup`.
+    </td>
+    <td>
+
+```yaml
+ffi-native:
+  asset: 'myasset' # Optional.
+```
+  </td>
+  </tr>
+  <tr>
+    <td>language</td>
+    <td>
+      <b>WARNING:</b> Other language support is EXPERIMENTAL. The API may change
+      in a breaking way without notice.
+      <br><br>
+      Choose the input langauge. Must be one of 'c', or 'objc'. Defaults to 'c'.
+    </td>
+    <td>
+
+```yaml
+language: 'objc'
+```
+  </td>
+  </tr>
+  <tr>
+    <td>output -> symbol-file</td>
+    <td>Generates a symbol file yaml containing all types defined in the generated output.</td>
+    <td>
+
+```yaml
+output:
+  ...
+  symbol-file:
+    # Although file paths are supported here, prefer Package Uri's here
+    # so that other pacakges can use them.
+    output: 'package:some_pkg/symbols.yaml'
+    import-path: 'package:some_pkg/base.dart'
+```
+</td>
+  </tr>
+  <tr>
+    <td>import -> symbol-files</td>
+    <td>Import symbols from a symbol file. Used for sharing type definitions from other pacakges.</td>
+    <td>
+
+```yaml
+import:
+  symbol-files:
+    # Both package Uri and file paths are supported here.
+    - 'package:some_pkg/symbols.yaml'
+    - 'path/to/some/symbol_file.yaml'
+```
+</td>
+  </tr>
 </tbody>
 </table>
 
-## Limitations
-1. Multi OS support for types such as long. [Issue #7](https://github.com/dart-lang/ffigen/issues/7)
+### Objective-C config options
+
+<table>
+<thead>
+  <tr>
+    <th>Key</th>
+    <th>Explaination</th>
+    <th>Example</th>
+  </tr>
+  <colgroup>
+    <col>
+    <col style="width: 100px;">
+  </colgroup>
+</thead>
+<tbody>
+  <tr>
+    <td>
+      objc-interfaces
+    </td>
+    <td>
+      Filters for interface declarations. This option works the same as other
+      declaration filters like `functions` and `structs`.
+    </td>
+    <td>
+
+```yaml
+objc-interfaces:
+  include:
+    # Includes a specific interface.
+    - 'MyInterface'
+    # Includes all interfaces starting with "NS".
+    - 'NS.*'
+  exclude:
+    # Override the above NS.* inclusion, to exclude NSURL.
+    - 'NSURL'
+  rename:
+    # Removes '_' prefix from interface names.
+    '_(.*)': '$1'
+```
+
+  </td>
+  </tr>
+
+  <tr>
+    <td>
+      objc-interfaces -> module
+    </td>
+    <td>
+      Adds a module prefix to the class name when loading the class
+      from the dylib. This is only relevent for ObjC headers that are generated
+      wrappers for a Swift library. See example/swift for more information.
+    </td>
+    <td>
+
+```yaml
+headers:
+  entry-points:
+    # Generated by swiftc to wrap foo_lib.swift.
+    - 'foo_lib-Swift.h'
+objc-interfaces:
+  include:
+    # Eg, foo_lib contains a set of classes prefixed with FL.
+    - 'FL.*'
+  module:
+    # Use 'foo_lib' as the module name for all the FL.* classes.
+    # We don't match .* here because other classes like NSString
+    # shouldn't be given a module prefix.
+    'FL.*': 'foo_lib'
+```
+
+  </td>
+  </tr>
+</tbody>
+</table>
 
 ## Trying out examples
 1. `cd examples/<example_u_want_to_run>`, Run `dart pub get`.
 2. Run `dart run ffigen`.
 
 ## Running Tests
-1. Dynamic library for some tests need to be built before running the examples.
-  1. `cd test/native_test`.
-  2. Run `dart build_test_dylib.dart`.
 
-Run tests from the root of the package with `dart run test`.
-> Note: If llvm is not installed in one of the default locations, tests may fail.
+See [test/README.md](test/README.md)
+
 ## FAQ
 ### Can ffigen be used for removing underscores or renaming declarations?
 Ffigen supports **regexp based renaming**, the regexp must be a
@@ -537,11 +702,6 @@
 
 Ffigen treats `char*` just as any other pointer,(`Pointer<Int8>`).
 To convert these to/from `String`, you can use [package:ffi](https://pub.dev/packages/ffi). Use `ptr.cast<Utf8>().toDartString()` to convert `char*` to dart `string` and `"str".toNativeUtf8()` to convert `string` to `char*`.
-### How does ffigen handle C99 bool data type?
-
-Although `dart:ffi` doesn't have a NativeType for `bool`, they can be implemented as `Uint8`.
-Ffigen generates dart `bool` for function parameters and return type by default.
-To disable this, and use `int` instead, set `dart-bool: false` in configurations.
 
 ### How are unnamed enums handled?
 
@@ -619,6 +779,12 @@
   - They refer to a struct/union having the same name as itself.
   - They refer to a boolean, enum, inline array, Handle or any unsupported type.
 
+### How are macros handled?
+
+`ffigen` uses `clang`'s own compiler frontend to parse and traverse the `C` header files. `ffigen` expands the macros using `clang`'s macro expansion and then traverses the expanded code. To do this, `ffigen` generates temporary files in a system tmp directory.
+
+A custom temporary directory can be specified by setting the `TEST_TMPDIR` environment variable.
+
 ### What are these logs generated by ffigen and how to fix them?
 
 Ffigen can sometimes generate a lot of logs, especially when it's parsing a lot of code.
@@ -637,3 +803,16 @@
     Level options are - `[all, fine, info (default), warning, severe]`.
     The `all` and `fine` will print a ton of logs are meant for debugging
     purposes only.
+
+### How can type definitions be shared?
+
+Ffigen can share type definitions using symbol files.
+- A package can generate a symbol file using the `output -> symbol-file` config.
+- And another package can then import this, using `import -> symbol-files` config.
+- Doing so will reuse all the types such as Struct/Unions, and will automatically
+ exclude generating other types (E.g functions, enums, macros).
+
+Checkout `examples/shared_bindings` for details.
+
+For manually reusing definitions from another package, the `library-imports`
+and `type-map` config can be used.
diff --git a/pkgs/ffigen/analysis_options.yaml b/pkgs/ffigen/analysis_options.yaml
index 002a2c4..5028f95 100644
--- a/pkgs/ffigen/analysis_options.yaml
+++ b/pkgs/ffigen/analysis_options.yaml
@@ -5,9 +5,13 @@
 include: package:lints/recommended.yaml
 
 analyzer:
-  strong-mode:
-    implicit-casts: false
-    implicit-dynamic: false
+  exclude:
+    - 'test/**_expected*'
+    # Goldens cannot be generated outside MacOS causing analysis errors.
+    - test/native_objc_test/** 
+  language:
+    strict-casts: true
+    strict-inference: true
 
 linter:
   rules:
diff --git a/pkgs/ffigen/example/README.md b/pkgs/ffigen/example/README.md
index 954249d..91a8db8 100644
--- a/pkgs/ffigen/example/README.md
+++ b/pkgs/ffigen/example/README.md
@@ -3,3 +3,5 @@
 - [Simple](https://github.com/dart-lang/ffigen/tree/master/example/simple)
 - [cJSON](https://github.com/dart-lang/ffigen/tree/master/example/c_json)
 - [LibClang](https://github.com/dart-lang/ffigen/tree/master/example/libclang-example)
+- [ObjectiveC](https://github.com/dart-lang/ffigen/tree/master/example/objective_c)
+- [Swift](https://github.com/dart-lang/ffigen/tree/master/example/swift)
diff --git a/pkgs/ffigen/example/c_json/README.md b/pkgs/ffigen/example/c_json/README.md
index 229d65b..f222cc2 100644
--- a/pkgs/ffigen/example/c_json/README.md
+++ b/pkgs/ffigen/example/c_json/README.md
@@ -15,7 +15,7 @@
 ## Generating bindings
 At the root of this example (`example/c_json`), run -
 ```
-dart run ffigen
+dart run ffigen --config config.yaml
 ```
 This will generate bindings in a file: [cjson_generated_bindings.dart](./cjson_generated_bindings.dart)
 
diff --git a/pkgs/ffigen/example/c_json/cjson_generated_bindings.dart b/pkgs/ffigen/example/c_json/cjson_generated_bindings.dart
index a518d8a..c520c20 100644
--- a/pkgs/ffigen/example/c_json/cjson_generated_bindings.dart
+++ b/pkgs/ffigen/example/c_json/cjson_generated_bindings.dart
@@ -19,10 +19,10 @@
 // THE SOFTWARE.
 
 // ignore_for_file: camel_case_types, non_constant_identifier_names
-
 // AUTO GENERATED FILE, DO NOT EDIT.
 //
 // Generated by `package:ffigen`.
+// ignore_for_file: type=lint
 import 'dart:ffi' as ffi;
 
 /// Holds bindings to cJSON.
@@ -40,15 +40,15 @@
           lookup)
       : _lookup = lookup;
 
-  ffi.Pointer<ffi.Int8> cJSON_Version() {
+  ffi.Pointer<ffi.Char> cJSON_Version() {
     return _cJSON_Version();
   }
 
   late final _cJSON_VersionPtr =
-      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Int8> Function()>>(
+      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Char> Function()>>(
           'cJSON_Version');
   late final _cJSON_Version =
-      _cJSON_VersionPtr.asFunction<ffi.Pointer<ffi.Int8> Function()>();
+      _cJSON_VersionPtr.asFunction<ffi.Pointer<ffi.Char> Function()>();
 
   void cJSON_InitHooks(
     ffi.Pointer<cJSON_Hooks> hooks,
@@ -65,7 +65,7 @@
       _cJSON_InitHooksPtr.asFunction<void Function(ffi.Pointer<cJSON_Hooks>)>();
 
   ffi.Pointer<cJSON> cJSON_Parse(
-    ffi.Pointer<ffi.Int8> value,
+    ffi.Pointer<ffi.Char> value,
   ) {
     return _cJSON_Parse(
       value,
@@ -74,13 +74,13 @@
 
   late final _cJSON_ParsePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Int8>)>>('cJSON_Parse');
+          ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Char>)>>('cJSON_Parse');
   late final _cJSON_Parse = _cJSON_ParsePtr
-      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Int8>)>();
+      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_ParseWithOpts(
-    ffi.Pointer<ffi.Int8> value,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> return_parse_end,
+    ffi.Pointer<ffi.Char> value,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> return_parse_end,
     int require_null_terminated,
   ) {
     return _cJSON_ParseWithOpts(
@@ -93,14 +93,14 @@
   late final _cJSON_ParseWithOptsPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
+              ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Pointer<ffi.Char>>,
               cJSON_bool)>>('cJSON_ParseWithOpts');
   late final _cJSON_ParseWithOpts = _cJSON_ParseWithOptsPtr.asFunction<
       ffi.Pointer<cJSON> Function(
-          ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Pointer<ffi.Int8>>, int)>();
+          ffi.Pointer<ffi.Char>, ffi.Pointer<ffi.Pointer<ffi.Char>>, int)>();
 
-  ffi.Pointer<ffi.Int8> cJSON_Print(
+  ffi.Pointer<ffi.Char> cJSON_Print(
     ffi.Pointer<cJSON> item,
   ) {
     return _cJSON_Print(
@@ -110,11 +110,11 @@
 
   late final _cJSON_PrintPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(ffi.Pointer<cJSON>)>>('cJSON_Print');
+          ffi.Pointer<ffi.Char> Function(ffi.Pointer<cJSON>)>>('cJSON_Print');
   late final _cJSON_Print = _cJSON_PrintPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(ffi.Pointer<cJSON>)>();
+      .asFunction<ffi.Pointer<ffi.Char> Function(ffi.Pointer<cJSON>)>();
 
-  ffi.Pointer<ffi.Int8> cJSON_PrintUnformatted(
+  ffi.Pointer<ffi.Char> cJSON_PrintUnformatted(
     ffi.Pointer<cJSON> item,
   ) {
     return _cJSON_PrintUnformatted(
@@ -124,12 +124,12 @@
 
   late final _cJSON_PrintUnformattedPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(
+          ffi.Pointer<ffi.Char> Function(
               ffi.Pointer<cJSON>)>>('cJSON_PrintUnformatted');
   late final _cJSON_PrintUnformatted = _cJSON_PrintUnformattedPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(ffi.Pointer<cJSON>)>();
+      .asFunction<ffi.Pointer<ffi.Char> Function(ffi.Pointer<cJSON>)>();
 
-  ffi.Pointer<ffi.Int8> cJSON_PrintBuffered(
+  ffi.Pointer<ffi.Char> cJSON_PrintBuffered(
     ffi.Pointer<cJSON> item,
     int prebuffer,
     int fmt,
@@ -143,14 +143,14 @@
 
   late final _cJSON_PrintBufferedPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(ffi.Pointer<cJSON>, ffi.Int32,
-              cJSON_bool)>>('cJSON_PrintBuffered');
+          ffi.Pointer<ffi.Char> Function(
+              ffi.Pointer<cJSON>, ffi.Int, cJSON_bool)>>('cJSON_PrintBuffered');
   late final _cJSON_PrintBuffered = _cJSON_PrintBufferedPtr.asFunction<
-      ffi.Pointer<ffi.Int8> Function(ffi.Pointer<cJSON>, int, int)>();
+      ffi.Pointer<ffi.Char> Function(ffi.Pointer<cJSON>, int, int)>();
 
   int cJSON_PrintPreallocated(
     ffi.Pointer<cJSON> item,
-    ffi.Pointer<ffi.Int8> buffer,
+    ffi.Pointer<ffi.Char> buffer,
     int length,
     int format,
   ) {
@@ -164,10 +164,10 @@
 
   late final _cJSON_PrintPreallocatedPtr = _lookup<
       ffi.NativeFunction<
-          cJSON_bool Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
-              ffi.Int32, cJSON_bool)>>('cJSON_PrintPreallocated');
+          cJSON_bool Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>,
+              ffi.Int, cJSON_bool)>>('cJSON_PrintPreallocated');
   late final _cJSON_PrintPreallocated = _cJSON_PrintPreallocatedPtr.asFunction<
-      int Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, int, int)>();
+      int Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>, int, int)>();
 
   void cJSON_Delete(
     ffi.Pointer<cJSON> item,
@@ -192,7 +192,7 @@
   }
 
   late final _cJSON_GetArraySizePtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<cJSON>)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<cJSON>)>>(
           'cJSON_GetArraySize');
   late final _cJSON_GetArraySize =
       _cJSON_GetArraySizePtr.asFunction<int Function(ffi.Pointer<cJSON>)>();
@@ -210,13 +210,13 @@
   late final _cJSON_GetArrayItemPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<cJSON>, ffi.Int32)>>('cJSON_GetArrayItem');
+              ffi.Pointer<cJSON>, ffi.Int)>>('cJSON_GetArrayItem');
   late final _cJSON_GetArrayItem = _cJSON_GetArrayItemPtr
       .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, int)>();
 
   ffi.Pointer<cJSON> cJSON_GetObjectItem(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<ffi.Char> string,
   ) {
     return _cJSON_GetObjectItem(
       object,
@@ -227,13 +227,13 @@
   late final _cJSON_GetObjectItemPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_GetObjectItem');
+              ffi.Pointer<ffi.Char>)>>('cJSON_GetObjectItem');
   late final _cJSON_GetObjectItem = _cJSON_GetObjectItemPtr.asFunction<
-      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_GetObjectItemCaseSensitive(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<ffi.Char> string,
   ) {
     return _cJSON_GetObjectItemCaseSensitive(
       object,
@@ -244,15 +244,15 @@
   late final _cJSON_GetObjectItemCaseSensitivePtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_GetObjectItemCaseSensitive');
+              ffi.Pointer<ffi.Char>)>>('cJSON_GetObjectItemCaseSensitive');
   late final _cJSON_GetObjectItemCaseSensitive =
       _cJSON_GetObjectItemCaseSensitivePtr.asFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+              ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>)>();
 
   int cJSON_HasObjectItem(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<ffi.Char> string,
   ) {
     return _cJSON_HasObjectItem(
       object,
@@ -263,21 +263,21 @@
   late final _cJSON_HasObjectItemPtr = _lookup<
       ffi.NativeFunction<
           cJSON_bool Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_HasObjectItem');
+              ffi.Pointer<ffi.Char>)>>('cJSON_HasObjectItem');
   late final _cJSON_HasObjectItem = _cJSON_HasObjectItemPtr
-      .asFunction<int Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+      .asFunction<int Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>)>();
 
-  ffi.Pointer<ffi.Int8> cJSON_GetErrorPtr() {
+  ffi.Pointer<ffi.Char> cJSON_GetErrorPtr() {
     return _cJSON_GetErrorPtr();
   }
 
   late final _cJSON_GetErrorPtrPtr =
-      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Int8> Function()>>(
+      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Char> Function()>>(
           'cJSON_GetErrorPtr');
   late final _cJSON_GetErrorPtr =
-      _cJSON_GetErrorPtrPtr.asFunction<ffi.Pointer<ffi.Int8> Function()>();
+      _cJSON_GetErrorPtrPtr.asFunction<ffi.Pointer<ffi.Char> Function()>();
 
-  ffi.Pointer<ffi.Int8> cJSON_GetStringValue(
+  ffi.Pointer<ffi.Char> cJSON_GetStringValue(
     ffi.Pointer<cJSON> item,
   ) {
     return _cJSON_GetStringValue(
@@ -287,10 +287,10 @@
 
   late final _cJSON_GetStringValuePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(
+          ffi.Pointer<ffi.Char> Function(
               ffi.Pointer<cJSON>)>>('cJSON_GetStringValue');
   late final _cJSON_GetStringValue = _cJSON_GetStringValuePtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(ffi.Pointer<cJSON>)>();
+      .asFunction<ffi.Pointer<ffi.Char> Function(ffi.Pointer<cJSON>)>();
 
   int cJSON_IsInvalid(
     ffi.Pointer<cJSON> item,
@@ -491,7 +491,7 @@
       _cJSON_CreateNumberPtr.asFunction<ffi.Pointer<cJSON> Function(double)>();
 
   ffi.Pointer<cJSON> cJSON_CreateString(
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<ffi.Char> string,
   ) {
     return _cJSON_CreateString(
       string,
@@ -501,12 +501,12 @@
   late final _cJSON_CreateStringPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<ffi.Int8>)>>('cJSON_CreateString');
+              ffi.Pointer<ffi.Char>)>>('cJSON_CreateString');
   late final _cJSON_CreateString = _cJSON_CreateStringPtr
-      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Int8>)>();
+      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_CreateRaw(
-    ffi.Pointer<ffi.Int8> raw,
+    ffi.Pointer<ffi.Char> raw,
   ) {
     return _cJSON_CreateRaw(
       raw,
@@ -516,9 +516,9 @@
   late final _cJSON_CreateRawPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<ffi.Int8>)>>('cJSON_CreateRaw');
+              ffi.Pointer<ffi.Char>)>>('cJSON_CreateRaw');
   late final _cJSON_CreateRaw = _cJSON_CreateRawPtr
-      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Int8>)>();
+      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_CreateArray() {
     return _cJSON_CreateArray();
@@ -541,7 +541,7 @@
       _cJSON_CreateObjectPtr.asFunction<ffi.Pointer<cJSON> Function()>();
 
   ffi.Pointer<cJSON> cJSON_CreateStringReference(
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<ffi.Char> string,
   ) {
     return _cJSON_CreateStringReference(
       string,
@@ -551,9 +551,9 @@
   late final _cJSON_CreateStringReferencePtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<ffi.Int8>)>>('cJSON_CreateStringReference');
+              ffi.Pointer<ffi.Char>)>>('cJSON_CreateStringReference');
   late final _cJSON_CreateStringReference = _cJSON_CreateStringReferencePtr
-      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Int8>)>();
+      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_CreateObjectReference(
     ffi.Pointer<cJSON> child,
@@ -584,7 +584,7 @@
       .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>)>();
 
   ffi.Pointer<cJSON> cJSON_CreateIntArray(
-    ffi.Pointer<ffi.Int32> numbers,
+    ffi.Pointer<ffi.Int> numbers,
     int count,
   ) {
     return _cJSON_CreateIntArray(
@@ -596,9 +596,9 @@
   late final _cJSON_CreateIntArrayPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<ffi.Int32>, ffi.Int32)>>('cJSON_CreateIntArray');
+              ffi.Pointer<ffi.Int>, ffi.Int)>>('cJSON_CreateIntArray');
   late final _cJSON_CreateIntArray = _cJSON_CreateIntArrayPtr
-      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Int32>, int)>();
+      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Int>, int)>();
 
   ffi.Pointer<cJSON> cJSON_CreateFloatArray(
     ffi.Pointer<ffi.Float> numbers,
@@ -613,7 +613,7 @@
   late final _cJSON_CreateFloatArrayPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<ffi.Float>, ffi.Int32)>>('cJSON_CreateFloatArray');
+              ffi.Pointer<ffi.Float>, ffi.Int)>>('cJSON_CreateFloatArray');
   late final _cJSON_CreateFloatArray = _cJSON_CreateFloatArrayPtr
       .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Float>, int)>();
 
@@ -630,12 +630,12 @@
   late final _cJSON_CreateDoubleArrayPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<ffi.Double>, ffi.Int32)>>('cJSON_CreateDoubleArray');
+              ffi.Pointer<ffi.Double>, ffi.Int)>>('cJSON_CreateDoubleArray');
   late final _cJSON_CreateDoubleArray = _cJSON_CreateDoubleArrayPtr
       .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Double>, int)>();
 
   ffi.Pointer<cJSON> cJSON_CreateStringArray(
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> strings,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> strings,
     int count,
   ) {
     return _cJSON_CreateStringArray(
@@ -646,10 +646,10 @@
 
   late final _cJSON_CreateStringArrayPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              ffi.Int32)>>('cJSON_CreateStringArray');
+          ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Pointer<ffi.Char>>,
+              ffi.Int)>>('cJSON_CreateStringArray');
   late final _cJSON_CreateStringArray = _cJSON_CreateStringArrayPtr.asFunction<
-      ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Pointer<ffi.Int8>>, int)>();
+      ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Pointer<ffi.Char>>, int)>();
 
   void cJSON_AddItemToArray(
     ffi.Pointer<cJSON> array,
@@ -670,7 +670,7 @@
 
   void cJSON_AddItemToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<ffi.Char> string,
     ffi.Pointer<cJSON> item,
   ) {
     return _cJSON_AddItemToObject(
@@ -682,15 +682,15 @@
 
   late final _cJSON_AddItemToObjectPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
+          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>,
               ffi.Pointer<cJSON>)>>('cJSON_AddItemToObject');
   late final _cJSON_AddItemToObject = _cJSON_AddItemToObjectPtr.asFunction<
       void Function(
-          ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, ffi.Pointer<cJSON>)>();
+          ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>, ffi.Pointer<cJSON>)>();
 
   void cJSON_AddItemToObjectCS(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<ffi.Char> string,
     ffi.Pointer<cJSON> item,
   ) {
     return _cJSON_AddItemToObjectCS(
@@ -702,11 +702,11 @@
 
   late final _cJSON_AddItemToObjectCSPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
+          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>,
               ffi.Pointer<cJSON>)>>('cJSON_AddItemToObjectCS');
   late final _cJSON_AddItemToObjectCS = _cJSON_AddItemToObjectCSPtr.asFunction<
       void Function(
-          ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, ffi.Pointer<cJSON>)>();
+          ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>, ffi.Pointer<cJSON>)>();
 
   void cJSON_AddItemReferenceToArray(
     ffi.Pointer<cJSON> array,
@@ -727,7 +727,7 @@
 
   void cJSON_AddItemReferenceToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<ffi.Char> string,
     ffi.Pointer<cJSON> item,
   ) {
     return _cJSON_AddItemReferenceToObject(
@@ -739,12 +739,12 @@
 
   late final _cJSON_AddItemReferenceToObjectPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
+          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>,
               ffi.Pointer<cJSON>)>>('cJSON_AddItemReferenceToObject');
   late final _cJSON_AddItemReferenceToObject =
       _cJSON_AddItemReferenceToObjectPtr.asFunction<
           void Function(
-              ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, ffi.Pointer<cJSON>)>();
+              ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>, ffi.Pointer<cJSON>)>();
 
   ffi.Pointer<cJSON> cJSON_DetachItemViaPointer(
     ffi.Pointer<cJSON> parent,
@@ -778,7 +778,7 @@
   late final _cJSON_DetachItemFromArrayPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<cJSON>, ffi.Int32)>>('cJSON_DetachItemFromArray');
+              ffi.Pointer<cJSON>, ffi.Int)>>('cJSON_DetachItemFromArray');
   late final _cJSON_DetachItemFromArray = _cJSON_DetachItemFromArrayPtr
       .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, int)>();
 
@@ -793,14 +793,14 @@
   }
 
   late final _cJSON_DeleteItemFromArrayPtr = _lookup<
-          ffi.NativeFunction<ffi.Void Function(ffi.Pointer<cJSON>, ffi.Int32)>>(
+          ffi.NativeFunction<ffi.Void Function(ffi.Pointer<cJSON>, ffi.Int)>>(
       'cJSON_DeleteItemFromArray');
   late final _cJSON_DeleteItemFromArray = _cJSON_DeleteItemFromArrayPtr
       .asFunction<void Function(ffi.Pointer<cJSON>, int)>();
 
   ffi.Pointer<cJSON> cJSON_DetachItemFromObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<ffi.Char> string,
   ) {
     return _cJSON_DetachItemFromObject(
       object,
@@ -811,15 +811,15 @@
   late final _cJSON_DetachItemFromObjectPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_DetachItemFromObject');
+              ffi.Pointer<ffi.Char>)>>('cJSON_DetachItemFromObject');
   late final _cJSON_DetachItemFromObject =
       _cJSON_DetachItemFromObjectPtr.asFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+              ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_DetachItemFromObjectCaseSensitive(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<ffi.Char> string,
   ) {
     return _cJSON_DetachItemFromObjectCaseSensitive(
       object,
@@ -830,16 +830,16 @@
   late final _cJSON_DetachItemFromObjectCaseSensitivePtr = _lookup<
           ffi.NativeFunction<
               ffi.Pointer<cJSON> Function(
-                  ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>>(
+                  ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>)>>(
       'cJSON_DetachItemFromObjectCaseSensitive');
   late final _cJSON_DetachItemFromObjectCaseSensitive =
       _cJSON_DetachItemFromObjectCaseSensitivePtr.asFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+              ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>)>();
 
   void cJSON_DeleteItemFromObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<ffi.Char> string,
   ) {
     return _cJSON_DeleteItemFromObject(
       object,
@@ -850,13 +850,13 @@
   late final _cJSON_DeleteItemFromObjectPtr = _lookup<
       ffi.NativeFunction<
           ffi.Void Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_DeleteItemFromObject');
+              ffi.Pointer<ffi.Char>)>>('cJSON_DeleteItemFromObject');
   late final _cJSON_DeleteItemFromObject = _cJSON_DeleteItemFromObjectPtr
-      .asFunction<void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+      .asFunction<void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>)>();
 
   void cJSON_DeleteItemFromObjectCaseSensitive(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<ffi.Char> string,
   ) {
     return _cJSON_DeleteItemFromObjectCaseSensitive(
       object,
@@ -866,11 +866,11 @@
 
   late final _cJSON_DeleteItemFromObjectCaseSensitivePtr = _lookup<
           ffi.NativeFunction<
-              ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>>(
+              ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>)>>(
       'cJSON_DeleteItemFromObjectCaseSensitive');
   late final _cJSON_DeleteItemFromObjectCaseSensitive =
       _cJSON_DeleteItemFromObjectCaseSensitivePtr.asFunction<
-          void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+          void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>)>();
 
   void cJSON_InsertItemInArray(
     ffi.Pointer<cJSON> array,
@@ -886,7 +886,7 @@
 
   late final _cJSON_InsertItemInArrayPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Int32,
+          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Int,
               ffi.Pointer<cJSON>)>>('cJSON_InsertItemInArray');
   late final _cJSON_InsertItemInArray = _cJSON_InsertItemInArrayPtr
       .asFunction<void Function(ffi.Pointer<cJSON>, int, ffi.Pointer<cJSON>)>();
@@ -926,14 +926,14 @@
 
   late final _cJSON_ReplaceItemInArrayPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Int32,
+          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Int,
               ffi.Pointer<cJSON>)>>('cJSON_ReplaceItemInArray');
   late final _cJSON_ReplaceItemInArray = _cJSON_ReplaceItemInArrayPtr
       .asFunction<void Function(ffi.Pointer<cJSON>, int, ffi.Pointer<cJSON>)>();
 
   void cJSON_ReplaceItemInObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<ffi.Char> string,
     ffi.Pointer<cJSON> newitem,
   ) {
     return _cJSON_ReplaceItemInObject(
@@ -945,16 +945,16 @@
 
   late final _cJSON_ReplaceItemInObjectPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
+          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>,
               ffi.Pointer<cJSON>)>>('cJSON_ReplaceItemInObject');
   late final _cJSON_ReplaceItemInObject =
       _cJSON_ReplaceItemInObjectPtr.asFunction<
           void Function(
-              ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, ffi.Pointer<cJSON>)>();
+              ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>, ffi.Pointer<cJSON>)>();
 
   void cJSON_ReplaceItemInObjectCaseSensitive(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<ffi.Char> string,
     ffi.Pointer<cJSON> newitem,
   ) {
     return _cJSON_ReplaceItemInObjectCaseSensitive(
@@ -966,12 +966,12 @@
 
   late final _cJSON_ReplaceItemInObjectCaseSensitivePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
+          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>,
               ffi.Pointer<cJSON>)>>('cJSON_ReplaceItemInObjectCaseSensitive');
   late final _cJSON_ReplaceItemInObjectCaseSensitive =
       _cJSON_ReplaceItemInObjectCaseSensitivePtr.asFunction<
           void Function(
-              ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, ffi.Pointer<cJSON>)>();
+              ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>, ffi.Pointer<cJSON>)>();
 
   ffi.Pointer<cJSON> cJSON_Duplicate(
     ffi.Pointer<cJSON> item,
@@ -1010,7 +1010,7 @@
       .asFunction<int Function(ffi.Pointer<cJSON>, ffi.Pointer<cJSON>, int)>();
 
   void cJSON_Minify(
-    ffi.Pointer<ffi.Int8> json,
+    ffi.Pointer<ffi.Char> json,
   ) {
     return _cJSON_Minify(
       json,
@@ -1018,14 +1018,14 @@
   }
 
   late final _cJSON_MinifyPtr =
-      _lookup<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Int8>)>>(
+      _lookup<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Char>)>>(
           'cJSON_Minify');
   late final _cJSON_Minify =
-      _cJSON_MinifyPtr.asFunction<void Function(ffi.Pointer<ffi.Int8>)>();
+      _cJSON_MinifyPtr.asFunction<void Function(ffi.Pointer<ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_AddNullToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<ffi.Char> name,
   ) {
     return _cJSON_AddNullToObject(
       object,
@@ -1036,13 +1036,13 @@
   late final _cJSON_AddNullToObjectPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_AddNullToObject');
+              ffi.Pointer<ffi.Char>)>>('cJSON_AddNullToObject');
   late final _cJSON_AddNullToObject = _cJSON_AddNullToObjectPtr.asFunction<
-      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_AddTrueToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<ffi.Char> name,
   ) {
     return _cJSON_AddTrueToObject(
       object,
@@ -1053,13 +1053,13 @@
   late final _cJSON_AddTrueToObjectPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_AddTrueToObject');
+              ffi.Pointer<ffi.Char>)>>('cJSON_AddTrueToObject');
   late final _cJSON_AddTrueToObject = _cJSON_AddTrueToObjectPtr.asFunction<
-      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_AddFalseToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<ffi.Char> name,
   ) {
     return _cJSON_AddFalseToObject(
       object,
@@ -1070,13 +1070,13 @@
   late final _cJSON_AddFalseToObjectPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_AddFalseToObject');
+              ffi.Pointer<ffi.Char>)>>('cJSON_AddFalseToObject');
   late final _cJSON_AddFalseToObject = _cJSON_AddFalseToObjectPtr.asFunction<
-      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_AddBoolToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<ffi.Char> name,
     int boolean,
   ) {
     return _cJSON_AddBoolToObject(
@@ -1088,15 +1088,15 @@
 
   late final _cJSON_AddBoolToObjectPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
+          ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>,
               cJSON_bool)>>('cJSON_AddBoolToObject');
   late final _cJSON_AddBoolToObject = _cJSON_AddBoolToObjectPtr.asFunction<
       ffi.Pointer<cJSON> Function(
-          ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, int)>();
+          ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>, int)>();
 
   ffi.Pointer<cJSON> cJSON_AddNumberToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<ffi.Char> name,
     double number,
   ) {
     return _cJSON_AddNumberToObject(
@@ -1108,16 +1108,16 @@
 
   late final _cJSON_AddNumberToObjectPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
+          ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>,
               ffi.Double)>>('cJSON_AddNumberToObject');
   late final _cJSON_AddNumberToObject = _cJSON_AddNumberToObjectPtr.asFunction<
       ffi.Pointer<cJSON> Function(
-          ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, double)>();
+          ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>, double)>();
 
   ffi.Pointer<cJSON> cJSON_AddStringToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> name,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<ffi.Char> name,
+    ffi.Pointer<ffi.Char> string,
   ) {
     return _cJSON_AddStringToObject(
       object,
@@ -1128,16 +1128,16 @@
 
   late final _cJSON_AddStringToObjectPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_AddStringToObject');
+          ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Char>)>>('cJSON_AddStringToObject');
   late final _cJSON_AddStringToObject = _cJSON_AddStringToObjectPtr.asFunction<
       ffi.Pointer<cJSON> Function(
-          ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int8>)>();
+          ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>, ffi.Pointer<ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_AddRawToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> name,
-    ffi.Pointer<ffi.Int8> raw,
+    ffi.Pointer<ffi.Char> name,
+    ffi.Pointer<ffi.Char> raw,
   ) {
     return _cJSON_AddRawToObject(
       object,
@@ -1148,15 +1148,15 @@
 
   late final _cJSON_AddRawToObjectPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_AddRawToObject');
+          ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Char>)>>('cJSON_AddRawToObject');
   late final _cJSON_AddRawToObject = _cJSON_AddRawToObjectPtr.asFunction<
       ffi.Pointer<cJSON> Function(
-          ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int8>)>();
+          ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>, ffi.Pointer<ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_AddObjectToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<ffi.Char> name,
   ) {
     return _cJSON_AddObjectToObject(
       object,
@@ -1167,13 +1167,13 @@
   late final _cJSON_AddObjectToObjectPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_AddObjectToObject');
+              ffi.Pointer<ffi.Char>)>>('cJSON_AddObjectToObject');
   late final _cJSON_AddObjectToObject = _cJSON_AddObjectToObjectPtr.asFunction<
-      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_AddArrayToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<ffi.Char> name,
   ) {
     return _cJSON_AddArrayToObject(
       object,
@@ -1184,9 +1184,9 @@
   late final _cJSON_AddArrayToObjectPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_AddArrayToObject');
+              ffi.Pointer<ffi.Char>)>>('cJSON_AddArrayToObject');
   late final _cJSON_AddArrayToObject = _cJSON_AddArrayToObjectPtr.asFunction<
-      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>)>();
 
   double cJSON_SetNumberHelper(
     ffi.Pointer<cJSON> object,
@@ -1214,7 +1214,7 @@
   }
 
   late final _cJSON_mallocPtr =
-      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function(ffi.IntPtr)>>(
+      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function(ffi.Size)>>(
           'cJSON_malloc');
   late final _cJSON_malloc =
       _cJSON_mallocPtr.asFunction<ffi.Pointer<ffi.Void> Function(int)>();
@@ -1241,30 +1241,30 @@
 
   external ffi.Pointer<cJSON> child;
 
-  @ffi.Int32()
+  @ffi.Int()
   external int type;
 
-  external ffi.Pointer<ffi.Int8> valuestring;
+  external ffi.Pointer<ffi.Char> valuestring;
 
-  @ffi.Int32()
+  @ffi.Int()
   external int valueint;
 
   @ffi.Double()
   external double valuedouble;
 
-  external ffi.Pointer<ffi.Int8> string;
+  external ffi.Pointer<ffi.Char> string;
 }
 
 class cJSON_Hooks extends ffi.Struct {
   external ffi.Pointer<
-      ffi.NativeFunction<ffi.Pointer<ffi.Void> Function(ffi.IntPtr)>> malloc_fn;
+          ffi.NativeFunction<ffi.Pointer<ffi.Void> Function(ffi.Size sz)>>
+      malloc_fn;
 
-  external ffi
-          .Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
-      free_fn;
+  external ffi.Pointer<
+      ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void> ptr)>> free_fn;
 }
 
-typedef cJSON_bool = ffi.Int32;
+typedef cJSON_bool = ffi.Int;
 
 const int CJSON_VERSION_MAJOR = 1;
 
diff --git a/pkgs/ffigen/example/c_json/config.yaml b/pkgs/ffigen/example/c_json/config.yaml
new file mode 100644
index 0000000..08c5891
--- /dev/null
+++ b/pkgs/ffigen/example/c_json/config.yaml
@@ -0,0 +1,31 @@
+output: 'cjson_generated_bindings.dart'
+name: 'CJson'
+description: 'Holds bindings to cJSON.'
+headers:
+  entry-points:
+    - '../../third_party/cjson_library/cJSON.h'
+  include-directives:
+    - '**cJSON.h'
+comments: false
+preamble: |
+  // Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
+  //
+  // Permission is hereby granted, free of charge, to any person obtaining a copy
+  // of this software and associated documentation files (the "Software"), to deal
+  // in the Software without restriction, including without limitation the rights
+  // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+  // copies of the Software, and to permit persons to whom the Software is
+  // furnished to do so, subject to the following conditions:
+  //
+  // The above copyright notice and this permission notice shall be included in
+  // all copies or substantial portions of the Software.
+  //
+  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+  // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+  // THE SOFTWARE.
+
+  // ignore_for_file: camel_case_types, non_constant_identifier_names
\ No newline at end of file
diff --git a/pkgs/ffigen/example/c_json/main.dart b/pkgs/ffigen/example/c_json/main.dart
index 99042eb..adbdac6 100644
--- a/pkgs/ffigen/example/c_json/main.dart
+++ b/pkgs/ffigen/example/c_json/main.dart
@@ -40,8 +40,8 @@
     print('Json converted successfully');
   } else {
     print("Converted json doesn't match\n");
-    print('Actual:\n' + dartJson.toString() + '\n');
-    print('Expected:\n' + json.decode(jsonString).toString());
+    print('Actual:\n$dartJson\n');
+    print('Expected:\n${json.decode(jsonString)}');
   }
 }
 
diff --git a/pkgs/ffigen/example/c_json/pubspec.yaml b/pkgs/ffigen/example/c_json/pubspec.yaml
index e9b7960..1733b5f 100644
--- a/pkgs/ffigen/example/c_json/pubspec.yaml
+++ b/pkgs/ffigen/example/c_json/pubspec.yaml
@@ -5,49 +5,13 @@
 name: c_json_example
 
 environment:
-  sdk: '>=2.13.0 <3.0.0'
+  sdk: '>=2.17.0 <4.0.0'
 
 dependencies:
-  ffi: ^1.0.0
+  ffi: ^2.0.1
   path: ^1.8.0
 
 dev_dependencies:
   ffigen:
     path: '../../'
-  lints: ^1.0.1
-
-ffigen:
-  output: 'cjson_generated_bindings.dart'
-  name: 'CJson'
-  description: 'Holds bindings to cJSON.'
-  headers:
-    entry-points:
-      - '../../third_party/cjson_library/cJSON.h'
-    include-directives:
-      - '**cJSON.h'
-  comments: false
-  typedef-map:
-    'size_t': 'IntPtr'
-
-  preamble: |
-    // Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
-    //
-    // Permission is hereby granted, free of charge, to any person obtaining a copy
-    // of this software and associated documentation files (the "Software"), to deal
-    // in the Software without restriction, including without limitation the rights
-    // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-    // copies of the Software, and to permit persons to whom the Software is
-    // furnished to do so, subject to the following conditions:
-    //
-    // The above copyright notice and this permission notice shall be included in
-    // all copies or substantial portions of the Software.
-    //
-    // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-    // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-    // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-    // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-    // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-    // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-    // THE SOFTWARE.
-
-    // ignore_for_file: camel_case_types, non_constant_identifier_names
+  lints: ^2.0.1
diff --git a/pkgs/ffigen/example/ffinative/.gitignore b/pkgs/ffigen/example/ffinative/.gitignore
new file mode 100644
index 0000000..1b05164
--- /dev/null
+++ b/pkgs/ffigen/example/ffinative/.gitignore
@@ -0,0 +1,11 @@
+# Files and directories created by pub.
+.dart_tool/
+.packages
+# Remove the following pattern if you wish to check in your lock file.
+pubspec.lock
+
+# Conventional directory for build outputs.
+build/
+
+# Directory created by dartdoc.
+doc/api/
diff --git a/pkgs/ffigen/example/ffinative/README.md b/pkgs/ffigen/example/ffinative/README.md
new file mode 100644
index 0000000..82b0e88
--- /dev/null
+++ b/pkgs/ffigen/example/ffinative/README.md
@@ -0,0 +1,10 @@
+# FfiNatives example
+
+A simple example generating `FfiNative` bindings for a very small header file (`headers/example.h`).
+
+## Generating bindings
+At the root of this example (`example/simple`), run -
+```
+dart run ffigen --config config.yaml
+```
+This will generate bindings in a file: [generated_bindings.dart](./generated_bindings.dart).
diff --git a/pkgs/ffigen/example/ffinative/config.yaml b/pkgs/ffigen/example/ffinative/config.yaml
new file mode 100644
index 0000000..18aeb3f
--- /dev/null
+++ b/pkgs/ffigen/example/ffinative/config.yaml
@@ -0,0 +1,10 @@
+name: NativeLibrary
+ffi-native:
+  # asset: 'assetname' # (optional)
+description: Bindings to `headers/example.h`.
+output: 'generated_bindings.dart'
+headers:
+  entry-points:
+    - 'headers/example.h'
+preamble: |
+  // ignore_for_file: deprecated_member_use
\ No newline at end of file
diff --git a/pkgs/ffigen/example/ffinative/generated_bindings.dart b/pkgs/ffigen/example/ffinative/generated_bindings.dart
new file mode 100644
index 0000000..1529564
--- /dev/null
+++ b/pkgs/ffigen/example/ffinative/generated_bindings.dart
@@ -0,0 +1,43 @@
+// ignore_for_file: deprecated_member_use
+
+// AUTO GENERATED FILE, DO NOT EDIT.
+//
+// Generated by `package:ffigen`.
+// ignore_for_file: type=lint
+import 'dart:ffi' as ffi;
+
+/// Adds 2 integers.
+@ffi.FfiNative<ffi.Int Function(ffi.Int, ffi.Int)>('sum')
+external int sum(
+  int a,
+  int b,
+);
+
+/// Subtracts 2 integers.
+@ffi.FfiNative<ffi.Int Function(ffi.Int, ffi.Int)>('subtract')
+external int subtract(
+  int a,
+  int b,
+);
+
+/// Multiplies 2 integers, returns pointer to an integer,.
+@ffi.FfiNative<ffi.Pointer<ffi.Int> Function(ffi.Int, ffi.Int)>('multiply')
+external ffi.Pointer<ffi.Int> multiply(
+  int a,
+  int b,
+);
+
+/// Divides 2 integers, returns pointer to a float.
+@ffi.FfiNative<ffi.Pointer<ffi.Float> Function(ffi.Int, ffi.Int)>('divide')
+external ffi.Pointer<ffi.Float> divide(
+  int a,
+  int b,
+);
+
+/// Divides 2 floats, returns a pointer to double.
+@ffi.FfiNative<ffi.Pointer<ffi.Double> Function(ffi.Float, ffi.Float)>(
+    'dividePrecision')
+external ffi.Pointer<ffi.Double> dividePrecision(
+  double a,
+  double b,
+);
diff --git a/pkgs/ffigen/example/ffinative/headers/example.h b/pkgs/ffigen/example/ffinative/headers/example.h
new file mode 100644
index 0000000..44056dd
--- /dev/null
+++ b/pkgs/ffigen/example/ffinative/headers/example.h
@@ -0,0 +1,18 @@
+// 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.
+
+/** Adds 2 integers. */
+int sum(int a, int b);
+
+/** Subtracts 2 integers. */
+int subtract(int a, int b);
+
+/** Multiplies 2 integers, returns pointer to an integer,. */
+int *multiply(int a, int b);
+
+/** Divides 2 integers, returns pointer to a float. */
+float *divide(int a, int b);
+
+/** Divides 2 floats, returns a pointer to double. */
+double *dividePrecision(float a, float b);
diff --git a/pkgs/ffigen/example/ffinative/pubspec.yaml b/pkgs/ffigen/example/ffinative/pubspec.yaml
new file mode 100644
index 0000000..2247de4
--- /dev/null
+++ b/pkgs/ffigen/example/ffinative/pubspec.yaml
@@ -0,0 +1,15 @@
+# Copyright (c) 2022, 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.
+
+name: ffinative_example
+
+environment:
+  sdk: '>=2.17.0 <4.0.0'
+
+dependencies:
+  ffi: ^2.0.1
+dev_dependencies:
+  ffigen:
+    path: '../../'
+  lints: ^2.0.0
diff --git a/pkgs/ffigen/example/libclang-example/config.yaml b/pkgs/ffigen/example/libclang-example/config.yaml
new file mode 100644
index 0000000..f6517c0
--- /dev/null
+++ b/pkgs/ffigen/example/libclang-example/config.yaml
@@ -0,0 +1,74 @@
+output: 'generated_bindings.dart'
+
+# This will sort the bindings alphabetically.
+# sort: true
+
+# This is required if LLVM can't be found in default locations by ffigen.
+# llvm-path:
+#   - '/usr/local/opt/llvm'
+
+# Bash style Glob matching is also supported.
+# TODO(11): Globs dont work on windows if they begin with '.' or '..'.
+headers:
+  entry-points:
+    - ../../third_party/libclang/include/clang-c/Index.h
+  include-directives: # use glob syntax to match with header file path.
+    - '**CXString.h'
+    - '**Index.h'
+
+compiler-opts:
+  - '-I../../third_party/libclang/include'
+  - '-I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/'
+  - '-Wno-nullability-completeness'
+functions:
+  include:
+    - 'clang_.*' # Can be a regexp, '.' matches any character.
+  symbol-address:
+    include:
+      - 'clang_.*' # Symbol Address for these functions will be exposed via addresses.
+  expose-typedefs:
+    include:
+      - 'clang_.*' # Typedefs for Native and Dart type for these functions will be generated.
+structs:
+  include:
+      - 'CX.*'
+enums:
+  include:
+    - 'CXTypeKind' # Full names are given higher priority than regexp.
+    - 'CXGlobalOptFlags'
+
+library-imports:
+  custom_import: 'custom_import.dart'
+
+# These can be used to map any typedef to a specific native type.
+type-map:
+  typedefs:
+    'time_t':
+      lib: 'ffi'
+      c-type: 'Int64'
+      dart-type: 'int'
+  structs:
+    'CXCursorSetImpl':
+      lib: 'custom_import'
+      c-type: 'CXCursorSetImpl'
+      dart-type: 'CXCursorSetImpl'
+
+# Default is 'NativeLibrary'
+name: 'LibClang'
+
+description: 'Holds bindings to LibClang.'
+
+# Doc Comments for generated binings.
+# Comments can be disabled by using comments: false
+comments:
+  style: doxygen # Options - doxygen(default) / any.
+  length: full # Options - brief / full(default).
+
+# The header of the file, this is pasted as it is.
+preamble: |
+  // Part of the LLVM Project, under the Apache License v2.0 with LLVM
+  // Exceptions.
+  // See https://llvm.org/LICENSE.txt for license information.
+  // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+  // ignore_for_file: camel_case_types, non_constant_identifier_names
diff --git a/pkgs/ffigen/example/libclang-example/custom_import.dart b/pkgs/ffigen/example/libclang-example/custom_import.dart
new file mode 100644
index 0000000..df11af4
--- /dev/null
+++ b/pkgs/ffigen/example/libclang-example/custom_import.dart
@@ -0,0 +1,63 @@
+// Copyright (c) 2022, 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:ffi';
+
+/// Represents a native unsigned pointer-sized integer in C.
+///
+/// [UintPtr] is not constructible in the Dart code and serves purely as marker in
+/// type signatures.
+@AbiSpecificIntegerMapping({
+  Abi.androidArm: Uint32(),
+  Abi.androidArm64: Uint64(),
+  Abi.androidIA32: Uint32(),
+  Abi.androidX64: Uint64(),
+  Abi.fuchsiaArm64: Uint64(),
+  Abi.fuchsiaX64: Uint64(),
+  Abi.iosArm: Uint32(),
+  Abi.iosArm64: Uint64(),
+  Abi.iosX64: Uint64(),
+  Abi.linuxArm: Uint32(),
+  Abi.linuxArm64: Uint64(),
+  Abi.linuxIA32: Uint32(),
+  Abi.linuxX64: Uint64(),
+  Abi.macosArm64: Uint64(),
+  Abi.macosX64: Uint64(),
+  Abi.windowsArm64: Uint64(),
+  Abi.windowsIA32: Uint32(),
+  Abi.windowsX64: Uint64(),
+})
+class UintPtr extends AbiSpecificInteger {
+  const UintPtr();
+}
+
+/// `unsigned long` in C.
+///
+/// [UnsignedLong] is not constructible in the Dart code and serves purely as marker in
+/// type signatures.
+@AbiSpecificIntegerMapping({
+  Abi.androidArm: Uint32(),
+  Abi.androidArm64: Uint64(),
+  Abi.androidIA32: Uint32(),
+  Abi.androidX64: Uint64(),
+  Abi.fuchsiaArm64: Uint64(),
+  Abi.fuchsiaX64: Uint64(),
+  Abi.iosArm: Uint32(),
+  Abi.iosArm64: Uint64(),
+  Abi.iosX64: Uint64(),
+  Abi.linuxArm: Uint32(),
+  Abi.linuxArm64: Uint64(),
+  Abi.linuxIA32: Uint32(),
+  Abi.linuxX64: Uint64(),
+  Abi.macosArm64: Uint64(),
+  Abi.macosX64: Uint64(),
+  Abi.windowsArm64: Uint32(),
+  Abi.windowsIA32: Uint32(),
+  Abi.windowsX64: Uint32(),
+})
+class UnsignedLong extends AbiSpecificInteger {
+  const UnsignedLong();
+}
+
+class CXCursorSetImpl extends Opaque {}
diff --git a/pkgs/ffigen/example/libclang-example/generated_bindings.dart b/pkgs/ffigen/example/libclang-example/generated_bindings.dart
index 1c7c15b..800c580 100644
--- a/pkgs/ffigen/example/libclang-example/generated_bindings.dart
+++ b/pkgs/ffigen/example/libclang-example/generated_bindings.dart
@@ -8,7 +8,9 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 //
 // Generated by `package:ffigen`.
+// ignore_for_file: type=lint
 import 'dart:ffi' as ffi;
+import 'custom_import.dart' as custom_import;
 
 /// Holds bindings to LibClang.
 class LibClang {
@@ -26,7 +28,7 @@
       : _lookup = lookup;
 
   /// Retrieve the character data associated with the given string.
-  ffi.Pointer<ffi.Int8> clang_getCString(
+  ffi.Pointer<ffi.Char> clang_getCString(
     CXString string,
   ) {
     return _clang_getCString(
@@ -194,7 +196,7 @@
   /// libclang invocations are not logged..
   void clang_CXIndex_setInvocationEmissionPathOption(
     CXIndex arg0,
-    ffi.Pointer<ffi.Int8> Path,
+    ffi.Pointer<ffi.Char> Path,
   ) {
     return _clang_CXIndex_setInvocationEmissionPathOption(
       arg0,
@@ -290,7 +292,7 @@
   /// or a NULL file handle if the file was not a part of this translation unit.
   CXFile clang_getFile(
     CXTranslationUnit tu,
-    ffi.Pointer<ffi.Int8> file_name,
+    ffi.Pointer<ffi.Char> file_name,
   ) {
     return _clang_getFile(
       tu,
@@ -312,10 +314,10 @@
   ///
   /// \returns a pointer to the buffer in memory that holds the contents of
   /// \p file, or a NULL pointer when the file is not loaded.
-  ffi.Pointer<ffi.Int8> clang_getFileContents(
+  ffi.Pointer<ffi.Char> clang_getFileContents(
     CXTranslationUnit tu,
     CXFile file,
-    ffi.Pointer<ffi.IntPtr> size,
+    ffi.Pointer<ffi.Size> size,
   ) {
     return _clang_getFileContents(
       tu,
@@ -555,9 +557,9 @@
   void clang_getExpansionLocation(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset,
+    ffi.Pointer<ffi.UnsignedInt> line,
+    ffi.Pointer<ffi.UnsignedInt> column,
+    ffi.Pointer<ffi.UnsignedInt> offset,
   ) {
     return _clang_getExpansionLocation(
       location,
@@ -615,8 +617,8 @@
   void clang_getPresumedLocation(
     CXSourceLocation location,
     ffi.Pointer<CXString> filename,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
+    ffi.Pointer<ffi.UnsignedInt> line,
+    ffi.Pointer<ffi.UnsignedInt> column,
   ) {
     return _clang_getPresumedLocation(
       location,
@@ -641,9 +643,9 @@
   void clang_getInstantiationLocation(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset,
+    ffi.Pointer<ffi.UnsignedInt> line,
+    ffi.Pointer<ffi.UnsignedInt> column,
+    ffi.Pointer<ffi.UnsignedInt> offset,
   ) {
     return _clang_getInstantiationLocation(
       location,
@@ -684,9 +686,9 @@
   void clang_getSpellingLocation(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset,
+    ffi.Pointer<ffi.UnsignedInt> line,
+    ffi.Pointer<ffi.UnsignedInt> column,
+    ffi.Pointer<ffi.UnsignedInt> offset,
   ) {
     return _clang_getSpellingLocation(
       location,
@@ -727,9 +729,9 @@
   void clang_getFileLocation(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset,
+    ffi.Pointer<ffi.UnsignedInt> line,
+    ffi.Pointer<ffi.UnsignedInt> column,
+    ffi.Pointer<ffi.UnsignedInt> offset,
   ) {
     return _clang_getFileLocation(
       location,
@@ -881,7 +883,7 @@
   /// \returns A loaded CXDiagnosticSet if successful, and NULL otherwise.  These
   /// diagnostics should be released using clang_disposeDiagnosticSet().
   CXDiagnosticSet clang_loadDiagnostics(
-    ffi.Pointer<ffi.Int8> file,
+    ffi.Pointer<ffi.Char> file,
     ffi.Pointer<ffi.Int32> error,
     ffi.Pointer<CXString> errorString,
   ) {
@@ -1341,9 +1343,9 @@
   /// guarantee their validity until the call to this function returns.
   CXTranslationUnit clang_createTranslationUnitFromSourceFile(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> source_filename,
+    ffi.Pointer<ffi.Char> source_filename,
     int num_clang_command_line_args,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> clang_command_line_args,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> clang_command_line_args,
     int num_unsaved_files,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
   ) {
@@ -1370,7 +1372,7 @@
   /// error codes.
   CXTranslationUnit clang_createTranslationUnit(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> ast_filename,
+    ffi.Pointer<ffi.Char> ast_filename,
   ) {
     return _clang_createTranslationUnit(
       CIdx,
@@ -1392,7 +1394,7 @@
   /// \returns Zero on success, otherwise returns an error code.
   int clang_createTranslationUnit2(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> ast_filename,
+    ffi.Pointer<ffi.Char> ast_filename,
     ffi.Pointer<CXTranslationUnit> out_TU,
   ) {
     return _clang_createTranslationUnit2(
@@ -1435,8 +1437,8 @@
   /// error codes.
   CXTranslationUnit clang_parseTranslationUnit(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    ffi.Pointer<ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> command_line_args,
     int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     int num_unsaved_files,
@@ -1503,8 +1505,8 @@
   /// \returns Zero on success, otherwise returns an error code.
   int clang_parseTranslationUnit2(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    ffi.Pointer<ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> command_line_args,
     int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     int num_unsaved_files,
@@ -1534,8 +1536,8 @@
   /// library paths are relative to the binary.
   int clang_parseTranslationUnit2FullArgv(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    ffi.Pointer<ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> command_line_args,
     int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     int num_unsaved_files,
@@ -1605,7 +1607,7 @@
   /// saved successfully, while a non-zero value indicates that a problem occurred.
   int clang_saveTranslationUnit(
     CXTranslationUnit TU,
-    ffi.Pointer<ffi.Int8> FileName,
+    ffi.Pointer<ffi.Char> FileName,
     int options,
   ) {
     return _clang_saveTranslationUnit(
@@ -1736,7 +1738,7 @@
 
   /// Returns the human-readable null-terminated C string that represents
   /// the name of the memory category.  This string should never be freed.
-  ffi.Pointer<ffi.Int8> clang_getTUResourceUsageName(
+  ffi.Pointer<ffi.Char> clang_getTUResourceUsageName(
     int kind,
   ) {
     return _clang_getTUResourceUsageName(
@@ -2208,9 +2210,9 @@
   /// \c min(N, availability_size) such structures.
   int clang_getCursorPlatformAvailability(
     CXCursor cursor,
-    ffi.Pointer<ffi.Int32> always_deprecated,
+    ffi.Pointer<ffi.Int> always_deprecated,
     ffi.Pointer<CXString> deprecated_message,
-    ffi.Pointer<ffi.Int32> always_unavailable,
+    ffi.Pointer<ffi.Int> always_unavailable,
     ffi.Pointer<CXString> unavailable_message,
     ffi.Pointer<CXPlatformAvailability> availability,
     int availability_size,
@@ -2495,7 +2497,7 @@
   void clang_getOverriddenCursors(
     CXCursor cursor,
     ffi.Pointer<ffi.Pointer<CXCursor>> overridden,
-    ffi.Pointer<ffi.Uint32> num_overridden,
+    ffi.Pointer<ffi.UnsignedInt> num_overridden,
   ) {
     return _clang_getOverriddenCursors(
       cursor,
@@ -3637,7 +3639,7 @@
   /// CXTypeLayoutError_InvalidFieldName is returned.
   int clang_Type_getOffsetOf(
     CXType T,
-    ffi.Pointer<ffi.Int8> S,
+    ffi.Pointer<ffi.Char> S,
   ) {
     return _clang_Type_getOffsetOf(
       T,
@@ -3996,7 +3998,7 @@
 
   /// Construct a USR for a specified Objective-C class.
   CXString clang_constructUSR_ObjCClass(
-    ffi.Pointer<ffi.Int8> class_name,
+    ffi.Pointer<ffi.Char> class_name,
   ) {
     return _clang_constructUSR_ObjCClass(
       class_name,
@@ -4011,8 +4013,8 @@
 
   /// Construct a USR for a specified Objective-C category.
   CXString clang_constructUSR_ObjCCategory(
-    ffi.Pointer<ffi.Int8> class_name,
-    ffi.Pointer<ffi.Int8> category_name,
+    ffi.Pointer<ffi.Char> class_name,
+    ffi.Pointer<ffi.Char> category_name,
   ) {
     return _clang_constructUSR_ObjCCategory(
       class_name,
@@ -4029,7 +4031,7 @@
 
   /// Construct a USR for a specified Objective-C protocol.
   CXString clang_constructUSR_ObjCProtocol(
-    ffi.Pointer<ffi.Int8> protocol_name,
+    ffi.Pointer<ffi.Char> protocol_name,
   ) {
     return _clang_constructUSR_ObjCProtocol(
       protocol_name,
@@ -4046,7 +4048,7 @@
   /// Construct a USR for a specified Objective-C instance variable and
   /// the USR for its containing class.
   CXString clang_constructUSR_ObjCIvar(
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<ffi.Char> name,
     CXString classUSR,
   ) {
     return _clang_constructUSR_ObjCIvar(
@@ -4064,7 +4066,7 @@
   /// Construct a USR for a specified Objective-C method and
   /// the USR for its containing class.
   CXString clang_constructUSR_ObjCMethod(
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<ffi.Char> name,
     int isInstanceMethod,
     CXString classUSR,
   ) {
@@ -4084,7 +4086,7 @@
   /// Construct a USR for a specified Objective-C property and the USR
   /// for its containing class.
   CXString clang_constructUSR_ObjCProperty(
-    ffi.Pointer<ffi.Int8> property,
+    ffi.Pointer<ffi.Char> property,
     CXString classUSR,
   ) {
     return _clang_constructUSR_ObjCProperty(
@@ -4558,7 +4560,7 @@
     CXCursor C,
     ffi.Pointer<CXString> language,
     ffi.Pointer<CXString> definedIn,
-    ffi.Pointer<ffi.Uint32> isGenerated,
+    ffi.Pointer<ffi.UnsignedInt> isGenerated,
   ) {
     return _clang_Cursor_isExternalSymbol(
       C,
@@ -5244,7 +5246,7 @@
     CXTranslationUnit TU,
     CXSourceRange Range,
     ffi.Pointer<ffi.Pointer<CXToken>> Tokens,
-    ffi.Pointer<ffi.Uint32> NumTokens,
+    ffi.Pointer<ffi.UnsignedInt> NumTokens,
   ) {
     return _clang_tokenize(
       TU,
@@ -5348,12 +5350,12 @@
 
   void clang_getDefinitionSpellingAndExtent(
     CXCursor arg0,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> startBuf,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> endBuf,
-    ffi.Pointer<ffi.Uint32> startLine,
-    ffi.Pointer<ffi.Uint32> startColumn,
-    ffi.Pointer<ffi.Uint32> endLine,
-    ffi.Pointer<ffi.Uint32> endColumn,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> startBuf,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> endBuf,
+    ffi.Pointer<ffi.UnsignedInt> startLine,
+    ffi.Pointer<ffi.UnsignedInt> startColumn,
+    ffi.Pointer<ffi.UnsignedInt> endLine,
+    ffi.Pointer<ffi.UnsignedInt> endColumn,
   ) {
     return _clang_getDefinitionSpellingAndExtent(
       arg0,
@@ -5820,7 +5822,7 @@
   /// completion fails, returns NULL.
   ffi.Pointer<CXCodeCompleteResults> clang_codeCompleteAt(
     CXTranslationUnit TU,
-    ffi.Pointer<ffi.Int8> complete_filename,
+    ffi.Pointer<ffi.Char> complete_filename,
     int complete_line,
     int complete_column,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
@@ -5960,7 +5962,7 @@
   /// container
   int clang_codeCompleteGetContainerKind(
     ffi.Pointer<CXCodeCompleteResults> Results,
-    ffi.Pointer<ffi.Uint32> IsIncomplete,
+    ffi.Pointer<ffi.UnsignedInt> IsIncomplete,
   ) {
     return _clang_codeCompleteGetContainerKind(
       Results,
@@ -6193,7 +6195,7 @@
   /// kind is other than Int or float. User must not free this pointer,
   /// instead call clang_EvalResult_dispose on the CXEvalResult returned
   /// by clang_Cursor_Evaluate.
-  ffi.Pointer<ffi.Int8> clang_EvalResult_getAsStr(
+  ffi.Pointer<ffi.Char> clang_EvalResult_getAsStr(
     CXEvalResult E,
   ) {
     return _clang_EvalResult_getAsStr(
@@ -6229,7 +6231,7 @@
   /// \returns the requested remapping. This remapping must be freed
   /// via a call to \c clang_remap_dispose(). Can return NULL if an error occurred.
   CXRemapping clang_getRemappings(
-    ffi.Pointer<ffi.Int8> path,
+    ffi.Pointer<ffi.Char> path,
   ) {
     return _clang_getRemappings(
       path,
@@ -6251,7 +6253,7 @@
   /// \returns the requested remapping. This remapping must be freed
   /// via a call to \c clang_remap_dispose(). Can return NULL if an error occurred.
   CXRemapping clang_getRemappingsFromFileList(
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> filePaths,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> filePaths,
     int numFiles,
   ) {
     return _clang_getRemappingsFromFileList(
@@ -6636,8 +6638,8 @@
     ffi.Pointer<IndexerCallbacks> index_callbacks,
     int index_callbacks_size,
     int index_options,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    ffi.Pointer<ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> command_line_args,
     int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     int num_unsaved_files,
@@ -6675,8 +6677,8 @@
     ffi.Pointer<IndexerCallbacks> index_callbacks,
     int index_callbacks_size,
     int index_options,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    ffi.Pointer<ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> command_line_args,
     int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     int num_unsaved_files,
@@ -6753,9 +6755,9 @@
     CXIdxLoc loc,
     ffi.Pointer<CXIdxClientFile> indexFile,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset,
+    ffi.Pointer<ffi.UnsignedInt> line,
+    ffi.Pointer<ffi.UnsignedInt> column,
+    ffi.Pointer<ffi.UnsignedInt> offset,
   ) {
     return _clang_indexLoc_getFileLocation(
       loc,
@@ -7648,20 +7650,20 @@
 class CXString extends ffi.Struct {
   external ffi.Pointer<ffi.Void> data;
 
-  @ffi.Uint32()
+  @ffi.UnsignedInt()
   external int private_flags;
 }
 
 class CXStringSet extends ffi.Struct {
   external ffi.Pointer<CXString> Strings;
 
-  @ffi.Uint32()
+  @ffi.UnsignedInt()
   external int Count;
 }
 
-typedef NativeClang_getCString = ffi.Pointer<ffi.Int8> Function(
+typedef NativeClang_getCString = ffi.Pointer<ffi.Char> Function(
     CXString string);
-typedef DartClang_getCString = ffi.Pointer<ffi.Int8> Function(CXString string);
+typedef DartClang_getCString = ffi.Pointer<ffi.Char> Function(CXString string);
 typedef NativeClang_disposeString = ffi.Void Function(CXString string);
 typedef DartClang_disposeString = void Function(CXString string);
 typedef NativeClang_disposeStringSet = ffi.Void Function(
@@ -7682,13 +7684,13 @@
   /// The file whose contents have not yet been saved.
   ///
   /// This file must already exist in the file system.
-  external ffi.Pointer<ffi.Int8> Filename;
+  external ffi.Pointer<ffi.Char> Filename;
 
   /// A buffer containing the unsaved contents of this file.
-  external ffi.Pointer<ffi.Int8> Contents;
+  external ffi.Pointer<ffi.Char> Contents;
 
   /// The length of the unsaved contents of this buffer.
-  @ffi.Uint64()
+  @ffi.UnsignedLong()
   external int Length;
 }
 
@@ -7696,19 +7698,19 @@
 class CXVersion extends ffi.Struct {
   /// The major version number, e.g., the '10' in '10.7.3'. A negative
   /// value indicates that there is no version number at all.
-  @ffi.Int32()
+  @ffi.Int()
   external int Major;
 
   /// The minor version number, e.g., the '7' in '10.7.3'. This value
   /// will be negative if no minor version number was provided, e.g., for
   /// version '10'.
-  @ffi.Int32()
+  @ffi.Int()
   external int Minor;
 
   /// The subminor version number, e.g., the '3' in '10.7.3'. This value
   /// will be negative if no minor or subminor version number was provided,
   /// e.g., in version '10' or '10.7'.
-  @ffi.Int32()
+  @ffi.Int()
   external int Subminor;
 }
 
@@ -7716,7 +7718,7 @@
 /// typically be linked together into an executable or library.
 typedef CXIndex = ffi.Pointer<ffi.Void>;
 typedef NativeClang_createIndex = CXIndex Function(
-    ffi.Int32 excludeDeclarationsFromPCH, ffi.Int32 displayDiagnostics);
+    ffi.Int excludeDeclarationsFromPCH, ffi.Int displayDiagnostics);
 typedef DartClang_createIndex = CXIndex Function(
     int excludeDeclarationsFromPCH, int displayDiagnostics);
 typedef NativeClang_disposeIndex = ffi.Void Function(CXIndex index);
@@ -7746,16 +7748,16 @@
 }
 
 typedef NativeClang_CXIndex_setGlobalOptions = ffi.Void Function(
-    CXIndex arg0, ffi.Uint32 options);
+    CXIndex arg0, ffi.UnsignedInt options);
 typedef DartClang_CXIndex_setGlobalOptions = void Function(
     CXIndex arg0, int options);
-typedef NativeClang_CXIndex_getGlobalOptions = ffi.Uint32 Function(
+typedef NativeClang_CXIndex_getGlobalOptions = ffi.UnsignedInt Function(
     CXIndex arg0);
 typedef DartClang_CXIndex_getGlobalOptions = int Function(CXIndex arg0);
 typedef NativeClang_CXIndex_setInvocationEmissionPathOption = ffi.Void Function(
-    CXIndex arg0, ffi.Pointer<ffi.Int8> Path);
+    CXIndex arg0, ffi.Pointer<ffi.Char> Path);
 typedef DartClang_CXIndex_setInvocationEmissionPathOption = void Function(
-    CXIndex arg0, ffi.Pointer<ffi.Int8> Path);
+    CXIndex arg0, ffi.Pointer<ffi.Char> Path);
 
 /// A particular source file that is part of a translation unit.
 typedef CXFile = ffi.Pointer<ffi.Void>;
@@ -7768,30 +7770,29 @@
 /// across an indexing session.
 class CXFileUniqueID extends ffi.Struct {
   @ffi.Array.multi([3])
-  external ffi.Array<ffi.Uint64> data;
+  external ffi.Array<ffi.UnsignedLongLong> data;
 }
 
-typedef NativeClang_getFileUniqueID = ffi.Int32 Function(
+typedef NativeClang_getFileUniqueID = ffi.Int Function(
     CXFile file, ffi.Pointer<CXFileUniqueID> outID);
 typedef DartClang_getFileUniqueID = int Function(
     CXFile file, ffi.Pointer<CXFileUniqueID> outID);
 
 /// A single translation unit, which resides in an index.
 typedef CXTranslationUnit = ffi.Pointer<CXTranslationUnitImpl>;
-typedef NativeClang_isFileMultipleIncludeGuarded = ffi.Uint32 Function(
+typedef NativeClang_isFileMultipleIncludeGuarded = ffi.UnsignedInt Function(
     CXTranslationUnit tu, CXFile file);
 typedef DartClang_isFileMultipleIncludeGuarded = int Function(
     CXTranslationUnit tu, CXFile file);
 typedef NativeClang_getFile = CXFile Function(
-    CXTranslationUnit tu, ffi.Pointer<ffi.Int8> file_name);
+    CXTranslationUnit tu, ffi.Pointer<ffi.Char> file_name);
 typedef DartClang_getFile = CXFile Function(
-    CXTranslationUnit tu, ffi.Pointer<ffi.Int8> file_name);
-typedef NativeClang_getFileContents = ffi.Pointer<ffi.Int8> Function(
-    CXTranslationUnit tu, CXFile file, ffi.Pointer<ffi.IntPtr> size);
-typedef DartClang_getFileContents = ffi.Pointer<ffi.Int8> Function(
-    CXTranslationUnit tu, CXFile file, ffi.Pointer<ffi.IntPtr> size);
-typedef NativeClang_File_isEqual = ffi.Int32 Function(
-    CXFile file1, CXFile file2);
+    CXTranslationUnit tu, ffi.Pointer<ffi.Char> file_name);
+typedef NativeClang_getFileContents = ffi.Pointer<ffi.Char> Function(
+    CXTranslationUnit tu, CXFile file, ffi.Pointer<ffi.Size> size);
+typedef DartClang_getFileContents = ffi.Pointer<ffi.Char> Function(
+    CXTranslationUnit tu, CXFile file, ffi.Pointer<ffi.Size> size);
+typedef NativeClang_File_isEqual = ffi.Int Function(CXFile file1, CXFile file2);
 typedef DartClang_File_isEqual = int Function(CXFile file1, CXFile file2);
 typedef NativeClang_File_tryGetRealPathName = CXString Function(CXFile file);
 typedef DartClang_File_tryGetRealPathName = CXString Function(CXFile file);
@@ -7805,7 +7806,7 @@
   @ffi.Array.multi([2])
   external ffi.Array<ffi.Pointer<ffi.Void>> ptr_data;
 
-  @ffi.Uint32()
+  @ffi.UnsignedInt()
   external int int_data;
 }
 
@@ -7817,32 +7818,35 @@
   @ffi.Array.multi([2])
   external ffi.Array<ffi.Pointer<ffi.Void>> ptr_data;
 
-  @ffi.Uint32()
+  @ffi.UnsignedInt()
   external int begin_int_data;
 
-  @ffi.Uint32()
+  @ffi.UnsignedInt()
   external int end_int_data;
 }
 
 typedef NativeClang_getNullLocation = CXSourceLocation Function();
 typedef DartClang_getNullLocation = CXSourceLocation Function();
-typedef NativeClang_equalLocations = ffi.Uint32 Function(
+typedef NativeClang_equalLocations = ffi.UnsignedInt Function(
     CXSourceLocation loc1, CXSourceLocation loc2);
 typedef DartClang_equalLocations = int Function(
     CXSourceLocation loc1, CXSourceLocation loc2);
 typedef NativeClang_getLocation = CXSourceLocation Function(
-    CXTranslationUnit tu, CXFile file, ffi.Uint32 line, ffi.Uint32 column);
+    CXTranslationUnit tu,
+    CXFile file,
+    ffi.UnsignedInt line,
+    ffi.UnsignedInt column);
 typedef DartClang_getLocation = CXSourceLocation Function(
     CXTranslationUnit tu, CXFile file, int line, int column);
 typedef NativeClang_getLocationForOffset = CXSourceLocation Function(
-    CXTranslationUnit tu, CXFile file, ffi.Uint32 offset);
+    CXTranslationUnit tu, CXFile file, ffi.UnsignedInt offset);
 typedef DartClang_getLocationForOffset = CXSourceLocation Function(
     CXTranslationUnit tu, CXFile file, int offset);
-typedef NativeClang_Location_isInSystemHeader = ffi.Int32 Function(
+typedef NativeClang_Location_isInSystemHeader = ffi.Int Function(
     CXSourceLocation location);
 typedef DartClang_Location_isInSystemHeader = int Function(
     CXSourceLocation location);
-typedef NativeClang_Location_isFromMainFile = ffi.Int32 Function(
+typedef NativeClang_Location_isFromMainFile = ffi.Int Function(
     CXSourceLocation location);
 typedef DartClang_Location_isFromMainFile = int Function(
     CXSourceLocation location);
@@ -7852,70 +7856,70 @@
     CXSourceLocation begin, CXSourceLocation end);
 typedef DartClang_getRange = CXSourceRange Function(
     CXSourceLocation begin, CXSourceLocation end);
-typedef NativeClang_equalRanges = ffi.Uint32 Function(
+typedef NativeClang_equalRanges = ffi.UnsignedInt Function(
     CXSourceRange range1, CXSourceRange range2);
 typedef DartClang_equalRanges = int Function(
     CXSourceRange range1, CXSourceRange range2);
-typedef NativeClang_Range_isNull = ffi.Int32 Function(CXSourceRange range);
+typedef NativeClang_Range_isNull = ffi.Int Function(CXSourceRange range);
 typedef DartClang_Range_isNull = int Function(CXSourceRange range);
 typedef NativeClang_getExpansionLocation = ffi.Void Function(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset);
+    ffi.Pointer<ffi.UnsignedInt> line,
+    ffi.Pointer<ffi.UnsignedInt> column,
+    ffi.Pointer<ffi.UnsignedInt> offset);
 typedef DartClang_getExpansionLocation = void Function(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset);
+    ffi.Pointer<ffi.UnsignedInt> line,
+    ffi.Pointer<ffi.UnsignedInt> column,
+    ffi.Pointer<ffi.UnsignedInt> offset);
 typedef NativeClang_getPresumedLocation = ffi.Void Function(
     CXSourceLocation location,
     ffi.Pointer<CXString> filename,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column);
+    ffi.Pointer<ffi.UnsignedInt> line,
+    ffi.Pointer<ffi.UnsignedInt> column);
 typedef DartClang_getPresumedLocation = void Function(
     CXSourceLocation location,
     ffi.Pointer<CXString> filename,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column);
+    ffi.Pointer<ffi.UnsignedInt> line,
+    ffi.Pointer<ffi.UnsignedInt> column);
 typedef NativeClang_getInstantiationLocation = ffi.Void Function(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset);
+    ffi.Pointer<ffi.UnsignedInt> line,
+    ffi.Pointer<ffi.UnsignedInt> column,
+    ffi.Pointer<ffi.UnsignedInt> offset);
 typedef DartClang_getInstantiationLocation = void Function(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset);
+    ffi.Pointer<ffi.UnsignedInt> line,
+    ffi.Pointer<ffi.UnsignedInt> column,
+    ffi.Pointer<ffi.UnsignedInt> offset);
 typedef NativeClang_getSpellingLocation = ffi.Void Function(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset);
+    ffi.Pointer<ffi.UnsignedInt> line,
+    ffi.Pointer<ffi.UnsignedInt> column,
+    ffi.Pointer<ffi.UnsignedInt> offset);
 typedef DartClang_getSpellingLocation = void Function(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset);
+    ffi.Pointer<ffi.UnsignedInt> line,
+    ffi.Pointer<ffi.UnsignedInt> column,
+    ffi.Pointer<ffi.UnsignedInt> offset);
 typedef NativeClang_getFileLocation = ffi.Void Function(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset);
+    ffi.Pointer<ffi.UnsignedInt> line,
+    ffi.Pointer<ffi.UnsignedInt> column,
+    ffi.Pointer<ffi.UnsignedInt> offset);
 typedef DartClang_getFileLocation = void Function(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset);
+    ffi.Pointer<ffi.UnsignedInt> line,
+    ffi.Pointer<ffi.UnsignedInt> column,
+    ffi.Pointer<ffi.UnsignedInt> offset);
 typedef NativeClang_getRangeStart = CXSourceLocation Function(
     CXSourceRange range);
 typedef DartClang_getRangeStart = CXSourceLocation Function(
@@ -7927,7 +7931,7 @@
 /// Identifies an array of ranges.
 class CXSourceRangeList extends ffi.Struct {
   /// The number of ranges in the \c ranges array.
-  @ffi.Uint32()
+  @ffi.UnsignedInt()
   external int count;
 
   /// An array of \c CXSourceRanges.
@@ -7949,7 +7953,7 @@
 
 /// A group of CXDiagnostics.
 typedef CXDiagnosticSet = ffi.Pointer<ffi.Void>;
-typedef NativeClang_getNumDiagnosticsInSet = ffi.Uint32 Function(
+typedef NativeClang_getNumDiagnosticsInSet = ffi.UnsignedInt Function(
     CXDiagnosticSet Diags);
 typedef DartClang_getNumDiagnosticsInSet = int Function(CXDiagnosticSet Diags);
 
@@ -7957,7 +7961,7 @@
 /// location, text, source ranges, and fix-it hints.
 typedef CXDiagnostic = ffi.Pointer<ffi.Void>;
 typedef NativeClang_getDiagnosticInSet = CXDiagnostic Function(
-    CXDiagnosticSet Diags, ffi.Uint32 Index);
+    CXDiagnosticSet Diags, ffi.UnsignedInt Index);
 typedef DartClang_getDiagnosticInSet = CXDiagnostic Function(
     CXDiagnosticSet Diags, int Index);
 
@@ -7981,11 +7985,11 @@
 }
 
 typedef NativeClang_loadDiagnostics = CXDiagnosticSet Function(
-    ffi.Pointer<ffi.Int8> file,
+    ffi.Pointer<ffi.Char> file,
     ffi.Pointer<ffi.Int32> error,
     ffi.Pointer<CXString> errorString);
 typedef DartClang_loadDiagnostics = CXDiagnosticSet Function(
-    ffi.Pointer<ffi.Int8> file,
+    ffi.Pointer<ffi.Char> file,
     ffi.Pointer<ffi.Int32> error,
     ffi.Pointer<CXString> errorString);
 typedef NativeClang_disposeDiagnosticSet = ffi.Void Function(
@@ -7995,11 +7999,11 @@
     CXDiagnostic D);
 typedef DartClang_getChildDiagnostics = CXDiagnosticSet Function(
     CXDiagnostic D);
-typedef NativeClang_getNumDiagnostics = ffi.Uint32 Function(
+typedef NativeClang_getNumDiagnostics = ffi.UnsignedInt Function(
     CXTranslationUnit Unit);
 typedef DartClang_getNumDiagnostics = int Function(CXTranslationUnit Unit);
 typedef NativeClang_getDiagnostic = CXDiagnostic Function(
-    CXTranslationUnit Unit, ffi.Uint32 Index);
+    CXTranslationUnit Unit, ffi.UnsignedInt Index);
 typedef DartClang_getDiagnostic = CXDiagnostic Function(
     CXTranslationUnit Unit, int Index);
 typedef NativeClang_getDiagnosticSetFromTU = CXDiagnosticSet Function(
@@ -8010,10 +8014,11 @@
     CXDiagnostic Diagnostic);
 typedef DartClang_disposeDiagnostic = void Function(CXDiagnostic Diagnostic);
 typedef NativeClang_formatDiagnostic = CXString Function(
-    CXDiagnostic Diagnostic, ffi.Uint32 Options);
+    CXDiagnostic Diagnostic, ffi.UnsignedInt Options);
 typedef DartClang_formatDiagnostic = CXString Function(
     CXDiagnostic Diagnostic, int Options);
-typedef NativeClang_defaultDiagnosticDisplayOptions = ffi.Uint32 Function();
+typedef NativeClang_defaultDiagnosticDisplayOptions = ffi.UnsignedInt
+    Function();
 typedef DartClang_defaultDiagnosticDisplayOptions = int Function();
 
 /// Describes the severity of a particular diagnostic.
@@ -8053,30 +8058,30 @@
     CXDiagnostic Diag, ffi.Pointer<CXString> Disable);
 typedef DartClang_getDiagnosticOption = CXString Function(
     CXDiagnostic Diag, ffi.Pointer<CXString> Disable);
-typedef NativeClang_getDiagnosticCategory = ffi.Uint32 Function(
+typedef NativeClang_getDiagnosticCategory = ffi.UnsignedInt Function(
     CXDiagnostic arg0);
 typedef DartClang_getDiagnosticCategory = int Function(CXDiagnostic arg0);
 typedef NativeClang_getDiagnosticCategoryName = CXString Function(
-    ffi.Uint32 Category);
+    ffi.UnsignedInt Category);
 typedef DartClang_getDiagnosticCategoryName = CXString Function(int Category);
 typedef NativeClang_getDiagnosticCategoryText = CXString Function(
     CXDiagnostic arg0);
 typedef DartClang_getDiagnosticCategoryText = CXString Function(
     CXDiagnostic arg0);
-typedef NativeClang_getDiagnosticNumRanges = ffi.Uint32 Function(
+typedef NativeClang_getDiagnosticNumRanges = ffi.UnsignedInt Function(
     CXDiagnostic arg0);
 typedef DartClang_getDiagnosticNumRanges = int Function(CXDiagnostic arg0);
 typedef NativeClang_getDiagnosticRange = CXSourceRange Function(
-    CXDiagnostic Diagnostic, ffi.Uint32 Range);
+    CXDiagnostic Diagnostic, ffi.UnsignedInt Range);
 typedef DartClang_getDiagnosticRange = CXSourceRange Function(
     CXDiagnostic Diagnostic, int Range);
-typedef NativeClang_getDiagnosticNumFixIts = ffi.Uint32 Function(
+typedef NativeClang_getDiagnosticNumFixIts = ffi.UnsignedInt Function(
     CXDiagnostic Diagnostic);
 typedef DartClang_getDiagnosticNumFixIts = int Function(
     CXDiagnostic Diagnostic);
 typedef NativeClang_getDiagnosticFixIt = CXString Function(
     CXDiagnostic Diagnostic,
-    ffi.Uint32 FixIt,
+    ffi.UnsignedInt FixIt,
     ffi.Pointer<CXSourceRange> ReplacementRange);
 typedef DartClang_getDiagnosticFixIt = CXString Function(
     CXDiagnostic Diagnostic,
@@ -8089,23 +8094,23 @@
 typedef NativeClang_createTranslationUnitFromSourceFile
     = CXTranslationUnit Function(
         CXIndex CIdx,
-        ffi.Pointer<ffi.Int8> source_filename,
-        ffi.Int32 num_clang_command_line_args,
-        ffi.Pointer<ffi.Pointer<ffi.Int8>> clang_command_line_args,
-        ffi.Uint32 num_unsaved_files,
+        ffi.Pointer<ffi.Char> source_filename,
+        ffi.Int num_clang_command_line_args,
+        ffi.Pointer<ffi.Pointer<ffi.Char>> clang_command_line_args,
+        ffi.UnsignedInt num_unsaved_files,
         ffi.Pointer<CXUnsavedFile> unsaved_files);
 typedef DartClang_createTranslationUnitFromSourceFile
     = CXTranslationUnit Function(
         CXIndex CIdx,
-        ffi.Pointer<ffi.Int8> source_filename,
+        ffi.Pointer<ffi.Char> source_filename,
         int num_clang_command_line_args,
-        ffi.Pointer<ffi.Pointer<ffi.Int8>> clang_command_line_args,
+        ffi.Pointer<ffi.Pointer<ffi.Char>> clang_command_line_args,
         int num_unsaved_files,
         ffi.Pointer<CXUnsavedFile> unsaved_files);
 typedef NativeClang_createTranslationUnit = CXTranslationUnit Function(
-    CXIndex CIdx, ffi.Pointer<ffi.Int8> ast_filename);
+    CXIndex CIdx, ffi.Pointer<ffi.Char> ast_filename);
 typedef DartClang_createTranslationUnit = CXTranslationUnit Function(
-    CXIndex CIdx, ffi.Pointer<ffi.Int8> ast_filename);
+    CXIndex CIdx, ffi.Pointer<ffi.Char> ast_filename);
 
 /// Error codes returned by libclang routines.
 ///
@@ -8133,41 +8138,41 @@
 }
 
 typedef NativeClang_createTranslationUnit2 = ffi.Int32 Function(CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> ast_filename, ffi.Pointer<CXTranslationUnit> out_TU);
+    ffi.Pointer<ffi.Char> ast_filename, ffi.Pointer<CXTranslationUnit> out_TU);
 typedef DartClang_createTranslationUnit2 = int Function(CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> ast_filename, ffi.Pointer<CXTranslationUnit> out_TU);
-typedef NativeClang_defaultEditingTranslationUnitOptions = ffi.Uint32
+    ffi.Pointer<ffi.Char> ast_filename, ffi.Pointer<CXTranslationUnit> out_TU);
+typedef NativeClang_defaultEditingTranslationUnitOptions = ffi.UnsignedInt
     Function();
 typedef DartClang_defaultEditingTranslationUnitOptions = int Function();
 typedef NativeClang_parseTranslationUnit = CXTranslationUnit Function(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
-    ffi.Int32 num_command_line_args,
+    ffi.Pointer<ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> command_line_args,
+    ffi.Int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
-    ffi.Uint32 num_unsaved_files,
-    ffi.Uint32 options);
+    ffi.UnsignedInt num_unsaved_files,
+    ffi.UnsignedInt options);
 typedef DartClang_parseTranslationUnit = CXTranslationUnit Function(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    ffi.Pointer<ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> command_line_args,
     int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     int num_unsaved_files,
     int options);
 typedef NativeClang_parseTranslationUnit2 = ffi.Int32 Function(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
-    ffi.Int32 num_command_line_args,
+    ffi.Pointer<ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> command_line_args,
+    ffi.Int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
-    ffi.Uint32 num_unsaved_files,
-    ffi.Uint32 options,
+    ffi.UnsignedInt num_unsaved_files,
+    ffi.UnsignedInt options,
     ffi.Pointer<CXTranslationUnit> out_TU);
 typedef DartClang_parseTranslationUnit2 = int Function(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    ffi.Pointer<ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> command_line_args,
     int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     int num_unsaved_files,
@@ -8175,44 +8180,44 @@
     ffi.Pointer<CXTranslationUnit> out_TU);
 typedef NativeClang_parseTranslationUnit2FullArgv = ffi.Int32 Function(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
-    ffi.Int32 num_command_line_args,
+    ffi.Pointer<ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> command_line_args,
+    ffi.Int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
-    ffi.Uint32 num_unsaved_files,
-    ffi.Uint32 options,
+    ffi.UnsignedInt num_unsaved_files,
+    ffi.UnsignedInt options,
     ffi.Pointer<CXTranslationUnit> out_TU);
 typedef DartClang_parseTranslationUnit2FullArgv = int Function(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    ffi.Pointer<ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> command_line_args,
     int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     int num_unsaved_files,
     int options,
     ffi.Pointer<CXTranslationUnit> out_TU);
-typedef NativeClang_defaultSaveOptions = ffi.Uint32 Function(
+typedef NativeClang_defaultSaveOptions = ffi.UnsignedInt Function(
     CXTranslationUnit TU);
 typedef DartClang_defaultSaveOptions = int Function(CXTranslationUnit TU);
-typedef NativeClang_saveTranslationUnit = ffi.Int32 Function(
-    CXTranslationUnit TU, ffi.Pointer<ffi.Int8> FileName, ffi.Uint32 options);
+typedef NativeClang_saveTranslationUnit = ffi.Int Function(CXTranslationUnit TU,
+    ffi.Pointer<ffi.Char> FileName, ffi.UnsignedInt options);
 typedef DartClang_saveTranslationUnit = int Function(
-    CXTranslationUnit TU, ffi.Pointer<ffi.Int8> FileName, int options);
-typedef NativeClang_suspendTranslationUnit = ffi.Uint32 Function(
+    CXTranslationUnit TU, ffi.Pointer<ffi.Char> FileName, int options);
+typedef NativeClang_suspendTranslationUnit = ffi.UnsignedInt Function(
     CXTranslationUnit arg0);
 typedef DartClang_suspendTranslationUnit = int Function(CXTranslationUnit arg0);
 typedef NativeClang_disposeTranslationUnit = ffi.Void Function(
     CXTranslationUnit arg0);
 typedef DartClang_disposeTranslationUnit = void Function(
     CXTranslationUnit arg0);
-typedef NativeClang_defaultReparseOptions = ffi.Uint32 Function(
+typedef NativeClang_defaultReparseOptions = ffi.UnsignedInt Function(
     CXTranslationUnit TU);
 typedef DartClang_defaultReparseOptions = int Function(CXTranslationUnit TU);
-typedef NativeClang_reparseTranslationUnit = ffi.Int32 Function(
+typedef NativeClang_reparseTranslationUnit = ffi.Int Function(
     CXTranslationUnit TU,
-    ffi.Uint32 num_unsaved_files,
+    ffi.UnsignedInt num_unsaved_files,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
-    ffi.Uint32 options);
+    ffi.UnsignedInt options);
 typedef DartClang_reparseTranslationUnit = int Function(
     CXTranslationUnit TU,
     int num_unsaved_files,
@@ -8241,16 +8246,16 @@
   static const int CXTUResourceUsage_Last = 14;
 }
 
-typedef NativeClang_getTUResourceUsageName = ffi.Pointer<ffi.Int8> Function(
+typedef NativeClang_getTUResourceUsageName = ffi.Pointer<ffi.Char> Function(
     ffi.Int32 kind);
-typedef DartClang_getTUResourceUsageName = ffi.Pointer<ffi.Int8> Function(
+typedef DartClang_getTUResourceUsageName = ffi.Pointer<ffi.Char> Function(
     int kind);
 
 class CXTUResourceUsageEntry extends ffi.Struct {
   @ffi.Int32()
   external int kind;
 
-  @ffi.Uint64()
+  @ffi.UnsignedLong()
   external int amount;
 }
 
@@ -8258,7 +8263,7 @@
 class CXTUResourceUsage extends ffi.Struct {
   external ffi.Pointer<ffi.Void> data;
 
-  @ffi.Uint32()
+  @ffi.UnsignedInt()
   external int numEntries;
 
   external ffi.Pointer<CXTUResourceUsageEntry> entries;
@@ -8284,7 +8289,7 @@
 typedef DartClang_TargetInfo_dispose = void Function(CXTargetInfo Info);
 typedef NativeClang_TargetInfo_getTriple = CXString Function(CXTargetInfo Info);
 typedef DartClang_TargetInfo_getTriple = CXString Function(CXTargetInfo Info);
-typedef NativeClang_TargetInfo_getPointerWidth = ffi.Int32 Function(
+typedef NativeClang_TargetInfo_getPointerWidth = ffi.Int Function(
     CXTargetInfo Info);
 typedef DartClang_TargetInfo_getPointerWidth = int Function(CXTargetInfo Info);
 
@@ -8308,7 +8313,7 @@
   @ffi.Int32()
   external int kind;
 
-  @ffi.Int32()
+  @ffi.Int()
   external int xdata;
 
   @ffi.Array.multi([3])
@@ -9107,36 +9112,38 @@
     CXTranslationUnit arg0);
 typedef DartClang_getTranslationUnitCursor = CXCursor Function(
     CXTranslationUnit arg0);
-typedef NativeClang_equalCursors = ffi.Uint32 Function(
+typedef NativeClang_equalCursors = ffi.UnsignedInt Function(
     CXCursor arg0, CXCursor arg1);
 typedef DartClang_equalCursors = int Function(CXCursor arg0, CXCursor arg1);
-typedef NativeClang_Cursor_isNull = ffi.Int32 Function(CXCursor cursor);
+typedef NativeClang_Cursor_isNull = ffi.Int Function(CXCursor cursor);
 typedef DartClang_Cursor_isNull = int Function(CXCursor cursor);
-typedef NativeClang_hashCursor = ffi.Uint32 Function(CXCursor arg0);
+typedef NativeClang_hashCursor = ffi.UnsignedInt Function(CXCursor arg0);
 typedef DartClang_hashCursor = int Function(CXCursor arg0);
 typedef NativeClang_getCursorKind = ffi.Int32 Function(CXCursor arg0);
 typedef DartClang_getCursorKind = int Function(CXCursor arg0);
-typedef NativeClang_isDeclaration = ffi.Uint32 Function(ffi.Int32 arg0);
+typedef NativeClang_isDeclaration = ffi.UnsignedInt Function(ffi.Int32 arg0);
 typedef DartClang_isDeclaration = int Function(int arg0);
-typedef NativeClang_isInvalidDeclaration = ffi.Uint32 Function(CXCursor arg0);
+typedef NativeClang_isInvalidDeclaration = ffi.UnsignedInt Function(
+    CXCursor arg0);
 typedef DartClang_isInvalidDeclaration = int Function(CXCursor arg0);
-typedef NativeClang_isReference = ffi.Uint32 Function(ffi.Int32 arg0);
+typedef NativeClang_isReference = ffi.UnsignedInt Function(ffi.Int32 arg0);
 typedef DartClang_isReference = int Function(int arg0);
-typedef NativeClang_isExpression = ffi.Uint32 Function(ffi.Int32 arg0);
+typedef NativeClang_isExpression = ffi.UnsignedInt Function(ffi.Int32 arg0);
 typedef DartClang_isExpression = int Function(int arg0);
-typedef NativeClang_isStatement = ffi.Uint32 Function(ffi.Int32 arg0);
+typedef NativeClang_isStatement = ffi.UnsignedInt Function(ffi.Int32 arg0);
 typedef DartClang_isStatement = int Function(int arg0);
-typedef NativeClang_isAttribute = ffi.Uint32 Function(ffi.Int32 arg0);
+typedef NativeClang_isAttribute = ffi.UnsignedInt Function(ffi.Int32 arg0);
 typedef DartClang_isAttribute = int Function(int arg0);
-typedef NativeClang_Cursor_hasAttrs = ffi.Uint32 Function(CXCursor C);
+typedef NativeClang_Cursor_hasAttrs = ffi.UnsignedInt Function(CXCursor C);
 typedef DartClang_Cursor_hasAttrs = int Function(CXCursor C);
-typedef NativeClang_isInvalid = ffi.Uint32 Function(ffi.Int32 arg0);
+typedef NativeClang_isInvalid = ffi.UnsignedInt Function(ffi.Int32 arg0);
 typedef DartClang_isInvalid = int Function(int arg0);
-typedef NativeClang_isTranslationUnit = ffi.Uint32 Function(ffi.Int32 arg0);
+typedef NativeClang_isTranslationUnit = ffi.UnsignedInt Function(
+    ffi.Int32 arg0);
 typedef DartClang_isTranslationUnit = int Function(int arg0);
-typedef NativeClang_isPreprocessing = ffi.Uint32 Function(ffi.Int32 arg0);
+typedef NativeClang_isPreprocessing = ffi.UnsignedInt Function(ffi.Int32 arg0);
 typedef DartClang_isPreprocessing = int Function(int arg0);
-typedef NativeClang_isUnexposed = ffi.Uint32 Function(ffi.Int32 arg0);
+typedef NativeClang_isUnexposed = ffi.UnsignedInt Function(ffi.Int32 arg0);
 typedef DartClang_isUnexposed = int Function(int arg0);
 
 /// Describe the linkage of the entity referred to by a cursor.
@@ -9224,7 +9231,7 @@
   external CXVersion Obsoleted;
 
   /// Whether the entity is unconditionally unavailable on this platform.
-  @ffi.Int32()
+  @ffi.Int()
   external int Unavailable;
 
   /// An optional message to provide to a user of this API, e.g., to
@@ -9232,19 +9239,19 @@
   external CXString Message;
 }
 
-typedef NativeClang_getCursorPlatformAvailability = ffi.Int32 Function(
+typedef NativeClang_getCursorPlatformAvailability = ffi.Int Function(
     CXCursor cursor,
-    ffi.Pointer<ffi.Int32> always_deprecated,
+    ffi.Pointer<ffi.Int> always_deprecated,
     ffi.Pointer<CXString> deprecated_message,
-    ffi.Pointer<ffi.Int32> always_unavailable,
+    ffi.Pointer<ffi.Int> always_unavailable,
     ffi.Pointer<CXString> unavailable_message,
     ffi.Pointer<CXPlatformAvailability> availability,
-    ffi.Int32 availability_size);
+    ffi.Int availability_size);
 typedef DartClang_getCursorPlatformAvailability = int Function(
     CXCursor cursor,
-    ffi.Pointer<ffi.Int32> always_deprecated,
+    ffi.Pointer<ffi.Int> always_deprecated,
     ffi.Pointer<CXString> deprecated_message,
-    ffi.Pointer<ffi.Int32> always_unavailable,
+    ffi.Pointer<ffi.Int> always_unavailable,
     ffi.Pointer<CXString> unavailable_message,
     ffi.Pointer<CXPlatformAvailability> availability,
     int availability_size);
@@ -9279,19 +9286,17 @@
 typedef DartClang_Cursor_getTranslationUnit = CXTranslationUnit Function(
     CXCursor arg0);
 
-class CXCursorSetImpl extends ffi.Opaque {}
-
 /// A fast container representing a set of CXCursors.
-typedef CXCursorSet = ffi.Pointer<CXCursorSetImpl>;
+typedef CXCursorSet = ffi.Pointer<custom_import.CXCursorSetImpl>;
 typedef NativeClang_createCXCursorSet = CXCursorSet Function();
 typedef DartClang_createCXCursorSet = CXCursorSet Function();
 typedef NativeClang_disposeCXCursorSet = ffi.Void Function(CXCursorSet cset);
 typedef DartClang_disposeCXCursorSet = void Function(CXCursorSet cset);
-typedef NativeClang_CXCursorSet_contains = ffi.Uint32 Function(
+typedef NativeClang_CXCursorSet_contains = ffi.UnsignedInt Function(
     CXCursorSet cset, CXCursor cursor);
 typedef DartClang_CXCursorSet_contains = int Function(
     CXCursorSet cset, CXCursor cursor);
-typedef NativeClang_CXCursorSet_insert = ffi.Uint32 Function(
+typedef NativeClang_CXCursorSet_insert = ffi.UnsignedInt Function(
     CXCursorSet cset, CXCursor cursor);
 typedef DartClang_CXCursorSet_insert = int Function(
     CXCursorSet cset, CXCursor cursor);
@@ -9303,11 +9308,11 @@
 typedef NativeClang_getOverriddenCursors = ffi.Void Function(
     CXCursor cursor,
     ffi.Pointer<ffi.Pointer<CXCursor>> overridden,
-    ffi.Pointer<ffi.Uint32> num_overridden);
+    ffi.Pointer<ffi.UnsignedInt> num_overridden);
 typedef DartClang_getOverriddenCursors = void Function(
     CXCursor cursor,
     ffi.Pointer<ffi.Pointer<CXCursor>> overridden,
-    ffi.Pointer<ffi.Uint32> num_overridden);
+    ffi.Pointer<ffi.UnsignedInt> num_overridden);
 typedef NativeClang_disposeOverriddenCursors = ffi.Void Function(
     ffi.Pointer<CXCursor> overridden);
 typedef DartClang_disposeOverriddenCursors = void Function(
@@ -9471,19 +9476,20 @@
 typedef DartClang_getTypedefDeclUnderlyingType = CXType Function(CXCursor C);
 typedef NativeClang_getEnumDeclIntegerType = CXType Function(CXCursor C);
 typedef DartClang_getEnumDeclIntegerType = CXType Function(CXCursor C);
-typedef NativeClang_getEnumConstantDeclValue = ffi.Int64 Function(CXCursor C);
-typedef DartClang_getEnumConstantDeclValue = int Function(CXCursor C);
-typedef NativeClang_getEnumConstantDeclUnsignedValue = ffi.Uint64 Function(
+typedef NativeClang_getEnumConstantDeclValue = ffi.LongLong Function(
     CXCursor C);
+typedef DartClang_getEnumConstantDeclValue = int Function(CXCursor C);
+typedef NativeClang_getEnumConstantDeclUnsignedValue = ffi.UnsignedLongLong
+    Function(CXCursor C);
 typedef DartClang_getEnumConstantDeclUnsignedValue = int Function(CXCursor C);
-typedef NativeClang_getFieldDeclBitWidth = ffi.Int32 Function(CXCursor C);
+typedef NativeClang_getFieldDeclBitWidth = ffi.Int Function(CXCursor C);
 typedef DartClang_getFieldDeclBitWidth = int Function(CXCursor C);
-typedef NativeClang_Cursor_getNumArguments = ffi.Int32 Function(CXCursor C);
+typedef NativeClang_Cursor_getNumArguments = ffi.Int Function(CXCursor C);
 typedef DartClang_Cursor_getNumArguments = int Function(CXCursor C);
 typedef NativeClang_Cursor_getArgument = CXCursor Function(
-    CXCursor C, ffi.Uint32 i);
+    CXCursor C, ffi.UnsignedInt i);
 typedef DartClang_Cursor_getArgument = CXCursor Function(CXCursor C, int i);
-typedef NativeClang_Cursor_getNumTemplateArguments = ffi.Int32 Function(
+typedef NativeClang_Cursor_getNumTemplateArguments = ffi.Int Function(
     CXCursor C);
 typedef DartClang_Cursor_getNumTemplateArguments = int Function(CXCursor C);
 
@@ -9505,39 +9511,43 @@
 }
 
 typedef NativeClang_Cursor_getTemplateArgumentKind = ffi.Int32 Function(
-    CXCursor C, ffi.Uint32 I);
+    CXCursor C, ffi.UnsignedInt I);
 typedef DartClang_Cursor_getTemplateArgumentKind = int Function(
     CXCursor C, int I);
 typedef NativeClang_Cursor_getTemplateArgumentType = CXType Function(
-    CXCursor C, ffi.Uint32 I);
+    CXCursor C, ffi.UnsignedInt I);
 typedef DartClang_Cursor_getTemplateArgumentType = CXType Function(
     CXCursor C, int I);
-typedef NativeClang_Cursor_getTemplateArgumentValue = ffi.Int64 Function(
-    CXCursor C, ffi.Uint32 I);
+typedef NativeClang_Cursor_getTemplateArgumentValue = ffi.LongLong Function(
+    CXCursor C, ffi.UnsignedInt I);
 typedef DartClang_Cursor_getTemplateArgumentValue = int Function(
     CXCursor C, int I);
-typedef NativeClang_Cursor_getTemplateArgumentUnsignedValue = ffi.Uint64
-    Function(CXCursor C, ffi.Uint32 I);
+typedef NativeClang_Cursor_getTemplateArgumentUnsignedValue
+    = ffi.UnsignedLongLong Function(CXCursor C, ffi.UnsignedInt I);
 typedef DartClang_Cursor_getTemplateArgumentUnsignedValue = int Function(
     CXCursor C, int I);
-typedef NativeClang_equalTypes = ffi.Uint32 Function(CXType A, CXType B);
+typedef NativeClang_equalTypes = ffi.UnsignedInt Function(CXType A, CXType B);
 typedef DartClang_equalTypes = int Function(CXType A, CXType B);
 typedef NativeClang_getCanonicalType = CXType Function(CXType T);
 typedef DartClang_getCanonicalType = CXType Function(CXType T);
-typedef NativeClang_isConstQualifiedType = ffi.Uint32 Function(CXType T);
+typedef NativeClang_isConstQualifiedType = ffi.UnsignedInt Function(CXType T);
 typedef DartClang_isConstQualifiedType = int Function(CXType T);
-typedef NativeClang_Cursor_isMacroFunctionLike = ffi.Uint32 Function(
+typedef NativeClang_Cursor_isMacroFunctionLike = ffi.UnsignedInt Function(
     CXCursor C);
 typedef DartClang_Cursor_isMacroFunctionLike = int Function(CXCursor C);
-typedef NativeClang_Cursor_isMacroBuiltin = ffi.Uint32 Function(CXCursor C);
+typedef NativeClang_Cursor_isMacroBuiltin = ffi.UnsignedInt Function(
+    CXCursor C);
 typedef DartClang_Cursor_isMacroBuiltin = int Function(CXCursor C);
-typedef NativeClang_Cursor_isFunctionInlined = ffi.Uint32 Function(CXCursor C);
+typedef NativeClang_Cursor_isFunctionInlined = ffi.UnsignedInt Function(
+    CXCursor C);
 typedef DartClang_Cursor_isFunctionInlined = int Function(CXCursor C);
-typedef NativeClang_isVolatileQualifiedType = ffi.Uint32 Function(CXType T);
+typedef NativeClang_isVolatileQualifiedType = ffi.UnsignedInt Function(
+    CXType T);
 typedef DartClang_isVolatileQualifiedType = int Function(CXType T);
-typedef NativeClang_isRestrictQualifiedType = ffi.Uint32 Function(CXType T);
+typedef NativeClang_isRestrictQualifiedType = ffi.UnsignedInt Function(
+    CXType T);
 typedef DartClang_isRestrictQualifiedType = int Function(CXType T);
-typedef NativeClang_getAddressSpace = ffi.Uint32 Function(CXType T);
+typedef NativeClang_getAddressSpace = ffi.UnsignedInt Function(CXType T);
 typedef DartClang_getAddressSpace = int Function(CXType T);
 typedef NativeClang_getTypedefName = CXString Function(CXType CT);
 typedef DartClang_getTypedefName = CXString Function(CXType CT);
@@ -9580,46 +9590,47 @@
 typedef DartClang_getFunctionTypeCallingConv = int Function(CXType T);
 typedef NativeClang_getResultType = CXType Function(CXType T);
 typedef DartClang_getResultType = CXType Function(CXType T);
-typedef NativeClang_getExceptionSpecificationType = ffi.Int32 Function(
-    CXType T);
+typedef NativeClang_getExceptionSpecificationType = ffi.Int Function(CXType T);
 typedef DartClang_getExceptionSpecificationType = int Function(CXType T);
-typedef NativeClang_getNumArgTypes = ffi.Int32 Function(CXType T);
+typedef NativeClang_getNumArgTypes = ffi.Int Function(CXType T);
 typedef DartClang_getNumArgTypes = int Function(CXType T);
-typedef NativeClang_getArgType = CXType Function(CXType T, ffi.Uint32 i);
+typedef NativeClang_getArgType = CXType Function(CXType T, ffi.UnsignedInt i);
 typedef DartClang_getArgType = CXType Function(CXType T, int i);
 typedef NativeClang_Type_getObjCObjectBaseType = CXType Function(CXType T);
 typedef DartClang_Type_getObjCObjectBaseType = CXType Function(CXType T);
-typedef NativeClang_Type_getNumObjCProtocolRefs = ffi.Uint32 Function(CXType T);
+typedef NativeClang_Type_getNumObjCProtocolRefs = ffi.UnsignedInt Function(
+    CXType T);
 typedef DartClang_Type_getNumObjCProtocolRefs = int Function(CXType T);
 typedef NativeClang_Type_getObjCProtocolDecl = CXCursor Function(
-    CXType T, ffi.Uint32 i);
+    CXType T, ffi.UnsignedInt i);
 typedef DartClang_Type_getObjCProtocolDecl = CXCursor Function(CXType T, int i);
-typedef NativeClang_Type_getNumObjCTypeArgs = ffi.Uint32 Function(CXType T);
+typedef NativeClang_Type_getNumObjCTypeArgs = ffi.UnsignedInt Function(
+    CXType T);
 typedef DartClang_Type_getNumObjCTypeArgs = int Function(CXType T);
 typedef NativeClang_Type_getObjCTypeArg = CXType Function(
-    CXType T, ffi.Uint32 i);
+    CXType T, ffi.UnsignedInt i);
 typedef DartClang_Type_getObjCTypeArg = CXType Function(CXType T, int i);
-typedef NativeClang_isFunctionTypeVariadic = ffi.Uint32 Function(CXType T);
+typedef NativeClang_isFunctionTypeVariadic = ffi.UnsignedInt Function(CXType T);
 typedef DartClang_isFunctionTypeVariadic = int Function(CXType T);
 typedef NativeClang_getCursorResultType = CXType Function(CXCursor C);
 typedef DartClang_getCursorResultType = CXType Function(CXCursor C);
-typedef NativeClang_getCursorExceptionSpecificationType = ffi.Int32 Function(
+typedef NativeClang_getCursorExceptionSpecificationType = ffi.Int Function(
     CXCursor C);
 typedef DartClang_getCursorExceptionSpecificationType = int Function(
     CXCursor C);
-typedef NativeClang_isPODType = ffi.Uint32 Function(CXType T);
+typedef NativeClang_isPODType = ffi.UnsignedInt Function(CXType T);
 typedef DartClang_isPODType = int Function(CXType T);
 typedef NativeClang_getElementType = CXType Function(CXType T);
 typedef DartClang_getElementType = CXType Function(CXType T);
-typedef NativeClang_getNumElements = ffi.Int64 Function(CXType T);
+typedef NativeClang_getNumElements = ffi.LongLong Function(CXType T);
 typedef DartClang_getNumElements = int Function(CXType T);
 typedef NativeClang_getArrayElementType = CXType Function(CXType T);
 typedef DartClang_getArrayElementType = CXType Function(CXType T);
-typedef NativeClang_getArraySize = ffi.Int64 Function(CXType T);
+typedef NativeClang_getArraySize = ffi.LongLong Function(CXType T);
 typedef DartClang_getArraySize = int Function(CXType T);
 typedef NativeClang_Type_getNamedType = CXType Function(CXType T);
 typedef DartClang_Type_getNamedType = CXType Function(CXType T);
-typedef NativeClang_Type_isTransparentTagTypedef = ffi.Uint32 Function(
+typedef NativeClang_Type_isTransparentTagTypedef = ffi.UnsignedInt Function(
     CXType T);
 typedef DartClang_Type_isTransparentTagTypedef = int Function(CXType T);
 
@@ -9642,31 +9653,32 @@
 
 typedef NativeClang_Type_getNullability = ffi.Int32 Function(CXType T);
 typedef DartClang_Type_getNullability = int Function(CXType T);
-typedef NativeClang_Type_getAlignOf = ffi.Int64 Function(CXType T);
+typedef NativeClang_Type_getAlignOf = ffi.LongLong Function(CXType T);
 typedef DartClang_Type_getAlignOf = int Function(CXType T);
 typedef NativeClang_Type_getClassType = CXType Function(CXType T);
 typedef DartClang_Type_getClassType = CXType Function(CXType T);
-typedef NativeClang_Type_getSizeOf = ffi.Int64 Function(CXType T);
+typedef NativeClang_Type_getSizeOf = ffi.LongLong Function(CXType T);
 typedef DartClang_Type_getSizeOf = int Function(CXType T);
-typedef NativeClang_Type_getOffsetOf = ffi.Int64 Function(
-    CXType T, ffi.Pointer<ffi.Int8> S);
+typedef NativeClang_Type_getOffsetOf = ffi.LongLong Function(
+    CXType T, ffi.Pointer<ffi.Char> S);
 typedef DartClang_Type_getOffsetOf = int Function(
-    CXType T, ffi.Pointer<ffi.Int8> S);
+    CXType T, ffi.Pointer<ffi.Char> S);
 typedef NativeClang_Type_getModifiedType = CXType Function(CXType T);
 typedef DartClang_Type_getModifiedType = CXType Function(CXType T);
-typedef NativeClang_Cursor_getOffsetOfField = ffi.Int64 Function(CXCursor C);
+typedef NativeClang_Cursor_getOffsetOfField = ffi.LongLong Function(CXCursor C);
 typedef DartClang_Cursor_getOffsetOfField = int Function(CXCursor C);
-typedef NativeClang_Cursor_isAnonymous = ffi.Uint32 Function(CXCursor C);
+typedef NativeClang_Cursor_isAnonymous = ffi.UnsignedInt Function(CXCursor C);
 typedef DartClang_Cursor_isAnonymous = int Function(CXCursor C);
-typedef NativeClang_Cursor_isAnonymousRecordDecl = ffi.Uint32 Function(
+typedef NativeClang_Cursor_isAnonymousRecordDecl = ffi.UnsignedInt Function(
     CXCursor C);
 typedef DartClang_Cursor_isAnonymousRecordDecl = int Function(CXCursor C);
-typedef NativeClang_Cursor_isInlineNamespace = ffi.Uint32 Function(CXCursor C);
+typedef NativeClang_Cursor_isInlineNamespace = ffi.UnsignedInt Function(
+    CXCursor C);
 typedef DartClang_Cursor_isInlineNamespace = int Function(CXCursor C);
-typedef NativeClang_Type_getNumTemplateArguments = ffi.Int32 Function(CXType T);
+typedef NativeClang_Type_getNumTemplateArguments = ffi.Int Function(CXType T);
 typedef DartClang_Type_getNumTemplateArguments = int Function(CXType T);
 typedef NativeClang_Type_getTemplateArgumentAsType = CXType Function(
-    CXType T, ffi.Uint32 i);
+    CXType T, ffi.UnsignedInt i);
 typedef DartClang_Type_getTemplateArgumentAsType = CXType Function(
     CXType T, int i);
 
@@ -9683,9 +9695,9 @@
 
 typedef NativeClang_Type_getCXXRefQualifier = ffi.Int32 Function(CXType T);
 typedef DartClang_Type_getCXXRefQualifier = int Function(CXType T);
-typedef NativeClang_Cursor_isBitField = ffi.Uint32 Function(CXCursor C);
+typedef NativeClang_Cursor_isBitField = ffi.UnsignedInt Function(CXCursor C);
 typedef DartClang_Cursor_isBitField = int Function(CXCursor C);
-typedef NativeClang_isVirtualBase = ffi.Uint32 Function(CXCursor arg0);
+typedef NativeClang_isVirtualBase = ffi.UnsignedInt Function(CXCursor arg0);
 typedef DartClang_isVirtualBase = int Function(CXCursor arg0);
 
 /// Represents the C++ access control level to a base class for a
@@ -9715,11 +9727,11 @@
 
 typedef NativeClang_Cursor_getStorageClass = ffi.Int32 Function(CXCursor arg0);
 typedef DartClang_Cursor_getStorageClass = int Function(CXCursor arg0);
-typedef NativeClang_getNumOverloadedDecls = ffi.Uint32 Function(
+typedef NativeClang_getNumOverloadedDecls = ffi.UnsignedInt Function(
     CXCursor cursor);
 typedef DartClang_getNumOverloadedDecls = int Function(CXCursor cursor);
 typedef NativeClang_getOverloadedDecl = CXCursor Function(
-    CXCursor cursor, ffi.Uint32 index);
+    CXCursor cursor, ffi.UnsignedInt index);
 typedef DartClang_getOverloadedDecl = CXCursor Function(
     CXCursor cursor, int index);
 typedef NativeClang_getIBOutletCollectionType = CXType Function(CXCursor arg0);
@@ -9736,7 +9748,9 @@
 /// The visitor should return one of the \c CXChildVisitResult values
 /// to direct clang_visitCursorChildren().
 typedef CXCursorVisitor = ffi.Pointer<
-    ffi.NativeFunction<ffi.Int32 Function(CXCursor, CXCursor, CXClientData)>>;
+    ffi.NativeFunction<
+        ffi.Int32 Function(
+            CXCursor cursor, CXCursor parent, CXClientData client_data)>>;
 
 /// Describes how the traversal of the children of a particular
 /// cursor should proceed after visiting a particular child cursor.
@@ -9759,40 +9773,42 @@
 /// Opaque pointer representing client data that will be passed through
 /// to various callbacks and visitors.
 typedef CXClientData = ffi.Pointer<ffi.Void>;
-typedef NativeClang_visitChildren = ffi.Uint32 Function(
+typedef NativeClang_visitChildren = ffi.UnsignedInt Function(
     CXCursor parent, CXCursorVisitor visitor, CXClientData client_data);
 typedef DartClang_visitChildren = int Function(
     CXCursor parent, CXCursorVisitor visitor, CXClientData client_data);
 typedef NativeClang_getCursorUSR = CXString Function(CXCursor arg0);
 typedef DartClang_getCursorUSR = CXString Function(CXCursor arg0);
 typedef NativeClang_constructUSR_ObjCClass = CXString Function(
-    ffi.Pointer<ffi.Int8> class_name);
+    ffi.Pointer<ffi.Char> class_name);
 typedef DartClang_constructUSR_ObjCClass = CXString Function(
-    ffi.Pointer<ffi.Int8> class_name);
+    ffi.Pointer<ffi.Char> class_name);
 typedef NativeClang_constructUSR_ObjCCategory = CXString Function(
-    ffi.Pointer<ffi.Int8> class_name, ffi.Pointer<ffi.Int8> category_name);
+    ffi.Pointer<ffi.Char> class_name, ffi.Pointer<ffi.Char> category_name);
 typedef DartClang_constructUSR_ObjCCategory = CXString Function(
-    ffi.Pointer<ffi.Int8> class_name, ffi.Pointer<ffi.Int8> category_name);
+    ffi.Pointer<ffi.Char> class_name, ffi.Pointer<ffi.Char> category_name);
 typedef NativeClang_constructUSR_ObjCProtocol = CXString Function(
-    ffi.Pointer<ffi.Int8> protocol_name);
+    ffi.Pointer<ffi.Char> protocol_name);
 typedef DartClang_constructUSR_ObjCProtocol = CXString Function(
-    ffi.Pointer<ffi.Int8> protocol_name);
+    ffi.Pointer<ffi.Char> protocol_name);
 typedef NativeClang_constructUSR_ObjCIvar = CXString Function(
-    ffi.Pointer<ffi.Int8> name, CXString classUSR);
+    ffi.Pointer<ffi.Char> name, CXString classUSR);
 typedef DartClang_constructUSR_ObjCIvar = CXString Function(
-    ffi.Pointer<ffi.Int8> name, CXString classUSR);
+    ffi.Pointer<ffi.Char> name, CXString classUSR);
 typedef NativeClang_constructUSR_ObjCMethod = CXString Function(
-    ffi.Pointer<ffi.Int8> name, ffi.Uint32 isInstanceMethod, CXString classUSR);
+    ffi.Pointer<ffi.Char> name,
+    ffi.UnsignedInt isInstanceMethod,
+    CXString classUSR);
 typedef DartClang_constructUSR_ObjCMethod = CXString Function(
-    ffi.Pointer<ffi.Int8> name, int isInstanceMethod, CXString classUSR);
+    ffi.Pointer<ffi.Char> name, int isInstanceMethod, CXString classUSR);
 typedef NativeClang_constructUSR_ObjCProperty = CXString Function(
-    ffi.Pointer<ffi.Int8> property, CXString classUSR);
+    ffi.Pointer<ffi.Char> property, CXString classUSR);
 typedef DartClang_constructUSR_ObjCProperty = CXString Function(
-    ffi.Pointer<ffi.Int8> property, CXString classUSR);
+    ffi.Pointer<ffi.Char> property, CXString classUSR);
 typedef NativeClang_getCursorSpelling = CXString Function(CXCursor arg0);
 typedef DartClang_getCursorSpelling = CXString Function(CXCursor arg0);
 typedef NativeClang_Cursor_getSpellingNameRange = CXSourceRange Function(
-    CXCursor arg0, ffi.Uint32 pieceIndex, ffi.Uint32 options);
+    CXCursor arg0, ffi.UnsignedInt pieceIndex, ffi.UnsignedInt options);
 typedef DartClang_Cursor_getSpellingNameRange = CXSourceRange Function(
     CXCursor arg0, int pieceIndex, int options);
 
@@ -9833,12 +9849,12 @@
   static const int CXPrintingPolicy_LastProperty = 25;
 }
 
-typedef NativeClang_PrintingPolicy_getProperty = ffi.Uint32 Function(
+typedef NativeClang_PrintingPolicy_getProperty = ffi.UnsignedInt Function(
     CXPrintingPolicy Policy, ffi.Int32 Property);
 typedef DartClang_PrintingPolicy_getProperty = int Function(
     CXPrintingPolicy Policy, int Property);
 typedef NativeClang_PrintingPolicy_setProperty = ffi.Void Function(
-    CXPrintingPolicy Policy, ffi.Int32 Property, ffi.Uint32 Value);
+    CXPrintingPolicy Policy, ffi.Int32 Property, ffi.UnsignedInt Value);
 typedef DartClang_PrintingPolicy_setProperty = void Function(
     CXPrintingPolicy Policy, int Property, int Value);
 typedef NativeClang_getCursorPrintingPolicy = CXPrintingPolicy Function(
@@ -9859,19 +9875,20 @@
 typedef DartClang_getCursorReferenced = CXCursor Function(CXCursor arg0);
 typedef NativeClang_getCursorDefinition = CXCursor Function(CXCursor arg0);
 typedef DartClang_getCursorDefinition = CXCursor Function(CXCursor arg0);
-typedef NativeClang_isCursorDefinition = ffi.Uint32 Function(CXCursor arg0);
+typedef NativeClang_isCursorDefinition = ffi.UnsignedInt Function(
+    CXCursor arg0);
 typedef DartClang_isCursorDefinition = int Function(CXCursor arg0);
 typedef NativeClang_getCanonicalCursor = CXCursor Function(CXCursor arg0);
 typedef DartClang_getCanonicalCursor = CXCursor Function(CXCursor arg0);
-typedef NativeClang_Cursor_getObjCSelectorIndex = ffi.Int32 Function(
+typedef NativeClang_Cursor_getObjCSelectorIndex = ffi.Int Function(
     CXCursor arg0);
 typedef DartClang_Cursor_getObjCSelectorIndex = int Function(CXCursor arg0);
-typedef NativeClang_Cursor_isDynamicCall = ffi.Int32 Function(CXCursor C);
+typedef NativeClang_Cursor_isDynamicCall = ffi.Int Function(CXCursor C);
 typedef DartClang_Cursor_isDynamicCall = int Function(CXCursor C);
 typedef NativeClang_Cursor_getReceiverType = CXType Function(CXCursor C);
 typedef DartClang_Cursor_getReceiverType = CXType Function(CXCursor C);
-typedef NativeClang_Cursor_getObjCPropertyAttributes = ffi.Uint32 Function(
-    CXCursor C, ffi.Uint32 reserved);
+typedef NativeClang_Cursor_getObjCPropertyAttributes = ffi.UnsignedInt Function(
+    CXCursor C, ffi.UnsignedInt reserved);
 typedef DartClang_Cursor_getObjCPropertyAttributes = int Function(
     CXCursor C, int reserved);
 typedef NativeClang_Cursor_getObjCPropertyGetterName = CXString Function(
@@ -9882,23 +9899,24 @@
     CXCursor C);
 typedef DartClang_Cursor_getObjCPropertySetterName = CXString Function(
     CXCursor C);
-typedef NativeClang_Cursor_getObjCDeclQualifiers = ffi.Uint32 Function(
+typedef NativeClang_Cursor_getObjCDeclQualifiers = ffi.UnsignedInt Function(
     CXCursor C);
 typedef DartClang_Cursor_getObjCDeclQualifiers = int Function(CXCursor C);
-typedef NativeClang_Cursor_isObjCOptional = ffi.Uint32 Function(CXCursor C);
+typedef NativeClang_Cursor_isObjCOptional = ffi.UnsignedInt Function(
+    CXCursor C);
 typedef DartClang_Cursor_isObjCOptional = int Function(CXCursor C);
-typedef NativeClang_Cursor_isVariadic = ffi.Uint32 Function(CXCursor C);
+typedef NativeClang_Cursor_isVariadic = ffi.UnsignedInt Function(CXCursor C);
 typedef DartClang_Cursor_isVariadic = int Function(CXCursor C);
-typedef NativeClang_Cursor_isExternalSymbol = ffi.Uint32 Function(
+typedef NativeClang_Cursor_isExternalSymbol = ffi.UnsignedInt Function(
     CXCursor C,
     ffi.Pointer<CXString> language,
     ffi.Pointer<CXString> definedIn,
-    ffi.Pointer<ffi.Uint32> isGenerated);
+    ffi.Pointer<ffi.UnsignedInt> isGenerated);
 typedef DartClang_Cursor_isExternalSymbol = int Function(
     CXCursor C,
     ffi.Pointer<CXString> language,
     ffi.Pointer<CXString> definedIn,
-    ffi.Pointer<ffi.Uint32> isGenerated);
+    ffi.Pointer<ffi.UnsignedInt> isGenerated);
 typedef NativeClang_Cursor_getCommentRange = CXSourceRange Function(CXCursor C);
 typedef DartClang_Cursor_getCommentRange = CXSourceRange Function(CXCursor C);
 typedef NativeClang_Cursor_getRawCommentText = CXString Function(CXCursor C);
@@ -9936,45 +9954,47 @@
 typedef DartClang_Module_getName = CXString Function(CXModule Module);
 typedef NativeClang_Module_getFullName = CXString Function(CXModule Module);
 typedef DartClang_Module_getFullName = CXString Function(CXModule Module);
-typedef NativeClang_Module_isSystem = ffi.Int32 Function(CXModule Module);
+typedef NativeClang_Module_isSystem = ffi.Int Function(CXModule Module);
 typedef DartClang_Module_isSystem = int Function(CXModule Module);
-typedef NativeClang_Module_getNumTopLevelHeaders = ffi.Uint32 Function(
+typedef NativeClang_Module_getNumTopLevelHeaders = ffi.UnsignedInt Function(
     CXTranslationUnit arg0, CXModule Module);
 typedef DartClang_Module_getNumTopLevelHeaders = int Function(
     CXTranslationUnit arg0, CXModule Module);
 typedef NativeClang_Module_getTopLevelHeader = CXFile Function(
-    CXTranslationUnit arg0, CXModule Module, ffi.Uint32 Index);
+    CXTranslationUnit arg0, CXModule Module, ffi.UnsignedInt Index);
 typedef DartClang_Module_getTopLevelHeader = CXFile Function(
     CXTranslationUnit arg0, CXModule Module, int Index);
-typedef NativeClang_CXXConstructor_isConvertingConstructor = ffi.Uint32
+typedef NativeClang_CXXConstructor_isConvertingConstructor = ffi.UnsignedInt
     Function(CXCursor C);
 typedef DartClang_CXXConstructor_isConvertingConstructor = int Function(
     CXCursor C);
-typedef NativeClang_CXXConstructor_isCopyConstructor = ffi.Uint32 Function(
+typedef NativeClang_CXXConstructor_isCopyConstructor = ffi.UnsignedInt Function(
     CXCursor C);
 typedef DartClang_CXXConstructor_isCopyConstructor = int Function(CXCursor C);
-typedef NativeClang_CXXConstructor_isDefaultConstructor = ffi.Uint32 Function(
-    CXCursor C);
+typedef NativeClang_CXXConstructor_isDefaultConstructor = ffi.UnsignedInt
+    Function(CXCursor C);
 typedef DartClang_CXXConstructor_isDefaultConstructor = int Function(
     CXCursor C);
-typedef NativeClang_CXXConstructor_isMoveConstructor = ffi.Uint32 Function(
+typedef NativeClang_CXXConstructor_isMoveConstructor = ffi.UnsignedInt Function(
     CXCursor C);
 typedef DartClang_CXXConstructor_isMoveConstructor = int Function(CXCursor C);
-typedef NativeClang_CXXField_isMutable = ffi.Uint32 Function(CXCursor C);
+typedef NativeClang_CXXField_isMutable = ffi.UnsignedInt Function(CXCursor C);
 typedef DartClang_CXXField_isMutable = int Function(CXCursor C);
-typedef NativeClang_CXXMethod_isDefaulted = ffi.Uint32 Function(CXCursor C);
+typedef NativeClang_CXXMethod_isDefaulted = ffi.UnsignedInt Function(
+    CXCursor C);
 typedef DartClang_CXXMethod_isDefaulted = int Function(CXCursor C);
-typedef NativeClang_CXXMethod_isPureVirtual = ffi.Uint32 Function(CXCursor C);
+typedef NativeClang_CXXMethod_isPureVirtual = ffi.UnsignedInt Function(
+    CXCursor C);
 typedef DartClang_CXXMethod_isPureVirtual = int Function(CXCursor C);
-typedef NativeClang_CXXMethod_isStatic = ffi.Uint32 Function(CXCursor C);
+typedef NativeClang_CXXMethod_isStatic = ffi.UnsignedInt Function(CXCursor C);
 typedef DartClang_CXXMethod_isStatic = int Function(CXCursor C);
-typedef NativeClang_CXXMethod_isVirtual = ffi.Uint32 Function(CXCursor C);
+typedef NativeClang_CXXMethod_isVirtual = ffi.UnsignedInt Function(CXCursor C);
 typedef DartClang_CXXMethod_isVirtual = int Function(CXCursor C);
-typedef NativeClang_CXXRecord_isAbstract = ffi.Uint32 Function(CXCursor C);
+typedef NativeClang_CXXRecord_isAbstract = ffi.UnsignedInt Function(CXCursor C);
 typedef DartClang_CXXRecord_isAbstract = int Function(CXCursor C);
-typedef NativeClang_EnumDecl_isScoped = ffi.Uint32 Function(CXCursor C);
+typedef NativeClang_EnumDecl_isScoped = ffi.UnsignedInt Function(CXCursor C);
 typedef DartClang_EnumDecl_isScoped = int Function(CXCursor C);
-typedef NativeClang_CXXMethod_isConst = ffi.Uint32 Function(CXCursor C);
+typedef NativeClang_CXXMethod_isConst = ffi.UnsignedInt Function(CXCursor C);
 typedef DartClang_CXXMethod_isConst = int Function(CXCursor C);
 typedef NativeClang_getTemplateCursorKind = ffi.Int32 Function(CXCursor C);
 typedef DartClang_getTemplateCursorKind = int Function(CXCursor C);
@@ -9982,14 +10002,14 @@
     CXCursor C);
 typedef DartClang_getSpecializedCursorTemplate = CXCursor Function(CXCursor C);
 typedef NativeClang_getCursorReferenceNameRange = CXSourceRange Function(
-    CXCursor C, ffi.Uint32 NameFlags, ffi.Uint32 PieceIndex);
+    CXCursor C, ffi.UnsignedInt NameFlags, ffi.UnsignedInt PieceIndex);
 typedef DartClang_getCursorReferenceNameRange = CXSourceRange Function(
     CXCursor C, int NameFlags, int PieceIndex);
 
 /// Describes a single preprocessing token.
 class CXToken extends ffi.Struct {
   @ffi.Array.multi([4])
-  external ffi.Array<ffi.Uint32> int_data;
+  external ffi.Array<ffi.UnsignedInt> int_data;
 
   external ffi.Pointer<ffi.Void> ptr_data;
 }
@@ -10035,48 +10055,48 @@
     CXTranslationUnit TU,
     CXSourceRange Range,
     ffi.Pointer<ffi.Pointer<CXToken>> Tokens,
-    ffi.Pointer<ffi.Uint32> NumTokens);
+    ffi.Pointer<ffi.UnsignedInt> NumTokens);
 typedef DartClang_tokenize = void Function(
     CXTranslationUnit TU,
     CXSourceRange Range,
     ffi.Pointer<ffi.Pointer<CXToken>> Tokens,
-    ffi.Pointer<ffi.Uint32> NumTokens);
+    ffi.Pointer<ffi.UnsignedInt> NumTokens);
 typedef NativeClang_annotateTokens = ffi.Void Function(
     CXTranslationUnit TU,
     ffi.Pointer<CXToken> Tokens,
-    ffi.Uint32 NumTokens,
+    ffi.UnsignedInt NumTokens,
     ffi.Pointer<CXCursor> Cursors);
 typedef DartClang_annotateTokens = void Function(CXTranslationUnit TU,
     ffi.Pointer<CXToken> Tokens, int NumTokens, ffi.Pointer<CXCursor> Cursors);
-typedef NativeClang_disposeTokens = ffi.Void Function(
-    CXTranslationUnit TU, ffi.Pointer<CXToken> Tokens, ffi.Uint32 NumTokens);
+typedef NativeClang_disposeTokens = ffi.Void Function(CXTranslationUnit TU,
+    ffi.Pointer<CXToken> Tokens, ffi.UnsignedInt NumTokens);
 typedef DartClang_disposeTokens = void Function(
     CXTranslationUnit TU, ffi.Pointer<CXToken> Tokens, int NumTokens);
 typedef NativeClang_getCursorKindSpelling = CXString Function(ffi.Int32 Kind);
 typedef DartClang_getCursorKindSpelling = CXString Function(int Kind);
 typedef NativeClang_getDefinitionSpellingAndExtent = ffi.Void Function(
     CXCursor arg0,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> startBuf,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> endBuf,
-    ffi.Pointer<ffi.Uint32> startLine,
-    ffi.Pointer<ffi.Uint32> startColumn,
-    ffi.Pointer<ffi.Uint32> endLine,
-    ffi.Pointer<ffi.Uint32> endColumn);
+    ffi.Pointer<ffi.Pointer<ffi.Char>> startBuf,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> endBuf,
+    ffi.Pointer<ffi.UnsignedInt> startLine,
+    ffi.Pointer<ffi.UnsignedInt> startColumn,
+    ffi.Pointer<ffi.UnsignedInt> endLine,
+    ffi.Pointer<ffi.UnsignedInt> endColumn);
 typedef DartClang_getDefinitionSpellingAndExtent = void Function(
     CXCursor arg0,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> startBuf,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> endBuf,
-    ffi.Pointer<ffi.Uint32> startLine,
-    ffi.Pointer<ffi.Uint32> startColumn,
-    ffi.Pointer<ffi.Uint32> endLine,
-    ffi.Pointer<ffi.Uint32> endColumn);
+    ffi.Pointer<ffi.Pointer<ffi.Char>> startBuf,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> endBuf,
+    ffi.Pointer<ffi.UnsignedInt> startLine,
+    ffi.Pointer<ffi.UnsignedInt> startColumn,
+    ffi.Pointer<ffi.UnsignedInt> endLine,
+    ffi.Pointer<ffi.UnsignedInt> endColumn);
 typedef NativeClang_enableStackTraces = ffi.Void Function();
 typedef DartClang_enableStackTraces = void Function();
 typedef NativeClang_executeOnThread = ffi.Void Function(
     ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
         fn,
     ffi.Pointer<ffi.Void> user_data,
-    ffi.Uint32 stack_size);
+    ffi.UnsignedInt stack_size);
 typedef DartClang_executeOnThread = void Function(
     ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
         fn,
@@ -10262,22 +10282,23 @@
 }
 
 typedef NativeClang_getCompletionChunkKind = ffi.Int32 Function(
-    CXCompletionString completion_string, ffi.Uint32 chunk_number);
+    CXCompletionString completion_string, ffi.UnsignedInt chunk_number);
 typedef DartClang_getCompletionChunkKind = int Function(
     CXCompletionString completion_string, int chunk_number);
 typedef NativeClang_getCompletionChunkText = CXString Function(
-    CXCompletionString completion_string, ffi.Uint32 chunk_number);
+    CXCompletionString completion_string, ffi.UnsignedInt chunk_number);
 typedef DartClang_getCompletionChunkText = CXString Function(
     CXCompletionString completion_string, int chunk_number);
-typedef NativeClang_getCompletionChunkCompletionString = CXCompletionString
-    Function(CXCompletionString completion_string, ffi.Uint32 chunk_number);
+typedef NativeClang_getCompletionChunkCompletionString
+    = CXCompletionString Function(
+        CXCompletionString completion_string, ffi.UnsignedInt chunk_number);
 typedef DartClang_getCompletionChunkCompletionString = CXCompletionString
     Function(CXCompletionString completion_string, int chunk_number);
-typedef NativeClang_getNumCompletionChunks = ffi.Uint32 Function(
+typedef NativeClang_getNumCompletionChunks = ffi.UnsignedInt Function(
     CXCompletionString completion_string);
 typedef DartClang_getNumCompletionChunks = int Function(
     CXCompletionString completion_string);
-typedef NativeClang_getCompletionPriority = ffi.Uint32 Function(
+typedef NativeClang_getCompletionPriority = ffi.UnsignedInt Function(
     CXCompletionString completion_string);
 typedef DartClang_getCompletionPriority = int Function(
     CXCompletionString completion_string);
@@ -10285,12 +10306,12 @@
     CXCompletionString completion_string);
 typedef DartClang_getCompletionAvailability = int Function(
     CXCompletionString completion_string);
-typedef NativeClang_getCompletionNumAnnotations = ffi.Uint32 Function(
+typedef NativeClang_getCompletionNumAnnotations = ffi.UnsignedInt Function(
     CXCompletionString completion_string);
 typedef DartClang_getCompletionNumAnnotations = int Function(
     CXCompletionString completion_string);
 typedef NativeClang_getCompletionAnnotation = CXString Function(
-    CXCompletionString completion_string, ffi.Uint32 annotation_number);
+    CXCompletionString completion_string, ffi.UnsignedInt annotation_number);
 typedef DartClang_getCompletionAnnotation = CXString Function(
     CXCompletionString completion_string, int annotation_number);
 typedef NativeClang_getCompletionParent = CXString Function(
@@ -10317,69 +10338,70 @@
 
   /// The number of code-completion results stored in the
   /// \c Results array.
-  @ffi.Uint32()
+  @ffi.UnsignedInt()
   external int NumResults;
 }
 
-typedef NativeClang_getCompletionNumFixIts = ffi.Uint32 Function(
-    ffi.Pointer<CXCodeCompleteResults> results, ffi.Uint32 completion_index);
+typedef NativeClang_getCompletionNumFixIts = ffi.UnsignedInt Function(
+    ffi.Pointer<CXCodeCompleteResults> results,
+    ffi.UnsignedInt completion_index);
 typedef DartClang_getCompletionNumFixIts = int Function(
     ffi.Pointer<CXCodeCompleteResults> results, int completion_index);
 typedef NativeClang_getCompletionFixIt = CXString Function(
     ffi.Pointer<CXCodeCompleteResults> results,
-    ffi.Uint32 completion_index,
-    ffi.Uint32 fixit_index,
+    ffi.UnsignedInt completion_index,
+    ffi.UnsignedInt fixit_index,
     ffi.Pointer<CXSourceRange> replacement_range);
 typedef DartClang_getCompletionFixIt = CXString Function(
     ffi.Pointer<CXCodeCompleteResults> results,
     int completion_index,
     int fixit_index,
     ffi.Pointer<CXSourceRange> replacement_range);
-typedef NativeClang_defaultCodeCompleteOptions = ffi.Uint32 Function();
+typedef NativeClang_defaultCodeCompleteOptions = ffi.UnsignedInt Function();
 typedef DartClang_defaultCodeCompleteOptions = int Function();
 typedef NativeClang_codeCompleteAt
     = ffi.Pointer<CXCodeCompleteResults> Function(
         CXTranslationUnit TU,
-        ffi.Pointer<ffi.Int8> complete_filename,
-        ffi.Uint32 complete_line,
-        ffi.Uint32 complete_column,
+        ffi.Pointer<ffi.Char> complete_filename,
+        ffi.UnsignedInt complete_line,
+        ffi.UnsignedInt complete_column,
         ffi.Pointer<CXUnsavedFile> unsaved_files,
-        ffi.Uint32 num_unsaved_files,
-        ffi.Uint32 options);
+        ffi.UnsignedInt num_unsaved_files,
+        ffi.UnsignedInt options);
 typedef DartClang_codeCompleteAt = ffi.Pointer<CXCodeCompleteResults> Function(
     CXTranslationUnit TU,
-    ffi.Pointer<ffi.Int8> complete_filename,
+    ffi.Pointer<ffi.Char> complete_filename,
     int complete_line,
     int complete_column,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     int num_unsaved_files,
     int options);
 typedef NativeClang_sortCodeCompletionResults = ffi.Void Function(
-    ffi.Pointer<CXCompletionResult> Results, ffi.Uint32 NumResults);
+    ffi.Pointer<CXCompletionResult> Results, ffi.UnsignedInt NumResults);
 typedef DartClang_sortCodeCompletionResults = void Function(
     ffi.Pointer<CXCompletionResult> Results, int NumResults);
 typedef NativeClang_disposeCodeCompleteResults = ffi.Void Function(
     ffi.Pointer<CXCodeCompleteResults> Results);
 typedef DartClang_disposeCodeCompleteResults = void Function(
     ffi.Pointer<CXCodeCompleteResults> Results);
-typedef NativeClang_codeCompleteGetNumDiagnostics = ffi.Uint32 Function(
+typedef NativeClang_codeCompleteGetNumDiagnostics = ffi.UnsignedInt Function(
     ffi.Pointer<CXCodeCompleteResults> Results);
 typedef DartClang_codeCompleteGetNumDiagnostics = int Function(
     ffi.Pointer<CXCodeCompleteResults> Results);
 typedef NativeClang_codeCompleteGetDiagnostic = CXDiagnostic Function(
-    ffi.Pointer<CXCodeCompleteResults> Results, ffi.Uint32 Index);
+    ffi.Pointer<CXCodeCompleteResults> Results, ffi.UnsignedInt Index);
 typedef DartClang_codeCompleteGetDiagnostic = CXDiagnostic Function(
     ffi.Pointer<CXCodeCompleteResults> Results, int Index);
-typedef NativeClang_codeCompleteGetContexts = ffi.Uint64 Function(
+typedef NativeClang_codeCompleteGetContexts = ffi.UnsignedLongLong Function(
     ffi.Pointer<CXCodeCompleteResults> Results);
 typedef DartClang_codeCompleteGetContexts = int Function(
     ffi.Pointer<CXCodeCompleteResults> Results);
 typedef NativeClang_codeCompleteGetContainerKind = ffi.Int32 Function(
     ffi.Pointer<CXCodeCompleteResults> Results,
-    ffi.Pointer<ffi.Uint32> IsIncomplete);
+    ffi.Pointer<ffi.UnsignedInt> IsIncomplete);
 typedef DartClang_codeCompleteGetContainerKind = int Function(
     ffi.Pointer<CXCodeCompleteResults> Results,
-    ffi.Pointer<ffi.Uint32> IsIncomplete);
+    ffi.Pointer<ffi.UnsignedInt> IsIncomplete);
 typedef NativeClang_codeCompleteGetContainerUSR = CXString Function(
     ffi.Pointer<CXCodeCompleteResults> Results);
 typedef DartClang_codeCompleteGetContainerUSR = CXString Function(
@@ -10391,7 +10413,7 @@
 typedef NativeClang_getClangVersion = CXString Function();
 typedef DartClang_getClangVersion = CXString Function();
 typedef NativeClang_toggleCrashRecovery = ffi.Void Function(
-    ffi.Uint32 isEnabled);
+    ffi.UnsignedInt isEnabled);
 typedef DartClang_toggleCrashRecovery = void Function(int isEnabled);
 
 /// Visitor invoked for each file in a translation unit
@@ -10406,7 +10428,10 @@
 typedef CXInclusionVisitor = ffi.Pointer<
     ffi.NativeFunction<
         ffi.Void Function(
-            CXFile, ffi.Pointer<CXSourceLocation>, ffi.Uint32, CXClientData)>>;
+            CXFile included_file,
+            ffi.Pointer<CXSourceLocation> inclusion_stack,
+            ffi.UnsignedInt include_len,
+            CXClientData client_data)>>;
 typedef NativeClang_getInclusions = ffi.Void Function(
     CXTranslationUnit tu, CXInclusionVisitor visitor, CXClientData client_data);
 typedef DartClang_getInclusions = void Function(
@@ -10429,23 +10454,23 @@
 
 typedef NativeClang_EvalResult_getKind = ffi.Int32 Function(CXEvalResult E);
 typedef DartClang_EvalResult_getKind = int Function(CXEvalResult E);
-typedef NativeClang_EvalResult_getAsInt = ffi.Int32 Function(CXEvalResult E);
+typedef NativeClang_EvalResult_getAsInt = ffi.Int Function(CXEvalResult E);
 typedef DartClang_EvalResult_getAsInt = int Function(CXEvalResult E);
-typedef NativeClang_EvalResult_getAsLongLong = ffi.Int64 Function(
+typedef NativeClang_EvalResult_getAsLongLong = ffi.LongLong Function(
     CXEvalResult E);
 typedef DartClang_EvalResult_getAsLongLong = int Function(CXEvalResult E);
-typedef NativeClang_EvalResult_isUnsignedInt = ffi.Uint32 Function(
+typedef NativeClang_EvalResult_isUnsignedInt = ffi.UnsignedInt Function(
     CXEvalResult E);
 typedef DartClang_EvalResult_isUnsignedInt = int Function(CXEvalResult E);
-typedef NativeClang_EvalResult_getAsUnsigned = ffi.Uint64 Function(
+typedef NativeClang_EvalResult_getAsUnsigned = ffi.UnsignedLongLong Function(
     CXEvalResult E);
 typedef DartClang_EvalResult_getAsUnsigned = int Function(CXEvalResult E);
 typedef NativeClang_EvalResult_getAsDouble = ffi.Double Function(
     CXEvalResult E);
 typedef DartClang_EvalResult_getAsDouble = double Function(CXEvalResult E);
-typedef NativeClang_EvalResult_getAsStr = ffi.Pointer<ffi.Int8> Function(
+typedef NativeClang_EvalResult_getAsStr = ffi.Pointer<ffi.Char> Function(
     CXEvalResult E);
-typedef DartClang_EvalResult_getAsStr = ffi.Pointer<ffi.Int8> Function(
+typedef DartClang_EvalResult_getAsStr = ffi.Pointer<ffi.Char> Function(
     CXEvalResult E);
 typedef NativeClang_EvalResult_dispose = ffi.Void Function(CXEvalResult E);
 typedef DartClang_EvalResult_dispose = void Function(CXEvalResult E);
@@ -10453,18 +10478,19 @@
 /// A remapping of original source files and their translated files.
 typedef CXRemapping = ffi.Pointer<ffi.Void>;
 typedef NativeClang_getRemappings = CXRemapping Function(
-    ffi.Pointer<ffi.Int8> path);
+    ffi.Pointer<ffi.Char> path);
 typedef DartClang_getRemappings = CXRemapping Function(
-    ffi.Pointer<ffi.Int8> path);
+    ffi.Pointer<ffi.Char> path);
 typedef NativeClang_getRemappingsFromFileList = CXRemapping Function(
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> filePaths, ffi.Uint32 numFiles);
+    ffi.Pointer<ffi.Pointer<ffi.Char>> filePaths, ffi.UnsignedInt numFiles);
 typedef DartClang_getRemappingsFromFileList = CXRemapping Function(
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> filePaths, int numFiles);
-typedef NativeClang_remap_getNumFiles = ffi.Uint32 Function(CXRemapping arg0);
+    ffi.Pointer<ffi.Pointer<ffi.Char>> filePaths, int numFiles);
+typedef NativeClang_remap_getNumFiles = ffi.UnsignedInt Function(
+    CXRemapping arg0);
 typedef DartClang_remap_getNumFiles = int Function(CXRemapping arg0);
 typedef NativeClang_remap_getFilenames = ffi.Void Function(
     CXRemapping arg0,
-    ffi.Uint32 index,
+    ffi.UnsignedInt index,
     ffi.Pointer<CXString> original,
     ffi.Pointer<CXString> transformed);
 typedef DartClang_remap_getFilenames = void Function(
@@ -10518,7 +10544,7 @@
   @ffi.Array.multi([2])
   external ffi.Array<ffi.Pointer<ffi.Void>> ptr_data;
 
-  @ffi.Uint32()
+  @ffi.UnsignedInt()
   external int int_data;
 }
 
@@ -10528,20 +10554,20 @@
   external CXIdxLoc hashLoc;
 
   /// Filename as written in the \#include/\#import directive.
-  external ffi.Pointer<ffi.Int8> filename;
+  external ffi.Pointer<ffi.Char> filename;
 
   /// The actual file that the \#include/\#import directive resolved to.
   external CXFile file;
 
-  @ffi.Int32()
+  @ffi.Int()
   external int isImport;
 
-  @ffi.Int32()
+  @ffi.Int()
   external int isAngled;
 
   /// Non-zero if the directive was automatically turned into a module
   /// import.
-  @ffi.Int32()
+  @ffi.Int()
   external int isModuleImport;
 }
 
@@ -10558,7 +10584,7 @@
 
   /// Non-zero if an inclusion directive was automatically turned into
   /// a module import. Applicable only for modules.
-  @ffi.Int32()
+  @ffi.Int()
   external int isImplicit;
 }
 
@@ -10588,15 +10614,15 @@
   @ffi.Int32()
   external int lang;
 
-  external ffi.Pointer<ffi.Int8> name;
+  external ffi.Pointer<ffi.Char> name;
 
-  external ffi.Pointer<ffi.Int8> USR;
+  external ffi.Pointer<ffi.Char> USR;
 
   external CXCursor cursor;
 
   external ffi.Pointer<ffi.Pointer<CXIdxAttrInfo>> attributes;
 
-  @ffi.Uint32()
+  @ffi.UnsignedInt()
   external int numAttributes;
 }
 
@@ -10680,28 +10706,28 @@
   /// cases like out-of-line C++ member functions.
   external ffi.Pointer<CXIdxContainerInfo> lexicalContainer;
 
-  @ffi.Int32()
+  @ffi.Int()
   external int isRedeclaration;
 
-  @ffi.Int32()
+  @ffi.Int()
   external int isDefinition;
 
-  @ffi.Int32()
+  @ffi.Int()
   external int isContainer;
 
   external ffi.Pointer<CXIdxContainerInfo> declAsContainer;
 
   /// Whether the declaration exists in code or was created implicitly
   /// by the compiler, e.g. implicit Objective-C methods for properties.
-  @ffi.Int32()
+  @ffi.Int()
   external int isImplicit;
 
   external ffi.Pointer<ffi.Pointer<CXIdxAttrInfo>> attributes;
 
-  @ffi.Uint32()
+  @ffi.UnsignedInt()
   external int numAttributes;
 
-  @ffi.Uint32()
+  @ffi.UnsignedInt()
   external int flags;
 }
 
@@ -10737,7 +10763,7 @@
 class CXIdxObjCProtocolRefListInfo extends ffi.Struct {
   external ffi.Pointer<ffi.Pointer<CXIdxObjCProtocolRefInfo>> protocols;
 
-  @ffi.Uint32()
+  @ffi.UnsignedInt()
   external int numProtocols;
 }
 
@@ -10774,7 +10800,7 @@
 
   external ffi.Pointer<ffi.Pointer<CXIdxBaseClassInfo>> bases;
 
-  @ffi.Uint32()
+  @ffi.UnsignedInt()
   external int numBases;
 }
 
@@ -10840,7 +10866,7 @@
   static const int CXSymbolRole_Implicit = 256;
 }
 
-typedef NativeClang_index_isEntityObjCContainerKind = ffi.Int32 Function(
+typedef NativeClang_index_isEntityObjCContainerKind = ffi.Int Function(
     ffi.Int32 arg0);
 typedef DartClang_index_isEntityObjCContainerKind = int Function(int arg0);
 typedef NativeClang_index_getObjCContainerDeclInfo
@@ -10922,8 +10948,10 @@
   /// Called periodically to check whether indexing should be aborted.
   /// Should return 0 to continue, and non-zero to abort.
   external ffi.Pointer<
-      ffi.NativeFunction<
-          ffi.Int32 Function(CXClientData, ffi.Pointer<ffi.Void>)>> abortQuery;
+          ffi.NativeFunction<
+              ffi.Int Function(
+                  CXClientData client_data, ffi.Pointer<ffi.Void> reserved)>>
+      abortQuery;
 
   /// Called at the end of indexing; passes the complete diagnostic set.
   external ffi.Pointer<
@@ -10934,8 +10962,8 @@
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          CXIdxClientFile Function(
-              CXClientData, CXFile, ffi.Pointer<ffi.Void>)>> enteredMainFile;
+          CXIdxClientFile Function(CXClientData client_data, CXFile mainFile,
+              ffi.Pointer<ffi.Void> reserved)>> enteredMainFile;
 
   /// Called when a file gets \#included/\#imported.
   external ffi.Pointer<
@@ -10958,9 +10986,10 @@
 
   /// Called at the beginning of indexing a translation unit.
   external ffi.Pointer<
-      ffi.NativeFunction<
-          CXIdxClientContainer Function(
-              CXClientData, ffi.Pointer<ffi.Void>)>> startedTranslationUnit;
+          ffi.NativeFunction<
+              CXIdxClientContainer Function(
+                  CXClientData client_data, ffi.Pointer<ffi.Void> reserved)>>
+      startedTranslationUnit;
 
   external ffi.Pointer<
           ffi.NativeFunction<
@@ -10980,64 +11009,64 @@
 /// The client's data object that is associated with an AST file (PCH
 /// or module).
 typedef CXIdxClientASTFile = ffi.Pointer<ffi.Void>;
-typedef NativeClang_indexSourceFile = ffi.Int32 Function(
+typedef NativeClang_indexSourceFile = ffi.Int Function(
     CXIndexAction arg0,
     CXClientData client_data,
     ffi.Pointer<IndexerCallbacks> index_callbacks,
-    ffi.Uint32 index_callbacks_size,
-    ffi.Uint32 index_options,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
-    ffi.Int32 num_command_line_args,
+    ffi.UnsignedInt index_callbacks_size,
+    ffi.UnsignedInt index_options,
+    ffi.Pointer<ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> command_line_args,
+    ffi.Int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
-    ffi.Uint32 num_unsaved_files,
+    ffi.UnsignedInt num_unsaved_files,
     ffi.Pointer<CXTranslationUnit> out_TU,
-    ffi.Uint32 TU_options);
+    ffi.UnsignedInt TU_options);
 typedef DartClang_indexSourceFile = int Function(
     CXIndexAction arg0,
     CXClientData client_data,
     ffi.Pointer<IndexerCallbacks> index_callbacks,
     int index_callbacks_size,
     int index_options,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    ffi.Pointer<ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> command_line_args,
     int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     int num_unsaved_files,
     ffi.Pointer<CXTranslationUnit> out_TU,
     int TU_options);
-typedef NativeClang_indexSourceFileFullArgv = ffi.Int32 Function(
+typedef NativeClang_indexSourceFileFullArgv = ffi.Int Function(
     CXIndexAction arg0,
     CXClientData client_data,
     ffi.Pointer<IndexerCallbacks> index_callbacks,
-    ffi.Uint32 index_callbacks_size,
-    ffi.Uint32 index_options,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
-    ffi.Int32 num_command_line_args,
+    ffi.UnsignedInt index_callbacks_size,
+    ffi.UnsignedInt index_options,
+    ffi.Pointer<ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> command_line_args,
+    ffi.Int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
-    ffi.Uint32 num_unsaved_files,
+    ffi.UnsignedInt num_unsaved_files,
     ffi.Pointer<CXTranslationUnit> out_TU,
-    ffi.Uint32 TU_options);
+    ffi.UnsignedInt TU_options);
 typedef DartClang_indexSourceFileFullArgv = int Function(
     CXIndexAction arg0,
     CXClientData client_data,
     ffi.Pointer<IndexerCallbacks> index_callbacks,
     int index_callbacks_size,
     int index_options,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    ffi.Pointer<ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> command_line_args,
     int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     int num_unsaved_files,
     ffi.Pointer<CXTranslationUnit> out_TU,
     int TU_options);
-typedef NativeClang_indexTranslationUnit = ffi.Int32 Function(
+typedef NativeClang_indexTranslationUnit = ffi.Int Function(
     CXIndexAction arg0,
     CXClientData client_data,
     ffi.Pointer<IndexerCallbacks> index_callbacks,
-    ffi.Uint32 index_callbacks_size,
-    ffi.Uint32 index_options,
+    ffi.UnsignedInt index_callbacks_size,
+    ffi.UnsignedInt index_options,
     CXTranslationUnit arg5);
 typedef DartClang_indexTranslationUnit = int Function(
     CXIndexAction arg0,
@@ -11050,16 +11079,16 @@
     CXIdxLoc loc,
     ffi.Pointer<CXIdxClientFile> indexFile,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset);
+    ffi.Pointer<ffi.UnsignedInt> line,
+    ffi.Pointer<ffi.UnsignedInt> column,
+    ffi.Pointer<ffi.UnsignedInt> offset);
 typedef DartClang_indexLoc_getFileLocation = void Function(
     CXIdxLoc loc,
     ffi.Pointer<CXIdxClientFile> indexFile,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset);
+    ffi.Pointer<ffi.UnsignedInt> line,
+    ffi.Pointer<ffi.UnsignedInt> column,
+    ffi.Pointer<ffi.UnsignedInt> offset);
 typedef NativeClang_indexLoc_getCXSourceLocation = CXSourceLocation Function(
     CXIdxLoc loc);
 typedef DartClang_indexLoc_getCXSourceLocation = CXSourceLocation Function(
@@ -11074,9 +11103,10 @@
 ///
 /// The visitor should return one of the \c CXVisitorResult values
 /// to direct \c clang_Type_visitFields.
-typedef CXFieldVisitor = ffi
-    .Pointer<ffi.NativeFunction<ffi.Int32 Function(CXCursor, CXClientData)>>;
-typedef NativeClang_Type_visitFields = ffi.Uint32 Function(
+typedef CXFieldVisitor = ffi.Pointer<
+    ffi.NativeFunction<
+        ffi.Int32 Function(CXCursor C, CXClientData client_data)>>;
+typedef NativeClang_Type_visitFields = ffi.UnsignedInt Function(
     CXType T, CXFieldVisitor visitor, CXClientData client_data);
 typedef DartClang_Type_visitFields = int Function(
     CXType T, CXFieldVisitor visitor, CXClientData client_data);
diff --git a/pkgs/ffigen/example/libclang-example/pubspec.yaml b/pkgs/ffigen/example/libclang-example/pubspec.yaml
index f10498b..daef35b 100644
--- a/pkgs/ffigen/example/libclang-example/pubspec.yaml
+++ b/pkgs/ffigen/example/libclang-example/pubspec.yaml
@@ -5,88 +5,11 @@
 name: libclang_example
 
 environment:
-  sdk: '>=2.13.0 <3.0.0'
+  sdk: '>=2.17.0 <4.0.0'
 
+dependencies:
+  ffi: ^2.0.1
 dev_dependencies:
   ffigen:
     path: '../../'
-  lints: ^1.0.1
-
-ffigen:
-  output: 'generated_bindings.dart'
-
-  # This will sort the bindings alphabetically.
-  # sort: true
-
-  # This is required if LLVM can't be found in default locations by ffigen.
-  # llvm-path:
-  #   - '/usr/local/opt/llvm'
-
-  # Bash style Glob matching is also supported.
-  # TODO(11): Globs dont work on windows if they begin with '.' or '..'.
-  headers:
-    entry-points:
-      - ../../third_party/libclang/include/clang-c/Index.h
-    include-directives: # use glob syntax to match with header file path.
-      - '**CXString.h'
-      - '**Index.h'
-
-  compiler-opts:
-    - '-I../../third_party/libclang/include'
-    - '-Wno-nullability-completeness'
-  functions:
-    include:
-      - 'clang_.*' # Can be a regexp, '.' matches any character.
-    symbol-address:
-      include:
-        - 'clang_.*' # Symbol Address for these functions will be exposed via addresses.
-    expose-typedefs:
-      include:
-        - 'clang_.*' # Typedefs for Native and Dart type for these functions will be generated.
-  structs:
-    include:
-        - 'CX.*'
-  enums:
-    include:
-      - 'CXTypeKind' # Full names are given higher priority than regexp.
-      - 'CXGlobalOptFlags'
-
-  # These are optional and also default,
-  # Omitting any and the default will be used.
-  size-map:
-    char: 1
-    unsigned char: 1
-    short: 2
-    unsigned short: 2
-    int: 4
-    unsigned int: 4
-    long: 8
-    unsigned long: 8
-    long long: 8
-    unsigned long long: 8
-    enum: 4
-
-  # These can be used to map any typedef to a specific native type.
-  typedef-map:
-    'size_t': 'IntPtr'
-    'time_t': 'Int64'
-
-  # Default is 'NativeLibrary'
-  name: 'LibClang'
-
-  description: 'Holds bindings to LibClang.'
-
-  # Doc Comments for generated binings.
-  # Comments can be disabled by using comments: false
-  comments:
-    style: doxygen # Options - doxygen(default) / any.
-    length: full # Options - brief / full(default).
-
-  # The header of the file, this is pasted as it is.
-  preamble: |
-    // Part of the LLVM Project, under the Apache License v2.0 with LLVM
-    // Exceptions.
-    // See https://llvm.org/LICENSE.txt for license information.
-    // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-
-    // ignore_for_file: camel_case_types, non_constant_identifier_names
+  lints: ^2.0.1
diff --git a/pkgs/ffigen/example/libclang-example/readme.md b/pkgs/ffigen/example/libclang-example/readme.md
index dab0bdf..39f2474 100644
--- a/pkgs/ffigen/example/libclang-example/readme.md
+++ b/pkgs/ffigen/example/libclang-example/readme.md
@@ -6,6 +6,6 @@
 ## Generating bindings
 At the root of this example (`example/libclang-example`), run -
 ```
-dart run ffigen
+dart run ffigen --config config.yaml
 ```
 This will generate bindings in a file: [generated_bindings.dart](./generated_bindings.dart).
diff --git a/pkgs/ffigen/example/objective_c/README.md b/pkgs/ffigen/example/objective_c/README.md
new file mode 100644
index 0000000..846b77a
--- /dev/null
+++ b/pkgs/ffigen/example/objective_c/README.md
@@ -0,0 +1,44 @@
+# Objective C example
+
+This example shows how to use ffigen to generate bindings for an Objective C
+library. It uses the AVFAudio framework to play audio files.
+
+```
+dart play_audio.dart test.mp3
+```
+
+## Config notes
+
+The ffigen config for an Objective C library looks very similar to a C library.
+The most important difference is that you must set `language: objc`. If you want
+to filter which interfaces are included you can use the `objc-interfaces:`
+option. This works similarly to the other filtering options.
+
+It is recommended that you filter out just about everything you're not
+interested in binding (see the ffigen config in [pubspec.yaml](./pubspec.yaml)).
+Virtually all Objective C libraries depend on Apple's internal libraries, which
+are huge. Filtering can reduce the generated bindings from millions of lines to
+tens of thousands. You can use the `exclude-all-by-default` flag, or exclude
+individual sets of declarations like this:
+
+```yaml
+functions:
+  exclude:
+    - '.*'
+# Same for structs/unions/enums etc.
+```
+
+In this example, we're only interested in `AVAudioPlayer`, so we've filtered out
+everything else. But ffigen will automatically pull in anything referenced by
+any of the fields or methods of `AVAudioPlayer`, so we're still able to use
+`NSURL` etc to load our audio file.
+
+## Generating bindings
+
+At the root of this example (`example/objective_c`), run:
+
+```
+dart run ffigen --config config.yaml
+```
+
+This will generate [avf_audio_bindings.dart](./avf_audio_bindings.dart).
diff --git a/pkgs/ffigen/example/objective_c/avf_audio_bindings.dart b/pkgs/ffigen/example/objective_c/avf_audio_bindings.dart
new file mode 100644
index 0000000..972e8fe
--- /dev/null
+++ b/pkgs/ffigen/example/objective_c/avf_audio_bindings.dart
@@ -0,0 +1,67761 @@
+// ignore_for_file: camel_case_types, non_constant_identifier_names, unused_element, unused_field, return_of_invalid_type, void_checks, annotate_overrides, no_leading_underscores_for_local_identifiers, library_private_types_in_public_api
+
+// AUTO GENERATED FILE, DO NOT EDIT.
+//
+// Generated by `package:ffigen`.
+// ignore_for_file: type=lint
+import 'dart:ffi' as ffi;
+import 'package:ffi/ffi.dart' as pkg_ffi;
+
+/// Bindings for AVFAudio.
+class AVFAudio {
+  /// Holds the symbol lookup function.
+  final ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
+      _lookup;
+
+  /// The symbols are looked up in [dynamicLibrary].
+  AVFAudio(ffi.DynamicLibrary dynamicLibrary) : _lookup = dynamicLibrary.lookup;
+
+  /// The symbols are looked up with [lookup].
+  AVFAudio.fromLookup(
+      ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
+          lookup)
+      : _lookup = lookup;
+
+  ffi.Pointer<ObjCSel> _registerName1(String name) {
+    final cstr = name.toNativeUtf8();
+    final sel = _sel_registerName(cstr.cast());
+    pkg_ffi.calloc.free(cstr);
+    return sel;
+  }
+
+  ffi.Pointer<ObjCSel> _sel_registerName(
+    ffi.Pointer<ffi.Char> str,
+  ) {
+    return __sel_registerName(
+      str,
+    );
+  }
+
+  late final __sel_registerNamePtr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCSel> Function(
+              ffi.Pointer<ffi.Char>)>>('sel_registerName');
+  late final __sel_registerName = __sel_registerNamePtr
+      .asFunction<ffi.Pointer<ObjCSel> Function(ffi.Pointer<ffi.Char>)>();
+
+  ffi.Pointer<ObjCObject> _getClass1(String name) {
+    final cstr = name.toNativeUtf8();
+    final clazz = _objc_getClass(cstr.cast());
+    pkg_ffi.calloc.free(cstr);
+    if (clazz == ffi.nullptr) {
+      throw Exception('Failed to load Objective-C class: $name');
+    }
+    return clazz;
+  }
+
+  ffi.Pointer<ObjCObject> _objc_getClass(
+    ffi.Pointer<ffi.Char> str,
+  ) {
+    return __objc_getClass(
+      str,
+    );
+  }
+
+  late final __objc_getClassPtr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ffi.Char>)>>('objc_getClass');
+  late final __objc_getClass = __objc_getClassPtr
+      .asFunction<ffi.Pointer<ObjCObject> Function(ffi.Pointer<ffi.Char>)>();
+
+  ffi.Pointer<ObjCObject> _objc_retain(
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_retain(
+      value,
+    );
+  }
+
+  late final __objc_retainPtr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>)>>('objc_retain');
+  late final __objc_retain = __objc_retainPtr
+      .asFunction<ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>)>();
+
+  void _objc_release(
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_release(
+      value,
+    );
+  }
+
+  late final __objc_releasePtr =
+      _lookup<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ObjCObject>)>>(
+          'objc_release');
+  late final __objc_release =
+      __objc_releasePtr.asFunction<void Function(ffi.Pointer<ObjCObject>)>();
+
+  late final _objc_releaseFinalizer2 =
+      ffi.NativeFinalizer(__objc_releasePtr.cast());
+  late final _class_NSObject1 = _getClass1("NSObject");
+  late final _sel_load1 = _registerName1("load");
+  void _objc_msgSend_1(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_1(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_1Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_1 = __objc_msgSend_1Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_initialize1 = _registerName1("initialize");
+  late final _sel_init1 = _registerName1("init");
+  instancetype _objc_msgSend_2(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_2(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_2Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_2 = __objc_msgSend_2Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_new1 = _registerName1("new");
+  late final _sel_allocWithZone_1 = _registerName1("allocWithZone:");
+  instancetype _objc_msgSend_3(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_NSZone> zone,
+  ) {
+    return __objc_msgSend_3(
+      obj,
+      sel,
+      zone,
+    );
+  }
+
+  late final __objc_msgSend_3Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_NSZone>)>>('objc_msgSend');
+  late final __objc_msgSend_3 = __objc_msgSend_3Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_NSZone>)>();
+
+  late final _sel_alloc1 = _registerName1("alloc");
+  late final _sel_dealloc1 = _registerName1("dealloc");
+  late final _sel_finalize1 = _registerName1("finalize");
+  late final _sel_copy1 = _registerName1("copy");
+  late final _sel_mutableCopy1 = _registerName1("mutableCopy");
+  late final _sel_copyWithZone_1 = _registerName1("copyWithZone:");
+  late final _sel_mutableCopyWithZone_1 =
+      _registerName1("mutableCopyWithZone:");
+  late final _sel_instancesRespondToSelector_1 =
+      _registerName1("instancesRespondToSelector:");
+  bool _objc_msgSend_4(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCSel> aSelector,
+  ) {
+    return __objc_msgSend_4(
+      obj,
+      sel,
+      aSelector,
+    );
+  }
+
+  late final __objc_msgSend_4Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_4 = __objc_msgSend_4Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCSel>)>();
+
+  bool _objc_msgSend_0(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> clazz,
+  ) {
+    return __objc_msgSend_0(
+      obj,
+      sel,
+      clazz,
+    );
+  }
+
+  late final __objc_msgSend_0Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_0 = __objc_msgSend_0Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_isKindOfClass_1 = _registerName1("isKindOfClass:");
+  late final _class_Protocol1 = _getClass1("Protocol");
+  late final _sel_conformsToProtocol_1 = _registerName1("conformsToProtocol:");
+  bool _objc_msgSend_5(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> protocol,
+  ) {
+    return __objc_msgSend_5(
+      obj,
+      sel,
+      protocol,
+    );
+  }
+
+  late final __objc_msgSend_5Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_5 = __objc_msgSend_5Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_methodForSelector_1 = _registerName1("methodForSelector:");
+  IMP _objc_msgSend_6(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCSel> aSelector,
+  ) {
+    return __objc_msgSend_6(
+      obj,
+      sel,
+      aSelector,
+    );
+  }
+
+  late final __objc_msgSend_6Ptr = _lookup<
+      ffi.NativeFunction<
+          IMP Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_6 = __objc_msgSend_6Ptr.asFunction<
+      IMP Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_instanceMethodForSelector_1 =
+      _registerName1("instanceMethodForSelector:");
+  late final _sel_doesNotRecognizeSelector_1 =
+      _registerName1("doesNotRecognizeSelector:");
+  void _objc_msgSend_7(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCSel> aSelector,
+  ) {
+    return __objc_msgSend_7(
+      obj,
+      sel,
+      aSelector,
+    );
+  }
+
+  late final __objc_msgSend_7Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_7 = __objc_msgSend_7Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_forwardingTargetForSelector_1 =
+      _registerName1("forwardingTargetForSelector:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_8(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCSel> aSelector,
+  ) {
+    return __objc_msgSend_8(
+      obj,
+      sel,
+      aSelector,
+    );
+  }
+
+  late final __objc_msgSend_8Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_8 = __objc_msgSend_8Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCSel>)>();
+
+  late final _class_NSInvocation1 = _getClass1("NSInvocation");
+  late final _class_NSMethodSignature1 = _getClass1("NSMethodSignature");
+  late final _sel_signatureWithObjCTypes_1 =
+      _registerName1("signatureWithObjCTypes:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_9(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Char> types,
+  ) {
+    return __objc_msgSend_9(
+      obj,
+      sel,
+      types,
+    );
+  }
+
+  late final __objc_msgSend_9Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ffi.Char>)>>('objc_msgSend');
+  late final __objc_msgSend_9 = __objc_msgSend_9Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ffi.Char>)>();
+
+  late final _sel_numberOfArguments1 = _registerName1("numberOfArguments");
+  int _objc_msgSend_10(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_10(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_10Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_10 = __objc_msgSend_10Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_getArgumentTypeAtIndex_1 =
+      _registerName1("getArgumentTypeAtIndex:");
+  ffi.Pointer<ffi.Char> _objc_msgSend_11(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int idx,
+  ) {
+    return __objc_msgSend_11(
+      obj,
+      sel,
+      idx,
+    );
+  }
+
+  late final __objc_msgSend_11Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ffi.Char> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_11 = __objc_msgSend_11Ptr.asFunction<
+      ffi.Pointer<ffi.Char> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_frameLength1 = _registerName1("frameLength");
+  late final _sel_isOneway1 = _registerName1("isOneway");
+  bool _objc_msgSend_12(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_12(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_12Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_12 = __objc_msgSend_12Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_methodReturnType1 = _registerName1("methodReturnType");
+  ffi.Pointer<ffi.Char> _objc_msgSend_13(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_13(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_13Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ffi.Char> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_13 = __objc_msgSend_13Ptr.asFunction<
+      ffi.Pointer<ffi.Char> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_methodReturnLength1 = _registerName1("methodReturnLength");
+  late final _sel_cancelPreviousPerformRequestsWithTarget_selector_object_1 =
+      _registerName1(
+          "cancelPreviousPerformRequestsWithTarget:selector:object:");
+  void _objc_msgSend_14(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> aTarget,
+    ffi.Pointer<ObjCSel> aSelector,
+    ffi.Pointer<ObjCObject> anArgument,
+  ) {
+    return __objc_msgSend_14(
+      obj,
+      sel,
+      aTarget,
+      aSelector,
+      anArgument,
+    );
+  }
+
+  late final __objc_msgSend_14Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_14 = __objc_msgSend_14Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_cancelPreviousPerformRequestsWithTarget_1 =
+      _registerName1("cancelPreviousPerformRequestsWithTarget:");
+  void _objc_msgSend_15(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> aTarget,
+  ) {
+    return __objc_msgSend_15(
+      obj,
+      sel,
+      aTarget,
+    );
+  }
+
+  late final __objc_msgSend_15Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_15 = __objc_msgSend_15Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_accessInstanceVariablesDirectly1 =
+      _registerName1("accessInstanceVariablesDirectly");
+  late final _sel_useStoredAccessor1 = _registerName1("useStoredAccessor");
+  late final _class_NSSet1 = _getClass1("NSSet");
+  late final _sel_count1 = _registerName1("count");
+  late final _sel_member_1 = _registerName1("member:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_16(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> object,
+  ) {
+    return __objc_msgSend_16(
+      obj,
+      sel,
+      object,
+    );
+  }
+
+  late final __objc_msgSend_16Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_16 = __objc_msgSend_16Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSEnumerator1 = _getClass1("NSEnumerator");
+  late final _sel_nextObject1 = _registerName1("nextObject");
+  late final _class_NSString1 = _getClass1("NSString");
+  late final _sel_length1 = _registerName1("length");
+  late final _sel_characterAtIndex_1 = _registerName1("characterAtIndex:");
+  int _objc_msgSend_17(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int index,
+  ) {
+    return __objc_msgSend_17(
+      obj,
+      sel,
+      index,
+    );
+  }
+
+  late final __objc_msgSend_17Ptr = _lookup<
+      ffi.NativeFunction<
+          unichar Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_17 = __objc_msgSend_17Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _class_NSCoder1 = _getClass1("NSCoder");
+  late final _sel_encodeValueOfObjCType_at_1 =
+      _registerName1("encodeValueOfObjCType:at:");
+  void _objc_msgSend_18(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Char> type,
+    ffi.Pointer<ffi.Void> addr,
+  ) {
+    return __objc_msgSend_18(
+      obj,
+      sel,
+      type,
+      addr,
+    );
+  }
+
+  late final __objc_msgSend_18Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Char>, ffi.Pointer<ffi.Void>)>>('objc_msgSend');
+  late final __objc_msgSend_18 = __objc_msgSend_18Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Char>, ffi.Pointer<ffi.Void>)>();
+
+  late final _class_NSData1 = _getClass1("NSData");
+  late final _sel_bytes1 = _registerName1("bytes");
+  ffi.Pointer<ffi.Void> _objc_msgSend_19(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_19(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_19Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ffi.Void> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_19 = __objc_msgSend_19Ptr.asFunction<
+      ffi.Pointer<ffi.Void> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_description1 = _registerName1("description");
+  ffi.Pointer<ObjCObject> _objc_msgSend_20(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_20(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_20Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_20 = __objc_msgSend_20Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_getBytes_length_1 = _registerName1("getBytes:length:");
+  void _objc_msgSend_21(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Void> buffer,
+    int length,
+  ) {
+    return __objc_msgSend_21(
+      obj,
+      sel,
+      buffer,
+      length,
+    );
+  }
+
+  late final __objc_msgSend_21Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Void>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_21 = __objc_msgSend_21Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Void>, int)>();
+
+  late final _sel_getBytes_range_1 = _registerName1("getBytes:range:");
+  void _objc_msgSend_22(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Void> buffer,
+    NSRange range,
+  ) {
+    return __objc_msgSend_22(
+      obj,
+      sel,
+      buffer,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_22Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Void>, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_22 = __objc_msgSend_22Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Void>, NSRange)>();
+
+  late final _sel_isEqualToData_1 = _registerName1("isEqualToData:");
+  bool _objc_msgSend_23(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> other,
+  ) {
+    return __objc_msgSend_23(
+      obj,
+      sel,
+      other,
+    );
+  }
+
+  late final __objc_msgSend_23Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_23 = __objc_msgSend_23Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_subdataWithRange_1 = _registerName1("subdataWithRange:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_24(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+  ) {
+    return __objc_msgSend_24(
+      obj,
+      sel,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_24Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_24 = __objc_msgSend_24Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange)>();
+
+  late final _sel_writeToFile_atomically_1 =
+      _registerName1("writeToFile:atomically:");
+  bool _objc_msgSend_25(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    bool useAuxiliaryFile,
+  ) {
+    return __objc_msgSend_25(
+      obj,
+      sel,
+      path,
+      useAuxiliaryFile,
+    );
+  }
+
+  late final __objc_msgSend_25Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_25 = __objc_msgSend_25Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, bool)>();
+
+  late final _class_NSURL1 = _getClass1("NSURL");
+  late final _sel_initWithScheme_host_path_1 =
+      _registerName1("initWithScheme:host:path:");
+  instancetype _objc_msgSend_26(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> scheme,
+    ffi.Pointer<ObjCObject> host,
+    ffi.Pointer<ObjCObject> path,
+  ) {
+    return __objc_msgSend_26(
+      obj,
+      sel,
+      scheme,
+      host,
+      path,
+    );
+  }
+
+  late final __objc_msgSend_26Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_26 = __objc_msgSend_26Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initFileURLWithPath_isDirectory_relativeToURL_1 =
+      _registerName1("initFileURLWithPath:isDirectory:relativeToURL:");
+  instancetype _objc_msgSend_27(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    bool isDir,
+    ffi.Pointer<ObjCObject> baseURL,
+  ) {
+    return __objc_msgSend_27(
+      obj,
+      sel,
+      path,
+      isDir,
+      baseURL,
+    );
+  }
+
+  late final __objc_msgSend_27Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_27 = __objc_msgSend_27Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, bool, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initFileURLWithPath_relativeToURL_1 =
+      _registerName1("initFileURLWithPath:relativeToURL:");
+  instancetype _objc_msgSend_28(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    ffi.Pointer<ObjCObject> baseURL,
+  ) {
+    return __objc_msgSend_28(
+      obj,
+      sel,
+      path,
+      baseURL,
+    );
+  }
+
+  late final __objc_msgSend_28Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_28 = __objc_msgSend_28Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initFileURLWithPath_isDirectory_1 =
+      _registerName1("initFileURLWithPath:isDirectory:");
+  instancetype _objc_msgSend_29(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    bool isDir,
+  ) {
+    return __objc_msgSend_29(
+      obj,
+      sel,
+      path,
+      isDir,
+    );
+  }
+
+  late final __objc_msgSend_29Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_29 = __objc_msgSend_29Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, bool)>();
+
+  late final _sel_initFileURLWithPath_1 =
+      _registerName1("initFileURLWithPath:");
+  instancetype _objc_msgSend_30(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+  ) {
+    return __objc_msgSend_30(
+      obj,
+      sel,
+      path,
+    );
+  }
+
+  late final __objc_msgSend_30Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_30 = __objc_msgSend_30Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_fileURLWithPath_isDirectory_relativeToURL_1 =
+      _registerName1("fileURLWithPath:isDirectory:relativeToURL:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_31(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    bool isDir,
+    ffi.Pointer<ObjCObject> baseURL,
+  ) {
+    return __objc_msgSend_31(
+      obj,
+      sel,
+      path,
+      isDir,
+      baseURL,
+    );
+  }
+
+  late final __objc_msgSend_31Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_31 = __objc_msgSend_31Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          bool,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_fileURLWithPath_relativeToURL_1 =
+      _registerName1("fileURLWithPath:relativeToURL:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_32(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    ffi.Pointer<ObjCObject> baseURL,
+  ) {
+    return __objc_msgSend_32(
+      obj,
+      sel,
+      path,
+      baseURL,
+    );
+  }
+
+  late final __objc_msgSend_32Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_32 = __objc_msgSend_32Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_fileURLWithPath_isDirectory_1 =
+      _registerName1("fileURLWithPath:isDirectory:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_33(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    bool isDir,
+  ) {
+    return __objc_msgSend_33(
+      obj,
+      sel,
+      path,
+      isDir,
+    );
+  }
+
+  late final __objc_msgSend_33Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_33 = __objc_msgSend_33Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>, bool)>();
+
+  late final _sel_fileURLWithPath_1 = _registerName1("fileURLWithPath:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_34(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+  ) {
+    return __objc_msgSend_34(
+      obj,
+      sel,
+      path,
+    );
+  }
+
+  late final __objc_msgSend_34Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_34 = __objc_msgSend_34Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initFileURLWithFileSystemRepresentation_isDirectory_relativeToURL_1 =
+      _registerName1(
+          "initFileURLWithFileSystemRepresentation:isDirectory:relativeToURL:");
+  instancetype _objc_msgSend_35(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Char> path,
+    bool isDir,
+    ffi.Pointer<ObjCObject> baseURL,
+  ) {
+    return __objc_msgSend_35(
+      obj,
+      sel,
+      path,
+      isDir,
+      baseURL,
+    );
+  }
+
+  late final __objc_msgSend_35Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Char>,
+              ffi.Bool,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_35 = __objc_msgSend_35Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Char>, bool, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_fileURLWithFileSystemRepresentation_isDirectory_relativeToURL_1 =
+      _registerName1(
+          "fileURLWithFileSystemRepresentation:isDirectory:relativeToURL:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_36(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Char> path,
+    bool isDir,
+    ffi.Pointer<ObjCObject> baseURL,
+  ) {
+    return __objc_msgSend_36(
+      obj,
+      sel,
+      path,
+      isDir,
+      baseURL,
+    );
+  }
+
+  late final __objc_msgSend_36Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Char>,
+              ffi.Bool,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_36 = __objc_msgSend_36Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Char>,
+          bool,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithString_1 = _registerName1("initWithString:");
+  late final _sel_initWithString_relativeToURL_1 =
+      _registerName1("initWithString:relativeToURL:");
+  late final _sel_URLWithString_1 = _registerName1("URLWithString:");
+  late final _sel_URLWithString_relativeToURL_1 =
+      _registerName1("URLWithString:relativeToURL:");
+  late final _sel_initWithDataRepresentation_relativeToURL_1 =
+      _registerName1("initWithDataRepresentation:relativeToURL:");
+  instancetype _objc_msgSend_37(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> data,
+    ffi.Pointer<ObjCObject> baseURL,
+  ) {
+    return __objc_msgSend_37(
+      obj,
+      sel,
+      data,
+      baseURL,
+    );
+  }
+
+  late final __objc_msgSend_37Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_37 = __objc_msgSend_37Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_URLWithDataRepresentation_relativeToURL_1 =
+      _registerName1("URLWithDataRepresentation:relativeToURL:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_38(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> data,
+    ffi.Pointer<ObjCObject> baseURL,
+  ) {
+    return __objc_msgSend_38(
+      obj,
+      sel,
+      data,
+      baseURL,
+    );
+  }
+
+  late final __objc_msgSend_38Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_38 = __objc_msgSend_38Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initAbsoluteURLWithDataRepresentation_relativeToURL_1 =
+      _registerName1("initAbsoluteURLWithDataRepresentation:relativeToURL:");
+  late final _sel_absoluteURLWithDataRepresentation_relativeToURL_1 =
+      _registerName1("absoluteURLWithDataRepresentation:relativeToURL:");
+  late final _sel_dataRepresentation1 = _registerName1("dataRepresentation");
+  ffi.Pointer<ObjCObject> _objc_msgSend_39(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_39(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_39Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_39 = __objc_msgSend_39Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_absoluteString1 = _registerName1("absoluteString");
+  late final _sel_relativeString1 = _registerName1("relativeString");
+  late final _sel_baseURL1 = _registerName1("baseURL");
+  ffi.Pointer<ObjCObject> _objc_msgSend_40(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_40(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_40Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_40 = __objc_msgSend_40Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_absoluteURL1 = _registerName1("absoluteURL");
+  late final _sel_scheme1 = _registerName1("scheme");
+  late final _sel_resourceSpecifier1 = _registerName1("resourceSpecifier");
+  late final _sel_host1 = _registerName1("host");
+  late final _class_NSNumber1 = _getClass1("NSNumber");
+  late final _class_NSValue1 = _getClass1("NSValue");
+  late final _sel_getValue_size_1 = _registerName1("getValue:size:");
+  late final _sel_objCType1 = _registerName1("objCType");
+  late final _sel_initWithBytes_objCType_1 =
+      _registerName1("initWithBytes:objCType:");
+  instancetype _objc_msgSend_41(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Void> value,
+    ffi.Pointer<ffi.Char> type,
+  ) {
+    return __objc_msgSend_41(
+      obj,
+      sel,
+      value,
+      type,
+    );
+  }
+
+  late final __objc_msgSend_41Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Char>)>>('objc_msgSend');
+  late final __objc_msgSend_41 = __objc_msgSend_41Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Char>)>();
+
+  late final _sel_initWithCoder_1 = _registerName1("initWithCoder:");
+  instancetype _objc_msgSend_42(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> coder,
+  ) {
+    return __objc_msgSend_42(
+      obj,
+      sel,
+      coder,
+    );
+  }
+
+  late final __objc_msgSend_42Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_42 = __objc_msgSend_42Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_valueWithBytes_objCType_1 =
+      _registerName1("valueWithBytes:objCType:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_43(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Void> value,
+    ffi.Pointer<ffi.Char> type,
+  ) {
+    return __objc_msgSend_43(
+      obj,
+      sel,
+      value,
+      type,
+    );
+  }
+
+  late final __objc_msgSend_43Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Void>,
+              ffi.Pointer<ffi.Char>)>>('objc_msgSend');
+  late final __objc_msgSend_43 = __objc_msgSend_43Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Void>,
+          ffi.Pointer<ffi.Char>)>();
+
+  late final _sel_value_withObjCType_1 = _registerName1("value:withObjCType:");
+  late final _sel_valueWithNonretainedObject_1 =
+      _registerName1("valueWithNonretainedObject:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_44(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> anObject,
+  ) {
+    return __objc_msgSend_44(
+      obj,
+      sel,
+      anObject,
+    );
+  }
+
+  late final __objc_msgSend_44Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_44 = __objc_msgSend_44Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_nonretainedObjectValue1 =
+      _registerName1("nonretainedObjectValue");
+  late final _sel_valueWithPointer_1 = _registerName1("valueWithPointer:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_45(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Void> pointer,
+  ) {
+    return __objc_msgSend_45(
+      obj,
+      sel,
+      pointer,
+    );
+  }
+
+  late final __objc_msgSend_45Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ffi.Void>)>>('objc_msgSend');
+  late final __objc_msgSend_45 = __objc_msgSend_45Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ffi.Void>)>();
+
+  late final _sel_pointerValue1 = _registerName1("pointerValue");
+  late final _sel_isEqualToValue_1 = _registerName1("isEqualToValue:");
+  bool _objc_msgSend_46(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_46(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_46Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_46 = __objc_msgSend_46Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_getValue_1 = _registerName1("getValue:");
+  void _objc_msgSend_47(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Void> value,
+  ) {
+    return __objc_msgSend_47(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_47Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Void>)>>('objc_msgSend');
+  late final __objc_msgSend_47 = __objc_msgSend_47Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Void>)>();
+
+  late final _sel_valueWithRange_1 = _registerName1("valueWithRange:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_48(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+  ) {
+    return __objc_msgSend_48(
+      obj,
+      sel,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_48Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_48 = __objc_msgSend_48Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange)>();
+
+  late final _sel_rangeValue1 = _registerName1("rangeValue");
+  NSRange _objc_msgSend_49(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_49(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_49Ptr = _lookup<
+      ffi.NativeFunction<
+          NSRange Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_49 = __objc_msgSend_49Ptr.asFunction<
+      NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_valueWithPoint_1 = _registerName1("valueWithPoint:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_50(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSPoint point,
+  ) {
+    return __objc_msgSend_50(
+      obj,
+      sel,
+      point,
+    );
+  }
+
+  late final __objc_msgSend_50Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSPoint)>>('objc_msgSend');
+  late final __objc_msgSend_50 = __objc_msgSend_50Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSPoint)>();
+
+  late final _sel_valueWithSize_1 = _registerName1("valueWithSize:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_51(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSSize size,
+  ) {
+    return __objc_msgSend_51(
+      obj,
+      sel,
+      size,
+    );
+  }
+
+  late final __objc_msgSend_51Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSSize)>>('objc_msgSend');
+  late final __objc_msgSend_51 = __objc_msgSend_51Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSSize)>();
+
+  late final _sel_valueWithRect_1 = _registerName1("valueWithRect:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_52(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRect rect,
+  ) {
+    return __objc_msgSend_52(
+      obj,
+      sel,
+      rect,
+    );
+  }
+
+  late final __objc_msgSend_52Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSRect)>>('objc_msgSend');
+  late final __objc_msgSend_52 = __objc_msgSend_52Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRect)>();
+
+  late final _sel_valueWithEdgeInsets_1 =
+      _registerName1("valueWithEdgeInsets:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_53(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSEdgeInsets insets,
+  ) {
+    return __objc_msgSend_53(
+      obj,
+      sel,
+      insets,
+    );
+  }
+
+  late final __objc_msgSend_53Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSEdgeInsets)>>('objc_msgSend');
+  late final __objc_msgSend_53 = __objc_msgSend_53Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSEdgeInsets)>();
+
+  late final _sel_pointValue1 = _registerName1("pointValue");
+  NSPoint _objc_msgSend_54(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_54(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_54Ptr = _lookup<
+      ffi.NativeFunction<
+          NSPoint Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_54 = __objc_msgSend_54Ptr.asFunction<
+      NSPoint Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_sizeValue1 = _registerName1("sizeValue");
+  NSSize _objc_msgSend_55(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_55(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_55Ptr = _lookup<
+      ffi.NativeFunction<
+          NSSize Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_55 = __objc_msgSend_55Ptr.asFunction<
+      NSSize Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_rectValue1 = _registerName1("rectValue");
+  NSRect _objc_msgSend_56(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_56(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_56Ptr = _lookup<
+      ffi.NativeFunction<
+          NSRect Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_56 = __objc_msgSend_56Ptr.asFunction<
+      NSRect Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_edgeInsetsValue1 = _registerName1("edgeInsetsValue");
+  NSEdgeInsets _objc_msgSend_57(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_57(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_57Ptr = _lookup<
+      ffi.NativeFunction<
+          NSEdgeInsets Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_57 = __objc_msgSend_57Ptr.asFunction<
+      NSEdgeInsets Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_keyPathsForValuesAffectingValueForKey_1 =
+      _registerName1("keyPathsForValuesAffectingValueForKey:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_58(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_58(
+      obj,
+      sel,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_58Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_58 = __objc_msgSend_58Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_automaticallyNotifiesObserversForKey_1 =
+      _registerName1("automaticallyNotifiesObserversForKey:");
+  bool _objc_msgSend_59(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_59(
+      obj,
+      sel,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_59Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_59 = __objc_msgSend_59Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSArray1 = _getClass1("NSArray");
+  late final _sel_objectAtIndex_1 = _registerName1("objectAtIndex:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_60(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int index,
+  ) {
+    return __objc_msgSend_60(
+      obj,
+      sel,
+      index,
+    );
+  }
+
+  late final __objc_msgSend_60Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_60 = __objc_msgSend_60Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_initWithObjects_count_1 =
+      _registerName1("initWithObjects:count:");
+  instancetype _objc_msgSend_61(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> objects,
+    int cnt,
+  ) {
+    return __objc_msgSend_61(
+      obj,
+      sel,
+      objects,
+      cnt,
+    );
+  }
+
+  late final __objc_msgSend_61Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_61 = __objc_msgSend_61Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>, int)>();
+
+  late final _sel_arrayByAddingObject_1 =
+      _registerName1("arrayByAddingObject:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_62(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> anObject,
+  ) {
+    return __objc_msgSend_62(
+      obj,
+      sel,
+      anObject,
+    );
+  }
+
+  late final __objc_msgSend_62Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_62 = __objc_msgSend_62Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_arrayByAddingObjectsFromArray_1 =
+      _registerName1("arrayByAddingObjectsFromArray:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_63(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> otherArray,
+  ) {
+    return __objc_msgSend_63(
+      obj,
+      sel,
+      otherArray,
+    );
+  }
+
+  late final __objc_msgSend_63Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_63 = __objc_msgSend_63Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_componentsJoinedByString_1 =
+      _registerName1("componentsJoinedByString:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_64(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> separator,
+  ) {
+    return __objc_msgSend_64(
+      obj,
+      sel,
+      separator,
+    );
+  }
+
+  late final __objc_msgSend_64Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_64 = __objc_msgSend_64Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_containsObject_1 = _registerName1("containsObject:");
+  late final _sel_descriptionWithLocale_1 =
+      _registerName1("descriptionWithLocale:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_65(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> locale,
+  ) {
+    return __objc_msgSend_65(
+      obj,
+      sel,
+      locale,
+    );
+  }
+
+  late final __objc_msgSend_65Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_65 = __objc_msgSend_65Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_descriptionWithLocale_indent_1 =
+      _registerName1("descriptionWithLocale:indent:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_66(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> locale,
+    int level,
+  ) {
+    return __objc_msgSend_66(
+      obj,
+      sel,
+      locale,
+      level,
+    );
+  }
+
+  late final __objc_msgSend_66Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_66 = __objc_msgSend_66Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_firstObjectCommonWithArray_1 =
+      _registerName1("firstObjectCommonWithArray:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_67(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> otherArray,
+  ) {
+    return __objc_msgSend_67(
+      obj,
+      sel,
+      otherArray,
+    );
+  }
+
+  late final __objc_msgSend_67Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_67 = __objc_msgSend_67Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_getObjects_range_1 = _registerName1("getObjects:range:");
+  void _objc_msgSend_68(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> objects,
+    NSRange range,
+  ) {
+    return __objc_msgSend_68(
+      obj,
+      sel,
+      objects,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_68Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_68 = __objc_msgSend_68Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>, NSRange)>();
+
+  late final _sel_indexOfObject_1 = _registerName1("indexOfObject:");
+  int _objc_msgSend_69(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> anObject,
+  ) {
+    return __objc_msgSend_69(
+      obj,
+      sel,
+      anObject,
+    );
+  }
+
+  late final __objc_msgSend_69Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_69 = __objc_msgSend_69Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_indexOfObject_inRange_1 =
+      _registerName1("indexOfObject:inRange:");
+  int _objc_msgSend_70(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> anObject,
+    NSRange range,
+  ) {
+    return __objc_msgSend_70(
+      obj,
+      sel,
+      anObject,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_70Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_70 = __objc_msgSend_70Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, NSRange)>();
+
+  late final _sel_indexOfObjectIdenticalTo_1 =
+      _registerName1("indexOfObjectIdenticalTo:");
+  late final _sel_indexOfObjectIdenticalTo_inRange_1 =
+      _registerName1("indexOfObjectIdenticalTo:inRange:");
+  late final _sel_isEqualToArray_1 = _registerName1("isEqualToArray:");
+  bool _objc_msgSend_71(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> otherArray,
+  ) {
+    return __objc_msgSend_71(
+      obj,
+      sel,
+      otherArray,
+    );
+  }
+
+  late final __objc_msgSend_71Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_71 = __objc_msgSend_71Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_firstObject1 = _registerName1("firstObject");
+  late final _sel_lastObject1 = _registerName1("lastObject");
+  late final _sel_objectEnumerator1 = _registerName1("objectEnumerator");
+  ffi.Pointer<ObjCObject> _objc_msgSend_72(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_72(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_72Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_72 = __objc_msgSend_72Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_reverseObjectEnumerator1 =
+      _registerName1("reverseObjectEnumerator");
+  late final _sel_sortedArrayHint1 = _registerName1("sortedArrayHint");
+  late final _sel_sortedArrayUsingFunction_context_1 =
+      _registerName1("sortedArrayUsingFunction:context:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_73(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<
+            ffi.NativeFunction<
+                NSInteger Function(ffi.Pointer<ObjCObject>,
+                    ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Void>)>>
+        comparator,
+    ffi.Pointer<ffi.Void> context,
+  ) {
+    return __objc_msgSend_73(
+      obj,
+      sel,
+      comparator,
+      context,
+    );
+  }
+
+  late final __objc_msgSend_73Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<
+                  ffi.NativeFunction<
+                      NSInteger Function(ffi.Pointer<ObjCObject>,
+                          ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Void>)>>,
+              ffi.Pointer<ffi.Void>)>>('objc_msgSend');
+  late final __objc_msgSend_73 = __objc_msgSend_73Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<
+              ffi.NativeFunction<
+                  NSInteger Function(ffi.Pointer<ObjCObject>,
+                      ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Void>)>>,
+          ffi.Pointer<ffi.Void>)>();
+
+  late final _sel_sortedArrayUsingFunction_context_hint_1 =
+      _registerName1("sortedArrayUsingFunction:context:hint:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_74(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<
+            ffi.NativeFunction<
+                NSInteger Function(ffi.Pointer<ObjCObject>,
+                    ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Void>)>>
+        comparator,
+    ffi.Pointer<ffi.Void> context,
+    ffi.Pointer<ObjCObject> hint,
+  ) {
+    return __objc_msgSend_74(
+      obj,
+      sel,
+      comparator,
+      context,
+      hint,
+    );
+  }
+
+  late final __objc_msgSend_74Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<
+                  ffi.NativeFunction<
+                      NSInteger Function(ffi.Pointer<ObjCObject>,
+                          ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Void>)>>,
+              ffi.Pointer<ffi.Void>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_74 = __objc_msgSend_74Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<
+              ffi.NativeFunction<
+                  NSInteger Function(ffi.Pointer<ObjCObject>,
+                      ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Void>)>>,
+          ffi.Pointer<ffi.Void>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_sortedArrayUsingSelector_1 =
+      _registerName1("sortedArrayUsingSelector:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_75(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCSel> comparator,
+  ) {
+    return __objc_msgSend_75(
+      obj,
+      sel,
+      comparator,
+    );
+  }
+
+  late final __objc_msgSend_75Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_75 = __objc_msgSend_75Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_subarrayWithRange_1 = _registerName1("subarrayWithRange:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_76(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+  ) {
+    return __objc_msgSend_76(
+      obj,
+      sel,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_76Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_76 = __objc_msgSend_76Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange)>();
+
+  late final _class_NSError1 = _getClass1("NSError");
+  late final _sel_initWithDomain_code_userInfo_1 =
+      _registerName1("initWithDomain:code:userInfo:");
+  instancetype _objc_msgSend_77(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSErrorDomain domain,
+    int code,
+  ) {
+    return __objc_msgSend_77(
+      obj,
+      sel,
+      domain,
+      code,
+    );
+  }
+
+  late final __objc_msgSend_77Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSErrorDomain, NSInteger)>>('objc_msgSend');
+  late final __objc_msgSend_77 = __objc_msgSend_77Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSErrorDomain, int)>();
+
+  late final _sel_errorWithDomain_code_userInfo_1 =
+      _registerName1("errorWithDomain:code:userInfo:");
+  late final _sel_domain1 = _registerName1("domain");
+  late final _sel_code1 = _registerName1("code");
+  int _objc_msgSend_78(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_78(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_78Ptr = _lookup<
+      ffi.NativeFunction<
+          NSInteger Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_78 = __objc_msgSend_78Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setKeys_triggerChangeNotificationsForDependentKey_1 =
+      _registerName1("setKeys:triggerChangeNotificationsForDependentKey:");
+  void _objc_msgSend_79(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> keys,
+    ffi.Pointer<ObjCObject> dependentKey,
+  ) {
+    return __objc_msgSend_79(
+      obj,
+      sel,
+      keys,
+      dependentKey,
+    );
+  }
+
+  late final __objc_msgSend_79Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_79 = __objc_msgSend_79Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_classFallbacksForKeyedArchiver1 =
+      _registerName1("classFallbacksForKeyedArchiver");
+  ffi.Pointer<ObjCObject> _objc_msgSend_80(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_80(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_80Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_80 = __objc_msgSend_80Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_classForKeyedUnarchiver1 =
+      _registerName1("classForKeyedUnarchiver");
+  late final _sel_writeToURL_error_1 = _registerName1("writeToURL:error:");
+  bool _objc_msgSend_81(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_81(
+      obj,
+      sel,
+      url,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_81Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_81 = __objc_msgSend_81Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_makeObjectsPerformSelector_1 =
+      _registerName1("makeObjectsPerformSelector:");
+  late final _sel_makeObjectsPerformSelector_withObject_1 =
+      _registerName1("makeObjectsPerformSelector:withObject:");
+  void _objc_msgSend_82(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCSel> aSelector,
+    ffi.Pointer<ObjCObject> argument,
+  ) {
+    return __objc_msgSend_82(
+      obj,
+      sel,
+      aSelector,
+      argument,
+    );
+  }
+
+  late final __objc_msgSend_82Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_82 = __objc_msgSend_82Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSIndexSet1 = _getClass1("NSIndexSet");
+  late final _sel_indexSet1 = _registerName1("indexSet");
+  late final _sel_indexSetWithIndex_1 = _registerName1("indexSetWithIndex:");
+  late final _sel_indexSetWithIndexesInRange_1 =
+      _registerName1("indexSetWithIndexesInRange:");
+  instancetype _objc_msgSend_83(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+  ) {
+    return __objc_msgSend_83(
+      obj,
+      sel,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_83Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_83 = __objc_msgSend_83Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange)>();
+
+  late final _sel_initWithIndexesInRange_1 =
+      _registerName1("initWithIndexesInRange:");
+  late final _sel_initWithIndexSet_1 = _registerName1("initWithIndexSet:");
+  instancetype _objc_msgSend_84(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> indexSet,
+  ) {
+    return __objc_msgSend_84(
+      obj,
+      sel,
+      indexSet,
+    );
+  }
+
+  late final __objc_msgSend_84Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_84 = __objc_msgSend_84Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithIndex_1 = _registerName1("initWithIndex:");
+  late final _sel_isEqualToIndexSet_1 = _registerName1("isEqualToIndexSet:");
+  bool _objc_msgSend_85(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> indexSet,
+  ) {
+    return __objc_msgSend_85(
+      obj,
+      sel,
+      indexSet,
+    );
+  }
+
+  late final __objc_msgSend_85Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_85 = __objc_msgSend_85Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_firstIndex1 = _registerName1("firstIndex");
+  late final _sel_lastIndex1 = _registerName1("lastIndex");
+  late final _sel_indexGreaterThanIndex_1 =
+      _registerName1("indexGreaterThanIndex:");
+  int _objc_msgSend_86(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_86(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_86Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_86 = __objc_msgSend_86Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_indexLessThanIndex_1 = _registerName1("indexLessThanIndex:");
+  late final _sel_indexGreaterThanOrEqualToIndex_1 =
+      _registerName1("indexGreaterThanOrEqualToIndex:");
+  late final _sel_indexLessThanOrEqualToIndex_1 =
+      _registerName1("indexLessThanOrEqualToIndex:");
+  late final _sel_getIndexes_maxCount_inIndexRange_1 =
+      _registerName1("getIndexes:maxCount:inIndexRange:");
+  int _objc_msgSend_87(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<NSUInteger> indexBuffer,
+    int bufferSize,
+    NSRangePointer range,
+  ) {
+    return __objc_msgSend_87(
+      obj,
+      sel,
+      indexBuffer,
+      bufferSize,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_87Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<NSUInteger>,
+              NSUInteger,
+              NSRangePointer)>>('objc_msgSend');
+  late final __objc_msgSend_87 = __objc_msgSend_87Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<NSUInteger>, int, NSRangePointer)>();
+
+  late final _sel_countOfIndexesInRange_1 =
+      _registerName1("countOfIndexesInRange:");
+  int _objc_msgSend_88(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+  ) {
+    return __objc_msgSend_88(
+      obj,
+      sel,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_88Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_88 = __objc_msgSend_88Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange)>();
+
+  late final _sel_containsIndex_1 = _registerName1("containsIndex:");
+  bool _objc_msgSend_89(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_89(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_89Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_89 = __objc_msgSend_89Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_containsIndexesInRange_1 =
+      _registerName1("containsIndexesInRange:");
+  bool _objc_msgSend_90(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+  ) {
+    return __objc_msgSend_90(
+      obj,
+      sel,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_90Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_90 = __objc_msgSend_90Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange)>();
+
+  late final _sel_containsIndexes_1 = _registerName1("containsIndexes:");
+  late final _sel_intersectsIndexesInRange_1 =
+      _registerName1("intersectsIndexesInRange:");
+  ffi.Pointer<_ObjCBlockDesc> _newBlockDesc1() {
+    final d =
+        pkg_ffi.calloc.allocate<_ObjCBlockDesc>(ffi.sizeOf<_ObjCBlockDesc>());
+    d.ref.size = ffi.sizeOf<_ObjCBlock>();
+    return d;
+  }
+
+  late final _objc_block_desc1 = _newBlockDesc1();
+  late final _objc_concrete_global_block1 =
+      _lookup<ffi.Void>('_NSConcreteGlobalBlock');
+  ffi.Pointer<_ObjCBlock> _newBlock1(
+      ffi.Pointer<ffi.Void> invoke, ffi.Pointer<ffi.Void> target) {
+    final b = pkg_ffi.calloc.allocate<_ObjCBlock>(ffi.sizeOf<_ObjCBlock>());
+    b.ref.isa = _objc_concrete_global_block1;
+    b.ref.invoke = invoke;
+    b.ref.target = target;
+    b.ref.descriptor = _objc_block_desc1;
+    final copy = _Block_copy(b.cast()).cast<_ObjCBlock>();
+    pkg_ffi.calloc.free(b);
+    return copy;
+  }
+
+  ffi.Pointer<ffi.Void> _Block_copy(
+    ffi.Pointer<ffi.Void> value,
+  ) {
+    return __Block_copy(
+      value,
+    );
+  }
+
+  late final __Block_copyPtr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ffi.Void> Function(
+              ffi.Pointer<ffi.Void>)>>('_Block_copy');
+  late final __Block_copy = __Block_copyPtr
+      .asFunction<ffi.Pointer<ffi.Void> Function(ffi.Pointer<ffi.Void>)>();
+
+  void _Block_release(
+    ffi.Pointer<ffi.Void> value,
+  ) {
+    return __Block_release(
+      value,
+    );
+  }
+
+  late final __Block_releasePtr =
+      _lookup<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>(
+          '_Block_release');
+  late final __Block_release =
+      __Block_releasePtr.asFunction<void Function(ffi.Pointer<ffi.Void>)>();
+
+  late final _objc_releaseFinalizer11 =
+      ffi.NativeFinalizer(__Block_releasePtr.cast());
+  late final _sel_enumerateIndexesUsingBlock_1 =
+      _registerName1("enumerateIndexesUsingBlock:");
+  void _objc_msgSend_91(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_91(
+      obj,
+      sel,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_91Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_91 = __objc_msgSend_91Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_enumerateIndexesWithOptions_usingBlock_1 =
+      _registerName1("enumerateIndexesWithOptions:usingBlock:");
+  void _objc_msgSend_92(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int opts,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_92(
+      obj,
+      sel,
+      opts,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_92Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_92 = __objc_msgSend_92Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_enumerateIndexesInRange_options_usingBlock_1 =
+      _registerName1("enumerateIndexesInRange:options:usingBlock:");
+  void _objc_msgSend_93(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    int opts,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_93(
+      obj,
+      sel,
+      range,
+      opts,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_93Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRange, ffi.Int32, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_93 = __objc_msgSend_93Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange, int,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_indexPassingTest_1 = _registerName1("indexPassingTest:");
+  int _objc_msgSend_94(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> predicate,
+  ) {
+    return __objc_msgSend_94(
+      obj,
+      sel,
+      predicate,
+    );
+  }
+
+  late final __objc_msgSend_94Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_94 = __objc_msgSend_94Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_indexWithOptions_passingTest_1 =
+      _registerName1("indexWithOptions:passingTest:");
+  int _objc_msgSend_95(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int opts,
+    ffi.Pointer<_ObjCBlock> predicate,
+  ) {
+    return __objc_msgSend_95(
+      obj,
+      sel,
+      opts,
+      predicate,
+    );
+  }
+
+  late final __objc_msgSend_95Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_95 = __objc_msgSend_95Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_indexInRange_options_passingTest_1 =
+      _registerName1("indexInRange:options:passingTest:");
+  int _objc_msgSend_96(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    int opts,
+    ffi.Pointer<_ObjCBlock> predicate,
+  ) {
+    return __objc_msgSend_96(
+      obj,
+      sel,
+      range,
+      opts,
+      predicate,
+    );
+  }
+
+  late final __objc_msgSend_96Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRange, ffi.Int32, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_96 = __objc_msgSend_96Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange, int,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_indexesPassingTest_1 = _registerName1("indexesPassingTest:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_97(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> predicate,
+  ) {
+    return __objc_msgSend_97(
+      obj,
+      sel,
+      predicate,
+    );
+  }
+
+  late final __objc_msgSend_97Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_97 = __objc_msgSend_97Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_indexesWithOptions_passingTest_1 =
+      _registerName1("indexesWithOptions:passingTest:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_98(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int opts,
+    ffi.Pointer<_ObjCBlock> predicate,
+  ) {
+    return __objc_msgSend_98(
+      obj,
+      sel,
+      opts,
+      predicate,
+    );
+  }
+
+  late final __objc_msgSend_98Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_98 = __objc_msgSend_98Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_indexesInRange_options_passingTest_1 =
+      _registerName1("indexesInRange:options:passingTest:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_99(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    int opts,
+    ffi.Pointer<_ObjCBlock> predicate,
+  ) {
+    return __objc_msgSend_99(
+      obj,
+      sel,
+      range,
+      opts,
+      predicate,
+    );
+  }
+
+  late final __objc_msgSend_99Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSRange,
+              ffi.Int32,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_99 = __objc_msgSend_99Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, NSRange, int, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_enumerateRangesUsingBlock_1 =
+      _registerName1("enumerateRangesUsingBlock:");
+  void _objc_msgSend_100(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_100(
+      obj,
+      sel,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_100Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_100 = __objc_msgSend_100Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_enumerateRangesWithOptions_usingBlock_1 =
+      _registerName1("enumerateRangesWithOptions:usingBlock:");
+  void _objc_msgSend_101(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int opts,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_101(
+      obj,
+      sel,
+      opts,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_101Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_101 = __objc_msgSend_101Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_enumerateRangesInRange_options_usingBlock_1 =
+      _registerName1("enumerateRangesInRange:options:usingBlock:");
+  void _objc_msgSend_102(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    int opts,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_102(
+      obj,
+      sel,
+      range,
+      opts,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_102Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRange, ffi.Int32, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_102 = __objc_msgSend_102Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange, int,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_objectsAtIndexes_1 = _registerName1("objectsAtIndexes:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_103(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> indexes,
+  ) {
+    return __objc_msgSend_103(
+      obj,
+      sel,
+      indexes,
+    );
+  }
+
+  late final __objc_msgSend_103Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_103 = __objc_msgSend_103Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_objectAtIndexedSubscript_1 =
+      _registerName1("objectAtIndexedSubscript:");
+  late final _sel_enumerateObjectsUsingBlock_1 =
+      _registerName1("enumerateObjectsUsingBlock:");
+  void _objc_msgSend_104(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_104(
+      obj,
+      sel,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_104Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_104 = __objc_msgSend_104Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_enumerateObjectsWithOptions_usingBlock_1 =
+      _registerName1("enumerateObjectsWithOptions:usingBlock:");
+  void _objc_msgSend_105(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int opts,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_105(
+      obj,
+      sel,
+      opts,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_105Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_105 = __objc_msgSend_105Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_enumerateObjectsAtIndexes_options_usingBlock_1 =
+      _registerName1("enumerateObjectsAtIndexes:options:usingBlock:");
+  void _objc_msgSend_106(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> s,
+    int opts,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_106(
+      obj,
+      sel,
+      s,
+      opts,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_106Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_106 = __objc_msgSend_106Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_indexOfObjectPassingTest_1 =
+      _registerName1("indexOfObjectPassingTest:");
+  int _objc_msgSend_107(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> predicate,
+  ) {
+    return __objc_msgSend_107(
+      obj,
+      sel,
+      predicate,
+    );
+  }
+
+  late final __objc_msgSend_107Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_107 = __objc_msgSend_107Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_indexOfObjectWithOptions_passingTest_1 =
+      _registerName1("indexOfObjectWithOptions:passingTest:");
+  int _objc_msgSend_108(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int opts,
+    ffi.Pointer<_ObjCBlock> predicate,
+  ) {
+    return __objc_msgSend_108(
+      obj,
+      sel,
+      opts,
+      predicate,
+    );
+  }
+
+  late final __objc_msgSend_108Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_108 = __objc_msgSend_108Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_indexOfObjectAtIndexes_options_passingTest_1 =
+      _registerName1("indexOfObjectAtIndexes:options:passingTest:");
+  int _objc_msgSend_109(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> s,
+    int opts,
+    ffi.Pointer<_ObjCBlock> predicate,
+  ) {
+    return __objc_msgSend_109(
+      obj,
+      sel,
+      s,
+      opts,
+      predicate,
+    );
+  }
+
+  late final __objc_msgSend_109Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_109 = __objc_msgSend_109Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_indexesOfObjectsPassingTest_1 =
+      _registerName1("indexesOfObjectsPassingTest:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_110(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> predicate,
+  ) {
+    return __objc_msgSend_110(
+      obj,
+      sel,
+      predicate,
+    );
+  }
+
+  late final __objc_msgSend_110Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_110 = __objc_msgSend_110Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_indexesOfObjectsWithOptions_passingTest_1 =
+      _registerName1("indexesOfObjectsWithOptions:passingTest:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_111(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int opts,
+    ffi.Pointer<_ObjCBlock> predicate,
+  ) {
+    return __objc_msgSend_111(
+      obj,
+      sel,
+      opts,
+      predicate,
+    );
+  }
+
+  late final __objc_msgSend_111Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_111 = __objc_msgSend_111Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_indexesOfObjectsAtIndexes_options_passingTest_1 =
+      _registerName1("indexesOfObjectsAtIndexes:options:passingTest:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_112(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> s,
+    int opts,
+    ffi.Pointer<_ObjCBlock> predicate,
+  ) {
+    return __objc_msgSend_112(
+      obj,
+      sel,
+      s,
+      opts,
+      predicate,
+    );
+  }
+
+  late final __objc_msgSend_112Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_112 = __objc_msgSend_112Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_sortedArrayUsingComparator_1 =
+      _registerName1("sortedArrayUsingComparator:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_113(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSComparator cmptr,
+  ) {
+    return __objc_msgSend_113(
+      obj,
+      sel,
+      cmptr,
+    );
+  }
+
+  late final __objc_msgSend_113Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSComparator)>>('objc_msgSend');
+  late final __objc_msgSend_113 = __objc_msgSend_113Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSComparator)>();
+
+  late final _sel_sortedArrayWithOptions_usingComparator_1 =
+      _registerName1("sortedArrayWithOptions:usingComparator:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_114(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int opts,
+    NSComparator cmptr,
+  ) {
+    return __objc_msgSend_114(
+      obj,
+      sel,
+      opts,
+      cmptr,
+    );
+  }
+
+  late final __objc_msgSend_114Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Int32, NSComparator)>>('objc_msgSend');
+  late final __objc_msgSend_114 = __objc_msgSend_114Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int, NSComparator)>();
+
+  late final _sel_indexOfObject_inSortedRange_options_usingComparator_1 =
+      _registerName1("indexOfObject:inSortedRange:options:usingComparator:");
+  int _objc_msgSend_115(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> obj1,
+    NSRange r,
+    int opts,
+    NSComparator cmp,
+  ) {
+    return __objc_msgSend_115(
+      obj,
+      sel,
+      obj1,
+      r,
+      opts,
+      cmp,
+    );
+  }
+
+  late final __objc_msgSend_115Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSRange,
+              ffi.Int32,
+              NSComparator)>>('objc_msgSend');
+  late final __objc_msgSend_115 = __objc_msgSend_115Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, NSRange, int, NSComparator)>();
+
+  late final _sel_array1 = _registerName1("array");
+  late final _sel_arrayWithObject_1 = _registerName1("arrayWithObject:");
+  late final _sel_arrayWithObjects_count_1 =
+      _registerName1("arrayWithObjects:count:");
+  late final _sel_arrayWithObjects_1 = _registerName1("arrayWithObjects:");
+  late final _sel_arrayWithArray_1 = _registerName1("arrayWithArray:");
+  late final _sel_initWithObjects_1 = _registerName1("initWithObjects:");
+  late final _sel_initWithArray_1 = _registerName1("initWithArray:");
+  late final _sel_initWithArray_copyItems_1 =
+      _registerName1("initWithArray:copyItems:");
+  instancetype _objc_msgSend_116(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> array,
+    bool flag,
+  ) {
+    return __objc_msgSend_116(
+      obj,
+      sel,
+      array,
+      flag,
+    );
+  }
+
+  late final __objc_msgSend_116Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_116 = __objc_msgSend_116Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, bool)>();
+
+  late final _sel_initWithContentsOfURL_error_1 =
+      _registerName1("initWithContentsOfURL:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_117(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_117(
+      obj,
+      sel,
+      url,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_117Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_117 = __objc_msgSend_117Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_arrayWithContentsOfURL_error_1 =
+      _registerName1("arrayWithContentsOfURL:error:");
+  late final _sel_getObjects_1 = _registerName1("getObjects:");
+  void _objc_msgSend_118(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> objects,
+  ) {
+    return __objc_msgSend_118(
+      obj,
+      sel,
+      objects,
+    );
+  }
+
+  late final __objc_msgSend_118Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_118 = __objc_msgSend_118Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_arrayWithContentsOfFile_1 =
+      _registerName1("arrayWithContentsOfFile:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_119(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+  ) {
+    return __objc_msgSend_119(
+      obj,
+      sel,
+      path,
+    );
+  }
+
+  late final __objc_msgSend_119Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_119 = __objc_msgSend_119Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_arrayWithContentsOfURL_1 =
+      _registerName1("arrayWithContentsOfURL:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_120(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+  ) {
+    return __objc_msgSend_120(
+      obj,
+      sel,
+      url,
+    );
+  }
+
+  late final __objc_msgSend_120Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_120 = __objc_msgSend_120Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithContentsOfFile_1 =
+      _registerName1("initWithContentsOfFile:");
+  late final _sel_initWithContentsOfURL_1 =
+      _registerName1("initWithContentsOfURL:");
+  late final _sel_writeToURL_atomically_1 =
+      _registerName1("writeToURL:atomically:");
+  bool _objc_msgSend_121(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    bool atomically,
+  ) {
+    return __objc_msgSend_121(
+      obj,
+      sel,
+      url,
+      atomically,
+    );
+  }
+
+  late final __objc_msgSend_121Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_121 = __objc_msgSend_121Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, bool)>();
+
+  late final _sel_pathsMatchingExtensions_1 =
+      _registerName1("pathsMatchingExtensions:");
+  late final _sel_valueForKey_1 = _registerName1("valueForKey:");
+  late final _sel_setValue_forKey_1 = _registerName1("setValue:forKey:");
+  void _objc_msgSend_122(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_122(
+      obj,
+      sel,
+      value,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_122Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_122 = __objc_msgSend_122Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_addObserver_toObjectsAtIndexes_forKeyPath_options_context_1 =
+      _registerName1(
+          "addObserver:toObjectsAtIndexes:forKeyPath:options:context:");
+  void _objc_msgSend_123(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> observer,
+    ffi.Pointer<ObjCObject> indexes,
+    ffi.Pointer<ObjCObject> keyPath,
+    int options,
+    ffi.Pointer<ffi.Void> context,
+  ) {
+    return __objc_msgSend_123(
+      obj,
+      sel,
+      observer,
+      indexes,
+      keyPath,
+      options,
+      context,
+    );
+  }
+
+  late final __objc_msgSend_123Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Void>)>>('objc_msgSend');
+  late final __objc_msgSend_123 = __objc_msgSend_123Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ffi.Void>)>();
+
+  late final _sel_removeObserver_fromObjectsAtIndexes_forKeyPath_context_1 =
+      _registerName1("removeObserver:fromObjectsAtIndexes:forKeyPath:context:");
+  void _objc_msgSend_124(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> observer,
+    ffi.Pointer<ObjCObject> indexes,
+    ffi.Pointer<ObjCObject> keyPath,
+    ffi.Pointer<ffi.Void> context,
+  ) {
+    return __objc_msgSend_124(
+      obj,
+      sel,
+      observer,
+      indexes,
+      keyPath,
+      context,
+    );
+  }
+
+  late final __objc_msgSend_124Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Void>)>>('objc_msgSend');
+  late final __objc_msgSend_124 = __objc_msgSend_124Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Void>)>();
+
+  late final _sel_removeObserver_fromObjectsAtIndexes_forKeyPath_1 =
+      _registerName1("removeObserver:fromObjectsAtIndexes:forKeyPath:");
+  void _objc_msgSend_125(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> observer,
+    ffi.Pointer<ObjCObject> indexes,
+    ffi.Pointer<ObjCObject> keyPath,
+  ) {
+    return __objc_msgSend_125(
+      obj,
+      sel,
+      observer,
+      indexes,
+      keyPath,
+    );
+  }
+
+  late final __objc_msgSend_125Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_125 = __objc_msgSend_125Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_addObserver_forKeyPath_options_context_1 =
+      _registerName1("addObserver:forKeyPath:options:context:");
+  void _objc_msgSend_126(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> observer,
+    ffi.Pointer<ObjCObject> keyPath,
+    int options,
+    ffi.Pointer<ffi.Void> context,
+  ) {
+    return __objc_msgSend_126(
+      obj,
+      sel,
+      observer,
+      keyPath,
+      options,
+      context,
+    );
+  }
+
+  late final __objc_msgSend_126Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Void>)>>('objc_msgSend');
+  late final __objc_msgSend_126 = __objc_msgSend_126Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ffi.Void>)>();
+
+  late final _sel_removeObserver_forKeyPath_context_1 =
+      _registerName1("removeObserver:forKeyPath:context:");
+  void _objc_msgSend_127(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> observer,
+    ffi.Pointer<ObjCObject> keyPath,
+    ffi.Pointer<ffi.Void> context,
+  ) {
+    return __objc_msgSend_127(
+      obj,
+      sel,
+      observer,
+      keyPath,
+      context,
+    );
+  }
+
+  late final __objc_msgSend_127Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Void>)>>('objc_msgSend');
+  late final __objc_msgSend_127 = __objc_msgSend_127Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Void>)>();
+
+  late final _sel_removeObserver_forKeyPath_1 =
+      _registerName1("removeObserver:forKeyPath:");
+  void _objc_msgSend_128(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> observer,
+    ffi.Pointer<ObjCObject> keyPath,
+  ) {
+    return __objc_msgSend_128(
+      obj,
+      sel,
+      observer,
+      keyPath,
+    );
+  }
+
+  late final __objc_msgSend_128Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_128 = __objc_msgSend_128Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_sortedArrayUsingDescriptors_1 =
+      _registerName1("sortedArrayUsingDescriptors:");
+  late final _class_NSPredicate1 = _getClass1("NSPredicate");
+  late final _sel_predicateWithFormat_argumentArray_1 =
+      _registerName1("predicateWithFormat:argumentArray:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_129(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> predicateFormat,
+    ffi.Pointer<ObjCObject> arguments,
+  ) {
+    return __objc_msgSend_129(
+      obj,
+      sel,
+      predicateFormat,
+      arguments,
+    );
+  }
+
+  late final __objc_msgSend_129Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_129 = __objc_msgSend_129Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_predicateWithFormat_1 =
+      _registerName1("predicateWithFormat:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_130(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> predicateFormat,
+  ) {
+    return __objc_msgSend_130(
+      obj,
+      sel,
+      predicateFormat,
+    );
+  }
+
+  late final __objc_msgSend_130Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_130 = __objc_msgSend_130Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_predicateWithFormat_arguments_1 =
+      _registerName1("predicateWithFormat:arguments:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_131(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> predicateFormat,
+    ffi.Pointer<__va_list_tag> argList,
+  ) {
+    return __objc_msgSend_131(
+      obj,
+      sel,
+      predicateFormat,
+      argList,
+    );
+  }
+
+  late final __objc_msgSend_131Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<__va_list_tag>)>>('objc_msgSend');
+  late final __objc_msgSend_131 = __objc_msgSend_131Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<__va_list_tag>)>();
+
+  late final _sel_predicateFromMetadataQueryString_1 =
+      _registerName1("predicateFromMetadataQueryString:");
+  late final _sel_predicateWithValue_1 = _registerName1("predicateWithValue:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_132(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    bool value,
+  ) {
+    return __objc_msgSend_132(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_132Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_132 = __objc_msgSend_132Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, bool)>();
+
+  late final _class_NSDictionary1 = _getClass1("NSDictionary");
+  late final _sel_objectForKey_1 = _registerName1("objectForKey:");
+  late final _sel_keyEnumerator1 = _registerName1("keyEnumerator");
+  late final _sel_initWithObjects_forKeys_count_1 =
+      _registerName1("initWithObjects:forKeys:count:");
+  instancetype _objc_msgSend_133(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> objects,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> keys,
+    int cnt,
+  ) {
+    return __objc_msgSend_133(
+      obj,
+      sel,
+      objects,
+      keys,
+      cnt,
+    );
+  }
+
+  late final __objc_msgSend_133Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_133 = __objc_msgSend_133Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          int)>();
+
+  late final _sel_allKeys1 = _registerName1("allKeys");
+  late final _sel_allKeysForObject_1 = _registerName1("allKeysForObject:");
+  late final _sel_allValues1 = _registerName1("allValues");
+  late final _sel_descriptionInStringsFileFormat1 =
+      _registerName1("descriptionInStringsFileFormat");
+  late final _sel_isEqualToDictionary_1 =
+      _registerName1("isEqualToDictionary:");
+  bool _objc_msgSend_134(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> otherDictionary,
+  ) {
+    return __objc_msgSend_134(
+      obj,
+      sel,
+      otherDictionary,
+    );
+  }
+
+  late final __objc_msgSend_134Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_134 = __objc_msgSend_134Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_objectsForKeys_notFoundMarker_1 =
+      _registerName1("objectsForKeys:notFoundMarker:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_135(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> keys,
+    ffi.Pointer<ObjCObject> marker,
+  ) {
+    return __objc_msgSend_135(
+      obj,
+      sel,
+      keys,
+      marker,
+    );
+  }
+
+  late final __objc_msgSend_135Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_135 = __objc_msgSend_135Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_keysSortedByValueUsingSelector_1 =
+      _registerName1("keysSortedByValueUsingSelector:");
+  late final _sel_getObjects_andKeys_count_1 =
+      _registerName1("getObjects:andKeys:count:");
+  void _objc_msgSend_136(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> objects,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> keys,
+    int count,
+  ) {
+    return __objc_msgSend_136(
+      obj,
+      sel,
+      objects,
+      keys,
+      count,
+    );
+  }
+
+  late final __objc_msgSend_136Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_136 = __objc_msgSend_136Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          int)>();
+
+  late final _sel_objectForKeyedSubscript_1 =
+      _registerName1("objectForKeyedSubscript:");
+  late final _sel_enumerateKeysAndObjectsUsingBlock_1 =
+      _registerName1("enumerateKeysAndObjectsUsingBlock:");
+  void _objc_msgSend_137(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_137(
+      obj,
+      sel,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_137Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_137 = __objc_msgSend_137Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_enumerateKeysAndObjectsWithOptions_usingBlock_1 =
+      _registerName1("enumerateKeysAndObjectsWithOptions:usingBlock:");
+  void _objc_msgSend_138(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int opts,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_138(
+      obj,
+      sel,
+      opts,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_138Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_138 = __objc_msgSend_138Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_keysSortedByValueUsingComparator_1 =
+      _registerName1("keysSortedByValueUsingComparator:");
+  late final _sel_keysSortedByValueWithOptions_usingComparator_1 =
+      _registerName1("keysSortedByValueWithOptions:usingComparator:");
+  late final _sel_getObjects_andKeys_1 = _registerName1("getObjects:andKeys:");
+  void _objc_msgSend_139(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> objects,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> keys,
+  ) {
+    return __objc_msgSend_139(
+      obj,
+      sel,
+      objects,
+      keys,
+    );
+  }
+
+  late final __objc_msgSend_139Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_139 = __objc_msgSend_139Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_dictionaryWithContentsOfFile_1 =
+      _registerName1("dictionaryWithContentsOfFile:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_140(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+  ) {
+    return __objc_msgSend_140(
+      obj,
+      sel,
+      path,
+    );
+  }
+
+  late final __objc_msgSend_140Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_140 = __objc_msgSend_140Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dictionaryWithContentsOfURL_1 =
+      _registerName1("dictionaryWithContentsOfURL:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_141(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+  ) {
+    return __objc_msgSend_141(
+      obj,
+      sel,
+      url,
+    );
+  }
+
+  late final __objc_msgSend_141Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_141 = __objc_msgSend_141Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dictionary1 = _registerName1("dictionary");
+  late final _sel_dictionaryWithObject_forKey_1 =
+      _registerName1("dictionaryWithObject:forKey:");
+  instancetype _objc_msgSend_142(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> object,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_142(
+      obj,
+      sel,
+      object,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_142Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_142 = __objc_msgSend_142Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dictionaryWithObjects_forKeys_count_1 =
+      _registerName1("dictionaryWithObjects:forKeys:count:");
+  late final _sel_dictionaryWithObjectsAndKeys_1 =
+      _registerName1("dictionaryWithObjectsAndKeys:");
+  late final _sel_dictionaryWithDictionary_1 =
+      _registerName1("dictionaryWithDictionary:");
+  instancetype _objc_msgSend_143(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> dict,
+  ) {
+    return __objc_msgSend_143(
+      obj,
+      sel,
+      dict,
+    );
+  }
+
+  late final __objc_msgSend_143Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_143 = __objc_msgSend_143Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dictionaryWithObjects_forKeys_1 =
+      _registerName1("dictionaryWithObjects:forKeys:");
+  instancetype _objc_msgSend_144(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> objects,
+    ffi.Pointer<ObjCObject> keys,
+  ) {
+    return __objc_msgSend_144(
+      obj,
+      sel,
+      objects,
+      keys,
+    );
+  }
+
+  late final __objc_msgSend_144Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_144 = __objc_msgSend_144Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithObjectsAndKeys_1 =
+      _registerName1("initWithObjectsAndKeys:");
+  late final _sel_initWithDictionary_1 = _registerName1("initWithDictionary:");
+  late final _sel_initWithDictionary_copyItems_1 =
+      _registerName1("initWithDictionary:copyItems:");
+  instancetype _objc_msgSend_145(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> otherDictionary,
+    bool flag,
+  ) {
+    return __objc_msgSend_145(
+      obj,
+      sel,
+      otherDictionary,
+      flag,
+    );
+  }
+
+  late final __objc_msgSend_145Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_145 = __objc_msgSend_145Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, bool)>();
+
+  late final _sel_initWithObjects_forKeys_1 =
+      _registerName1("initWithObjects:forKeys:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_146(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_146(
+      obj,
+      sel,
+      url,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_146Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_146 = __objc_msgSend_146Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_dictionaryWithContentsOfURL_error_1 =
+      _registerName1("dictionaryWithContentsOfURL:error:");
+  late final _sel_sharedKeySetForKeys_1 =
+      _registerName1("sharedKeySetForKeys:");
+  late final _sel_countByEnumeratingWithState_objects_count_1 =
+      _registerName1("countByEnumeratingWithState:objects:count:");
+  int _objc_msgSend_147(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<NSFastEnumerationState> state,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> buffer,
+    int len,
+  ) {
+    return __objc_msgSend_147(
+      obj,
+      sel,
+      state,
+      buffer,
+      len,
+    );
+  }
+
+  late final __objc_msgSend_147Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<NSFastEnumerationState>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_147 = __objc_msgSend_147Ptr.asFunction<
+      int Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<NSFastEnumerationState>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          int)>();
+
+  late final _sel_fileSize1 = _registerName1("fileSize");
+  int _objc_msgSend_148(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_148(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_148Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.UnsignedLongLong Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_148 = __objc_msgSend_148Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _class_NSDate1 = _getClass1("NSDate");
+  late final _sel_timeIntervalSinceReferenceDate1 =
+      _registerName1("timeIntervalSinceReferenceDate");
+  double _objc_msgSend_149(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_149(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_149Ptr = _lookup<
+      ffi.NativeFunction<
+          NSTimeInterval Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_149 = __objc_msgSend_149Ptr.asFunction<
+      double Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_initWithTimeIntervalSinceReferenceDate_1 =
+      _registerName1("initWithTimeIntervalSinceReferenceDate:");
+  instancetype _objc_msgSend_150(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    double ti,
+  ) {
+    return __objc_msgSend_150(
+      obj,
+      sel,
+      ti,
+    );
+  }
+
+  late final __objc_msgSend_150Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSTimeInterval)>>('objc_msgSend');
+  late final __objc_msgSend_150 = __objc_msgSend_150Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, double)>();
+
+  late final _sel_timeIntervalSinceDate_1 =
+      _registerName1("timeIntervalSinceDate:");
+  double _objc_msgSend_151(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> anotherDate,
+  ) {
+    return __objc_msgSend_151(
+      obj,
+      sel,
+      anotherDate,
+    );
+  }
+
+  late final __objc_msgSend_151Ptr = _lookup<
+      ffi.NativeFunction<
+          NSTimeInterval Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_151 = __objc_msgSend_151Ptr.asFunction<
+      double Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_timeIntervalSinceNow1 =
+      _registerName1("timeIntervalSinceNow");
+  late final _sel_timeIntervalSince19701 =
+      _registerName1("timeIntervalSince1970");
+  late final _sel_addTimeInterval_1 = _registerName1("addTimeInterval:");
+  late final _sel_dateByAddingTimeInterval_1 =
+      _registerName1("dateByAddingTimeInterval:");
+  late final _sel_earlierDate_1 = _registerName1("earlierDate:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_152(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> anotherDate,
+  ) {
+    return __objc_msgSend_152(
+      obj,
+      sel,
+      anotherDate,
+    );
+  }
+
+  late final __objc_msgSend_152Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_152 = __objc_msgSend_152Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_laterDate_1 = _registerName1("laterDate:");
+  late final _sel_compare_1 = _registerName1("compare:");
+  int _objc_msgSend_153(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> other,
+  ) {
+    return __objc_msgSend_153(
+      obj,
+      sel,
+      other,
+    );
+  }
+
+  late final __objc_msgSend_153Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_153 = __objc_msgSend_153Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_isEqualToDate_1 = _registerName1("isEqualToDate:");
+  bool _objc_msgSend_154(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> otherDate,
+  ) {
+    return __objc_msgSend_154(
+      obj,
+      sel,
+      otherDate,
+    );
+  }
+
+  late final __objc_msgSend_154Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_154 = __objc_msgSend_154Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_date1 = _registerName1("date");
+  late final _sel_dateWithTimeIntervalSinceNow_1 =
+      _registerName1("dateWithTimeIntervalSinceNow:");
+  late final _sel_dateWithTimeIntervalSinceReferenceDate_1 =
+      _registerName1("dateWithTimeIntervalSinceReferenceDate:");
+  late final _sel_dateWithTimeIntervalSince1970_1 =
+      _registerName1("dateWithTimeIntervalSince1970:");
+  late final _sel_dateWithTimeInterval_sinceDate_1 =
+      _registerName1("dateWithTimeInterval:sinceDate:");
+  instancetype _objc_msgSend_155(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    double secsToBeAdded,
+    ffi.Pointer<ObjCObject> date,
+  ) {
+    return __objc_msgSend_155(
+      obj,
+      sel,
+      secsToBeAdded,
+      date,
+    );
+  }
+
+  late final __objc_msgSend_155Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSTimeInterval, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_155 = __objc_msgSend_155Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          double, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_distantFuture1 = _registerName1("distantFuture");
+  ffi.Pointer<ObjCObject> _objc_msgSend_156(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_156(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_156Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_156 = __objc_msgSend_156Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_distantPast1 = _registerName1("distantPast");
+  late final _sel_now1 = _registerName1("now");
+  late final _sel_initWithTimeIntervalSinceNow_1 =
+      _registerName1("initWithTimeIntervalSinceNow:");
+  late final _sel_initWithTimeIntervalSince1970_1 =
+      _registerName1("initWithTimeIntervalSince1970:");
+  late final _sel_initWithTimeInterval_sinceDate_1 =
+      _registerName1("initWithTimeInterval:sinceDate:");
+  late final _sel_dateWithNaturalLanguageString_locale_1 =
+      _registerName1("dateWithNaturalLanguageString:locale:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_157(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> string,
+    ffi.Pointer<ObjCObject> locale,
+  ) {
+    return __objc_msgSend_157(
+      obj,
+      sel,
+      string,
+      locale,
+    );
+  }
+
+  late final __objc_msgSend_157Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_157 = __objc_msgSend_157Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dateWithNaturalLanguageString_1 =
+      _registerName1("dateWithNaturalLanguageString:");
+  late final _sel_dateWithString_1 = _registerName1("dateWithString:");
+  late final _class_NSCalendarDate1 = _getClass1("NSCalendarDate");
+  late final _sel_calendarDate1 = _registerName1("calendarDate");
+  late final _sel_dateWithString_calendarFormat_locale_1 =
+      _registerName1("dateWithString:calendarFormat:locale:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_158(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> description,
+    ffi.Pointer<ObjCObject> format,
+    ffi.Pointer<ObjCObject> locale,
+  ) {
+    return __objc_msgSend_158(
+      obj,
+      sel,
+      description,
+      format,
+      locale,
+    );
+  }
+
+  late final __objc_msgSend_158Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_158 = __objc_msgSend_158Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dateWithString_calendarFormat_1 =
+      _registerName1("dateWithString:calendarFormat:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_159(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> description,
+    ffi.Pointer<ObjCObject> format,
+  ) {
+    return __objc_msgSend_159(
+      obj,
+      sel,
+      description,
+      format,
+    );
+  }
+
+  late final __objc_msgSend_159Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_159 = __objc_msgSend_159Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSTimeZone1 = _getClass1("NSTimeZone");
+  late final _sel_name1 = _registerName1("name");
+  late final _sel_data1 = _registerName1("data");
+  late final _sel_secondsFromGMTForDate_1 =
+      _registerName1("secondsFromGMTForDate:");
+  int _objc_msgSend_160(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> aDate,
+  ) {
+    return __objc_msgSend_160(
+      obj,
+      sel,
+      aDate,
+    );
+  }
+
+  late final __objc_msgSend_160Ptr = _lookup<
+      ffi.NativeFunction<
+          NSInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_160 = __objc_msgSend_160Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_abbreviationForDate_1 =
+      _registerName1("abbreviationForDate:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_161(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> aDate,
+  ) {
+    return __objc_msgSend_161(
+      obj,
+      sel,
+      aDate,
+    );
+  }
+
+  late final __objc_msgSend_161Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_161 = __objc_msgSend_161Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_isDaylightSavingTimeForDate_1 =
+      _registerName1("isDaylightSavingTimeForDate:");
+  late final _sel_daylightSavingTimeOffsetForDate_1 =
+      _registerName1("daylightSavingTimeOffsetForDate:");
+  late final _sel_nextDaylightSavingTimeTransitionAfterDate_1 =
+      _registerName1("nextDaylightSavingTimeTransitionAfterDate:");
+  late final _sel_systemTimeZone1 = _registerName1("systemTimeZone");
+  ffi.Pointer<ObjCObject> _objc_msgSend_162(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_162(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_162Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_162 = __objc_msgSend_162Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_resetSystemTimeZone1 = _registerName1("resetSystemTimeZone");
+  late final _sel_defaultTimeZone1 = _registerName1("defaultTimeZone");
+  late final _sel_setDefaultTimeZone_1 = _registerName1("setDefaultTimeZone:");
+  void _objc_msgSend_163(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_163(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_163Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_163 = __objc_msgSend_163Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_localTimeZone1 = _registerName1("localTimeZone");
+  late final _sel_knownTimeZoneNames1 = _registerName1("knownTimeZoneNames");
+  late final _sel_abbreviationDictionary1 =
+      _registerName1("abbreviationDictionary");
+  ffi.Pointer<ObjCObject> _objc_msgSend_164(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_164(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_164Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_164 = __objc_msgSend_164Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setAbbreviationDictionary_1 =
+      _registerName1("setAbbreviationDictionary:");
+  void _objc_msgSend_165(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_165(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_165Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_165 = __objc_msgSend_165Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_timeZoneDataVersion1 = _registerName1("timeZoneDataVersion");
+  late final _sel_secondsFromGMT1 = _registerName1("secondsFromGMT");
+  late final _sel_abbreviation1 = _registerName1("abbreviation");
+  late final _sel_isDaylightSavingTime1 =
+      _registerName1("isDaylightSavingTime");
+  late final _sel_daylightSavingTimeOffset1 =
+      _registerName1("daylightSavingTimeOffset");
+  late final _sel_nextDaylightSavingTimeTransition1 =
+      _registerName1("nextDaylightSavingTimeTransition");
+  late final _sel_isEqualToTimeZone_1 = _registerName1("isEqualToTimeZone:");
+  bool _objc_msgSend_166(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> aTimeZone,
+  ) {
+    return __objc_msgSend_166(
+      obj,
+      sel,
+      aTimeZone,
+    );
+  }
+
+  late final __objc_msgSend_166Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_166 = __objc_msgSend_166Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSLocale1 = _getClass1("NSLocale");
+  late final _sel_displayNameForKey_value_1 =
+      _registerName1("displayNameForKey:value:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_167(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSLocaleKey key,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_167(
+      obj,
+      sel,
+      key,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_167Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSLocaleKey,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_167 = __objc_msgSend_167Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, NSLocaleKey, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithLocaleIdentifier_1 =
+      _registerName1("initWithLocaleIdentifier:");
+  late final _sel_localeIdentifier1 = _registerName1("localeIdentifier");
+  late final _sel_localizedStringForLocaleIdentifier_1 =
+      _registerName1("localizedStringForLocaleIdentifier:");
+  late final _sel_languageCode1 = _registerName1("languageCode");
+  late final _sel_localizedStringForLanguageCode_1 =
+      _registerName1("localizedStringForLanguageCode:");
+  late final _sel_countryCode1 = _registerName1("countryCode");
+  late final _sel_localizedStringForCountryCode_1 =
+      _registerName1("localizedStringForCountryCode:");
+  late final _sel_scriptCode1 = _registerName1("scriptCode");
+  late final _sel_localizedStringForScriptCode_1 =
+      _registerName1("localizedStringForScriptCode:");
+  late final _sel_variantCode1 = _registerName1("variantCode");
+  late final _sel_localizedStringForVariantCode_1 =
+      _registerName1("localizedStringForVariantCode:");
+  late final _class_NSCharacterSet1 = _getClass1("NSCharacterSet");
+  late final _sel_controlCharacterSet1 = _registerName1("controlCharacterSet");
+  ffi.Pointer<ObjCObject> _objc_msgSend_168(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_168(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_168Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_168 = __objc_msgSend_168Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_whitespaceCharacterSet1 =
+      _registerName1("whitespaceCharacterSet");
+  late final _sel_whitespaceAndNewlineCharacterSet1 =
+      _registerName1("whitespaceAndNewlineCharacterSet");
+  late final _sel_decimalDigitCharacterSet1 =
+      _registerName1("decimalDigitCharacterSet");
+  late final _sel_letterCharacterSet1 = _registerName1("letterCharacterSet");
+  late final _sel_lowercaseLetterCharacterSet1 =
+      _registerName1("lowercaseLetterCharacterSet");
+  late final _sel_uppercaseLetterCharacterSet1 =
+      _registerName1("uppercaseLetterCharacterSet");
+  late final _sel_nonBaseCharacterSet1 = _registerName1("nonBaseCharacterSet");
+  late final _sel_alphanumericCharacterSet1 =
+      _registerName1("alphanumericCharacterSet");
+  late final _sel_decomposableCharacterSet1 =
+      _registerName1("decomposableCharacterSet");
+  late final _sel_illegalCharacterSet1 = _registerName1("illegalCharacterSet");
+  late final _sel_punctuationCharacterSet1 =
+      _registerName1("punctuationCharacterSet");
+  late final _sel_capitalizedLetterCharacterSet1 =
+      _registerName1("capitalizedLetterCharacterSet");
+  late final _sel_symbolCharacterSet1 = _registerName1("symbolCharacterSet");
+  late final _sel_newlineCharacterSet1 = _registerName1("newlineCharacterSet");
+  late final _sel_characterSetWithRange_1 =
+      _registerName1("characterSetWithRange:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_169(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange aRange,
+  ) {
+    return __objc_msgSend_169(
+      obj,
+      sel,
+      aRange,
+    );
+  }
+
+  late final __objc_msgSend_169Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_169 = __objc_msgSend_169Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange)>();
+
+  late final _sel_characterSetWithCharactersInString_1 =
+      _registerName1("characterSetWithCharactersInString:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_170(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> aString,
+  ) {
+    return __objc_msgSend_170(
+      obj,
+      sel,
+      aString,
+    );
+  }
+
+  late final __objc_msgSend_170Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_170 = __objc_msgSend_170Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_characterSetWithBitmapRepresentation_1 =
+      _registerName1("characterSetWithBitmapRepresentation:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_171(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> data,
+  ) {
+    return __objc_msgSend_171(
+      obj,
+      sel,
+      data,
+    );
+  }
+
+  late final __objc_msgSend_171Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_171 = __objc_msgSend_171Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_characterSetWithContentsOfFile_1 =
+      _registerName1("characterSetWithContentsOfFile:");
+  late final _sel_characterIsMember_1 = _registerName1("characterIsMember:");
+  bool _objc_msgSend_172(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int aCharacter,
+  ) {
+    return __objc_msgSend_172(
+      obj,
+      sel,
+      aCharacter,
+    );
+  }
+
+  late final __objc_msgSend_172Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              unichar)>>('objc_msgSend');
+  late final __objc_msgSend_172 = __objc_msgSend_172Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_bitmapRepresentation1 =
+      _registerName1("bitmapRepresentation");
+  late final _sel_invertedSet1 = _registerName1("invertedSet");
+  late final _sel_longCharacterIsMember_1 =
+      _registerName1("longCharacterIsMember:");
+  bool _objc_msgSend_173(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int theLongChar,
+  ) {
+    return __objc_msgSend_173(
+      obj,
+      sel,
+      theLongChar,
+    );
+  }
+
+  late final __objc_msgSend_173Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              UTF32Char)>>('objc_msgSend');
+  late final __objc_msgSend_173 = __objc_msgSend_173Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_isSupersetOfSet_1 = _registerName1("isSupersetOfSet:");
+  bool _objc_msgSend_174(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> theOtherSet,
+  ) {
+    return __objc_msgSend_174(
+      obj,
+      sel,
+      theOtherSet,
+    );
+  }
+
+  late final __objc_msgSend_174Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_174 = __objc_msgSend_174Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_hasMemberInPlane_1 = _registerName1("hasMemberInPlane:");
+  bool _objc_msgSend_175(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int thePlane,
+  ) {
+    return __objc_msgSend_175(
+      obj,
+      sel,
+      thePlane,
+    );
+  }
+
+  late final __objc_msgSend_175Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Uint8)>>('objc_msgSend');
+  late final __objc_msgSend_175 = __objc_msgSend_175Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_URLUserAllowedCharacterSet1 =
+      _registerName1("URLUserAllowedCharacterSet");
+  late final _sel_URLPasswordAllowedCharacterSet1 =
+      _registerName1("URLPasswordAllowedCharacterSet");
+  late final _sel_URLHostAllowedCharacterSet1 =
+      _registerName1("URLHostAllowedCharacterSet");
+  late final _sel_URLPathAllowedCharacterSet1 =
+      _registerName1("URLPathAllowedCharacterSet");
+  late final _sel_URLQueryAllowedCharacterSet1 =
+      _registerName1("URLQueryAllowedCharacterSet");
+  late final _sel_URLFragmentAllowedCharacterSet1 =
+      _registerName1("URLFragmentAllowedCharacterSet");
+  late final _sel_exemplarCharacterSet1 =
+      _registerName1("exemplarCharacterSet");
+  late final _sel_calendarIdentifier1 = _registerName1("calendarIdentifier");
+  late final _sel_localizedStringForCalendarIdentifier_1 =
+      _registerName1("localizedStringForCalendarIdentifier:");
+  late final _sel_collationIdentifier1 = _registerName1("collationIdentifier");
+  late final _sel_localizedStringForCollationIdentifier_1 =
+      _registerName1("localizedStringForCollationIdentifier:");
+  late final _sel_usesMetricSystem1 = _registerName1("usesMetricSystem");
+  late final _sel_decimalSeparator1 = _registerName1("decimalSeparator");
+  late final _sel_groupingSeparator1 = _registerName1("groupingSeparator");
+  late final _sel_currencySymbol1 = _registerName1("currencySymbol");
+  late final _sel_currencyCode1 = _registerName1("currencyCode");
+  late final _sel_localizedStringForCurrencyCode_1 =
+      _registerName1("localizedStringForCurrencyCode:");
+  late final _sel_collatorIdentifier1 = _registerName1("collatorIdentifier");
+  late final _sel_localizedStringForCollatorIdentifier_1 =
+      _registerName1("localizedStringForCollatorIdentifier:");
+  late final _sel_quotationBeginDelimiter1 =
+      _registerName1("quotationBeginDelimiter");
+  late final _sel_quotationEndDelimiter1 =
+      _registerName1("quotationEndDelimiter");
+  late final _sel_alternateQuotationBeginDelimiter1 =
+      _registerName1("alternateQuotationBeginDelimiter");
+  late final _sel_alternateQuotationEndDelimiter1 =
+      _registerName1("alternateQuotationEndDelimiter");
+  late final _sel_autoupdatingCurrentLocale1 =
+      _registerName1("autoupdatingCurrentLocale");
+  ffi.Pointer<ObjCObject> _objc_msgSend_176(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_176(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_176Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_176 = __objc_msgSend_176Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_currentLocale1 = _registerName1("currentLocale");
+  late final _sel_systemLocale1 = _registerName1("systemLocale");
+  late final _sel_localeWithLocaleIdentifier_1 =
+      _registerName1("localeWithLocaleIdentifier:");
+  late final _sel_availableLocaleIdentifiers1 =
+      _registerName1("availableLocaleIdentifiers");
+  late final _sel_ISOLanguageCodes1 = _registerName1("ISOLanguageCodes");
+  late final _sel_ISOCountryCodes1 = _registerName1("ISOCountryCodes");
+  late final _sel_ISOCurrencyCodes1 = _registerName1("ISOCurrencyCodes");
+  late final _sel_commonISOCurrencyCodes1 =
+      _registerName1("commonISOCurrencyCodes");
+  late final _sel_preferredLanguages1 = _registerName1("preferredLanguages");
+  late final _sel_componentsFromLocaleIdentifier_1 =
+      _registerName1("componentsFromLocaleIdentifier:");
+  late final _sel_localeIdentifierFromComponents_1 =
+      _registerName1("localeIdentifierFromComponents:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_177(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> dict,
+  ) {
+    return __objc_msgSend_177(
+      obj,
+      sel,
+      dict,
+    );
+  }
+
+  late final __objc_msgSend_177Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_177 = __objc_msgSend_177Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_canonicalLocaleIdentifierFromString_1 =
+      _registerName1("canonicalLocaleIdentifierFromString:");
+  late final _sel_canonicalLanguageIdentifierFromString_1 =
+      _registerName1("canonicalLanguageIdentifierFromString:");
+  late final _sel_localeIdentifierFromWindowsLocaleCode_1 =
+      _registerName1("localeIdentifierFromWindowsLocaleCode:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_178(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int lcid,
+  ) {
+    return __objc_msgSend_178(
+      obj,
+      sel,
+      lcid,
+    );
+  }
+
+  late final __objc_msgSend_178Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Uint32)>>('objc_msgSend');
+  late final __objc_msgSend_178 = __objc_msgSend_178Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_windowsLocaleCodeFromLocaleIdentifier_1 =
+      _registerName1("windowsLocaleCodeFromLocaleIdentifier:");
+  int _objc_msgSend_179(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> localeIdentifier,
+  ) {
+    return __objc_msgSend_179(
+      obj,
+      sel,
+      localeIdentifier,
+    );
+  }
+
+  late final __objc_msgSend_179Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Uint32 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_179 = __objc_msgSend_179Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_characterDirectionForLanguage_1 =
+      _registerName1("characterDirectionForLanguage:");
+  int _objc_msgSend_180(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> isoLangCode,
+  ) {
+    return __objc_msgSend_180(
+      obj,
+      sel,
+      isoLangCode,
+    );
+  }
+
+  late final __objc_msgSend_180Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_180 = __objc_msgSend_180Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_lineDirectionForLanguage_1 =
+      _registerName1("lineDirectionForLanguage:");
+  late final _sel_localizedName_locale_1 =
+      _registerName1("localizedName:locale:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_181(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int style,
+    ffi.Pointer<ObjCObject> locale,
+  ) {
+    return __objc_msgSend_181(
+      obj,
+      sel,
+      style,
+      locale,
+    );
+  }
+
+  late final __objc_msgSend_181Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_181 = __objc_msgSend_181Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_timeZoneWithName_1 = _registerName1("timeZoneWithName:");
+  late final _sel_timeZoneWithName_data_1 =
+      _registerName1("timeZoneWithName:data:");
+  instancetype _objc_msgSend_182(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> tzName,
+    ffi.Pointer<ObjCObject> aData,
+  ) {
+    return __objc_msgSend_182(
+      obj,
+      sel,
+      tzName,
+      aData,
+    );
+  }
+
+  late final __objc_msgSend_182Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_182 = __objc_msgSend_182Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithName_1 = _registerName1("initWithName:");
+  late final _sel_initWithName_data_1 = _registerName1("initWithName:data:");
+  late final _sel_timeZoneForSecondsFromGMT_1 =
+      _registerName1("timeZoneForSecondsFromGMT:");
+  instancetype _objc_msgSend_183(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int seconds,
+  ) {
+    return __objc_msgSend_183(
+      obj,
+      sel,
+      seconds,
+    );
+  }
+
+  late final __objc_msgSend_183Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSInteger)>>('objc_msgSend');
+  late final __objc_msgSend_183 = __objc_msgSend_183Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_timeZoneWithAbbreviation_1 =
+      _registerName1("timeZoneWithAbbreviation:");
+  late final _sel_dateWithYear_month_day_hour_minute_second_timeZone_1 =
+      _registerName1("dateWithYear:month:day:hour:minute:second:timeZone:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_184(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int year,
+    int month,
+    int day,
+    int hour,
+    int minute,
+    int second,
+    ffi.Pointer<ObjCObject> aTimeZone,
+  ) {
+    return __objc_msgSend_184(
+      obj,
+      sel,
+      year,
+      month,
+      day,
+      hour,
+      minute,
+      second,
+      aTimeZone,
+    );
+  }
+
+  late final __objc_msgSend_184Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSInteger,
+              NSUInteger,
+              NSUInteger,
+              NSUInteger,
+              NSUInteger,
+              NSUInteger,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_184 = __objc_msgSend_184Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          int,
+          int,
+          int,
+          int,
+          int,
+          int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dateByAddingYears_months_days_hours_minutes_seconds_1 =
+      _registerName1("dateByAddingYears:months:days:hours:minutes:seconds:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_185(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int year,
+    int month,
+    int day,
+    int hour,
+    int minute,
+    int second,
+  ) {
+    return __objc_msgSend_185(
+      obj,
+      sel,
+      year,
+      month,
+      day,
+      hour,
+      minute,
+      second,
+    );
+  }
+
+  late final __objc_msgSend_185Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSInteger,
+              NSInteger,
+              NSInteger,
+              NSInteger,
+              NSInteger,
+              NSInteger)>>('objc_msgSend');
+  late final __objc_msgSend_185 = __objc_msgSend_185Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, int, int, int, int, int)>();
+
+  late final _sel_dayOfCommonEra1 = _registerName1("dayOfCommonEra");
+  late final _sel_dayOfMonth1 = _registerName1("dayOfMonth");
+  late final _sel_dayOfWeek1 = _registerName1("dayOfWeek");
+  late final _sel_dayOfYear1 = _registerName1("dayOfYear");
+  late final _sel_hourOfDay1 = _registerName1("hourOfDay");
+  late final _sel_minuteOfHour1 = _registerName1("minuteOfHour");
+  late final _sel_monthOfYear1 = _registerName1("monthOfYear");
+  late final _sel_secondOfMinute1 = _registerName1("secondOfMinute");
+  late final _sel_yearOfCommonEra1 = _registerName1("yearOfCommonEra");
+  late final _sel_calendarFormat1 = _registerName1("calendarFormat");
+  late final _sel_descriptionWithCalendarFormat_locale_1 =
+      _registerName1("descriptionWithCalendarFormat:locale:");
+  late final _sel_descriptionWithCalendarFormat_1 =
+      _registerName1("descriptionWithCalendarFormat:");
+  late final _sel_timeZone1 = _registerName1("timeZone");
+  late final _sel_initWithString_calendarFormat_locale_1 =
+      _registerName1("initWithString:calendarFormat:locale:");
+  late final _sel_initWithString_calendarFormat_1 =
+      _registerName1("initWithString:calendarFormat:");
+  late final _sel_initWithYear_month_day_hour_minute_second_timeZone_1 =
+      _registerName1("initWithYear:month:day:hour:minute:second:timeZone:");
+  late final _sel_setCalendarFormat_1 = _registerName1("setCalendarFormat:");
+  void _objc_msgSend_186(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> format,
+  ) {
+    return __objc_msgSend_186(
+      obj,
+      sel,
+      format,
+    );
+  }
+
+  late final __objc_msgSend_186Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_186 = __objc_msgSend_186Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_setTimeZone_1 = _registerName1("setTimeZone:");
+  void _objc_msgSend_187(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> aTimeZone,
+  ) {
+    return __objc_msgSend_187(
+      obj,
+      sel,
+      aTimeZone,
+    );
+  }
+
+  late final __objc_msgSend_187Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_187 = __objc_msgSend_187Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_years_months_days_hours_minutes_seconds_sinceDate_1 =
+      _registerName1("years:months:days:hours:minutes:seconds:sinceDate:");
+  void _objc_msgSend_188(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<NSInteger> yp,
+    ffi.Pointer<NSInteger> mop,
+    ffi.Pointer<NSInteger> dp,
+    ffi.Pointer<NSInteger> hp,
+    ffi.Pointer<NSInteger> mip,
+    ffi.Pointer<NSInteger> sp,
+    ffi.Pointer<ObjCObject> date,
+  ) {
+    return __objc_msgSend_188(
+      obj,
+      sel,
+      yp,
+      mop,
+      dp,
+      hp,
+      mip,
+      sp,
+      date,
+    );
+  }
+
+  late final __objc_msgSend_188Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<NSInteger>,
+              ffi.Pointer<NSInteger>,
+              ffi.Pointer<NSInteger>,
+              ffi.Pointer<NSInteger>,
+              ffi.Pointer<NSInteger>,
+              ffi.Pointer<NSInteger>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_188 = __objc_msgSend_188Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<NSInteger>,
+          ffi.Pointer<NSInteger>,
+          ffi.Pointer<NSInteger>,
+          ffi.Pointer<NSInteger>,
+          ffi.Pointer<NSInteger>,
+          ffi.Pointer<NSInteger>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dateWithCalendarFormat_timeZone_1 =
+      _registerName1("dateWithCalendarFormat:timeZone:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_189(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> format,
+    ffi.Pointer<ObjCObject> aTimeZone,
+  ) {
+    return __objc_msgSend_189(
+      obj,
+      sel,
+      format,
+      aTimeZone,
+    );
+  }
+
+  late final __objc_msgSend_189Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_189 = __objc_msgSend_189Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_descriptionWithCalendarFormat_timeZone_locale_1 =
+      _registerName1("descriptionWithCalendarFormat:timeZone:locale:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_190(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> format,
+    ffi.Pointer<ObjCObject> aTimeZone,
+    ffi.Pointer<ObjCObject> locale,
+  ) {
+    return __objc_msgSend_190(
+      obj,
+      sel,
+      format,
+      aTimeZone,
+      locale,
+    );
+  }
+
+  late final __objc_msgSend_190Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_190 = __objc_msgSend_190Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_fileModificationDate1 =
+      _registerName1("fileModificationDate");
+  late final _sel_fileType1 = _registerName1("fileType");
+  late final _sel_filePosixPermissions1 =
+      _registerName1("filePosixPermissions");
+  late final _sel_fileOwnerAccountName1 =
+      _registerName1("fileOwnerAccountName");
+  late final _sel_fileGroupOwnerAccountName1 =
+      _registerName1("fileGroupOwnerAccountName");
+  late final _sel_fileSystemNumber1 = _registerName1("fileSystemNumber");
+  late final _sel_fileSystemFileNumber1 =
+      _registerName1("fileSystemFileNumber");
+  late final _sel_fileExtensionHidden1 = _registerName1("fileExtensionHidden");
+  late final _sel_fileHFSCreatorCode1 = _registerName1("fileHFSCreatorCode");
+  int _objc_msgSend_191(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_191(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_191Ptr = _lookup<
+      ffi.NativeFunction<
+          OSType Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_191 = __objc_msgSend_191Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_fileHFSTypeCode1 = _registerName1("fileHFSTypeCode");
+  late final _sel_fileIsImmutable1 = _registerName1("fileIsImmutable");
+  late final _sel_fileIsAppendOnly1 = _registerName1("fileIsAppendOnly");
+  late final _sel_fileCreationDate1 = _registerName1("fileCreationDate");
+  late final _sel_fileOwnerAccountID1 = _registerName1("fileOwnerAccountID");
+  ffi.Pointer<ObjCObject> _objc_msgSend_192(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_192(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_192Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_192 = __objc_msgSend_192Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_fileGroupOwnerAccountID1 =
+      _registerName1("fileGroupOwnerAccountID");
+  late final _sel_predicateWithBlock_1 = _registerName1("predicateWithBlock:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_193(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_193(
+      obj,
+      sel,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_193Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_193 = __objc_msgSend_193Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_predicateFormat1 = _registerName1("predicateFormat");
+  late final _sel_predicateWithSubstitutionVariables_1 =
+      _registerName1("predicateWithSubstitutionVariables:");
+  late final _sel_evaluateWithObject_1 = _registerName1("evaluateWithObject:");
+  late final _sel_evaluateWithObject_substitutionVariables_1 =
+      _registerName1("evaluateWithObject:substitutionVariables:");
+  bool _objc_msgSend_194(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> object,
+    ffi.Pointer<ObjCObject> bindings,
+  ) {
+    return __objc_msgSend_194(
+      obj,
+      sel,
+      object,
+      bindings,
+    );
+  }
+
+  late final __objc_msgSend_194Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_194 = __objc_msgSend_194Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_allowEvaluation1 = _registerName1("allowEvaluation");
+  late final _sel_filteredArrayUsingPredicate_1 =
+      _registerName1("filteredArrayUsingPredicate:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_195(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> predicate,
+  ) {
+    return __objc_msgSend_195(
+      obj,
+      sel,
+      predicate,
+    );
+  }
+
+  late final __objc_msgSend_195Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_195 = __objc_msgSend_195Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithChar_1 = _registerName1("initWithChar:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_196(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_196(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_196Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Char)>>('objc_msgSend');
+  late final __objc_msgSend_196 = __objc_msgSend_196Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_initWithUnsignedChar_1 =
+      _registerName1("initWithUnsignedChar:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_197(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_197(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_197Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.UnsignedChar)>>('objc_msgSend');
+  late final __objc_msgSend_197 = __objc_msgSend_197Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_initWithShort_1 = _registerName1("initWithShort:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_198(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_198(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_198Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Short)>>('objc_msgSend');
+  late final __objc_msgSend_198 = __objc_msgSend_198Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_initWithUnsignedShort_1 =
+      _registerName1("initWithUnsignedShort:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_199(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_199(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_199Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.UnsignedShort)>>('objc_msgSend');
+  late final __objc_msgSend_199 = __objc_msgSend_199Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_initWithInt_1 = _registerName1("initWithInt:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_200(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_200(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_200Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Int)>>('objc_msgSend');
+  late final __objc_msgSend_200 = __objc_msgSend_200Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_initWithUnsignedInt_1 =
+      _registerName1("initWithUnsignedInt:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_201(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_201(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_201Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.UnsignedInt)>>('objc_msgSend');
+  late final __objc_msgSend_201 = __objc_msgSend_201Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_initWithLong_1 = _registerName1("initWithLong:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_202(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_202(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_202Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Long)>>('objc_msgSend');
+  late final __objc_msgSend_202 = __objc_msgSend_202Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_initWithUnsignedLong_1 =
+      _registerName1("initWithUnsignedLong:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_203(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_203(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_203Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.UnsignedLong)>>('objc_msgSend');
+  late final __objc_msgSend_203 = __objc_msgSend_203Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_initWithLongLong_1 = _registerName1("initWithLongLong:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_204(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_204(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_204Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.LongLong)>>('objc_msgSend');
+  late final __objc_msgSend_204 = __objc_msgSend_204Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_initWithUnsignedLongLong_1 =
+      _registerName1("initWithUnsignedLongLong:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_205(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_205(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_205Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.UnsignedLongLong)>>('objc_msgSend');
+  late final __objc_msgSend_205 = __objc_msgSend_205Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_initWithFloat_1 = _registerName1("initWithFloat:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_206(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    double value,
+  ) {
+    return __objc_msgSend_206(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_206Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Float)>>('objc_msgSend');
+  late final __objc_msgSend_206 = __objc_msgSend_206Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, double)>();
+
+  late final _sel_initWithDouble_1 = _registerName1("initWithDouble:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_207(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    double value,
+  ) {
+    return __objc_msgSend_207(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_207Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Double)>>('objc_msgSend');
+  late final __objc_msgSend_207 = __objc_msgSend_207Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, double)>();
+
+  late final _sel_initWithBool_1 = _registerName1("initWithBool:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_208(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    bool value,
+  ) {
+    return __objc_msgSend_208(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_208Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_208 = __objc_msgSend_208Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, bool)>();
+
+  late final _sel_initWithInteger_1 = _registerName1("initWithInteger:");
+  late final _sel_initWithUnsignedInteger_1 =
+      _registerName1("initWithUnsignedInteger:");
+  late final _sel_charValue1 = _registerName1("charValue");
+  int _objc_msgSend_209(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_209(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_209Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Char Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_209 = __objc_msgSend_209Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_unsignedCharValue1 = _registerName1("unsignedCharValue");
+  int _objc_msgSend_210(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_210(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_210Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.UnsignedChar Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_210 = __objc_msgSend_210Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_shortValue1 = _registerName1("shortValue");
+  int _objc_msgSend_211(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_211(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_211Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Short Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_211 = __objc_msgSend_211Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_unsignedShortValue1 = _registerName1("unsignedShortValue");
+  int _objc_msgSend_212(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_212(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_212Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.UnsignedShort Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_212 = __objc_msgSend_212Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_intValue1 = _registerName1("intValue");
+  int _objc_msgSend_213(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_213(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_213Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_213 = __objc_msgSend_213Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_unsignedIntValue1 = _registerName1("unsignedIntValue");
+  late final _sel_longValue1 = _registerName1("longValue");
+  late final _sel_unsignedLongValue1 = _registerName1("unsignedLongValue");
+  late final _sel_longLongValue1 = _registerName1("longLongValue");
+  int _objc_msgSend_214(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_214(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_214Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.LongLong Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_214 = __objc_msgSend_214Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_unsignedLongLongValue1 =
+      _registerName1("unsignedLongLongValue");
+  late final _sel_floatValue1 = _registerName1("floatValue");
+  double _objc_msgSend_215(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_215(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_215Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Float Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_215 = __objc_msgSend_215Ptr.asFunction<
+      double Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_doubleValue1 = _registerName1("doubleValue");
+  late final _sel_boolValue1 = _registerName1("boolValue");
+  late final _sel_integerValue1 = _registerName1("integerValue");
+  late final _sel_unsignedIntegerValue1 =
+      _registerName1("unsignedIntegerValue");
+  late final _sel_stringValue1 = _registerName1("stringValue");
+  int _objc_msgSend_216(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> otherNumber,
+  ) {
+    return __objc_msgSend_216(
+      obj,
+      sel,
+      otherNumber,
+    );
+  }
+
+  late final __objc_msgSend_216Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_216 = __objc_msgSend_216Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_isEqualToNumber_1 = _registerName1("isEqualToNumber:");
+  bool _objc_msgSend_217(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> number,
+  ) {
+    return __objc_msgSend_217(
+      obj,
+      sel,
+      number,
+    );
+  }
+
+  late final __objc_msgSend_217Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_217 = __objc_msgSend_217Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_numberWithChar_1 = _registerName1("numberWithChar:");
+  late final _sel_numberWithUnsignedChar_1 =
+      _registerName1("numberWithUnsignedChar:");
+  late final _sel_numberWithShort_1 = _registerName1("numberWithShort:");
+  late final _sel_numberWithUnsignedShort_1 =
+      _registerName1("numberWithUnsignedShort:");
+  late final _sel_numberWithInt_1 = _registerName1("numberWithInt:");
+  late final _sel_numberWithUnsignedInt_1 =
+      _registerName1("numberWithUnsignedInt:");
+  late final _sel_numberWithLong_1 = _registerName1("numberWithLong:");
+  late final _sel_numberWithUnsignedLong_1 =
+      _registerName1("numberWithUnsignedLong:");
+  late final _sel_numberWithLongLong_1 = _registerName1("numberWithLongLong:");
+  late final _sel_numberWithUnsignedLongLong_1 =
+      _registerName1("numberWithUnsignedLongLong:");
+  late final _sel_numberWithFloat_1 = _registerName1("numberWithFloat:");
+  late final _sel_numberWithDouble_1 = _registerName1("numberWithDouble:");
+  late final _sel_numberWithBool_1 = _registerName1("numberWithBool:");
+  late final _sel_numberWithInteger_1 = _registerName1("numberWithInteger:");
+  late final _sel_numberWithUnsignedInteger_1 =
+      _registerName1("numberWithUnsignedInteger:");
+  late final _sel_port1 = _registerName1("port");
+  late final _sel_user1 = _registerName1("user");
+  late final _sel_password1 = _registerName1("password");
+  late final _sel_path1 = _registerName1("path");
+  late final _sel_fragment1 = _registerName1("fragment");
+  late final _sel_parameterString1 = _registerName1("parameterString");
+  late final _sel_query1 = _registerName1("query");
+  late final _sel_relativePath1 = _registerName1("relativePath");
+  late final _sel_hasDirectoryPath1 = _registerName1("hasDirectoryPath");
+  late final _sel_getFileSystemRepresentation_maxLength_1 =
+      _registerName1("getFileSystemRepresentation:maxLength:");
+  bool _objc_msgSend_218(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Char> buffer,
+    int maxBufferLength,
+  ) {
+    return __objc_msgSend_218(
+      obj,
+      sel,
+      buffer,
+      maxBufferLength,
+    );
+  }
+
+  late final __objc_msgSend_218Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Char>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_218 = __objc_msgSend_218Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Char>, int)>();
+
+  late final _sel_fileSystemRepresentation1 =
+      _registerName1("fileSystemRepresentation");
+  late final _sel_isFileURL1 = _registerName1("isFileURL");
+  late final _sel_standardizedURL1 = _registerName1("standardizedURL");
+  late final _sel_checkResourceIsReachableAndReturnError_1 =
+      _registerName1("checkResourceIsReachableAndReturnError:");
+  bool _objc_msgSend_219(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_219(
+      obj,
+      sel,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_219Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_219 = __objc_msgSend_219Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_isFileReferenceURL1 = _registerName1("isFileReferenceURL");
+  late final _sel_fileReferenceURL1 = _registerName1("fileReferenceURL");
+  late final _sel_filePathURL1 = _registerName1("filePathURL");
+  late final _sel_getResourceValue_forKey_error_1 =
+      _registerName1("getResourceValue:forKey:error:");
+  bool _objc_msgSend_220(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> value,
+    NSURLResourceKey key,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_220(
+      obj,
+      sel,
+      value,
+      key,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_220Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              NSURLResourceKey,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_220 = __objc_msgSend_220Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          NSURLResourceKey,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_getPromisedItemResourceValue_forKey_error_1 =
+      _registerName1("getPromisedItemResourceValue:forKey:error:");
+  late final _sel_promisedItemResourceValuesForKeys_error_1 =
+      _registerName1("promisedItemResourceValuesForKeys:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_221(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> keys,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_221(
+      obj,
+      sel,
+      keys,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_221Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_221 = __objc_msgSend_221Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_checkPromisedItemIsReachableAndReturnError_1 =
+      _registerName1("checkPromisedItemIsReachableAndReturnError:");
+  late final _sel_fileURLWithPathComponents_1 =
+      _registerName1("fileURLWithPathComponents:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_222(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> components,
+  ) {
+    return __objc_msgSend_222(
+      obj,
+      sel,
+      components,
+    );
+  }
+
+  late final __objc_msgSend_222Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_222 = __objc_msgSend_222Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_pathComponents1 = _registerName1("pathComponents");
+  late final _sel_lastPathComponent1 = _registerName1("lastPathComponent");
+  late final _sel_pathExtension1 = _registerName1("pathExtension");
+  late final _sel_URLByAppendingPathComponent_1 =
+      _registerName1("URLByAppendingPathComponent:");
+  late final _sel_URLByAppendingPathComponent_isDirectory_1 =
+      _registerName1("URLByAppendingPathComponent:isDirectory:");
+  late final _sel_URLByDeletingLastPathComponent1 =
+      _registerName1("URLByDeletingLastPathComponent");
+  late final _sel_URLByAppendingPathExtension_1 =
+      _registerName1("URLByAppendingPathExtension:");
+  late final _sel_URLByDeletingPathExtension1 =
+      _registerName1("URLByDeletingPathExtension");
+  late final _sel_URLByStandardizingPath1 =
+      _registerName1("URLByStandardizingPath");
+  late final _sel_URLByResolvingSymlinksInPath1 =
+      _registerName1("URLByResolvingSymlinksInPath");
+  late final _sel_resourceDataUsingCache_1 =
+      _registerName1("resourceDataUsingCache:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_223(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    bool shouldUseCache,
+  ) {
+    return __objc_msgSend_223(
+      obj,
+      sel,
+      shouldUseCache,
+    );
+  }
+
+  late final __objc_msgSend_223Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_223 = __objc_msgSend_223Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, bool)>();
+
+  late final _sel_loadResourceDataNotifyingClient_usingCache_1 =
+      _registerName1("loadResourceDataNotifyingClient:usingCache:");
+  void _objc_msgSend_224(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> client,
+    bool shouldUseCache,
+  ) {
+    return __objc_msgSend_224(
+      obj,
+      sel,
+      client,
+      shouldUseCache,
+    );
+  }
+
+  late final __objc_msgSend_224Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_224 = __objc_msgSend_224Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, bool)>();
+
+  late final _sel_propertyForKey_1 = _registerName1("propertyForKey:");
+  late final _sel_setResourceData_1 = _registerName1("setResourceData:");
+  late final _sel_setProperty_forKey_1 = _registerName1("setProperty:forKey:");
+  bool _objc_msgSend_225(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> property,
+    ffi.Pointer<ObjCObject> propertyKey,
+  ) {
+    return __objc_msgSend_225(
+      obj,
+      sel,
+      property,
+      propertyKey,
+    );
+  }
+
+  late final __objc_msgSend_225Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_225 = __objc_msgSend_225Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSURLHandle1 = _getClass1("NSURLHandle");
+  late final _sel_registerURLHandleClass_1 =
+      _registerName1("registerURLHandleClass:");
+  late final _sel_URLHandleClassForURL_1 =
+      _registerName1("URLHandleClassForURL:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_226(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> anURL,
+  ) {
+    return __objc_msgSend_226(
+      obj,
+      sel,
+      anURL,
+    );
+  }
+
+  late final __objc_msgSend_226Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_226 = __objc_msgSend_226Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_status1 = _registerName1("status");
+  int _objc_msgSend_227(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_227(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_227Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_227 = __objc_msgSend_227Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_failureReason1 = _registerName1("failureReason");
+  late final _sel_addClient_1 = _registerName1("addClient:");
+  late final _sel_removeClient_1 = _registerName1("removeClient:");
+  late final _sel_loadInBackground1 = _registerName1("loadInBackground");
+  late final _sel_cancelLoadInBackground1 =
+      _registerName1("cancelLoadInBackground");
+  late final _sel_resourceData1 = _registerName1("resourceData");
+  late final _sel_availableResourceData1 =
+      _registerName1("availableResourceData");
+  late final _sel_expectedResourceDataSize1 =
+      _registerName1("expectedResourceDataSize");
+  late final _sel_flushCachedData1 = _registerName1("flushCachedData");
+  late final _sel_backgroundLoadDidFailWithReason_1 =
+      _registerName1("backgroundLoadDidFailWithReason:");
+  late final _sel_didLoadBytes_loadComplete_1 =
+      _registerName1("didLoadBytes:loadComplete:");
+  void _objc_msgSend_228(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> newBytes,
+    bool yorn,
+  ) {
+    return __objc_msgSend_228(
+      obj,
+      sel,
+      newBytes,
+      yorn,
+    );
+  }
+
+  late final __objc_msgSend_228Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_228 = __objc_msgSend_228Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, bool)>();
+
+  late final _sel_canInitWithURL_1 = _registerName1("canInitWithURL:");
+  bool _objc_msgSend_229(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> anURL,
+  ) {
+    return __objc_msgSend_229(
+      obj,
+      sel,
+      anURL,
+    );
+  }
+
+  late final __objc_msgSend_229Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_229 = __objc_msgSend_229Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_cachedHandleForURL_1 = _registerName1("cachedHandleForURL:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_230(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> anURL,
+  ) {
+    return __objc_msgSend_230(
+      obj,
+      sel,
+      anURL,
+    );
+  }
+
+  late final __objc_msgSend_230Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_230 = __objc_msgSend_230Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithURL_cached_1 = _registerName1("initWithURL:cached:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_231(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> anURL,
+    bool willCache,
+  ) {
+    return __objc_msgSend_231(
+      obj,
+      sel,
+      anURL,
+      willCache,
+    );
+  }
+
+  late final __objc_msgSend_231Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_231 = __objc_msgSend_231Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>, bool)>();
+
+  late final _sel_propertyForKeyIfAvailable_1 =
+      _registerName1("propertyForKeyIfAvailable:");
+  late final _sel_writeProperty_forKey_1 =
+      _registerName1("writeProperty:forKey:");
+  late final _sel_writeData_1 = _registerName1("writeData:");
+  late final _sel_loadInForeground1 = _registerName1("loadInForeground");
+  late final _sel_beginLoadInBackground1 =
+      _registerName1("beginLoadInBackground");
+  late final _sel_endLoadInBackground1 = _registerName1("endLoadInBackground");
+  late final _sel_URLHandleUsingCache_1 =
+      _registerName1("URLHandleUsingCache:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_232(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    bool shouldUseCache,
+  ) {
+    return __objc_msgSend_232(
+      obj,
+      sel,
+      shouldUseCache,
+    );
+  }
+
+  late final __objc_msgSend_232Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_232 = __objc_msgSend_232Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, bool)>();
+
+  late final _sel_writeToFile_options_error_1 =
+      _registerName1("writeToFile:options:error:");
+  bool _objc_msgSend_233(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    int writeOptionsMask,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> errorPtr,
+  ) {
+    return __objc_msgSend_233(
+      obj,
+      sel,
+      path,
+      writeOptionsMask,
+      errorPtr,
+    );
+  }
+
+  late final __objc_msgSend_233Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_233 = __objc_msgSend_233Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_writeToURL_options_error_1 =
+      _registerName1("writeToURL:options:error:");
+  bool _objc_msgSend_234(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    int writeOptionsMask,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> errorPtr,
+  ) {
+    return __objc_msgSend_234(
+      obj,
+      sel,
+      url,
+      writeOptionsMask,
+      errorPtr,
+    );
+  }
+
+  late final __objc_msgSend_234Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_234 = __objc_msgSend_234Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_rangeOfData_options_range_1 =
+      _registerName1("rangeOfData:options:range:");
+  NSRange _objc_msgSend_235(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> dataToFind,
+    int mask,
+    NSRange searchRange,
+  ) {
+    return __objc_msgSend_235(
+      obj,
+      sel,
+      dataToFind,
+      mask,
+      searchRange,
+    );
+  }
+
+  late final __objc_msgSend_235Ptr = _lookup<
+      ffi.NativeFunction<
+          NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Int32, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_235 = __objc_msgSend_235Ptr.asFunction<
+      NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, NSRange)>();
+
+  late final _sel_enumerateByteRangesUsingBlock_1 =
+      _registerName1("enumerateByteRangesUsingBlock:");
+  void _objc_msgSend_236(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_236(
+      obj,
+      sel,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_236Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_236 = __objc_msgSend_236Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_dataWithBytes_length_1 =
+      _registerName1("dataWithBytes:length:");
+  instancetype _objc_msgSend_237(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Void> bytes,
+    int length,
+  ) {
+    return __objc_msgSend_237(
+      obj,
+      sel,
+      bytes,
+      length,
+    );
+  }
+
+  late final __objc_msgSend_237Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Void>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_237 = __objc_msgSend_237Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Void>, int)>();
+
+  late final _sel_dataWithBytesNoCopy_length_1 =
+      _registerName1("dataWithBytesNoCopy:length:");
+  late final _sel_dataWithBytesNoCopy_length_freeWhenDone_1 =
+      _registerName1("dataWithBytesNoCopy:length:freeWhenDone:");
+  instancetype _objc_msgSend_238(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Void> bytes,
+    int length,
+    bool b,
+  ) {
+    return __objc_msgSend_238(
+      obj,
+      sel,
+      bytes,
+      length,
+      b,
+    );
+  }
+
+  late final __objc_msgSend_238Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Void>, NSUInteger, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_238 = __objc_msgSend_238Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Void>, int, bool)>();
+
+  late final _sel_dataWithContentsOfFile_options_error_1 =
+      _registerName1("dataWithContentsOfFile:options:error:");
+  instancetype _objc_msgSend_239(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    int readOptionsMask,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> errorPtr,
+  ) {
+    return __objc_msgSend_239(
+      obj,
+      sel,
+      path,
+      readOptionsMask,
+      errorPtr,
+    );
+  }
+
+  late final __objc_msgSend_239Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_239 = __objc_msgSend_239Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_dataWithContentsOfURL_options_error_1 =
+      _registerName1("dataWithContentsOfURL:options:error:");
+  instancetype _objc_msgSend_240(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    int readOptionsMask,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> errorPtr,
+  ) {
+    return __objc_msgSend_240(
+      obj,
+      sel,
+      url,
+      readOptionsMask,
+      errorPtr,
+    );
+  }
+
+  late final __objc_msgSend_240Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_240 = __objc_msgSend_240Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_dataWithContentsOfFile_1 =
+      _registerName1("dataWithContentsOfFile:");
+  late final _sel_dataWithContentsOfURL_1 =
+      _registerName1("dataWithContentsOfURL:");
+  late final _sel_initWithBytes_length_1 =
+      _registerName1("initWithBytes:length:");
+  late final _sel_initWithBytesNoCopy_length_1 =
+      _registerName1("initWithBytesNoCopy:length:");
+  late final _sel_initWithBytesNoCopy_length_freeWhenDone_1 =
+      _registerName1("initWithBytesNoCopy:length:freeWhenDone:");
+  late final _sel_initWithBytesNoCopy_length_deallocator_1 =
+      _registerName1("initWithBytesNoCopy:length:deallocator:");
+  instancetype _objc_msgSend_241(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Void> bytes,
+    int length,
+    ffi.Pointer<_ObjCBlock> deallocator,
+  ) {
+    return __objc_msgSend_241(
+      obj,
+      sel,
+      bytes,
+      length,
+      deallocator,
+    );
+  }
+
+  late final __objc_msgSend_241Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Void>,
+              NSUInteger,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_241 = __objc_msgSend_241Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Void>, int, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_initWithContentsOfFile_options_error_1 =
+      _registerName1("initWithContentsOfFile:options:error:");
+  late final _sel_initWithContentsOfURL_options_error_1 =
+      _registerName1("initWithContentsOfURL:options:error:");
+  late final _sel_initWithData_1 = _registerName1("initWithData:");
+  instancetype _objc_msgSend_242(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> data,
+  ) {
+    return __objc_msgSend_242(
+      obj,
+      sel,
+      data,
+    );
+  }
+
+  late final __objc_msgSend_242Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_242 = __objc_msgSend_242Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dataWithData_1 = _registerName1("dataWithData:");
+  late final _sel_initWithBase64EncodedString_options_1 =
+      _registerName1("initWithBase64EncodedString:options:");
+  instancetype _objc_msgSend_243(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> base64String,
+    int options,
+  ) {
+    return __objc_msgSend_243(
+      obj,
+      sel,
+      base64String,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_243Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_243 = __objc_msgSend_243Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_base64EncodedStringWithOptions_1 =
+      _registerName1("base64EncodedStringWithOptions:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_244(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int options,
+  ) {
+    return __objc_msgSend_244(
+      obj,
+      sel,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_244Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_244 = __objc_msgSend_244Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_initWithBase64EncodedData_options_1 =
+      _registerName1("initWithBase64EncodedData:options:");
+  instancetype _objc_msgSend_245(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> base64Data,
+    int options,
+  ) {
+    return __objc_msgSend_245(
+      obj,
+      sel,
+      base64Data,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_245Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_245 = __objc_msgSend_245Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_base64EncodedDataWithOptions_1 =
+      _registerName1("base64EncodedDataWithOptions:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_246(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int options,
+  ) {
+    return __objc_msgSend_246(
+      obj,
+      sel,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_246Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_246 = __objc_msgSend_246Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_decompressedDataUsingAlgorithm_error_1 =
+      _registerName1("decompressedDataUsingAlgorithm:error:");
+  instancetype _objc_msgSend_247(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int algorithm,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_247(
+      obj,
+      sel,
+      algorithm,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_247Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_247 = __objc_msgSend_247Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_compressedDataUsingAlgorithm_error_1 =
+      _registerName1("compressedDataUsingAlgorithm:error:");
+  late final _sel_getBytes_1 = _registerName1("getBytes:");
+  late final _sel_dataWithContentsOfMappedFile_1 =
+      _registerName1("dataWithContentsOfMappedFile:");
+  late final _sel_initWithContentsOfMappedFile_1 =
+      _registerName1("initWithContentsOfMappedFile:");
+  late final _sel_initWithBase64Encoding_1 =
+      _registerName1("initWithBase64Encoding:");
+  late final _sel_base64Encoding1 = _registerName1("base64Encoding");
+  late final _sel_encodeDataObject_1 = _registerName1("encodeDataObject:");
+  void _objc_msgSend_248(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> data,
+  ) {
+    return __objc_msgSend_248(
+      obj,
+      sel,
+      data,
+    );
+  }
+
+  late final __objc_msgSend_248Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_248 = __objc_msgSend_248Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_decodeDataObject1 = _registerName1("decodeDataObject");
+  late final _sel_decodeValueOfObjCType_at_size_1 =
+      _registerName1("decodeValueOfObjCType:at:size:");
+  void _objc_msgSend_249(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Char> type,
+    ffi.Pointer<ffi.Void> data,
+    int size,
+  ) {
+    return __objc_msgSend_249(
+      obj,
+      sel,
+      type,
+      data,
+      size,
+    );
+  }
+
+  late final __objc_msgSend_249Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Void>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_249 = __objc_msgSend_249Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Char>, ffi.Pointer<ffi.Void>, int)>();
+
+  late final _sel_versionForClassName_1 =
+      _registerName1("versionForClassName:");
+  int _objc_msgSend_250(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> className,
+  ) {
+    return __objc_msgSend_250(
+      obj,
+      sel,
+      className,
+    );
+  }
+
+  late final __objc_msgSend_250Ptr = _lookup<
+      ffi.NativeFunction<
+          NSInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_250 = __objc_msgSend_250Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_encodeObject_1 = _registerName1("encodeObject:");
+  late final _sel_encodeRootObject_1 = _registerName1("encodeRootObject:");
+  late final _sel_encodeBycopyObject_1 = _registerName1("encodeBycopyObject:");
+  late final _sel_encodeByrefObject_1 = _registerName1("encodeByrefObject:");
+  late final _sel_encodeConditionalObject_1 =
+      _registerName1("encodeConditionalObject:");
+  late final _sel_encodeValuesOfObjCTypes_1 =
+      _registerName1("encodeValuesOfObjCTypes:");
+  void _objc_msgSend_251(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Char> types,
+  ) {
+    return __objc_msgSend_251(
+      obj,
+      sel,
+      types,
+    );
+  }
+
+  late final __objc_msgSend_251Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Char>)>>('objc_msgSend');
+  late final __objc_msgSend_251 = __objc_msgSend_251Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Char>)>();
+
+  late final _sel_encodeArrayOfObjCType_count_at_1 =
+      _registerName1("encodeArrayOfObjCType:count:at:");
+  void _objc_msgSend_252(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Char> type,
+    int count,
+    ffi.Pointer<ffi.Void> array,
+  ) {
+    return __objc_msgSend_252(
+      obj,
+      sel,
+      type,
+      count,
+      array,
+    );
+  }
+
+  late final __objc_msgSend_252Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Char>,
+              NSUInteger,
+              ffi.Pointer<ffi.Void>)>>('objc_msgSend');
+  late final __objc_msgSend_252 = __objc_msgSend_252Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Char>, int, ffi.Pointer<ffi.Void>)>();
+
+  late final _sel_encodeBytes_length_1 = _registerName1("encodeBytes:length:");
+  late final _sel_decodeObject1 = _registerName1("decodeObject");
+  late final _sel_decodeTopLevelObjectAndReturnError_1 =
+      _registerName1("decodeTopLevelObjectAndReturnError:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_253(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_253(
+      obj,
+      sel,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_253Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_253 = __objc_msgSend_253Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_decodeValuesOfObjCTypes_1 =
+      _registerName1("decodeValuesOfObjCTypes:");
+  late final _sel_decodeArrayOfObjCType_count_at_1 =
+      _registerName1("decodeArrayOfObjCType:count:at:");
+  late final _sel_decodeBytesWithReturnedLength_1 =
+      _registerName1("decodeBytesWithReturnedLength:");
+  ffi.Pointer<ffi.Void> _objc_msgSend_254(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<NSUInteger> lengthp,
+  ) {
+    return __objc_msgSend_254(
+      obj,
+      sel,
+      lengthp,
+    );
+  }
+
+  late final __objc_msgSend_254Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ffi.Void> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<NSUInteger>)>>('objc_msgSend');
+  late final __objc_msgSend_254 = __objc_msgSend_254Ptr.asFunction<
+      ffi.Pointer<ffi.Void> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<NSUInteger>)>();
+
+  late final _sel_encodePropertyList_1 = _registerName1("encodePropertyList:");
+  late final _sel_decodePropertyList1 = _registerName1("decodePropertyList");
+  late final _sel_setObjectZone_1 = _registerName1("setObjectZone:");
+  void _objc_msgSend_255(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<NSZone> zone,
+  ) {
+    return __objc_msgSend_255(
+      obj,
+      sel,
+      zone,
+    );
+  }
+
+  late final __objc_msgSend_255Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<NSZone>)>>('objc_msgSend');
+  late final __objc_msgSend_255 = __objc_msgSend_255Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<NSZone>)>();
+
+  late final _sel_objectZone1 = _registerName1("objectZone");
+  ffi.Pointer<NSZone> _objc_msgSend_256(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_256(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_256Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<NSZone> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_256 = __objc_msgSend_256Ptr.asFunction<
+      ffi.Pointer<NSZone> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_systemVersion1 = _registerName1("systemVersion");
+  late final _sel_allowsKeyedCoding1 = _registerName1("allowsKeyedCoding");
+  late final _sel_encodeObject_forKey_1 =
+      _registerName1("encodeObject:forKey:");
+  late final _sel_encodeConditionalObject_forKey_1 =
+      _registerName1("encodeConditionalObject:forKey:");
+  late final _sel_encodeBool_forKey_1 = _registerName1("encodeBool:forKey:");
+  void _objc_msgSend_257(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    bool value,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_257(
+      obj,
+      sel,
+      value,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_257Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Bool, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_257 = __objc_msgSend_257Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, bool,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_encodeInt_forKey_1 = _registerName1("encodeInt:forKey:");
+  void _objc_msgSend_258(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_258(
+      obj,
+      sel,
+      value,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_258Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_258 = __objc_msgSend_258Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_encodeInt32_forKey_1 = _registerName1("encodeInt32:forKey:");
+  void _objc_msgSend_259(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_259(
+      obj,
+      sel,
+      value,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_259Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_259 = __objc_msgSend_259Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_encodeInt64_forKey_1 = _registerName1("encodeInt64:forKey:");
+  void _objc_msgSend_260(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_260(
+      obj,
+      sel,
+      value,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_260Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int64, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_260 = __objc_msgSend_260Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_encodeFloat_forKey_1 = _registerName1("encodeFloat:forKey:");
+  void _objc_msgSend_261(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    double value,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_261(
+      obj,
+      sel,
+      value,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_261Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Float, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_261 = __objc_msgSend_261Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, double,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_encodeDouble_forKey_1 =
+      _registerName1("encodeDouble:forKey:");
+  void _objc_msgSend_262(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    double value,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_262(
+      obj,
+      sel,
+      value,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_262Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Double, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_262 = __objc_msgSend_262Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, double,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_encodeBytes_length_forKey_1 =
+      _registerName1("encodeBytes:length:forKey:");
+  void _objc_msgSend_263(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Uint8> bytes,
+    int length,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_263(
+      obj,
+      sel,
+      bytes,
+      length,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_263Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Uint8>,
+              NSUInteger,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_263 = __objc_msgSend_263Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Uint8>, int, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_containsValueForKey_1 =
+      _registerName1("containsValueForKey:");
+  late final _sel_decodeObjectForKey_1 = _registerName1("decodeObjectForKey:");
+  late final _sel_decodeTopLevelObjectForKey_error_1 =
+      _registerName1("decodeTopLevelObjectForKey:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_264(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_264(
+      obj,
+      sel,
+      key,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_264Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_264 = __objc_msgSend_264Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_decodeBoolForKey_1 = _registerName1("decodeBoolForKey:");
+  late final _sel_decodeIntForKey_1 = _registerName1("decodeIntForKey:");
+  int _objc_msgSend_265(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_265(
+      obj,
+      sel,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_265Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_265 = __objc_msgSend_265Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_decodeInt32ForKey_1 = _registerName1("decodeInt32ForKey:");
+  int _objc_msgSend_266(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_266(
+      obj,
+      sel,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_266Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_266 = __objc_msgSend_266Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_decodeInt64ForKey_1 = _registerName1("decodeInt64ForKey:");
+  int _objc_msgSend_267(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_267(
+      obj,
+      sel,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_267Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int64 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_267 = __objc_msgSend_267Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_decodeFloatForKey_1 = _registerName1("decodeFloatForKey:");
+  double _objc_msgSend_268(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_268(
+      obj,
+      sel,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_268Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Float Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_268 = __objc_msgSend_268Ptr.asFunction<
+      double Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_decodeDoubleForKey_1 = _registerName1("decodeDoubleForKey:");
+  double _objc_msgSend_269(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_269(
+      obj,
+      sel,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_269Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Double Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_269 = __objc_msgSend_269Ptr.asFunction<
+      double Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_decodeBytesForKey_returnedLength_1 =
+      _registerName1("decodeBytesForKey:returnedLength:");
+  ffi.Pointer<ffi.Uint8> _objc_msgSend_270(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+    ffi.Pointer<NSUInteger> lengthp,
+  ) {
+    return __objc_msgSend_270(
+      obj,
+      sel,
+      key,
+      lengthp,
+    );
+  }
+
+  late final __objc_msgSend_270Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ffi.Uint8> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<NSUInteger>)>>('objc_msgSend');
+  late final __objc_msgSend_270 = __objc_msgSend_270Ptr.asFunction<
+      ffi.Pointer<ffi.Uint8> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<NSUInteger>)>();
+
+  late final _sel_encodeInteger_forKey_1 =
+      _registerName1("encodeInteger:forKey:");
+  void _objc_msgSend_271(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_271(
+      obj,
+      sel,
+      value,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_271Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSInteger, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_271 = __objc_msgSend_271Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_decodeIntegerForKey_1 =
+      _registerName1("decodeIntegerForKey:");
+  late final _sel_requiresSecureCoding1 =
+      _registerName1("requiresSecureCoding");
+  late final _sel_decodeObjectOfClass_forKey_1 =
+      _registerName1("decodeObjectOfClass:forKey:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_272(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> aClass,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_272(
+      obj,
+      sel,
+      aClass,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_272Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_272 = __objc_msgSend_272Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_decodeTopLevelObjectOfClass_forKey_error_1 =
+      _registerName1("decodeTopLevelObjectOfClass:forKey:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_273(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> aClass,
+    ffi.Pointer<ObjCObject> key,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_273(
+      obj,
+      sel,
+      aClass,
+      key,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_273Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_273 = __objc_msgSend_273Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_decodeArrayOfObjectsOfClass_forKey_1 =
+      _registerName1("decodeArrayOfObjectsOfClass:forKey:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_274(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> cls,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_274(
+      obj,
+      sel,
+      cls,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_274Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_274 = __objc_msgSend_274Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_decodeDictionaryWithKeysOfClass_objectsOfClass_forKey_1 =
+      _registerName1("decodeDictionaryWithKeysOfClass:objectsOfClass:forKey:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_275(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> keyCls,
+    ffi.Pointer<ObjCObject> objectCls,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_275(
+      obj,
+      sel,
+      keyCls,
+      objectCls,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_275Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_275 = __objc_msgSend_275Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_decodeObjectOfClasses_forKey_1 =
+      _registerName1("decodeObjectOfClasses:forKey:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_276(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> classes,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_276(
+      obj,
+      sel,
+      classes,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_276Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_276 = __objc_msgSend_276Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_decodeTopLevelObjectOfClasses_forKey_error_1 =
+      _registerName1("decodeTopLevelObjectOfClasses:forKey:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_277(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> classes,
+    ffi.Pointer<ObjCObject> key,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_277(
+      obj,
+      sel,
+      classes,
+      key,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_277Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_277 = __objc_msgSend_277Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_decodeArrayOfObjectsOfClasses_forKey_1 =
+      _registerName1("decodeArrayOfObjectsOfClasses:forKey:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_278(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> classes,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_278(
+      obj,
+      sel,
+      classes,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_278Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_278 = __objc_msgSend_278Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_decodeDictionaryWithKeysOfClasses_objectsOfClasses_forKey_1 =
+      _registerName1(
+          "decodeDictionaryWithKeysOfClasses:objectsOfClasses:forKey:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_279(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> keyClasses,
+    ffi.Pointer<ObjCObject> objectClasses,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_279(
+      obj,
+      sel,
+      keyClasses,
+      objectClasses,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_279Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_279 = __objc_msgSend_279Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_decodePropertyListForKey_1 =
+      _registerName1("decodePropertyListForKey:");
+  late final _sel_allowedClasses1 = _registerName1("allowedClasses");
+  ffi.Pointer<ObjCObject> _objc_msgSend_280(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_280(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_280Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_280 = __objc_msgSend_280Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_failWithError_1 = _registerName1("failWithError:");
+  void _objc_msgSend_281(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> error,
+  ) {
+    return __objc_msgSend_281(
+      obj,
+      sel,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_281Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_281 = __objc_msgSend_281Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_decodingFailurePolicy1 =
+      _registerName1("decodingFailurePolicy");
+  int _objc_msgSend_282(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_282(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_282Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_282 = __objc_msgSend_282Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_error1 = _registerName1("error");
+  ffi.Pointer<ObjCObject> _objc_msgSend_283(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_283(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_283Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_283 = __objc_msgSend_283Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_encodeNXObject_1 = _registerName1("encodeNXObject:");
+  late final _sel_decodeNXObject1 = _registerName1("decodeNXObject");
+  late final _sel_decodeValueOfObjCType_at_1 =
+      _registerName1("decodeValueOfObjCType:at:");
+  late final _sel_encodePoint_1 = _registerName1("encodePoint:");
+  void _objc_msgSend_284(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSPoint point,
+  ) {
+    return __objc_msgSend_284(
+      obj,
+      sel,
+      point,
+    );
+  }
+
+  late final __objc_msgSend_284Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSPoint)>>('objc_msgSend');
+  late final __objc_msgSend_284 = __objc_msgSend_284Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSPoint)>();
+
+  late final _sel_decodePoint1 = _registerName1("decodePoint");
+  late final _sel_encodeSize_1 = _registerName1("encodeSize:");
+  void _objc_msgSend_285(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSSize size,
+  ) {
+    return __objc_msgSend_285(
+      obj,
+      sel,
+      size,
+    );
+  }
+
+  late final __objc_msgSend_285Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSSize)>>('objc_msgSend');
+  late final __objc_msgSend_285 = __objc_msgSend_285Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSSize)>();
+
+  late final _sel_decodeSize1 = _registerName1("decodeSize");
+  late final _sel_encodeRect_1 = _registerName1("encodeRect:");
+  void _objc_msgSend_286(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRect rect,
+  ) {
+    return __objc_msgSend_286(
+      obj,
+      sel,
+      rect,
+    );
+  }
+
+  late final __objc_msgSend_286Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRect)>>('objc_msgSend');
+  late final __objc_msgSend_286 = __objc_msgSend_286Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRect)>();
+
+  late final _sel_decodeRect1 = _registerName1("decodeRect");
+  late final _sel_encodePoint_forKey_1 = _registerName1("encodePoint:forKey:");
+  void _objc_msgSend_287(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSPoint point,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_287(
+      obj,
+      sel,
+      point,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_287Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSPoint, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_287 = __objc_msgSend_287Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSPoint,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_encodeSize_forKey_1 = _registerName1("encodeSize:forKey:");
+  void _objc_msgSend_288(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSSize size,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_288(
+      obj,
+      sel,
+      size,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_288Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSSize, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_288 = __objc_msgSend_288Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSSize,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_encodeRect_forKey_1 = _registerName1("encodeRect:forKey:");
+  void _objc_msgSend_289(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRect rect,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_289(
+      obj,
+      sel,
+      rect,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_289Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRect, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_289 = __objc_msgSend_289Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRect,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_decodePointForKey_1 = _registerName1("decodePointForKey:");
+  NSPoint _objc_msgSend_290(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_290(
+      obj,
+      sel,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_290Ptr = _lookup<
+      ffi.NativeFunction<
+          NSPoint Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_290 = __objc_msgSend_290Ptr.asFunction<
+      NSPoint Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_decodeSizeForKey_1 = _registerName1("decodeSizeForKey:");
+  NSSize _objc_msgSend_291(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_291(
+      obj,
+      sel,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_291Ptr = _lookup<
+      ffi.NativeFunction<
+          NSSize Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_291 = __objc_msgSend_291Ptr.asFunction<
+      NSSize Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_decodeRectForKey_1 = _registerName1("decodeRectForKey:");
+  NSRect _objc_msgSend_292(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_292(
+      obj,
+      sel,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_292Ptr = _lookup<
+      ffi.NativeFunction<
+          NSRect Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_292 = __objc_msgSend_292Ptr.asFunction<
+      NSRect Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_substringFromIndex_1 = _registerName1("substringFromIndex:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_293(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int from,
+  ) {
+    return __objc_msgSend_293(
+      obj,
+      sel,
+      from,
+    );
+  }
+
+  late final __objc_msgSend_293Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_293 = __objc_msgSend_293Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_substringToIndex_1 = _registerName1("substringToIndex:");
+  late final _sel_substringWithRange_1 = _registerName1("substringWithRange:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_294(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+  ) {
+    return __objc_msgSend_294(
+      obj,
+      sel,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_294Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_294 = __objc_msgSend_294Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange)>();
+
+  late final _sel_getCharacters_range_1 =
+      _registerName1("getCharacters:range:");
+  void _objc_msgSend_295(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<unichar> buffer,
+    NSRange range,
+  ) {
+    return __objc_msgSend_295(
+      obj,
+      sel,
+      buffer,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_295Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<unichar>, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_295 = __objc_msgSend_295Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<unichar>, NSRange)>();
+
+  int _objc_msgSend_296(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> string,
+  ) {
+    return __objc_msgSend_296(
+      obj,
+      sel,
+      string,
+    );
+  }
+
+  late final __objc_msgSend_296Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_296 = __objc_msgSend_296Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_compare_options_1 = _registerName1("compare:options:");
+  int _objc_msgSend_297(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> string,
+    int mask,
+  ) {
+    return __objc_msgSend_297(
+      obj,
+      sel,
+      string,
+      mask,
+    );
+  }
+
+  late final __objc_msgSend_297Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_297 = __objc_msgSend_297Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_compare_options_range_1 =
+      _registerName1("compare:options:range:");
+  int _objc_msgSend_298(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> string,
+    int mask,
+    NSRange rangeOfReceiverToCompare,
+  ) {
+    return __objc_msgSend_298(
+      obj,
+      sel,
+      string,
+      mask,
+      rangeOfReceiverToCompare,
+    );
+  }
+
+  late final __objc_msgSend_298Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Int32, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_298 = __objc_msgSend_298Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, NSRange)>();
+
+  late final _sel_compare_options_range_locale_1 =
+      _registerName1("compare:options:range:locale:");
+  int _objc_msgSend_299(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> string,
+    int mask,
+    NSRange rangeOfReceiverToCompare,
+    ffi.Pointer<ObjCObject> locale,
+  ) {
+    return __objc_msgSend_299(
+      obj,
+      sel,
+      string,
+      mask,
+      rangeOfReceiverToCompare,
+      locale,
+    );
+  }
+
+  late final __objc_msgSend_299Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              NSRange,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_299 = __objc_msgSend_299Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, NSRange, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_caseInsensitiveCompare_1 =
+      _registerName1("caseInsensitiveCompare:");
+  late final _sel_localizedCompare_1 = _registerName1("localizedCompare:");
+  late final _sel_localizedCaseInsensitiveCompare_1 =
+      _registerName1("localizedCaseInsensitiveCompare:");
+  late final _sel_localizedStandardCompare_1 =
+      _registerName1("localizedStandardCompare:");
+  late final _sel_isEqualToString_1 = _registerName1("isEqualToString:");
+  late final _sel_hasPrefix_1 = _registerName1("hasPrefix:");
+  late final _sel_hasSuffix_1 = _registerName1("hasSuffix:");
+  late final _sel_commonPrefixWithString_options_1 =
+      _registerName1("commonPrefixWithString:options:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_300(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> str,
+    int mask,
+  ) {
+    return __objc_msgSend_300(
+      obj,
+      sel,
+      str,
+      mask,
+    );
+  }
+
+  late final __objc_msgSend_300Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_300 = __objc_msgSend_300Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_containsString_1 = _registerName1("containsString:");
+  late final _sel_localizedCaseInsensitiveContainsString_1 =
+      _registerName1("localizedCaseInsensitiveContainsString:");
+  late final _sel_localizedStandardContainsString_1 =
+      _registerName1("localizedStandardContainsString:");
+  late final _sel_localizedStandardRangeOfString_1 =
+      _registerName1("localizedStandardRangeOfString:");
+  NSRange _objc_msgSend_301(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> str,
+  ) {
+    return __objc_msgSend_301(
+      obj,
+      sel,
+      str,
+    );
+  }
+
+  late final __objc_msgSend_301Ptr = _lookup<
+      ffi.NativeFunction<
+          NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_301 = __objc_msgSend_301Ptr.asFunction<
+      NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_rangeOfString_1 = _registerName1("rangeOfString:");
+  late final _sel_rangeOfString_options_1 =
+      _registerName1("rangeOfString:options:");
+  NSRange _objc_msgSend_302(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> searchString,
+    int mask,
+  ) {
+    return __objc_msgSend_302(
+      obj,
+      sel,
+      searchString,
+      mask,
+    );
+  }
+
+  late final __objc_msgSend_302Ptr = _lookup<
+      ffi.NativeFunction<
+          NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_302 = __objc_msgSend_302Ptr.asFunction<
+      NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_rangeOfString_options_range_1 =
+      _registerName1("rangeOfString:options:range:");
+  NSRange _objc_msgSend_303(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> searchString,
+    int mask,
+    NSRange rangeOfReceiverToSearch,
+  ) {
+    return __objc_msgSend_303(
+      obj,
+      sel,
+      searchString,
+      mask,
+      rangeOfReceiverToSearch,
+    );
+  }
+
+  late final __objc_msgSend_303Ptr = _lookup<
+      ffi.NativeFunction<
+          NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Int32, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_303 = __objc_msgSend_303Ptr.asFunction<
+      NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, NSRange)>();
+
+  late final _sel_rangeOfString_options_range_locale_1 =
+      _registerName1("rangeOfString:options:range:locale:");
+  NSRange _objc_msgSend_304(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> searchString,
+    int mask,
+    NSRange rangeOfReceiverToSearch,
+    ffi.Pointer<ObjCObject> locale,
+  ) {
+    return __objc_msgSend_304(
+      obj,
+      sel,
+      searchString,
+      mask,
+      rangeOfReceiverToSearch,
+      locale,
+    );
+  }
+
+  late final __objc_msgSend_304Ptr = _lookup<
+      ffi.NativeFunction<
+          NSRange Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              NSRange,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_304 = __objc_msgSend_304Ptr.asFunction<
+      NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, NSRange, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_rangeOfCharacterFromSet_1 =
+      _registerName1("rangeOfCharacterFromSet:");
+  NSRange _objc_msgSend_305(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> searchSet,
+  ) {
+    return __objc_msgSend_305(
+      obj,
+      sel,
+      searchSet,
+    );
+  }
+
+  late final __objc_msgSend_305Ptr = _lookup<
+      ffi.NativeFunction<
+          NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_305 = __objc_msgSend_305Ptr.asFunction<
+      NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_rangeOfCharacterFromSet_options_1 =
+      _registerName1("rangeOfCharacterFromSet:options:");
+  NSRange _objc_msgSend_306(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> searchSet,
+    int mask,
+  ) {
+    return __objc_msgSend_306(
+      obj,
+      sel,
+      searchSet,
+      mask,
+    );
+  }
+
+  late final __objc_msgSend_306Ptr = _lookup<
+      ffi.NativeFunction<
+          NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_306 = __objc_msgSend_306Ptr.asFunction<
+      NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_rangeOfCharacterFromSet_options_range_1 =
+      _registerName1("rangeOfCharacterFromSet:options:range:");
+  NSRange _objc_msgSend_307(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> searchSet,
+    int mask,
+    NSRange rangeOfReceiverToSearch,
+  ) {
+    return __objc_msgSend_307(
+      obj,
+      sel,
+      searchSet,
+      mask,
+      rangeOfReceiverToSearch,
+    );
+  }
+
+  late final __objc_msgSend_307Ptr = _lookup<
+      ffi.NativeFunction<
+          NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Int32, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_307 = __objc_msgSend_307Ptr.asFunction<
+      NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, NSRange)>();
+
+  late final _sel_rangeOfComposedCharacterSequenceAtIndex_1 =
+      _registerName1("rangeOfComposedCharacterSequenceAtIndex:");
+  NSRange _objc_msgSend_308(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int index,
+  ) {
+    return __objc_msgSend_308(
+      obj,
+      sel,
+      index,
+    );
+  }
+
+  late final __objc_msgSend_308Ptr = _lookup<
+      ffi.NativeFunction<
+          NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_308 = __objc_msgSend_308Ptr.asFunction<
+      NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_rangeOfComposedCharacterSequencesForRange_1 =
+      _registerName1("rangeOfComposedCharacterSequencesForRange:");
+  NSRange _objc_msgSend_309(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+  ) {
+    return __objc_msgSend_309(
+      obj,
+      sel,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_309Ptr = _lookup<
+      ffi.NativeFunction<
+          NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_309 = __objc_msgSend_309Ptr.asFunction<
+      NSRange Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange)>();
+
+  late final _sel_stringByAppendingString_1 =
+      _registerName1("stringByAppendingString:");
+  late final _sel_stringByAppendingFormat_1 =
+      _registerName1("stringByAppendingFormat:");
+  late final _sel_uppercaseString1 = _registerName1("uppercaseString");
+  late final _sel_lowercaseString1 = _registerName1("lowercaseString");
+  late final _sel_capitalizedString1 = _registerName1("capitalizedString");
+  late final _sel_localizedUppercaseString1 =
+      _registerName1("localizedUppercaseString");
+  late final _sel_localizedLowercaseString1 =
+      _registerName1("localizedLowercaseString");
+  late final _sel_localizedCapitalizedString1 =
+      _registerName1("localizedCapitalizedString");
+  late final _sel_uppercaseStringWithLocale_1 =
+      _registerName1("uppercaseStringWithLocale:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_310(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> locale,
+  ) {
+    return __objc_msgSend_310(
+      obj,
+      sel,
+      locale,
+    );
+  }
+
+  late final __objc_msgSend_310Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_310 = __objc_msgSend_310Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_lowercaseStringWithLocale_1 =
+      _registerName1("lowercaseStringWithLocale:");
+  late final _sel_capitalizedStringWithLocale_1 =
+      _registerName1("capitalizedStringWithLocale:");
+  late final _sel_getLineStart_end_contentsEnd_forRange_1 =
+      _registerName1("getLineStart:end:contentsEnd:forRange:");
+  void _objc_msgSend_311(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<NSUInteger> startPtr,
+    ffi.Pointer<NSUInteger> lineEndPtr,
+    ffi.Pointer<NSUInteger> contentsEndPtr,
+    NSRange range,
+  ) {
+    return __objc_msgSend_311(
+      obj,
+      sel,
+      startPtr,
+      lineEndPtr,
+      contentsEndPtr,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_311Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<NSUInteger>,
+              ffi.Pointer<NSUInteger>,
+              ffi.Pointer<NSUInteger>,
+              NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_311 = __objc_msgSend_311Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<NSUInteger>,
+          ffi.Pointer<NSUInteger>,
+          ffi.Pointer<NSUInteger>,
+          NSRange)>();
+
+  late final _sel_lineRangeForRange_1 = _registerName1("lineRangeForRange:");
+  late final _sel_getParagraphStart_end_contentsEnd_forRange_1 =
+      _registerName1("getParagraphStart:end:contentsEnd:forRange:");
+  late final _sel_paragraphRangeForRange_1 =
+      _registerName1("paragraphRangeForRange:");
+  late final _sel_enumerateSubstringsInRange_options_usingBlock_1 =
+      _registerName1("enumerateSubstringsInRange:options:usingBlock:");
+  void _objc_msgSend_312(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    int opts,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_312(
+      obj,
+      sel,
+      range,
+      opts,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_312Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRange, ffi.Int32, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_312 = __objc_msgSend_312Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange, int,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_enumerateLinesUsingBlock_1 =
+      _registerName1("enumerateLinesUsingBlock:");
+  void _objc_msgSend_313(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_313(
+      obj,
+      sel,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_313Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_313 = __objc_msgSend_313Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_UTF8String1 = _registerName1("UTF8String");
+  late final _sel_fastestEncoding1 = _registerName1("fastestEncoding");
+  late final _sel_smallestEncoding1 = _registerName1("smallestEncoding");
+  late final _sel_dataUsingEncoding_allowLossyConversion_1 =
+      _registerName1("dataUsingEncoding:allowLossyConversion:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_314(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int encoding,
+    bool lossy,
+  ) {
+    return __objc_msgSend_314(
+      obj,
+      sel,
+      encoding,
+      lossy,
+    );
+  }
+
+  late final __objc_msgSend_314Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSStringEncoding,
+              ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_314 = __objc_msgSend_314Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int, bool)>();
+
+  late final _sel_dataUsingEncoding_1 = _registerName1("dataUsingEncoding:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_315(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int encoding,
+  ) {
+    return __objc_msgSend_315(
+      obj,
+      sel,
+      encoding,
+    );
+  }
+
+  late final __objc_msgSend_315Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSStringEncoding)>>('objc_msgSend');
+  late final __objc_msgSend_315 = __objc_msgSend_315Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_canBeConvertedToEncoding_1 =
+      _registerName1("canBeConvertedToEncoding:");
+  late final _sel_cStringUsingEncoding_1 =
+      _registerName1("cStringUsingEncoding:");
+  late final _sel_getCString_maxLength_encoding_1 =
+      _registerName1("getCString:maxLength:encoding:");
+  bool _objc_msgSend_316(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Char> buffer,
+    int maxBufferCount,
+    int encoding,
+  ) {
+    return __objc_msgSend_316(
+      obj,
+      sel,
+      buffer,
+      maxBufferCount,
+      encoding,
+    );
+  }
+
+  late final __objc_msgSend_316Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Char>,
+              NSUInteger,
+              NSStringEncoding)>>('objc_msgSend');
+  late final __objc_msgSend_316 = __objc_msgSend_316Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Char>, int, int)>();
+
+  late final _sel_getBytes_maxLength_usedLength_encoding_options_range_remainingRange_1 =
+      _registerName1(
+          "getBytes:maxLength:usedLength:encoding:options:range:remainingRange:");
+  bool _objc_msgSend_317(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Void> buffer,
+    int maxBufferCount,
+    ffi.Pointer<NSUInteger> usedBufferCount,
+    int encoding,
+    int options,
+    NSRange range,
+    NSRangePointer leftover,
+  ) {
+    return __objc_msgSend_317(
+      obj,
+      sel,
+      buffer,
+      maxBufferCount,
+      usedBufferCount,
+      encoding,
+      options,
+      range,
+      leftover,
+    );
+  }
+
+  late final __objc_msgSend_317Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Void>,
+              NSUInteger,
+              ffi.Pointer<NSUInteger>,
+              NSStringEncoding,
+              ffi.Int32,
+              NSRange,
+              NSRangePointer)>>('objc_msgSend');
+  late final __objc_msgSend_317 = __objc_msgSend_317Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Void>,
+          int,
+          ffi.Pointer<NSUInteger>,
+          int,
+          int,
+          NSRange,
+          NSRangePointer)>();
+
+  late final _sel_maximumLengthOfBytesUsingEncoding_1 =
+      _registerName1("maximumLengthOfBytesUsingEncoding:");
+  late final _sel_lengthOfBytesUsingEncoding_1 =
+      _registerName1("lengthOfBytesUsingEncoding:");
+  late final _sel_availableStringEncodings1 =
+      _registerName1("availableStringEncodings");
+  ffi.Pointer<NSStringEncoding> _objc_msgSend_318(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_318(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_318Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<NSStringEncoding> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_318 = __objc_msgSend_318Ptr.asFunction<
+      ffi.Pointer<NSStringEncoding> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_localizedNameOfStringEncoding_1 =
+      _registerName1("localizedNameOfStringEncoding:");
+  late final _sel_defaultCStringEncoding1 =
+      _registerName1("defaultCStringEncoding");
+  late final _sel_decomposedStringWithCanonicalMapping1 =
+      _registerName1("decomposedStringWithCanonicalMapping");
+  late final _sel_precomposedStringWithCanonicalMapping1 =
+      _registerName1("precomposedStringWithCanonicalMapping");
+  late final _sel_decomposedStringWithCompatibilityMapping1 =
+      _registerName1("decomposedStringWithCompatibilityMapping");
+  late final _sel_precomposedStringWithCompatibilityMapping1 =
+      _registerName1("precomposedStringWithCompatibilityMapping");
+  late final _sel_componentsSeparatedByString_1 =
+      _registerName1("componentsSeparatedByString:");
+  late final _sel_componentsSeparatedByCharactersInSet_1 =
+      _registerName1("componentsSeparatedByCharactersInSet:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_319(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> separator,
+  ) {
+    return __objc_msgSend_319(
+      obj,
+      sel,
+      separator,
+    );
+  }
+
+  late final __objc_msgSend_319Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_319 = __objc_msgSend_319Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_stringByTrimmingCharactersInSet_1 =
+      _registerName1("stringByTrimmingCharactersInSet:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_320(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> set1,
+  ) {
+    return __objc_msgSend_320(
+      obj,
+      sel,
+      set1,
+    );
+  }
+
+  late final __objc_msgSend_320Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_320 = __objc_msgSend_320Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_stringByPaddingToLength_withString_startingAtIndex_1 =
+      _registerName1("stringByPaddingToLength:withString:startingAtIndex:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_321(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int newLength,
+    ffi.Pointer<ObjCObject> padString,
+    int padIndex,
+  ) {
+    return __objc_msgSend_321(
+      obj,
+      sel,
+      newLength,
+      padString,
+      padIndex,
+    );
+  }
+
+  late final __objc_msgSend_321Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSUInteger,
+              ffi.Pointer<ObjCObject>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_321 = __objc_msgSend_321Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_stringByFoldingWithOptions_locale_1 =
+      _registerName1("stringByFoldingWithOptions:locale:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_322(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int options,
+    ffi.Pointer<ObjCObject> locale,
+  ) {
+    return __objc_msgSend_322(
+      obj,
+      sel,
+      options,
+      locale,
+    );
+  }
+
+  late final __objc_msgSend_322Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_322 = __objc_msgSend_322Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_stringByReplacingOccurrencesOfString_withString_options_range_1 =
+      _registerName1(
+          "stringByReplacingOccurrencesOfString:withString:options:range:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_323(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> target,
+    ffi.Pointer<ObjCObject> replacement,
+    int options,
+    NSRange searchRange,
+  ) {
+    return __objc_msgSend_323(
+      obj,
+      sel,
+      target,
+      replacement,
+      options,
+      searchRange,
+    );
+  }
+
+  late final __objc_msgSend_323Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_323 = __objc_msgSend_323Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          NSRange)>();
+
+  late final _sel_stringByReplacingOccurrencesOfString_withString_1 =
+      _registerName1("stringByReplacingOccurrencesOfString:withString:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_324(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> target,
+    ffi.Pointer<ObjCObject> replacement,
+  ) {
+    return __objc_msgSend_324(
+      obj,
+      sel,
+      target,
+      replacement,
+    );
+  }
+
+  late final __objc_msgSend_324Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_324 = __objc_msgSend_324Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_stringByReplacingCharactersInRange_withString_1 =
+      _registerName1("stringByReplacingCharactersInRange:withString:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_325(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    ffi.Pointer<ObjCObject> replacement,
+  ) {
+    return __objc_msgSend_325(
+      obj,
+      sel,
+      range,
+      replacement,
+    );
+  }
+
+  late final __objc_msgSend_325Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSRange,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_325 = __objc_msgSend_325Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, NSRange, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_stringByApplyingTransform_reverse_1 =
+      _registerName1("stringByApplyingTransform:reverse:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_326(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSStringTransform transform,
+    bool reverse,
+  ) {
+    return __objc_msgSend_326(
+      obj,
+      sel,
+      transform,
+      reverse,
+    );
+  }
+
+  late final __objc_msgSend_326Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSStringTransform,
+              ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_326 = __objc_msgSend_326Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, NSStringTransform, bool)>();
+
+  late final _sel_writeToURL_atomically_encoding_error_1 =
+      _registerName1("writeToURL:atomically:encoding:error:");
+  bool _objc_msgSend_327(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    bool useAuxiliaryFile,
+    int enc,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_327(
+      obj,
+      sel,
+      url,
+      useAuxiliaryFile,
+      enc,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_327Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool,
+              NSStringEncoding,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_327 = __objc_msgSend_327Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          bool,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_writeToFile_atomically_encoding_error_1 =
+      _registerName1("writeToFile:atomically:encoding:error:");
+  bool _objc_msgSend_328(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    bool useAuxiliaryFile,
+    int enc,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_328(
+      obj,
+      sel,
+      path,
+      useAuxiliaryFile,
+      enc,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_328Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool,
+              NSStringEncoding,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_328 = __objc_msgSend_328Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          bool,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_hash1 = _registerName1("hash");
+  late final _sel_initWithCharactersNoCopy_length_freeWhenDone_1 =
+      _registerName1("initWithCharactersNoCopy:length:freeWhenDone:");
+  instancetype _objc_msgSend_329(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<unichar> characters,
+    int length,
+    bool freeBuffer,
+  ) {
+    return __objc_msgSend_329(
+      obj,
+      sel,
+      characters,
+      length,
+      freeBuffer,
+    );
+  }
+
+  late final __objc_msgSend_329Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<unichar>, NSUInteger, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_329 = __objc_msgSend_329Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<unichar>, int, bool)>();
+
+  late final _sel_initWithCharactersNoCopy_length_deallocator_1 =
+      _registerName1("initWithCharactersNoCopy:length:deallocator:");
+  instancetype _objc_msgSend_330(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<unichar> chars,
+    int len,
+    ffi.Pointer<_ObjCBlock> deallocator,
+  ) {
+    return __objc_msgSend_330(
+      obj,
+      sel,
+      chars,
+      len,
+      deallocator,
+    );
+  }
+
+  late final __objc_msgSend_330Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<unichar>,
+              NSUInteger,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_330 = __objc_msgSend_330Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<unichar>, int, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_initWithCharacters_length_1 =
+      _registerName1("initWithCharacters:length:");
+  instancetype _objc_msgSend_331(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<unichar> characters,
+    int length,
+  ) {
+    return __objc_msgSend_331(
+      obj,
+      sel,
+      characters,
+      length,
+    );
+  }
+
+  late final __objc_msgSend_331Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<unichar>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_331 = __objc_msgSend_331Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<unichar>, int)>();
+
+  late final _sel_initWithUTF8String_1 = _registerName1("initWithUTF8String:");
+  instancetype _objc_msgSend_332(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Char> nullTerminatedCString,
+  ) {
+    return __objc_msgSend_332(
+      obj,
+      sel,
+      nullTerminatedCString,
+    );
+  }
+
+  late final __objc_msgSend_332Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Char>)>>('objc_msgSend');
+  late final __objc_msgSend_332 = __objc_msgSend_332Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Char>)>();
+
+  late final _sel_initWithFormat_1 = _registerName1("initWithFormat:");
+  late final _sel_initWithFormat_arguments_1 =
+      _registerName1("initWithFormat:arguments:");
+  instancetype _objc_msgSend_333(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> format,
+    ffi.Pointer<__va_list_tag> argList,
+  ) {
+    return __objc_msgSend_333(
+      obj,
+      sel,
+      format,
+      argList,
+    );
+  }
+
+  late final __objc_msgSend_333Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<__va_list_tag>)>>('objc_msgSend');
+  late final __objc_msgSend_333 = __objc_msgSend_333Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<__va_list_tag>)>();
+
+  late final _sel_initWithFormat_locale_1 =
+      _registerName1("initWithFormat:locale:");
+  late final _sel_initWithFormat_locale_arguments_1 =
+      _registerName1("initWithFormat:locale:arguments:");
+  instancetype _objc_msgSend_334(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> format,
+    ffi.Pointer<ObjCObject> locale,
+    ffi.Pointer<__va_list_tag> argList,
+  ) {
+    return __objc_msgSend_334(
+      obj,
+      sel,
+      format,
+      locale,
+      argList,
+    );
+  }
+
+  late final __objc_msgSend_334Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<__va_list_tag>)>>('objc_msgSend');
+  late final __objc_msgSend_334 = __objc_msgSend_334Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<__va_list_tag>)>();
+
+  late final _sel_initWithData_encoding_1 =
+      _registerName1("initWithData:encoding:");
+  instancetype _objc_msgSend_335(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> data,
+    int encoding,
+  ) {
+    return __objc_msgSend_335(
+      obj,
+      sel,
+      data,
+      encoding,
+    );
+  }
+
+  late final __objc_msgSend_335Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, NSStringEncoding)>>('objc_msgSend');
+  late final __objc_msgSend_335 = __objc_msgSend_335Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_initWithBytes_length_encoding_1 =
+      _registerName1("initWithBytes:length:encoding:");
+  instancetype _objc_msgSend_336(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Void> bytes,
+    int len,
+    int encoding,
+  ) {
+    return __objc_msgSend_336(
+      obj,
+      sel,
+      bytes,
+      len,
+      encoding,
+    );
+  }
+
+  late final __objc_msgSend_336Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Void>,
+              NSUInteger,
+              NSStringEncoding)>>('objc_msgSend');
+  late final __objc_msgSend_336 = __objc_msgSend_336Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Void>, int, int)>();
+
+  late final _sel_initWithBytesNoCopy_length_encoding_freeWhenDone_1 =
+      _registerName1("initWithBytesNoCopy:length:encoding:freeWhenDone:");
+  instancetype _objc_msgSend_337(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Void> bytes,
+    int len,
+    int encoding,
+    bool freeBuffer,
+  ) {
+    return __objc_msgSend_337(
+      obj,
+      sel,
+      bytes,
+      len,
+      encoding,
+      freeBuffer,
+    );
+  }
+
+  late final __objc_msgSend_337Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Void>,
+              NSUInteger,
+              NSStringEncoding,
+              ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_337 = __objc_msgSend_337Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Void>, int, int, bool)>();
+
+  late final _sel_initWithBytesNoCopy_length_encoding_deallocator_1 =
+      _registerName1("initWithBytesNoCopy:length:encoding:deallocator:");
+  instancetype _objc_msgSend_338(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Void> bytes,
+    int len,
+    int encoding,
+    ffi.Pointer<_ObjCBlock> deallocator,
+  ) {
+    return __objc_msgSend_338(
+      obj,
+      sel,
+      bytes,
+      len,
+      encoding,
+      deallocator,
+    );
+  }
+
+  late final __objc_msgSend_338Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Void>,
+              NSUInteger,
+              NSStringEncoding,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_338 = __objc_msgSend_338Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Void>, int, int, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_string1 = _registerName1("string");
+  late final _sel_stringWithString_1 = _registerName1("stringWithString:");
+  late final _sel_stringWithCharacters_length_1 =
+      _registerName1("stringWithCharacters:length:");
+  late final _sel_stringWithUTF8String_1 =
+      _registerName1("stringWithUTF8String:");
+  late final _sel_stringWithFormat_1 = _registerName1("stringWithFormat:");
+  late final _sel_localizedStringWithFormat_1 =
+      _registerName1("localizedStringWithFormat:");
+  late final _sel_initWithCString_encoding_1 =
+      _registerName1("initWithCString:encoding:");
+  instancetype _objc_msgSend_339(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Char> nullTerminatedCString,
+    int encoding,
+  ) {
+    return __objc_msgSend_339(
+      obj,
+      sel,
+      nullTerminatedCString,
+      encoding,
+    );
+  }
+
+  late final __objc_msgSend_339Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Char>, NSStringEncoding)>>('objc_msgSend');
+  late final __objc_msgSend_339 = __objc_msgSend_339Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Char>, int)>();
+
+  late final _sel_stringWithCString_encoding_1 =
+      _registerName1("stringWithCString:encoding:");
+  late final _sel_initWithContentsOfURL_encoding_error_1 =
+      _registerName1("initWithContentsOfURL:encoding:error:");
+  instancetype _objc_msgSend_340(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    int enc,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_340(
+      obj,
+      sel,
+      url,
+      enc,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_340Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSStringEncoding,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_340 = __objc_msgSend_340Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_initWithContentsOfFile_encoding_error_1 =
+      _registerName1("initWithContentsOfFile:encoding:error:");
+  instancetype _objc_msgSend_341(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    int enc,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_341(
+      obj,
+      sel,
+      path,
+      enc,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_341Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSStringEncoding,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_341 = __objc_msgSend_341Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_stringWithContentsOfURL_encoding_error_1 =
+      _registerName1("stringWithContentsOfURL:encoding:error:");
+  late final _sel_stringWithContentsOfFile_encoding_error_1 =
+      _registerName1("stringWithContentsOfFile:encoding:error:");
+  late final _sel_initWithContentsOfURL_usedEncoding_error_1 =
+      _registerName1("initWithContentsOfURL:usedEncoding:error:");
+  instancetype _objc_msgSend_342(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    ffi.Pointer<NSStringEncoding> enc,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_342(
+      obj,
+      sel,
+      url,
+      enc,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_342Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<NSStringEncoding>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_342 = __objc_msgSend_342Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<NSStringEncoding>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_initWithContentsOfFile_usedEncoding_error_1 =
+      _registerName1("initWithContentsOfFile:usedEncoding:error:");
+  instancetype _objc_msgSend_343(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    ffi.Pointer<NSStringEncoding> enc,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_343(
+      obj,
+      sel,
+      path,
+      enc,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_343Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<NSStringEncoding>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_343 = __objc_msgSend_343Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<NSStringEncoding>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_stringWithContentsOfURL_usedEncoding_error_1 =
+      _registerName1("stringWithContentsOfURL:usedEncoding:error:");
+  late final _sel_stringWithContentsOfFile_usedEncoding_error_1 =
+      _registerName1("stringWithContentsOfFile:usedEncoding:error:");
+  late final _sel_stringEncodingForData_encodingOptions_convertedString_usedLossyConversion_1 =
+      _registerName1(
+          "stringEncodingForData:encodingOptions:convertedString:usedLossyConversion:");
+  int _objc_msgSend_344(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> data,
+    ffi.Pointer<ObjCObject> opts,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> string,
+    ffi.Pointer<ffi.Bool> usedLossyConversion,
+  ) {
+    return __objc_msgSend_344(
+      obj,
+      sel,
+      data,
+      opts,
+      string,
+      usedLossyConversion,
+    );
+  }
+
+  late final __objc_msgSend_344Ptr = _lookup<
+      ffi.NativeFunction<
+          NSStringEncoding Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Pointer<ffi.Bool>)>>('objc_msgSend');
+  late final __objc_msgSend_344 = __objc_msgSend_344Ptr.asFunction<
+      int Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          ffi.Pointer<ffi.Bool>)>();
+
+  late final _sel_propertyList1 = _registerName1("propertyList");
+  late final _sel_propertyListFromStringsFileFormat1 =
+      _registerName1("propertyListFromStringsFileFormat");
+  late final _sel_cString1 = _registerName1("cString");
+  late final _sel_lossyCString1 = _registerName1("lossyCString");
+  late final _sel_cStringLength1 = _registerName1("cStringLength");
+  late final _sel_getCString_1 = _registerName1("getCString:");
+  late final _sel_getCString_maxLength_1 =
+      _registerName1("getCString:maxLength:");
+  void _objc_msgSend_345(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Char> bytes,
+    int maxLength,
+  ) {
+    return __objc_msgSend_345(
+      obj,
+      sel,
+      bytes,
+      maxLength,
+    );
+  }
+
+  late final __objc_msgSend_345Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Char>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_345 = __objc_msgSend_345Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Char>, int)>();
+
+  late final _sel_getCString_maxLength_range_remainingRange_1 =
+      _registerName1("getCString:maxLength:range:remainingRange:");
+  void _objc_msgSend_346(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Char> bytes,
+    int maxLength,
+    NSRange aRange,
+    NSRangePointer leftoverRange,
+  ) {
+    return __objc_msgSend_346(
+      obj,
+      sel,
+      bytes,
+      maxLength,
+      aRange,
+      leftoverRange,
+    );
+  }
+
+  late final __objc_msgSend_346Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Char>,
+              NSUInteger,
+              NSRange,
+              NSRangePointer)>>('objc_msgSend');
+  late final __objc_msgSend_346 = __objc_msgSend_346Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Char>, int, NSRange, NSRangePointer)>();
+
+  late final _sel_stringWithContentsOfFile_1 =
+      _registerName1("stringWithContentsOfFile:");
+  late final _sel_stringWithContentsOfURL_1 =
+      _registerName1("stringWithContentsOfURL:");
+  late final _sel_initWithCStringNoCopy_length_freeWhenDone_1 =
+      _registerName1("initWithCStringNoCopy:length:freeWhenDone:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_347(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Char> bytes,
+    int length,
+    bool freeBuffer,
+  ) {
+    return __objc_msgSend_347(
+      obj,
+      sel,
+      bytes,
+      length,
+      freeBuffer,
+    );
+  }
+
+  late final __objc_msgSend_347Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Char>,
+              NSUInteger,
+              ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_347 = __objc_msgSend_347Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ffi.Char>, int, bool)>();
+
+  late final _sel_initWithCString_length_1 =
+      _registerName1("initWithCString:length:");
+  late final _sel_initWithCString_1 = _registerName1("initWithCString:");
+  late final _sel_stringWithCString_length_1 =
+      _registerName1("stringWithCString:length:");
+  late final _sel_stringWithCString_1 = _registerName1("stringWithCString:");
+  late final _sel_getCharacters_1 = _registerName1("getCharacters:");
+  void _objc_msgSend_348(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<unichar> buffer,
+  ) {
+    return __objc_msgSend_348(
+      obj,
+      sel,
+      buffer,
+    );
+  }
+
+  late final __objc_msgSend_348Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<unichar>)>>('objc_msgSend');
+  late final __objc_msgSend_348 = __objc_msgSend_348Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<unichar>)>();
+
+  late final _sel_variantFittingPresentationWidth_1 =
+      _registerName1("variantFittingPresentationWidth:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_349(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int width,
+  ) {
+    return __objc_msgSend_349(
+      obj,
+      sel,
+      width,
+    );
+  }
+
+  late final __objc_msgSend_349Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSInteger)>>('objc_msgSend');
+  late final __objc_msgSend_349 = __objc_msgSend_349Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_pathWithComponents_1 = _registerName1("pathWithComponents:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_350(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> components,
+  ) {
+    return __objc_msgSend_350(
+      obj,
+      sel,
+      components,
+    );
+  }
+
+  late final __objc_msgSend_350Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_350 = __objc_msgSend_350Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_isAbsolutePath1 = _registerName1("isAbsolutePath");
+  late final _sel_stringByDeletingLastPathComponent1 =
+      _registerName1("stringByDeletingLastPathComponent");
+  late final _sel_stringByAppendingPathComponent_1 =
+      _registerName1("stringByAppendingPathComponent:");
+  late final _sel_stringByDeletingPathExtension1 =
+      _registerName1("stringByDeletingPathExtension");
+  late final _sel_stringByAppendingPathExtension_1 =
+      _registerName1("stringByAppendingPathExtension:");
+  late final _sel_stringByAbbreviatingWithTildeInPath1 =
+      _registerName1("stringByAbbreviatingWithTildeInPath");
+  late final _sel_stringByExpandingTildeInPath1 =
+      _registerName1("stringByExpandingTildeInPath");
+  late final _sel_stringByStandardizingPath1 =
+      _registerName1("stringByStandardizingPath");
+  late final _sel_stringByResolvingSymlinksInPath1 =
+      _registerName1("stringByResolvingSymlinksInPath");
+  late final _sel_stringsByAppendingPaths_1 =
+      _registerName1("stringsByAppendingPaths:");
+  late final _sel_completePathIntoString_caseSensitive_matchesIntoArray_filterTypes_1 =
+      _registerName1(
+          "completePathIntoString:caseSensitive:matchesIntoArray:filterTypes:");
+  int _objc_msgSend_351(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outputName,
+    bool flag,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outputArray,
+    ffi.Pointer<ObjCObject> filterTypes,
+  ) {
+    return __objc_msgSend_351(
+      obj,
+      sel,
+      outputName,
+      flag,
+      outputArray,
+      filterTypes,
+    );
+  }
+
+  late final __objc_msgSend_351Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Bool,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_351 = __objc_msgSend_351Ptr.asFunction<
+      int Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          bool,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_stringByAddingPercentEncodingWithAllowedCharacters_1 =
+      _registerName1("stringByAddingPercentEncodingWithAllowedCharacters:");
+  late final _sel_stringByRemovingPercentEncoding1 =
+      _registerName1("stringByRemovingPercentEncoding");
+  late final _sel_stringByAddingPercentEscapesUsingEncoding_1 =
+      _registerName1("stringByAddingPercentEscapesUsingEncoding:");
+  late final _sel_stringByReplacingPercentEscapesUsingEncoding_1 =
+      _registerName1("stringByReplacingPercentEscapesUsingEncoding:");
+  late final _class_NSOrthography1 = _getClass1("NSOrthography");
+  late final _sel_dominantScript1 = _registerName1("dominantScript");
+  late final _sel_languageMap1 = _registerName1("languageMap");
+  late final _sel_initWithDominantScript_languageMap_1 =
+      _registerName1("initWithDominantScript:languageMap:");
+  instancetype _objc_msgSend_352(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> script,
+    ffi.Pointer<ObjCObject> map,
+  ) {
+    return __objc_msgSend_352(
+      obj,
+      sel,
+      script,
+      map,
+    );
+  }
+
+  late final __objc_msgSend_352Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_352 = __objc_msgSend_352Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_languagesForScript_1 = _registerName1("languagesForScript:");
+  late final _sel_dominantLanguageForScript_1 =
+      _registerName1("dominantLanguageForScript:");
+  late final _sel_dominantLanguage1 = _registerName1("dominantLanguage");
+  late final _sel_allScripts1 = _registerName1("allScripts");
+  late final _sel_allLanguages1 = _registerName1("allLanguages");
+  late final _sel_defaultOrthographyForLanguage_1 =
+      _registerName1("defaultOrthographyForLanguage:");
+  late final _sel_orthographyWithDominantScript_languageMap_1 =
+      _registerName1("orthographyWithDominantScript:languageMap:");
+  late final _sel_linguisticTagsInRange_scheme_options_orthography_tokenRanges_1 =
+      _registerName1(
+          "linguisticTagsInRange:scheme:options:orthography:tokenRanges:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_353(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    NSLinguisticTagScheme scheme,
+    int options,
+    ffi.Pointer<ObjCObject> orthography,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> tokenRanges,
+  ) {
+    return __objc_msgSend_353(
+      obj,
+      sel,
+      range,
+      scheme,
+      options,
+      orthography,
+      tokenRanges,
+    );
+  }
+
+  late final __objc_msgSend_353Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSRange,
+              NSLinguisticTagScheme,
+              ffi.Int32,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_353 = __objc_msgSend_353Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          NSRange,
+          NSLinguisticTagScheme,
+          int,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_enumerateLinguisticTagsInRange_scheme_options_orthography_usingBlock_1 =
+      _registerName1(
+          "enumerateLinguisticTagsInRange:scheme:options:orthography:usingBlock:");
+  void _objc_msgSend_354(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    NSLinguisticTagScheme scheme,
+    int options,
+    ffi.Pointer<ObjCObject> orthography,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_354(
+      obj,
+      sel,
+      range,
+      scheme,
+      options,
+      orthography,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_354Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSRange,
+              NSLinguisticTagScheme,
+              ffi.Int32,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_354 = __objc_msgSend_354Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          NSRange,
+          NSLinguisticTagScheme,
+          int,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_allObjects1 = _registerName1("allObjects");
+  late final _sel_anyObject1 = _registerName1("anyObject");
+  late final _sel_intersectsSet_1 = _registerName1("intersectsSet:");
+  bool _objc_msgSend_355(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> otherSet,
+  ) {
+    return __objc_msgSend_355(
+      obj,
+      sel,
+      otherSet,
+    );
+  }
+
+  late final __objc_msgSend_355Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_355 = __objc_msgSend_355Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_isEqualToSet_1 = _registerName1("isEqualToSet:");
+  late final _sel_isSubsetOfSet_1 = _registerName1("isSubsetOfSet:");
+  late final _sel_setByAddingObject_1 = _registerName1("setByAddingObject:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_356(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> anObject,
+  ) {
+    return __objc_msgSend_356(
+      obj,
+      sel,
+      anObject,
+    );
+  }
+
+  late final __objc_msgSend_356Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_356 = __objc_msgSend_356Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_setByAddingObjectsFromSet_1 =
+      _registerName1("setByAddingObjectsFromSet:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_357(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> other,
+  ) {
+    return __objc_msgSend_357(
+      obj,
+      sel,
+      other,
+    );
+  }
+
+  late final __objc_msgSend_357Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_357 = __objc_msgSend_357Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_setByAddingObjectsFromArray_1 =
+      _registerName1("setByAddingObjectsFromArray:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_358(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> other,
+  ) {
+    return __objc_msgSend_358(
+      obj,
+      sel,
+      other,
+    );
+  }
+
+  late final __objc_msgSend_358Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_358 = __objc_msgSend_358Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  void _objc_msgSend_359(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_359(
+      obj,
+      sel,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_359Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_359 = __objc_msgSend_359Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  void _objc_msgSend_360(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int opts,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_360(
+      obj,
+      sel,
+      opts,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_360Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_360 = __objc_msgSend_360Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_objectsPassingTest_1 = _registerName1("objectsPassingTest:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_361(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> predicate,
+  ) {
+    return __objc_msgSend_361(
+      obj,
+      sel,
+      predicate,
+    );
+  }
+
+  late final __objc_msgSend_361Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_361 = __objc_msgSend_361Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_objectsWithOptions_passingTest_1 =
+      _registerName1("objectsWithOptions:passingTest:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_362(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int opts,
+    ffi.Pointer<_ObjCBlock> predicate,
+  ) {
+    return __objc_msgSend_362(
+      obj,
+      sel,
+      opts,
+      predicate,
+    );
+  }
+
+  late final __objc_msgSend_362Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_362 = __objc_msgSend_362Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_set1 = _registerName1("set");
+  late final _sel_setWithObject_1 = _registerName1("setWithObject:");
+  late final _sel_setWithObjects_count_1 =
+      _registerName1("setWithObjects:count:");
+  late final _sel_setWithObjects_1 = _registerName1("setWithObjects:");
+  late final _sel_setWithSet_1 = _registerName1("setWithSet:");
+  instancetype _objc_msgSend_363(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> set1,
+  ) {
+    return __objc_msgSend_363(
+      obj,
+      sel,
+      set1,
+    );
+  }
+
+  late final __objc_msgSend_363Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_363 = __objc_msgSend_363Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_setWithArray_1 = _registerName1("setWithArray:");
+  late final _sel_initWithSet_1 = _registerName1("initWithSet:");
+  late final _sel_initWithSet_copyItems_1 =
+      _registerName1("initWithSet:copyItems:");
+  instancetype _objc_msgSend_364(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> set1,
+    bool flag,
+  ) {
+    return __objc_msgSend_364(
+      obj,
+      sel,
+      set1,
+      flag,
+    );
+  }
+
+  late final __objc_msgSend_364Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_364 = __objc_msgSend_364Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, bool)>();
+
+  late final _sel_filteredSetUsingPredicate_1 =
+      _registerName1("filteredSetUsingPredicate:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_365(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> predicate,
+  ) {
+    return __objc_msgSend_365(
+      obj,
+      sel,
+      predicate,
+    );
+  }
+
+  late final __objc_msgSend_365Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_365 = __objc_msgSend_365Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_invocationWithMethodSignature_1 =
+      _registerName1("invocationWithMethodSignature:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_366(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> sig,
+  ) {
+    return __objc_msgSend_366(
+      obj,
+      sel,
+      sig,
+    );
+  }
+
+  late final __objc_msgSend_366Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_366 = __objc_msgSend_366Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_methodSignature1 = _registerName1("methodSignature");
+  ffi.Pointer<ObjCObject> _objc_msgSend_367(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_367(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_367Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_367 = __objc_msgSend_367Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_retainArguments1 = _registerName1("retainArguments");
+  late final _sel_argumentsRetained1 = _registerName1("argumentsRetained");
+  late final _sel_target1 = _registerName1("target");
+  late final _sel_setTarget_1 = _registerName1("setTarget:");
+  void _objc_msgSend_368(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_368(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_368Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_368 = __objc_msgSend_368Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_selector1 = _registerName1("selector");
+  ffi.Pointer<ObjCSel> _objc_msgSend_369(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_369(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_369Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCSel> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_369 = __objc_msgSend_369Ptr.asFunction<
+      ffi.Pointer<ObjCSel> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setSelector_1 = _registerName1("setSelector:");
+  void _objc_msgSend_370(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCSel> value,
+  ) {
+    return __objc_msgSend_370(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_370Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_370 = __objc_msgSend_370Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_getReturnValue_1 = _registerName1("getReturnValue:");
+  late final _sel_setReturnValue_1 = _registerName1("setReturnValue:");
+  late final _sel_getArgument_atIndex_1 =
+      _registerName1("getArgument:atIndex:");
+  void _objc_msgSend_371(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Void> argumentLocation,
+    int idx,
+  ) {
+    return __objc_msgSend_371(
+      obj,
+      sel,
+      argumentLocation,
+      idx,
+    );
+  }
+
+  late final __objc_msgSend_371Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Void>, NSInteger)>>('objc_msgSend');
+  late final __objc_msgSend_371 = __objc_msgSend_371Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Void>, int)>();
+
+  late final _sel_setArgument_atIndex_1 =
+      _registerName1("setArgument:atIndex:");
+  late final _sel_invoke1 = _registerName1("invoke");
+  late final _sel_invokeWithTarget_1 = _registerName1("invokeWithTarget:");
+  late final _sel_forwardInvocation_1 = _registerName1("forwardInvocation:");
+  void _objc_msgSend_372(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> anInvocation,
+  ) {
+    return __objc_msgSend_372(
+      obj,
+      sel,
+      anInvocation,
+    );
+  }
+
+  late final __objc_msgSend_372Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_372 = __objc_msgSend_372Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_methodSignatureForSelector_1 =
+      _registerName1("methodSignatureForSelector:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_373(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCSel> aSelector,
+  ) {
+    return __objc_msgSend_373(
+      obj,
+      sel,
+      aSelector,
+    );
+  }
+
+  late final __objc_msgSend_373Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_373 = __objc_msgSend_373Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_instanceMethodSignatureForSelector_1 =
+      _registerName1("instanceMethodSignatureForSelector:");
+  late final _sel_allowsWeakReference1 = _registerName1("allowsWeakReference");
+  late final _sel_retainWeakReference1 = _registerName1("retainWeakReference");
+  late final _sel_isSubclassOfClass_1 = _registerName1("isSubclassOfClass:");
+  late final _sel_resolveClassMethod_1 = _registerName1("resolveClassMethod:");
+  late final _sel_resolveInstanceMethod_1 =
+      _registerName1("resolveInstanceMethod:");
+  late final _sel_superclass1 = _registerName1("superclass");
+  late final _sel_class1 = _registerName1("class");
+  late final _sel_debugDescription1 = _registerName1("debugDescription");
+  late final _sel_version1 = _registerName1("version");
+  late final _sel_setVersion_1 = _registerName1("setVersion:");
+  void _objc_msgSend_374(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int aVersion,
+  ) {
+    return __objc_msgSend_374(
+      obj,
+      sel,
+      aVersion,
+    );
+  }
+
+  late final __objc_msgSend_374Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSInteger)>>('objc_msgSend');
+  late final __objc_msgSend_374 = __objc_msgSend_374Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_classForCoder1 = _registerName1("classForCoder");
+  late final _sel_replacementObjectForCoder_1 =
+      _registerName1("replacementObjectForCoder:");
+  late final _sel_awakeAfterUsingCoder_1 =
+      _registerName1("awakeAfterUsingCoder:");
+  late final _sel_poseAsClass_1 = _registerName1("poseAsClass:");
+  late final _sel_autoContentAccessingProxy1 =
+      _registerName1("autoContentAccessingProxy");
+  late final _sel_attemptRecoveryFromError_optionIndex_delegate_didRecoverSelector_contextInfo_1 =
+      _registerName1(
+          "attemptRecoveryFromError:optionIndex:delegate:didRecoverSelector:contextInfo:");
+  void _objc_msgSend_375(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> error,
+    int recoveryOptionIndex,
+    ffi.Pointer<ObjCObject> delegate,
+    ffi.Pointer<ObjCSel> didRecoverSelector,
+    ffi.Pointer<ffi.Void> contextInfo,
+  ) {
+    return __objc_msgSend_375(
+      obj,
+      sel,
+      error,
+      recoveryOptionIndex,
+      delegate,
+      didRecoverSelector,
+      contextInfo,
+    );
+  }
+
+  late final __objc_msgSend_375Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSUInteger,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Void>)>>('objc_msgSend');
+  late final __objc_msgSend_375 = __objc_msgSend_375Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Void>)>();
+
+  late final _sel_attemptRecoveryFromError_optionIndex_1 =
+      _registerName1("attemptRecoveryFromError:optionIndex:");
+  bool _objc_msgSend_376(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> error,
+    int recoveryOptionIndex,
+  ) {
+    return __objc_msgSend_376(
+      obj,
+      sel,
+      error,
+      recoveryOptionIndex,
+    );
+  }
+
+  late final __objc_msgSend_376Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_376 = __objc_msgSend_376Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_performSelector_withObject_afterDelay_inModes_1 =
+      _registerName1("performSelector:withObject:afterDelay:inModes:");
+  void _objc_msgSend_377(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCSel> aSelector,
+    ffi.Pointer<ObjCObject> anArgument,
+    double delay,
+    ffi.Pointer<ObjCObject> modes,
+  ) {
+    return __objc_msgSend_377(
+      obj,
+      sel,
+      aSelector,
+      anArgument,
+      delay,
+      modes,
+    );
+  }
+
+  late final __objc_msgSend_377Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSTimeInterval,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_377 = __objc_msgSend_377Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          double,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_performSelector_withObject_afterDelay_1 =
+      _registerName1("performSelector:withObject:afterDelay:");
+  void _objc_msgSend_378(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCSel> aSelector,
+    ffi.Pointer<ObjCObject> anArgument,
+    double delay,
+  ) {
+    return __objc_msgSend_378(
+      obj,
+      sel,
+      aSelector,
+      anArgument,
+      delay,
+    );
+  }
+
+  late final __objc_msgSend_378Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSTimeInterval)>>('objc_msgSend');
+  late final __objc_msgSend_378 = __objc_msgSend_378Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>, double)>();
+
+  late final _sel_URL_resourceDataDidBecomeAvailable_1 =
+      _registerName1("URL:resourceDataDidBecomeAvailable:");
+  void _objc_msgSend_379(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> sender,
+    ffi.Pointer<ObjCObject> newBytes,
+  ) {
+    return __objc_msgSend_379(
+      obj,
+      sel,
+      sender,
+      newBytes,
+    );
+  }
+
+  late final __objc_msgSend_379Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_379 = __objc_msgSend_379Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_URLResourceDidFinishLoading_1 =
+      _registerName1("URLResourceDidFinishLoading:");
+  void _objc_msgSend_380(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> sender,
+  ) {
+    return __objc_msgSend_380(
+      obj,
+      sel,
+      sender,
+    );
+  }
+
+  late final __objc_msgSend_380Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_380 = __objc_msgSend_380Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_URLResourceDidCancelLoading_1 =
+      _registerName1("URLResourceDidCancelLoading:");
+  late final _sel_URL_resourceDidFailLoadingWithReason_1 =
+      _registerName1("URL:resourceDidFailLoadingWithReason:");
+  void _objc_msgSend_381(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> sender,
+    ffi.Pointer<ObjCObject> reason,
+  ) {
+    return __objc_msgSend_381(
+      obj,
+      sel,
+      sender,
+      reason,
+    );
+  }
+
+  late final __objc_msgSend_381Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_381 = __objc_msgSend_381Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSFileManager1 = _getClass1("NSFileManager");
+  late final _sel_defaultManager1 = _registerName1("defaultManager");
+  ffi.Pointer<ObjCObject> _objc_msgSend_382(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_382(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_382Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_382 = __objc_msgSend_382Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_mountedVolumeURLsIncludingResourceValuesForKeys_options_1 =
+      _registerName1(
+          "mountedVolumeURLsIncludingResourceValuesForKeys:options:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_383(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> propertyKeys,
+    int options,
+  ) {
+    return __objc_msgSend_383(
+      obj,
+      sel,
+      propertyKeys,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_383Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_383 = __objc_msgSend_383Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_unmountVolumeAtURL_options_completionHandler_1 =
+      _registerName1("unmountVolumeAtURL:options:completionHandler:");
+  void _objc_msgSend_384(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    int mask,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_384(
+      obj,
+      sel,
+      url,
+      mask,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_384Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_384 = __objc_msgSend_384Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_contentsOfDirectoryAtURL_includingPropertiesForKeys_options_error_1 =
+      _registerName1(
+          "contentsOfDirectoryAtURL:includingPropertiesForKeys:options:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_385(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    ffi.Pointer<ObjCObject> keys,
+    int mask,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_385(
+      obj,
+      sel,
+      url,
+      keys,
+      mask,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_385Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_385 = __objc_msgSend_385Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_URLsForDirectory_inDomains_1 =
+      _registerName1("URLsForDirectory:inDomains:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_386(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int directory,
+    int domainMask,
+  ) {
+    return __objc_msgSend_386(
+      obj,
+      sel,
+      directory,
+      domainMask,
+    );
+  }
+
+  late final __objc_msgSend_386Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Int32, ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_386 = __objc_msgSend_386Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int, int)>();
+
+  late final _sel_URLForDirectory_inDomain_appropriateForURL_create_error_1 =
+      _registerName1(
+          "URLForDirectory:inDomain:appropriateForURL:create:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_387(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int directory,
+    int domain,
+    ffi.Pointer<ObjCObject> url,
+    bool shouldCreate,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_387(
+      obj,
+      sel,
+      directory,
+      domain,
+      url,
+      shouldCreate,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_387Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Int32,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_387 = __objc_msgSend_387Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          int,
+          int,
+          ffi.Pointer<ObjCObject>,
+          bool,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_getRelationship_ofDirectoryAtURL_toItemAtURL_error_1 =
+      _registerName1("getRelationship:ofDirectoryAtURL:toItemAtURL:error:");
+  bool _objc_msgSend_388(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Int32> outRelationship,
+    ffi.Pointer<ObjCObject> directoryURL,
+    ffi.Pointer<ObjCObject> otherURL,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_388(
+      obj,
+      sel,
+      outRelationship,
+      directoryURL,
+      otherURL,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_388Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Int32>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_388 = __objc_msgSend_388Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Int32>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_getRelationship_ofDirectory_inDomain_toItemAtURL_error_1 =
+      _registerName1("getRelationship:ofDirectory:inDomain:toItemAtURL:error:");
+  bool _objc_msgSend_389(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Int32> outRelationship,
+    int directory,
+    int domainMask,
+    ffi.Pointer<ObjCObject> url,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_389(
+      obj,
+      sel,
+      outRelationship,
+      directory,
+      domainMask,
+      url,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_389Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Int32>,
+              ffi.Int32,
+              ffi.Int32,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_389 = __objc_msgSend_389Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Int32>,
+          int,
+          int,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_createDirectoryAtURL_withIntermediateDirectories_attributes_error_1 =
+      _registerName1(
+          "createDirectoryAtURL:withIntermediateDirectories:attributes:error:");
+  bool _objc_msgSend_390(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    bool createIntermediates,
+    ffi.Pointer<ObjCObject> attributes,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_390(
+      obj,
+      sel,
+      url,
+      createIntermediates,
+      attributes,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_390Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_390 = __objc_msgSend_390Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          bool,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_createSymbolicLinkAtURL_withDestinationURL_error_1 =
+      _registerName1("createSymbolicLinkAtURL:withDestinationURL:error:");
+  bool _objc_msgSend_391(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    ffi.Pointer<ObjCObject> destURL,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_391(
+      obj,
+      sel,
+      url,
+      destURL,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_391Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_391 = __objc_msgSend_391Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_delegate1 = _registerName1("delegate");
+  late final _sel_setDelegate_1 = _registerName1("setDelegate:");
+  late final _sel_setAttributes_ofItemAtPath_error_1 =
+      _registerName1("setAttributes:ofItemAtPath:error:");
+  bool _objc_msgSend_392(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> attributes,
+    ffi.Pointer<ObjCObject> path,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_392(
+      obj,
+      sel,
+      attributes,
+      path,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_392Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_392 = __objc_msgSend_392Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_createDirectoryAtPath_withIntermediateDirectories_attributes_error_1 =
+      _registerName1(
+          "createDirectoryAtPath:withIntermediateDirectories:attributes:error:");
+  bool _objc_msgSend_393(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    bool createIntermediates,
+    ffi.Pointer<ObjCObject> attributes,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_393(
+      obj,
+      sel,
+      path,
+      createIntermediates,
+      attributes,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_393Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_393 = __objc_msgSend_393Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          bool,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_contentsOfDirectoryAtPath_error_1 =
+      _registerName1("contentsOfDirectoryAtPath:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_394(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_394(
+      obj,
+      sel,
+      path,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_394Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_394 = __objc_msgSend_394Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_subpathsOfDirectoryAtPath_error_1 =
+      _registerName1("subpathsOfDirectoryAtPath:error:");
+  late final _sel_attributesOfItemAtPath_error_1 =
+      _registerName1("attributesOfItemAtPath:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_395(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_395(
+      obj,
+      sel,
+      path,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_395Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_395 = __objc_msgSend_395Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_attributesOfFileSystemForPath_error_1 =
+      _registerName1("attributesOfFileSystemForPath:error:");
+  late final _sel_createSymbolicLinkAtPath_withDestinationPath_error_1 =
+      _registerName1("createSymbolicLinkAtPath:withDestinationPath:error:");
+  bool _objc_msgSend_396(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    ffi.Pointer<ObjCObject> destPath,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_396(
+      obj,
+      sel,
+      path,
+      destPath,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_396Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_396 = __objc_msgSend_396Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_destinationOfSymbolicLinkAtPath_error_1 =
+      _registerName1("destinationOfSymbolicLinkAtPath:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_397(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_397(
+      obj,
+      sel,
+      path,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_397Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_397 = __objc_msgSend_397Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_copyItemAtPath_toPath_error_1 =
+      _registerName1("copyItemAtPath:toPath:error:");
+  late final _sel_moveItemAtPath_toPath_error_1 =
+      _registerName1("moveItemAtPath:toPath:error:");
+  late final _sel_linkItemAtPath_toPath_error_1 =
+      _registerName1("linkItemAtPath:toPath:error:");
+  late final _sel_removeItemAtPath_error_1 =
+      _registerName1("removeItemAtPath:error:");
+  bool _objc_msgSend_398(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_398(
+      obj,
+      sel,
+      path,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_398Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_398 = __objc_msgSend_398Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_copyItemAtURL_toURL_error_1 =
+      _registerName1("copyItemAtURL:toURL:error:");
+  late final _sel_moveItemAtURL_toURL_error_1 =
+      _registerName1("moveItemAtURL:toURL:error:");
+  late final _sel_linkItemAtURL_toURL_error_1 =
+      _registerName1("linkItemAtURL:toURL:error:");
+  late final _sel_removeItemAtURL_error_1 =
+      _registerName1("removeItemAtURL:error:");
+  late final _sel_trashItemAtURL_resultingItemURL_error_1 =
+      _registerName1("trashItemAtURL:resultingItemURL:error:");
+  bool _objc_msgSend_399(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outResultingURL,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_399(
+      obj,
+      sel,
+      url,
+      outResultingURL,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_399Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_399 = __objc_msgSend_399Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_fileAttributesAtPath_traverseLink_1 =
+      _registerName1("fileAttributesAtPath:traverseLink:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_400(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    bool yorn,
+  ) {
+    return __objc_msgSend_400(
+      obj,
+      sel,
+      path,
+      yorn,
+    );
+  }
+
+  late final __objc_msgSend_400Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_400 = __objc_msgSend_400Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>, bool)>();
+
+  late final _sel_changeFileAttributes_atPath_1 =
+      _registerName1("changeFileAttributes:atPath:");
+  bool _objc_msgSend_401(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> attributes,
+    ffi.Pointer<ObjCObject> path,
+  ) {
+    return __objc_msgSend_401(
+      obj,
+      sel,
+      attributes,
+      path,
+    );
+  }
+
+  late final __objc_msgSend_401Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_401 = __objc_msgSend_401Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_directoryContentsAtPath_1 =
+      _registerName1("directoryContentsAtPath:");
+  late final _sel_fileSystemAttributesAtPath_1 =
+      _registerName1("fileSystemAttributesAtPath:");
+  late final _sel_pathContentOfSymbolicLinkAtPath_1 =
+      _registerName1("pathContentOfSymbolicLinkAtPath:");
+  late final _sel_createSymbolicLinkAtPath_pathContent_1 =
+      _registerName1("createSymbolicLinkAtPath:pathContent:");
+  bool _objc_msgSend_402(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    ffi.Pointer<ObjCObject> otherpath,
+  ) {
+    return __objc_msgSend_402(
+      obj,
+      sel,
+      path,
+      otherpath,
+    );
+  }
+
+  late final __objc_msgSend_402Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_402 = __objc_msgSend_402Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_createDirectoryAtPath_attributes_1 =
+      _registerName1("createDirectoryAtPath:attributes:");
+  bool _objc_msgSend_403(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    ffi.Pointer<ObjCObject> attributes,
+  ) {
+    return __objc_msgSend_403(
+      obj,
+      sel,
+      path,
+      attributes,
+    );
+  }
+
+  late final __objc_msgSend_403Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_403 = __objc_msgSend_403Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_linkPath_toPath_handler_1 =
+      _registerName1("linkPath:toPath:handler:");
+  bool _objc_msgSend_404(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> src,
+    ffi.Pointer<ObjCObject> dest,
+    ffi.Pointer<ObjCObject> handler,
+  ) {
+    return __objc_msgSend_404(
+      obj,
+      sel,
+      src,
+      dest,
+      handler,
+    );
+  }
+
+  late final __objc_msgSend_404Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_404 = __objc_msgSend_404Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_copyPath_toPath_handler_1 =
+      _registerName1("copyPath:toPath:handler:");
+  late final _sel_movePath_toPath_handler_1 =
+      _registerName1("movePath:toPath:handler:");
+  late final _sel_removeFileAtPath_handler_1 =
+      _registerName1("removeFileAtPath:handler:");
+  bool _objc_msgSend_405(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    ffi.Pointer<ObjCObject> handler,
+  ) {
+    return __objc_msgSend_405(
+      obj,
+      sel,
+      path,
+      handler,
+    );
+  }
+
+  late final __objc_msgSend_405Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_405 = __objc_msgSend_405Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_currentDirectoryPath1 =
+      _registerName1("currentDirectoryPath");
+  late final _sel_changeCurrentDirectoryPath_1 =
+      _registerName1("changeCurrentDirectoryPath:");
+  late final _sel_fileExistsAtPath_1 = _registerName1("fileExistsAtPath:");
+  late final _sel_fileExistsAtPath_isDirectory_1 =
+      _registerName1("fileExistsAtPath:isDirectory:");
+  bool _objc_msgSend_406(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    ffi.Pointer<ffi.Bool> isDirectory,
+  ) {
+    return __objc_msgSend_406(
+      obj,
+      sel,
+      path,
+      isDirectory,
+    );
+  }
+
+  late final __objc_msgSend_406Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Bool>)>>('objc_msgSend');
+  late final __objc_msgSend_406 = __objc_msgSend_406Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Bool>)>();
+
+  late final _sel_isReadableFileAtPath_1 =
+      _registerName1("isReadableFileAtPath:");
+  late final _sel_isWritableFileAtPath_1 =
+      _registerName1("isWritableFileAtPath:");
+  late final _sel_isExecutableFileAtPath_1 =
+      _registerName1("isExecutableFileAtPath:");
+  late final _sel_isDeletableFileAtPath_1 =
+      _registerName1("isDeletableFileAtPath:");
+  late final _sel_contentsEqualAtPath_andPath_1 =
+      _registerName1("contentsEqualAtPath:andPath:");
+  late final _sel_displayNameAtPath_1 = _registerName1("displayNameAtPath:");
+  late final _sel_componentsToDisplayForPath_1 =
+      _registerName1("componentsToDisplayForPath:");
+  late final _sel_homeDirectoryForCurrentUser1 =
+      _registerName1("homeDirectoryForCurrentUser");
+  late final _sel_temporaryDirectory1 = _registerName1("temporaryDirectory");
+  late final _sel_homeDirectoryForUser_1 =
+      _registerName1("homeDirectoryForUser:");
+  late final _sel_fileManager_shouldProceedAfterError_1 =
+      _registerName1("fileManager:shouldProceedAfterError:");
+  bool _objc_msgSend_407(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> fm,
+    ffi.Pointer<ObjCObject> errorInfo,
+  ) {
+    return __objc_msgSend_407(
+      obj,
+      sel,
+      fm,
+      errorInfo,
+    );
+  }
+
+  late final __objc_msgSend_407Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_407 = __objc_msgSend_407Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_fileManager_willProcessPath_1 =
+      _registerName1("fileManager:willProcessPath:");
+  void _objc_msgSend_408(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> fm,
+    ffi.Pointer<ObjCObject> path,
+  ) {
+    return __objc_msgSend_408(
+      obj,
+      sel,
+      fm,
+      path,
+    );
+  }
+
+  late final __objc_msgSend_408Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_408 = __objc_msgSend_408Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_validateValue_forKey_error_1 =
+      _registerName1("validateValue:forKey:error:");
+  late final _class_NSMutableArray1 = _getClass1("NSMutableArray");
+  late final _sel_addObject_1 = _registerName1("addObject:");
+  late final _sel_insertObject_atIndex_1 =
+      _registerName1("insertObject:atIndex:");
+  void _objc_msgSend_409(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> anObject,
+    int index,
+  ) {
+    return __objc_msgSend_409(
+      obj,
+      sel,
+      anObject,
+      index,
+    );
+  }
+
+  late final __objc_msgSend_409Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_409 = __objc_msgSend_409Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_removeLastObject1 = _registerName1("removeLastObject");
+  late final _sel_removeObjectAtIndex_1 =
+      _registerName1("removeObjectAtIndex:");
+  void _objc_msgSend_410(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int index,
+  ) {
+    return __objc_msgSend_410(
+      obj,
+      sel,
+      index,
+    );
+  }
+
+  late final __objc_msgSend_410Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_410 = __objc_msgSend_410Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_replaceObjectAtIndex_withObject_1 =
+      _registerName1("replaceObjectAtIndex:withObject:");
+  void _objc_msgSend_411(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int index,
+    ffi.Pointer<ObjCObject> anObject,
+  ) {
+    return __objc_msgSend_411(
+      obj,
+      sel,
+      index,
+      anObject,
+    );
+  }
+
+  late final __objc_msgSend_411Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSUInteger, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_411 = __objc_msgSend_411Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithCapacity_1 = _registerName1("initWithCapacity:");
+  late final _sel_addObjectsFromArray_1 =
+      _registerName1("addObjectsFromArray:");
+  void _objc_msgSend_412(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> otherArray,
+  ) {
+    return __objc_msgSend_412(
+      obj,
+      sel,
+      otherArray,
+    );
+  }
+
+  late final __objc_msgSend_412Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_412 = __objc_msgSend_412Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_exchangeObjectAtIndex_withObjectAtIndex_1 =
+      _registerName1("exchangeObjectAtIndex:withObjectAtIndex:");
+  void _objc_msgSend_413(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int idx1,
+    int idx2,
+  ) {
+    return __objc_msgSend_413(
+      obj,
+      sel,
+      idx1,
+      idx2,
+    );
+  }
+
+  late final __objc_msgSend_413Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSUInteger, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_413 = __objc_msgSend_413Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int, int)>();
+
+  late final _sel_removeAllObjects1 = _registerName1("removeAllObjects");
+  late final _sel_removeObject_inRange_1 =
+      _registerName1("removeObject:inRange:");
+  void _objc_msgSend_414(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> anObject,
+    NSRange range,
+  ) {
+    return __objc_msgSend_414(
+      obj,
+      sel,
+      anObject,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_414Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_414 = __objc_msgSend_414Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, NSRange)>();
+
+  late final _sel_removeObject_1 = _registerName1("removeObject:");
+  late final _sel_removeObjectIdenticalTo_inRange_1 =
+      _registerName1("removeObjectIdenticalTo:inRange:");
+  late final _sel_removeObjectIdenticalTo_1 =
+      _registerName1("removeObjectIdenticalTo:");
+  late final _sel_removeObjectsFromIndices_numIndices_1 =
+      _registerName1("removeObjectsFromIndices:numIndices:");
+  void _objc_msgSend_415(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<NSUInteger> indices,
+    int cnt,
+  ) {
+    return __objc_msgSend_415(
+      obj,
+      sel,
+      indices,
+      cnt,
+    );
+  }
+
+  late final __objc_msgSend_415Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<NSUInteger>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_415 = __objc_msgSend_415Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<NSUInteger>, int)>();
+
+  late final _sel_removeObjectsInArray_1 =
+      _registerName1("removeObjectsInArray:");
+  late final _sel_removeObjectsInRange_1 =
+      _registerName1("removeObjectsInRange:");
+  void _objc_msgSend_416(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+  ) {
+    return __objc_msgSend_416(
+      obj,
+      sel,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_416Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_416 = __objc_msgSend_416Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange)>();
+
+  late final _sel_replaceObjectsInRange_withObjectsFromArray_range_1 =
+      _registerName1("replaceObjectsInRange:withObjectsFromArray:range:");
+  void _objc_msgSend_417(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    ffi.Pointer<ObjCObject> otherArray,
+    NSRange otherRange,
+  ) {
+    return __objc_msgSend_417(
+      obj,
+      sel,
+      range,
+      otherArray,
+      otherRange,
+    );
+  }
+
+  late final __objc_msgSend_417Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRange, ffi.Pointer<ObjCObject>, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_417 = __objc_msgSend_417Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange,
+          ffi.Pointer<ObjCObject>, NSRange)>();
+
+  late final _sel_replaceObjectsInRange_withObjectsFromArray_1 =
+      _registerName1("replaceObjectsInRange:withObjectsFromArray:");
+  void _objc_msgSend_418(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    ffi.Pointer<ObjCObject> otherArray,
+  ) {
+    return __objc_msgSend_418(
+      obj,
+      sel,
+      range,
+      otherArray,
+    );
+  }
+
+  late final __objc_msgSend_418Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRange, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_418 = __objc_msgSend_418Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_setArray_1 = _registerName1("setArray:");
+  late final _sel_sortUsingFunction_context_1 =
+      _registerName1("sortUsingFunction:context:");
+  void _objc_msgSend_419(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<
+            ffi.NativeFunction<
+                NSInteger Function(ffi.Pointer<ObjCObject>,
+                    ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Void>)>>
+        compare,
+    ffi.Pointer<ffi.Void> context,
+  ) {
+    return __objc_msgSend_419(
+      obj,
+      sel,
+      compare,
+      context,
+    );
+  }
+
+  late final __objc_msgSend_419Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<
+                  ffi.NativeFunction<
+                      NSInteger Function(ffi.Pointer<ObjCObject>,
+                          ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Void>)>>,
+              ffi.Pointer<ffi.Void>)>>('objc_msgSend');
+  late final __objc_msgSend_419 = __objc_msgSend_419Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<
+              ffi.NativeFunction<
+                  NSInteger Function(ffi.Pointer<ObjCObject>,
+                      ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Void>)>>,
+          ffi.Pointer<ffi.Void>)>();
+
+  late final _sel_sortUsingSelector_1 = _registerName1("sortUsingSelector:");
+  late final _sel_insertObjects_atIndexes_1 =
+      _registerName1("insertObjects:atIndexes:");
+  void _objc_msgSend_420(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> objects,
+    ffi.Pointer<ObjCObject> indexes,
+  ) {
+    return __objc_msgSend_420(
+      obj,
+      sel,
+      objects,
+      indexes,
+    );
+  }
+
+  late final __objc_msgSend_420Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_420 = __objc_msgSend_420Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_removeObjectsAtIndexes_1 =
+      _registerName1("removeObjectsAtIndexes:");
+  void _objc_msgSend_421(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> indexes,
+  ) {
+    return __objc_msgSend_421(
+      obj,
+      sel,
+      indexes,
+    );
+  }
+
+  late final __objc_msgSend_421Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_421 = __objc_msgSend_421Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_replaceObjectsAtIndexes_withObjects_1 =
+      _registerName1("replaceObjectsAtIndexes:withObjects:");
+  void _objc_msgSend_422(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> indexes,
+    ffi.Pointer<ObjCObject> objects,
+  ) {
+    return __objc_msgSend_422(
+      obj,
+      sel,
+      indexes,
+      objects,
+    );
+  }
+
+  late final __objc_msgSend_422Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_422 = __objc_msgSend_422Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_setObject_atIndexedSubscript_1 =
+      _registerName1("setObject:atIndexedSubscript:");
+  late final _sel_sortUsingComparator_1 =
+      _registerName1("sortUsingComparator:");
+  void _objc_msgSend_423(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSComparator cmptr,
+  ) {
+    return __objc_msgSend_423(
+      obj,
+      sel,
+      cmptr,
+    );
+  }
+
+  late final __objc_msgSend_423Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSComparator)>>('objc_msgSend');
+  late final __objc_msgSend_423 = __objc_msgSend_423Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSComparator)>();
+
+  late final _sel_sortWithOptions_usingComparator_1 =
+      _registerName1("sortWithOptions:usingComparator:");
+  void _objc_msgSend_424(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int opts,
+    NSComparator cmptr,
+  ) {
+    return __objc_msgSend_424(
+      obj,
+      sel,
+      opts,
+      cmptr,
+    );
+  }
+
+  late final __objc_msgSend_424Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32, NSComparator)>>('objc_msgSend');
+  late final __objc_msgSend_424 = __objc_msgSend_424Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int, NSComparator)>();
+
+  late final _sel_arrayWithCapacity_1 = _registerName1("arrayWithCapacity:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_425(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+  ) {
+    return __objc_msgSend_425(
+      obj,
+      sel,
+      path,
+    );
+  }
+
+  late final __objc_msgSend_425Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_425 = __objc_msgSend_425Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  ffi.Pointer<ObjCObject> _objc_msgSend_426(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+  ) {
+    return __objc_msgSend_426(
+      obj,
+      sel,
+      url,
+    );
+  }
+
+  late final __objc_msgSend_426Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_426 = __objc_msgSend_426Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_applyDifference_1 = _registerName1("applyDifference:");
+  late final _sel_sortUsingDescriptors_1 =
+      _registerName1("sortUsingDescriptors:");
+  late final _sel_filterUsingPredicate_1 =
+      _registerName1("filterUsingPredicate:");
+  void _objc_msgSend_427(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> predicate,
+  ) {
+    return __objc_msgSend_427(
+      obj,
+      sel,
+      predicate,
+    );
+  }
+
+  late final __objc_msgSend_427Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_427 = __objc_msgSend_427Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_mutableArrayValueForKey_1 =
+      _registerName1("mutableArrayValueForKey:");
+  late final _class_NSMutableOrderedSet1 = _getClass1("NSMutableOrderedSet");
+  late final _class_NSOrderedSet1 = _getClass1("NSOrderedSet");
+  late final _sel_isEqualToOrderedSet_1 =
+      _registerName1("isEqualToOrderedSet:");
+  bool _objc_msgSend_428(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> other,
+  ) {
+    return __objc_msgSend_428(
+      obj,
+      sel,
+      other,
+    );
+  }
+
+  late final __objc_msgSend_428Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_428 = __objc_msgSend_428Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_intersectsOrderedSet_1 =
+      _registerName1("intersectsOrderedSet:");
+  late final _sel_isSubsetOfOrderedSet_1 =
+      _registerName1("isSubsetOfOrderedSet:");
+  late final _sel_reversedOrderedSet1 = _registerName1("reversedOrderedSet");
+  ffi.Pointer<ObjCObject> _objc_msgSend_429(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_429(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_429Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_429 = __objc_msgSend_429Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_orderedSet1 = _registerName1("orderedSet");
+  late final _sel_orderedSetWithObject_1 =
+      _registerName1("orderedSetWithObject:");
+  late final _sel_orderedSetWithObjects_count_1 =
+      _registerName1("orderedSetWithObjects:count:");
+  late final _sel_orderedSetWithObjects_1 =
+      _registerName1("orderedSetWithObjects:");
+  late final _sel_orderedSetWithOrderedSet_1 =
+      _registerName1("orderedSetWithOrderedSet:");
+  instancetype _objc_msgSend_430(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> set1,
+  ) {
+    return __objc_msgSend_430(
+      obj,
+      sel,
+      set1,
+    );
+  }
+
+  late final __objc_msgSend_430Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_430 = __objc_msgSend_430Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_orderedSetWithOrderedSet_range_copyItems_1 =
+      _registerName1("orderedSetWithOrderedSet:range:copyItems:");
+  instancetype _objc_msgSend_431(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> set1,
+    NSRange range,
+    bool flag,
+  ) {
+    return __objc_msgSend_431(
+      obj,
+      sel,
+      set1,
+      range,
+      flag,
+    );
+  }
+
+  late final __objc_msgSend_431Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, NSRange, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_431 = __objc_msgSend_431Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, NSRange, bool)>();
+
+  late final _sel_orderedSetWithArray_1 =
+      _registerName1("orderedSetWithArray:");
+  late final _sel_orderedSetWithArray_range_copyItems_1 =
+      _registerName1("orderedSetWithArray:range:copyItems:");
+  instancetype _objc_msgSend_432(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> array,
+    NSRange range,
+    bool flag,
+  ) {
+    return __objc_msgSend_432(
+      obj,
+      sel,
+      array,
+      range,
+      flag,
+    );
+  }
+
+  late final __objc_msgSend_432Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, NSRange, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_432 = __objc_msgSend_432Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, NSRange, bool)>();
+
+  late final _sel_orderedSetWithSet_1 = _registerName1("orderedSetWithSet:");
+  late final _sel_orderedSetWithSet_copyItems_1 =
+      _registerName1("orderedSetWithSet:copyItems:");
+  late final _sel_initWithObject_1 = _registerName1("initWithObject:");
+  late final _sel_initWithOrderedSet_1 = _registerName1("initWithOrderedSet:");
+  late final _sel_initWithOrderedSet_copyItems_1 =
+      _registerName1("initWithOrderedSet:copyItems:");
+  instancetype _objc_msgSend_433(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> set1,
+    bool flag,
+  ) {
+    return __objc_msgSend_433(
+      obj,
+      sel,
+      set1,
+      flag,
+    );
+  }
+
+  late final __objc_msgSend_433Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_433 = __objc_msgSend_433Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, bool)>();
+
+  late final _sel_initWithOrderedSet_range_copyItems_1 =
+      _registerName1("initWithOrderedSet:range:copyItems:");
+  late final _sel_initWithArray_range_copyItems_1 =
+      _registerName1("initWithArray:range:copyItems:");
+  late final _sel_filteredOrderedSetUsingPredicate_1 =
+      _registerName1("filteredOrderedSetUsingPredicate:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_434(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> p,
+  ) {
+    return __objc_msgSend_434(
+      obj,
+      sel,
+      p,
+    );
+  }
+
+  late final __objc_msgSend_434Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_434 = __objc_msgSend_434Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_addObjects_count_1 = _registerName1("addObjects:count:");
+  void _objc_msgSend_435(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> objects,
+    int count,
+  ) {
+    return __objc_msgSend_435(
+      obj,
+      sel,
+      objects,
+      count,
+    );
+  }
+
+  late final __objc_msgSend_435Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_435 = __objc_msgSend_435Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>, int)>();
+
+  late final _sel_moveObjectsAtIndexes_toIndex_1 =
+      _registerName1("moveObjectsAtIndexes:toIndex:");
+  void _objc_msgSend_436(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> indexes,
+    int idx,
+  ) {
+    return __objc_msgSend_436(
+      obj,
+      sel,
+      indexes,
+      idx,
+    );
+  }
+
+  late final __objc_msgSend_436Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_436 = __objc_msgSend_436Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_setObject_atIndex_1 = _registerName1("setObject:atIndex:");
+  late final _sel_replaceObjectsInRange_withObjects_count_1 =
+      _registerName1("replaceObjectsInRange:withObjects:count:");
+  void _objc_msgSend_437(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> objects,
+    int count,
+  ) {
+    return __objc_msgSend_437(
+      obj,
+      sel,
+      range,
+      objects,
+      count,
+    );
+  }
+
+  late final __objc_msgSend_437Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSRange,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_437 = __objc_msgSend_437Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>, int)>();
+
+  late final _sel_intersectOrderedSet_1 =
+      _registerName1("intersectOrderedSet:");
+  void _objc_msgSend_438(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> other,
+  ) {
+    return __objc_msgSend_438(
+      obj,
+      sel,
+      other,
+    );
+  }
+
+  late final __objc_msgSend_438Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_438 = __objc_msgSend_438Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_minusOrderedSet_1 = _registerName1("minusOrderedSet:");
+  late final _sel_unionOrderedSet_1 = _registerName1("unionOrderedSet:");
+  late final _sel_intersectSet_1 = _registerName1("intersectSet:");
+  void _objc_msgSend_439(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> other,
+  ) {
+    return __objc_msgSend_439(
+      obj,
+      sel,
+      other,
+    );
+  }
+
+  late final __objc_msgSend_439Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_439 = __objc_msgSend_439Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_minusSet_1 = _registerName1("minusSet:");
+  late final _sel_unionSet_1 = _registerName1("unionSet:");
+  late final _sel_sortRange_options_usingComparator_1 =
+      _registerName1("sortRange:options:usingComparator:");
+  void _objc_msgSend_440(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    int opts,
+    NSComparator cmptr,
+  ) {
+    return __objc_msgSend_440(
+      obj,
+      sel,
+      range,
+      opts,
+      cmptr,
+    );
+  }
+
+  late final __objc_msgSend_440Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRange, ffi.Int32, NSComparator)>>('objc_msgSend');
+  late final __objc_msgSend_440 = __objc_msgSend_440Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange, int,
+          NSComparator)>();
+
+  late final _sel_orderedSetWithCapacity_1 =
+      _registerName1("orderedSetWithCapacity:");
+  late final _sel_mutableOrderedSetValueForKey_1 =
+      _registerName1("mutableOrderedSetValueForKey:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_441(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_441(
+      obj,
+      sel,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_441Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_441 = __objc_msgSend_441Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSMutableSet1 = _getClass1("NSMutableSet");
+  late final _sel_setSet_1 = _registerName1("setSet:");
+  late final _sel_setWithCapacity_1 = _registerName1("setWithCapacity:");
+  late final _sel_mutableSetValueForKey_1 =
+      _registerName1("mutableSetValueForKey:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_442(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_442(
+      obj,
+      sel,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_442Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_442 = __objc_msgSend_442Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_valueForKeyPath_1 = _registerName1("valueForKeyPath:");
+  late final _sel_setValue_forKeyPath_1 =
+      _registerName1("setValue:forKeyPath:");
+  late final _sel_validateValue_forKeyPath_error_1 =
+      _registerName1("validateValue:forKeyPath:error:");
+  late final _sel_mutableArrayValueForKeyPath_1 =
+      _registerName1("mutableArrayValueForKeyPath:");
+  late final _sel_mutableOrderedSetValueForKeyPath_1 =
+      _registerName1("mutableOrderedSetValueForKeyPath:");
+  late final _sel_mutableSetValueForKeyPath_1 =
+      _registerName1("mutableSetValueForKeyPath:");
+  late final _sel_valueForUndefinedKey_1 =
+      _registerName1("valueForUndefinedKey:");
+  late final _sel_setValue_forUndefinedKey_1 =
+      _registerName1("setValue:forUndefinedKey:");
+  late final _sel_setNilValueForKey_1 = _registerName1("setNilValueForKey:");
+  late final _sel_dictionaryWithValuesForKeys_1 =
+      _registerName1("dictionaryWithValuesForKeys:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_443(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> keys,
+  ) {
+    return __objc_msgSend_443(
+      obj,
+      sel,
+      keys,
+    );
+  }
+
+  late final __objc_msgSend_443Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_443 = __objc_msgSend_443Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_setValuesForKeysWithDictionary_1 =
+      _registerName1("setValuesForKeysWithDictionary:");
+  void _objc_msgSend_444(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> keyedValues,
+  ) {
+    return __objc_msgSend_444(
+      obj,
+      sel,
+      keyedValues,
+    );
+  }
+
+  late final __objc_msgSend_444Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_444 = __objc_msgSend_444Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_storedValueForKey_1 = _registerName1("storedValueForKey:");
+  late final _sel_takeStoredValue_forKey_1 =
+      _registerName1("takeStoredValue:forKey:");
+  late final _sel_takeValue_forKey_1 = _registerName1("takeValue:forKey:");
+  late final _sel_takeValue_forKeyPath_1 =
+      _registerName1("takeValue:forKeyPath:");
+  late final _sel_handleQueryWithUnboundKey_1 =
+      _registerName1("handleQueryWithUnboundKey:");
+  late final _sel_handleTakeValue_forUnboundKey_1 =
+      _registerName1("handleTakeValue:forUnboundKey:");
+  late final _sel_unableToSetNilForKey_1 =
+      _registerName1("unableToSetNilForKey:");
+  late final _sel_valuesForKeys_1 = _registerName1("valuesForKeys:");
+  late final _sel_takeValuesFromDictionary_1 =
+      _registerName1("takeValuesFromDictionary:");
+  late final _sel_observeValueForKeyPath_ofObject_change_context_1 =
+      _registerName1("observeValueForKeyPath:ofObject:change:context:");
+  void _objc_msgSend_445(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> keyPath,
+    ffi.Pointer<ObjCObject> object,
+    ffi.Pointer<ObjCObject> change,
+    ffi.Pointer<ffi.Void> context,
+  ) {
+    return __objc_msgSend_445(
+      obj,
+      sel,
+      keyPath,
+      object,
+      change,
+      context,
+    );
+  }
+
+  late final __objc_msgSend_445Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Void>)>>('objc_msgSend');
+  late final __objc_msgSend_445 = __objc_msgSend_445Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Void>)>();
+
+  late final _sel_willChangeValueForKey_1 =
+      _registerName1("willChangeValueForKey:");
+  late final _sel_didChangeValueForKey_1 =
+      _registerName1("didChangeValueForKey:");
+  late final _sel_willChange_valuesAtIndexes_forKey_1 =
+      _registerName1("willChange:valuesAtIndexes:forKey:");
+  void _objc_msgSend_446(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int changeKind,
+    ffi.Pointer<ObjCObject> indexes,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_446(
+      obj,
+      sel,
+      changeKind,
+      indexes,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_446Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_446 = __objc_msgSend_446Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_didChange_valuesAtIndexes_forKey_1 =
+      _registerName1("didChange:valuesAtIndexes:forKey:");
+  late final _sel_willChangeValueForKey_withSetMutation_usingObjects_1 =
+      _registerName1("willChangeValueForKey:withSetMutation:usingObjects:");
+  void _objc_msgSend_447(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+    int mutationKind,
+    ffi.Pointer<ObjCObject> objects,
+  ) {
+    return __objc_msgSend_447(
+      obj,
+      sel,
+      key,
+      mutationKind,
+      objects,
+    );
+  }
+
+  late final __objc_msgSend_447Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_447 = __objc_msgSend_447Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_didChangeValueForKey_withSetMutation_usingObjects_1 =
+      _registerName1("didChangeValueForKey:withSetMutation:usingObjects:");
+  late final _sel_observationInfo1 = _registerName1("observationInfo");
+  late final _sel_setObservationInfo_1 = _registerName1("setObservationInfo:");
+  void _objc_msgSend_448(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Void> value,
+  ) {
+    return __objc_msgSend_448(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_448Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Void>)>>('objc_msgSend');
+  late final __objc_msgSend_448 = __objc_msgSend_448Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Void>)>();
+
+  late final _sel_classForKeyedArchiver1 =
+      _registerName1("classForKeyedArchiver");
+  late final _class_NSKeyedArchiver1 = _getClass1("NSKeyedArchiver");
+  late final _sel_initRequiringSecureCoding_1 =
+      _registerName1("initRequiringSecureCoding:");
+  instancetype _objc_msgSend_449(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    bool requiresSecureCoding,
+  ) {
+    return __objc_msgSend_449(
+      obj,
+      sel,
+      requiresSecureCoding,
+    );
+  }
+
+  late final __objc_msgSend_449Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_449 = __objc_msgSend_449Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, bool)>();
+
+  late final _sel_archivedDataWithRootObject_requiringSecureCoding_error_1 =
+      _registerName1("archivedDataWithRootObject:requiringSecureCoding:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_450(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> object,
+    bool requiresSecureCoding,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_450(
+      obj,
+      sel,
+      object,
+      requiresSecureCoding,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_450Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_450 = __objc_msgSend_450Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          bool,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _class_NSMutableData1 = _getClass1("NSMutableData");
+  late final _sel_mutableBytes1 = _registerName1("mutableBytes");
+  late final _sel_setLength_1 = _registerName1("setLength:");
+  void _objc_msgSend_451(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_451(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_451Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_451 = __objc_msgSend_451Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_appendBytes_length_1 = _registerName1("appendBytes:length:");
+  late final _sel_appendData_1 = _registerName1("appendData:");
+  late final _sel_increaseLengthBy_1 = _registerName1("increaseLengthBy:");
+  late final _sel_replaceBytesInRange_withBytes_1 =
+      _registerName1("replaceBytesInRange:withBytes:");
+  void _objc_msgSend_452(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    ffi.Pointer<ffi.Void> bytes,
+  ) {
+    return __objc_msgSend_452(
+      obj,
+      sel,
+      range,
+      bytes,
+    );
+  }
+
+  late final __objc_msgSend_452Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRange, ffi.Pointer<ffi.Void>)>>('objc_msgSend');
+  late final __objc_msgSend_452 = __objc_msgSend_452Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange,
+          ffi.Pointer<ffi.Void>)>();
+
+  late final _sel_resetBytesInRange_1 = _registerName1("resetBytesInRange:");
+  late final _sel_setData_1 = _registerName1("setData:");
+  late final _sel_replaceBytesInRange_withBytes_length_1 =
+      _registerName1("replaceBytesInRange:withBytes:length:");
+  void _objc_msgSend_453(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    ffi.Pointer<ffi.Void> replacementBytes,
+    int replacementLength,
+  ) {
+    return __objc_msgSend_453(
+      obj,
+      sel,
+      range,
+      replacementBytes,
+      replacementLength,
+    );
+  }
+
+  late final __objc_msgSend_453Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRange, ffi.Pointer<ffi.Void>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_453 = __objc_msgSend_453Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange,
+          ffi.Pointer<ffi.Void>, int)>();
+
+  late final _sel_dataWithCapacity_1 = _registerName1("dataWithCapacity:");
+  late final _sel_dataWithLength_1 = _registerName1("dataWithLength:");
+  late final _sel_initWithLength_1 = _registerName1("initWithLength:");
+  late final _sel_decompressUsingAlgorithm_error_1 =
+      _registerName1("decompressUsingAlgorithm:error:");
+  bool _objc_msgSend_454(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int algorithm,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_454(
+      obj,
+      sel,
+      algorithm,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_454Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_454 = __objc_msgSend_454Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_compressUsingAlgorithm_error_1 =
+      _registerName1("compressUsingAlgorithm:error:");
+  late final _sel_initForWritingWithMutableData_1 =
+      _registerName1("initForWritingWithMutableData:");
+  instancetype _objc_msgSend_455(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> data,
+  ) {
+    return __objc_msgSend_455(
+      obj,
+      sel,
+      data,
+    );
+  }
+
+  late final __objc_msgSend_455Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_455 = __objc_msgSend_455Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_archivedDataWithRootObject_1 =
+      _registerName1("archivedDataWithRootObject:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_456(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> rootObject,
+  ) {
+    return __objc_msgSend_456(
+      obj,
+      sel,
+      rootObject,
+    );
+  }
+
+  late final __objc_msgSend_456Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_456 = __objc_msgSend_456Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_archiveRootObject_toFile_1 =
+      _registerName1("archiveRootObject:toFile:");
+  late final _sel_outputFormat1 = _registerName1("outputFormat");
+  int _objc_msgSend_457(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_457(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_457Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_457 = __objc_msgSend_457Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setOutputFormat_1 = _registerName1("setOutputFormat:");
+  void _objc_msgSend_458(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_458(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_458Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_458 = __objc_msgSend_458Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_encodedData1 = _registerName1("encodedData");
+  late final _sel_finishEncoding1 = _registerName1("finishEncoding");
+  late final _sel_setClassName_forClass_1 =
+      _registerName1("setClassName:forClass:");
+  void _objc_msgSend_459(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> codedName,
+    ffi.Pointer<ObjCObject> cls,
+  ) {
+    return __objc_msgSend_459(
+      obj,
+      sel,
+      codedName,
+      cls,
+    );
+  }
+
+  late final __objc_msgSend_459Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_459 = __objc_msgSend_459Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_classNameForClass_1 = _registerName1("classNameForClass:");
+  late final _sel_setRequiresSecureCoding_1 =
+      _registerName1("setRequiresSecureCoding:");
+  void _objc_msgSend_460(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    bool value,
+  ) {
+    return __objc_msgSend_460(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_460Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_460 = __objc_msgSend_460Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, bool)>();
+
+  late final _sel_replacementObjectForKeyedArchiver_1 =
+      _registerName1("replacementObjectForKeyedArchiver:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_461(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> archiver,
+  ) {
+    return __objc_msgSend_461(
+      obj,
+      sel,
+      archiver,
+    );
+  }
+
+  late final __objc_msgSend_461Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_461 = __objc_msgSend_461Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_performSelectorOnMainThread_withObject_waitUntilDone_modes_1 =
+      _registerName1(
+          "performSelectorOnMainThread:withObject:waitUntilDone:modes:");
+  void _objc_msgSend_462(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCSel> aSelector,
+    ffi.Pointer<ObjCObject> arg,
+    bool wait,
+    ffi.Pointer<ObjCObject> array,
+  ) {
+    return __objc_msgSend_462(
+      obj,
+      sel,
+      aSelector,
+      arg,
+      wait,
+      array,
+    );
+  }
+
+  late final __objc_msgSend_462Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_462 = __objc_msgSend_462Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          bool,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_performSelectorOnMainThread_withObject_waitUntilDone_1 =
+      _registerName1("performSelectorOnMainThread:withObject:waitUntilDone:");
+  void _objc_msgSend_463(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCSel> aSelector,
+    ffi.Pointer<ObjCObject> arg,
+    bool wait,
+  ) {
+    return __objc_msgSend_463(
+      obj,
+      sel,
+      aSelector,
+      arg,
+      wait,
+    );
+  }
+
+  late final __objc_msgSend_463Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_463 = __objc_msgSend_463Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>, bool)>();
+
+  late final _class_NSThread1 = _getClass1("NSThread");
+  late final _sel_currentThread1 = _registerName1("currentThread");
+  ffi.Pointer<ObjCObject> _objc_msgSend_464(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_464(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_464Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_464 = __objc_msgSend_464Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_detachNewThreadWithBlock_1 =
+      _registerName1("detachNewThreadWithBlock:");
+  void _objc_msgSend_465(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_465(
+      obj,
+      sel,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_465Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_465 = __objc_msgSend_465Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_detachNewThreadSelector_toTarget_withObject_1 =
+      _registerName1("detachNewThreadSelector:toTarget:withObject:");
+  void _objc_msgSend_466(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCSel> selector,
+    ffi.Pointer<ObjCObject> target,
+    ffi.Pointer<ObjCObject> argument,
+  ) {
+    return __objc_msgSend_466(
+      obj,
+      sel,
+      selector,
+      target,
+      argument,
+    );
+  }
+
+  late final __objc_msgSend_466Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_466 = __objc_msgSend_466Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_isMultiThreaded1 = _registerName1("isMultiThreaded");
+  late final _class_NSMutableDictionary1 = _getClass1("NSMutableDictionary");
+  late final _sel_removeObjectForKey_1 = _registerName1("removeObjectForKey:");
+  late final _sel_setObject_forKey_1 = _registerName1("setObject:forKey:");
+  void _objc_msgSend_467(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> anObject,
+    ffi.Pointer<ObjCObject> aKey,
+  ) {
+    return __objc_msgSend_467(
+      obj,
+      sel,
+      anObject,
+      aKey,
+    );
+  }
+
+  late final __objc_msgSend_467Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_467 = __objc_msgSend_467Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_addEntriesFromDictionary_1 =
+      _registerName1("addEntriesFromDictionary:");
+  late final _sel_removeObjectsForKeys_1 =
+      _registerName1("removeObjectsForKeys:");
+  late final _sel_setDictionary_1 = _registerName1("setDictionary:");
+  late final _sel_setObject_forKeyedSubscript_1 =
+      _registerName1("setObject:forKeyedSubscript:");
+  late final _sel_dictionaryWithCapacity_1 =
+      _registerName1("dictionaryWithCapacity:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_468(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+  ) {
+    return __objc_msgSend_468(
+      obj,
+      sel,
+      path,
+    );
+  }
+
+  late final __objc_msgSend_468Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_468 = __objc_msgSend_468Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  ffi.Pointer<ObjCObject> _objc_msgSend_469(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+  ) {
+    return __objc_msgSend_469(
+      obj,
+      sel,
+      url,
+    );
+  }
+
+  late final __objc_msgSend_469Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_469 = __objc_msgSend_469Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dictionaryWithSharedKeySet_1 =
+      _registerName1("dictionaryWithSharedKeySet:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_470(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> keyset,
+  ) {
+    return __objc_msgSend_470(
+      obj,
+      sel,
+      keyset,
+    );
+  }
+
+  late final __objc_msgSend_470Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_470 = __objc_msgSend_470Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_threadDictionary1 = _registerName1("threadDictionary");
+  ffi.Pointer<ObjCObject> _objc_msgSend_471(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_471(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_471Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_471 = __objc_msgSend_471Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_sleepUntilDate_1 = _registerName1("sleepUntilDate:");
+  void _objc_msgSend_472(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> date,
+  ) {
+    return __objc_msgSend_472(
+      obj,
+      sel,
+      date,
+    );
+  }
+
+  late final __objc_msgSend_472Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_472 = __objc_msgSend_472Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_sleepForTimeInterval_1 =
+      _registerName1("sleepForTimeInterval:");
+  void _objc_msgSend_473(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    double ti,
+  ) {
+    return __objc_msgSend_473(
+      obj,
+      sel,
+      ti,
+    );
+  }
+
+  late final __objc_msgSend_473Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSTimeInterval)>>('objc_msgSend');
+  late final __objc_msgSend_473 = __objc_msgSend_473Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, double)>();
+
+  late final _sel_exit1 = _registerName1("exit");
+  late final _sel_threadPriority1 = _registerName1("threadPriority");
+  late final _sel_setThreadPriority_1 = _registerName1("setThreadPriority:");
+  void _objc_msgSend_474(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    double value,
+  ) {
+    return __objc_msgSend_474(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_474Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Double)>>('objc_msgSend');
+  late final __objc_msgSend_474 = __objc_msgSend_474Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, double)>();
+
+  late final _sel_qualityOfService1 = _registerName1("qualityOfService");
+  int _objc_msgSend_475(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_475(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_475Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_475 = __objc_msgSend_475Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setQualityOfService_1 =
+      _registerName1("setQualityOfService:");
+  void _objc_msgSend_476(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_476(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_476Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_476 = __objc_msgSend_476Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_callStackReturnAddresses1 =
+      _registerName1("callStackReturnAddresses");
+  late final _sel_callStackSymbols1 = _registerName1("callStackSymbols");
+  late final _sel_setName_1 = _registerName1("setName:");
+  void _objc_msgSend_477(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_477(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_477Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_477 = __objc_msgSend_477Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_stackSize1 = _registerName1("stackSize");
+  late final _sel_setStackSize_1 = _registerName1("setStackSize:");
+  late final _sel_isMainThread1 = _registerName1("isMainThread");
+  late final _sel_mainThread1 = _registerName1("mainThread");
+  late final _sel_initWithTarget_selector_object_1 =
+      _registerName1("initWithTarget:selector:object:");
+  instancetype _objc_msgSend_478(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> target,
+    ffi.Pointer<ObjCSel> selector,
+    ffi.Pointer<ObjCObject> argument,
+  ) {
+    return __objc_msgSend_478(
+      obj,
+      sel,
+      target,
+      selector,
+      argument,
+    );
+  }
+
+  late final __objc_msgSend_478Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_478 = __objc_msgSend_478Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithBlock_1 = _registerName1("initWithBlock:");
+  instancetype _objc_msgSend_479(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_479(
+      obj,
+      sel,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_479Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_479 = __objc_msgSend_479Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_isExecuting1 = _registerName1("isExecuting");
+  late final _sel_isFinished1 = _registerName1("isFinished");
+  late final _sel_isCancelled1 = _registerName1("isCancelled");
+  late final _sel_cancel1 = _registerName1("cancel");
+  late final _sel_start1 = _registerName1("start");
+  late final _sel_main1 = _registerName1("main");
+  late final _sel_performSelector_onThread_withObject_waitUntilDone_modes_1 =
+      _registerName1(
+          "performSelector:onThread:withObject:waitUntilDone:modes:");
+  void _objc_msgSend_480(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCSel> aSelector,
+    ffi.Pointer<ObjCObject> thr,
+    ffi.Pointer<ObjCObject> arg,
+    bool wait,
+    ffi.Pointer<ObjCObject> array,
+  ) {
+    return __objc_msgSend_480(
+      obj,
+      sel,
+      aSelector,
+      thr,
+      arg,
+      wait,
+      array,
+    );
+  }
+
+  late final __objc_msgSend_480Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_480 = __objc_msgSend_480Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          bool,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_performSelector_onThread_withObject_waitUntilDone_1 =
+      _registerName1("performSelector:onThread:withObject:waitUntilDone:");
+  void _objc_msgSend_481(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCSel> aSelector,
+    ffi.Pointer<ObjCObject> thr,
+    ffi.Pointer<ObjCObject> arg,
+    bool wait,
+  ) {
+    return __objc_msgSend_481(
+      obj,
+      sel,
+      aSelector,
+      thr,
+      arg,
+      wait,
+    );
+  }
+
+  late final __objc_msgSend_481Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_481 = __objc_msgSend_481Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          bool)>();
+
+  late final _sel_performSelectorInBackground_withObject_1 =
+      _registerName1("performSelectorInBackground:withObject:");
+  late final _sel_classForArchiver1 = _registerName1("classForArchiver");
+  late final _class_NSArchiver1 = _getClass1("NSArchiver");
+  late final _sel_archiverData1 = _registerName1("archiverData");
+  ffi.Pointer<ObjCObject> _objc_msgSend_482(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_482(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_482Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_482 = __objc_msgSend_482Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_encodeClassName_intoClassName_1 =
+      _registerName1("encodeClassName:intoClassName:");
+  void _objc_msgSend_483(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> trueName,
+    ffi.Pointer<ObjCObject> inArchiveName,
+  ) {
+    return __objc_msgSend_483(
+      obj,
+      sel,
+      trueName,
+      inArchiveName,
+    );
+  }
+
+  late final __objc_msgSend_483Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_483 = __objc_msgSend_483Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_classNameEncodedForTrueClassName_1 =
+      _registerName1("classNameEncodedForTrueClassName:");
+  late final _sel_replaceObject_withObject_1 =
+      _registerName1("replaceObject:withObject:");
+  late final _sel_replacementObjectForArchiver_1 =
+      _registerName1("replacementObjectForArchiver:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_484(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> archiver,
+  ) {
+    return __objc_msgSend_484(
+      obj,
+      sel,
+      archiver,
+    );
+  }
+
+  late final __objc_msgSend_484Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_484 = __objc_msgSend_484Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_classForPortCoder1 = _registerName1("classForPortCoder");
+  late final _class_NSPortCoder1 = _getClass1("NSPortCoder");
+  late final _sel_isBycopy1 = _registerName1("isBycopy");
+  late final _sel_isByref1 = _registerName1("isByref");
+  late final _class_NSPort1 = _getClass1("NSPort");
+  ffi.Pointer<ObjCObject> _objc_msgSend_485(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_485(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_485Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_485 = __objc_msgSend_485Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_invalidate1 = _registerName1("invalidate");
+  late final _sel_isValid1 = _registerName1("isValid");
+  late final _class_NSRunLoop1 = _getClass1("NSRunLoop");
+  late final _sel_currentRunLoop1 = _registerName1("currentRunLoop");
+  ffi.Pointer<ObjCObject> _objc_msgSend_486(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_486(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_486Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_486 = __objc_msgSend_486Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_mainRunLoop1 = _registerName1("mainRunLoop");
+  late final _sel_currentMode1 = _registerName1("currentMode");
+  late final _sel_getCFRunLoop1 = _registerName1("getCFRunLoop");
+  CFRunLoopRef _objc_msgSend_487(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_487(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_487Ptr = _lookup<
+      ffi.NativeFunction<
+          CFRunLoopRef Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_487 = __objc_msgSend_487Ptr.asFunction<
+      CFRunLoopRef Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _class_NSTimer1 = _getClass1("NSTimer");
+  late final _sel_timerWithTimeInterval_invocation_repeats_1 =
+      _registerName1("timerWithTimeInterval:invocation:repeats:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_488(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    double ti,
+    ffi.Pointer<ObjCObject> invocation,
+    bool yesOrNo,
+  ) {
+    return __objc_msgSend_488(
+      obj,
+      sel,
+      ti,
+      invocation,
+      yesOrNo,
+    );
+  }
+
+  late final __objc_msgSend_488Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSTimeInterval,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_488 = __objc_msgSend_488Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, double, ffi.Pointer<ObjCObject>, bool)>();
+
+  late final _sel_scheduledTimerWithTimeInterval_invocation_repeats_1 =
+      _registerName1("scheduledTimerWithTimeInterval:invocation:repeats:");
+  late final _sel_timerWithTimeInterval_target_selector_userInfo_repeats_1 =
+      _registerName1("timerWithTimeInterval:target:selector:userInfo:repeats:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_489(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    double ti,
+    ffi.Pointer<ObjCObject> aTarget,
+    ffi.Pointer<ObjCSel> aSelector,
+    ffi.Pointer<ObjCObject> userInfo,
+    bool yesOrNo,
+  ) {
+    return __objc_msgSend_489(
+      obj,
+      sel,
+      ti,
+      aTarget,
+      aSelector,
+      userInfo,
+      yesOrNo,
+    );
+  }
+
+  late final __objc_msgSend_489Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSTimeInterval,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_489 = __objc_msgSend_489Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          double,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          bool)>();
+
+  late final _sel_scheduledTimerWithTimeInterval_target_selector_userInfo_repeats_1 =
+      _registerName1(
+          "scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:");
+  late final _sel_timerWithTimeInterval_repeats_block_1 =
+      _registerName1("timerWithTimeInterval:repeats:block:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_490(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    double interval,
+    bool repeats,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_490(
+      obj,
+      sel,
+      interval,
+      repeats,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_490Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSTimeInterval,
+              ffi.Bool,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_490 = __objc_msgSend_490Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, double, bool, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_scheduledTimerWithTimeInterval_repeats_block_1 =
+      _registerName1("scheduledTimerWithTimeInterval:repeats:block:");
+  late final _sel_initWithFireDate_interval_repeats_block_1 =
+      _registerName1("initWithFireDate:interval:repeats:block:");
+  instancetype _objc_msgSend_491(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> date,
+    double interval,
+    bool repeats,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_491(
+      obj,
+      sel,
+      date,
+      interval,
+      repeats,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_491Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSTimeInterval,
+              ffi.Bool,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_491 = __objc_msgSend_491Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, double, bool, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_initWithFireDate_interval_target_selector_userInfo_repeats_1 =
+      _registerName1(
+          "initWithFireDate:interval:target:selector:userInfo:repeats:");
+  instancetype _objc_msgSend_492(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> date,
+    double ti,
+    ffi.Pointer<ObjCObject> t,
+    ffi.Pointer<ObjCSel> s,
+    ffi.Pointer<ObjCObject> ui,
+    bool rep,
+  ) {
+    return __objc_msgSend_492(
+      obj,
+      sel,
+      date,
+      ti,
+      t,
+      s,
+      ui,
+      rep,
+    );
+  }
+
+  late final __objc_msgSend_492Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSTimeInterval,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_492 = __objc_msgSend_492Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          double,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          bool)>();
+
+  late final _sel_fire1 = _registerName1("fire");
+  late final _sel_fireDate1 = _registerName1("fireDate");
+  late final _sel_setFireDate_1 = _registerName1("setFireDate:");
+  void _objc_msgSend_493(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_493(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_493Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_493 = __objc_msgSend_493Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_timeInterval1 = _registerName1("timeInterval");
+  late final _sel_tolerance1 = _registerName1("tolerance");
+  late final _sel_setTolerance_1 = _registerName1("setTolerance:");
+  late final _sel_userInfo1 = _registerName1("userInfo");
+  late final _sel_addTimer_forMode_1 = _registerName1("addTimer:forMode:");
+  void _objc_msgSend_494(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> timer,
+    NSRunLoopMode mode,
+  ) {
+    return __objc_msgSend_494(
+      obj,
+      sel,
+      timer,
+      mode,
+    );
+  }
+
+  late final __objc_msgSend_494Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, NSRunLoopMode)>>('objc_msgSend');
+  late final __objc_msgSend_494 = __objc_msgSend_494Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, NSRunLoopMode)>();
+
+  late final _sel_addPort_forMode_1 = _registerName1("addPort:forMode:");
+  void _objc_msgSend_495(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> aPort,
+    NSRunLoopMode mode,
+  ) {
+    return __objc_msgSend_495(
+      obj,
+      sel,
+      aPort,
+      mode,
+    );
+  }
+
+  late final __objc_msgSend_495Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, NSRunLoopMode)>>('objc_msgSend');
+  late final __objc_msgSend_495 = __objc_msgSend_495Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, NSRunLoopMode)>();
+
+  late final _sel_removePort_forMode_1 = _registerName1("removePort:forMode:");
+  late final _sel_limitDateForMode_1 = _registerName1("limitDateForMode:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_496(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRunLoopMode mode,
+  ) {
+    return __objc_msgSend_496(
+      obj,
+      sel,
+      mode,
+    );
+  }
+
+  late final __objc_msgSend_496Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSRunLoopMode)>>('objc_msgSend');
+  late final __objc_msgSend_496 = __objc_msgSend_496Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRunLoopMode)>();
+
+  late final _sel_acceptInputForMode_beforeDate_1 =
+      _registerName1("acceptInputForMode:beforeDate:");
+  void _objc_msgSend_497(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRunLoopMode mode,
+    ffi.Pointer<ObjCObject> limitDate,
+  ) {
+    return __objc_msgSend_497(
+      obj,
+      sel,
+      mode,
+      limitDate,
+    );
+  }
+
+  late final __objc_msgSend_497Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRunLoopMode, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_497 = __objc_msgSend_497Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          NSRunLoopMode, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_run1 = _registerName1("run");
+  late final _sel_runUntilDate_1 = _registerName1("runUntilDate:");
+  late final _sel_runMode_beforeDate_1 = _registerName1("runMode:beforeDate:");
+  bool _objc_msgSend_498(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRunLoopMode mode,
+    ffi.Pointer<ObjCObject> limitDate,
+  ) {
+    return __objc_msgSend_498(
+      obj,
+      sel,
+      mode,
+      limitDate,
+    );
+  }
+
+  late final __objc_msgSend_498Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRunLoopMode, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_498 = __objc_msgSend_498Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          NSRunLoopMode, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_configureAsServer1 = _registerName1("configureAsServer");
+  late final _sel_performInModes_block_1 =
+      _registerName1("performInModes:block:");
+  void _objc_msgSend_499(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> modes,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_499(
+      obj,
+      sel,
+      modes,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_499Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_499 = __objc_msgSend_499Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_performBlock_1 = _registerName1("performBlock:");
+  late final _sel_performSelector_target_argument_order_modes_1 =
+      _registerName1("performSelector:target:argument:order:modes:");
+  void _objc_msgSend_500(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCSel> aSelector,
+    ffi.Pointer<ObjCObject> target,
+    ffi.Pointer<ObjCObject> arg,
+    int order,
+    ffi.Pointer<ObjCObject> modes,
+  ) {
+    return __objc_msgSend_500(
+      obj,
+      sel,
+      aSelector,
+      target,
+      arg,
+      order,
+      modes,
+    );
+  }
+
+  late final __objc_msgSend_500Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              NSUInteger,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_500 = __objc_msgSend_500Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_cancelPerformSelector_target_argument_1 =
+      _registerName1("cancelPerformSelector:target:argument:");
+  late final _sel_cancelPerformSelectorsWithTarget_1 =
+      _registerName1("cancelPerformSelectorsWithTarget:");
+  late final _sel_scheduleInRunLoop_forMode_1 =
+      _registerName1("scheduleInRunLoop:forMode:");
+  void _objc_msgSend_501(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> runLoop,
+    NSRunLoopMode mode,
+  ) {
+    return __objc_msgSend_501(
+      obj,
+      sel,
+      runLoop,
+      mode,
+    );
+  }
+
+  late final __objc_msgSend_501Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, NSRunLoopMode)>>('objc_msgSend');
+  late final __objc_msgSend_501 = __objc_msgSend_501Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, NSRunLoopMode)>();
+
+  late final _sel_removeFromRunLoop_forMode_1 =
+      _registerName1("removeFromRunLoop:forMode:");
+  late final _sel_reservedSpaceLength1 = _registerName1("reservedSpaceLength");
+  late final _sel_sendBeforeDate_components_from_reserved_1 =
+      _registerName1("sendBeforeDate:components:from:reserved:");
+  bool _objc_msgSend_502(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> limitDate,
+    ffi.Pointer<ObjCObject> components,
+    ffi.Pointer<ObjCObject> receivePort,
+    int headerSpaceReserved,
+  ) {
+    return __objc_msgSend_502(
+      obj,
+      sel,
+      limitDate,
+      components,
+      receivePort,
+      headerSpaceReserved,
+    );
+  }
+
+  late final __objc_msgSend_502Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_502 = __objc_msgSend_502Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          int)>();
+
+  late final _sel_sendBeforeDate_msgid_components_from_reserved_1 =
+      _registerName1("sendBeforeDate:msgid:components:from:reserved:");
+  bool _objc_msgSend_503(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> limitDate,
+    int msgID,
+    ffi.Pointer<ObjCObject> components,
+    ffi.Pointer<ObjCObject> receivePort,
+    int headerSpaceReserved,
+  ) {
+    return __objc_msgSend_503(
+      obj,
+      sel,
+      limitDate,
+      msgID,
+      components,
+      receivePort,
+      headerSpaceReserved,
+    );
+  }
+
+  late final __objc_msgSend_503Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSUInteger,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_503 = __objc_msgSend_503Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          int)>();
+
+  late final _class_NSConnection1 = _getClass1("NSConnection");
+  late final _sel_statistics1 = _registerName1("statistics");
+  late final _sel_allConnections1 = _registerName1("allConnections");
+  late final _sel_defaultConnection1 = _registerName1("defaultConnection");
+  ffi.Pointer<ObjCObject> _objc_msgSend_504(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_504(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_504Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_504 = __objc_msgSend_504Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_connectionWithRegisteredName_host_1 =
+      _registerName1("connectionWithRegisteredName:host:");
+  late final _class_NSPortNameServer1 = _getClass1("NSPortNameServer");
+  late final _sel_systemDefaultPortNameServer1 =
+      _registerName1("systemDefaultPortNameServer");
+  ffi.Pointer<ObjCObject> _objc_msgSend_505(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_505(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_505Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_505 = __objc_msgSend_505Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_portForName_1 = _registerName1("portForName:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_506(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> name,
+  ) {
+    return __objc_msgSend_506(
+      obj,
+      sel,
+      name,
+    );
+  }
+
+  late final __objc_msgSend_506Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_506 = __objc_msgSend_506Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_portForName_host_1 = _registerName1("portForName:host:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_507(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> name,
+    ffi.Pointer<ObjCObject> host,
+  ) {
+    return __objc_msgSend_507(
+      obj,
+      sel,
+      name,
+      host,
+    );
+  }
+
+  late final __objc_msgSend_507Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_507 = __objc_msgSend_507Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_registerPort_name_1 = _registerName1("registerPort:name:");
+  bool _objc_msgSend_508(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> port,
+    ffi.Pointer<ObjCObject> name,
+  ) {
+    return __objc_msgSend_508(
+      obj,
+      sel,
+      port,
+      name,
+    );
+  }
+
+  late final __objc_msgSend_508Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_508 = __objc_msgSend_508Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_removePortForName_1 = _registerName1("removePortForName:");
+  late final _sel_connectionWithRegisteredName_host_usingNameServer_1 =
+      _registerName1("connectionWithRegisteredName:host:usingNameServer:");
+  instancetype _objc_msgSend_509(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> name,
+    ffi.Pointer<ObjCObject> hostName,
+    ffi.Pointer<ObjCObject> server,
+  ) {
+    return __objc_msgSend_509(
+      obj,
+      sel,
+      name,
+      hostName,
+      server,
+    );
+  }
+
+  late final __objc_msgSend_509Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_509 = __objc_msgSend_509Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSDistantObject1 = _getClass1("NSDistantObject");
+  late final _class_NSProxy1 = _getClass1("NSProxy");
+  late final _sel_respondsToSelector_1 = _registerName1("respondsToSelector:");
+  late final _sel_proxyWithTarget_connection_1 =
+      _registerName1("proxyWithTarget:connection:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_510(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> target,
+    ffi.Pointer<ObjCObject> connection,
+  ) {
+    return __objc_msgSend_510(
+      obj,
+      sel,
+      target,
+      connection,
+    );
+  }
+
+  late final __objc_msgSend_510Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_510 = __objc_msgSend_510Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithTarget_connection_1 =
+      _registerName1("initWithTarget:connection:");
+  late final _sel_proxyWithLocal_connection_1 =
+      _registerName1("proxyWithLocal:connection:");
+  late final _sel_initWithLocal_connection_1 =
+      _registerName1("initWithLocal:connection:");
+  late final _sel_setProtocolForProxy_1 =
+      _registerName1("setProtocolForProxy:");
+  void _objc_msgSend_511(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> proto,
+  ) {
+    return __objc_msgSend_511(
+      obj,
+      sel,
+      proto,
+    );
+  }
+
+  late final __objc_msgSend_511Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_511 = __objc_msgSend_511Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_connectionForProxy1 = _registerName1("connectionForProxy");
+  late final _sel_rootProxyForConnectionWithRegisteredName_host_1 =
+      _registerName1("rootProxyForConnectionWithRegisteredName:host:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_512(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> name,
+    ffi.Pointer<ObjCObject> hostName,
+  ) {
+    return __objc_msgSend_512(
+      obj,
+      sel,
+      name,
+      hostName,
+    );
+  }
+
+  late final __objc_msgSend_512Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_512 = __objc_msgSend_512Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_rootProxyForConnectionWithRegisteredName_host_usingNameServer_1 =
+      _registerName1(
+          "rootProxyForConnectionWithRegisteredName:host:usingNameServer:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_513(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> name,
+    ffi.Pointer<ObjCObject> hostName,
+    ffi.Pointer<ObjCObject> server,
+  ) {
+    return __objc_msgSend_513(
+      obj,
+      sel,
+      name,
+      hostName,
+      server,
+    );
+  }
+
+  late final __objc_msgSend_513Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_513 = __objc_msgSend_513Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_serviceConnectionWithName_rootObject_usingNameServer_1 =
+      _registerName1("serviceConnectionWithName:rootObject:usingNameServer:");
+  instancetype _objc_msgSend_514(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> name,
+    ffi.Pointer<ObjCObject> root,
+    ffi.Pointer<ObjCObject> server,
+  ) {
+    return __objc_msgSend_514(
+      obj,
+      sel,
+      name,
+      root,
+      server,
+    );
+  }
+
+  late final __objc_msgSend_514Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_514 = __objc_msgSend_514Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_serviceConnectionWithName_rootObject_1 =
+      _registerName1("serviceConnectionWithName:rootObject:");
+  late final _sel_requestTimeout1 = _registerName1("requestTimeout");
+  late final _sel_setRequestTimeout_1 = _registerName1("setRequestTimeout:");
+  late final _sel_replyTimeout1 = _registerName1("replyTimeout");
+  late final _sel_setReplyTimeout_1 = _registerName1("setReplyTimeout:");
+  late final _sel_rootObject1 = _registerName1("rootObject");
+  late final _sel_setRootObject_1 = _registerName1("setRootObject:");
+  late final _sel_independentConversationQueueing1 =
+      _registerName1("independentConversationQueueing");
+  late final _sel_setIndependentConversationQueueing_1 =
+      _registerName1("setIndependentConversationQueueing:");
+  late final _sel_rootProxy1 = _registerName1("rootProxy");
+  ffi.Pointer<ObjCObject> _objc_msgSend_515(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_515(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_515Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_515 = __objc_msgSend_515Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_addRequestMode_1 = _registerName1("addRequestMode:");
+  late final _sel_removeRequestMode_1 = _registerName1("removeRequestMode:");
+  late final _sel_requestModes1 = _registerName1("requestModes");
+  late final _sel_registerName_1 = _registerName1("registerName:");
+  late final _sel_registerName_withNameServer_1 =
+      _registerName1("registerName:withNameServer:");
+  bool _objc_msgSend_516(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> name,
+    ffi.Pointer<ObjCObject> server,
+  ) {
+    return __objc_msgSend_516(
+      obj,
+      sel,
+      name,
+      server,
+    );
+  }
+
+  late final __objc_msgSend_516Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_516 = __objc_msgSend_516Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_connectionWithReceivePort_sendPort_1 =
+      _registerName1("connectionWithReceivePort:sendPort:");
+  instancetype _objc_msgSend_517(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> receivePort,
+    ffi.Pointer<ObjCObject> sendPort,
+  ) {
+    return __objc_msgSend_517(
+      obj,
+      sel,
+      receivePort,
+      sendPort,
+    );
+  }
+
+  late final __objc_msgSend_517Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_517 = __objc_msgSend_517Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_currentConversation1 = _registerName1("currentConversation");
+  late final _sel_initWithReceivePort_sendPort_1 =
+      _registerName1("initWithReceivePort:sendPort:");
+  late final _sel_sendPort1 = _registerName1("sendPort");
+  late final _sel_receivePort1 = _registerName1("receivePort");
+  late final _sel_enableMultipleThreads1 =
+      _registerName1("enableMultipleThreads");
+  late final _sel_multipleThreadsEnabled1 =
+      _registerName1("multipleThreadsEnabled");
+  late final _sel_addRunLoop_1 = _registerName1("addRunLoop:");
+  void _objc_msgSend_518(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> runloop,
+  ) {
+    return __objc_msgSend_518(
+      obj,
+      sel,
+      runloop,
+    );
+  }
+
+  late final __objc_msgSend_518Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_518 = __objc_msgSend_518Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_removeRunLoop_1 = _registerName1("removeRunLoop:");
+  late final _sel_runInNewThread1 = _registerName1("runInNewThread");
+  late final _sel_remoteObjects1 = _registerName1("remoteObjects");
+  late final _sel_localObjects1 = _registerName1("localObjects");
+  late final _sel_dispatchWithComponents_1 =
+      _registerName1("dispatchWithComponents:");
+  late final _sel_addConnection_toRunLoop_forMode_1 =
+      _registerName1("addConnection:toRunLoop:forMode:");
+  void _objc_msgSend_519(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> conn,
+    ffi.Pointer<ObjCObject> runLoop,
+    NSRunLoopMode mode,
+  ) {
+    return __objc_msgSend_519(
+      obj,
+      sel,
+      conn,
+      runLoop,
+      mode,
+    );
+  }
+
+  late final __objc_msgSend_519Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              NSRunLoopMode)>>('objc_msgSend');
+  late final __objc_msgSend_519 = __objc_msgSend_519Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>, NSRunLoopMode)>();
+
+  late final _sel_removeConnection_fromRunLoop_forMode_1 =
+      _registerName1("removeConnection:fromRunLoop:forMode:");
+  late final _sel_encodePortObject_1 = _registerName1("encodePortObject:");
+  void _objc_msgSend_520(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> aport,
+  ) {
+    return __objc_msgSend_520(
+      obj,
+      sel,
+      aport,
+    );
+  }
+
+  late final __objc_msgSend_520Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_520 = __objc_msgSend_520Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_decodePortObject1 = _registerName1("decodePortObject");
+  late final _sel_connection1 = _registerName1("connection");
+  late final _sel_portCoderWithReceivePort_sendPort_components_1 =
+      _registerName1("portCoderWithReceivePort:sendPort:components:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_521(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> rcvPort,
+    ffi.Pointer<ObjCObject> sndPort,
+    ffi.Pointer<ObjCObject> comps,
+  ) {
+    return __objc_msgSend_521(
+      obj,
+      sel,
+      rcvPort,
+      sndPort,
+      comps,
+    );
+  }
+
+  late final __objc_msgSend_521Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_521 = __objc_msgSend_521Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithReceivePort_sendPort_components_1 =
+      _registerName1("initWithReceivePort:sendPort:components:");
+  late final _sel_dispatch1 = _registerName1("dispatch");
+  late final _sel_replacementObjectForPortCoder_1 =
+      _registerName1("replacementObjectForPortCoder:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_522(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> coder,
+  ) {
+    return __objc_msgSend_522(
+      obj,
+      sel,
+      coder,
+    );
+  }
+
+  late final __objc_msgSend_522Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_522 = __objc_msgSend_522Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSClassDescription1 = _getClass1("NSClassDescription");
+  late final _sel_registerClassDescription_forClass_1 =
+      _registerName1("registerClassDescription:forClass:");
+  void _objc_msgSend_523(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> description,
+    ffi.Pointer<ObjCObject> aClass,
+  ) {
+    return __objc_msgSend_523(
+      obj,
+      sel,
+      description,
+      aClass,
+    );
+  }
+
+  late final __objc_msgSend_523Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_523 = __objc_msgSend_523Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_invalidateClassDescriptionCache1 =
+      _registerName1("invalidateClassDescriptionCache");
+  late final _sel_classDescriptionForClass_1 =
+      _registerName1("classDescriptionForClass:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_524(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> aClass,
+  ) {
+    return __objc_msgSend_524(
+      obj,
+      sel,
+      aClass,
+    );
+  }
+
+  late final __objc_msgSend_524Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_524 = __objc_msgSend_524Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_attributeKeys1 = _registerName1("attributeKeys");
+  late final _sel_toOneRelationshipKeys1 =
+      _registerName1("toOneRelationshipKeys");
+  late final _sel_toManyRelationshipKeys1 =
+      _registerName1("toManyRelationshipKeys");
+  late final _sel_inverseForRelationshipKey_1 =
+      _registerName1("inverseForRelationshipKey:");
+  late final _sel_classDescription1 = _registerName1("classDescription");
+  ffi.Pointer<ObjCObject> _objc_msgSend_525(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_525(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_525Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_525 = __objc_msgSend_525Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _class_NSScriptObjectSpecifier1 =
+      _getClass1("NSScriptObjectSpecifier");
+  late final _class_NSAppleEventDescriptor1 =
+      _getClass1("NSAppleEventDescriptor");
+  late final _sel_nullDescriptor1 = _registerName1("nullDescriptor");
+  ffi.Pointer<ObjCObject> _objc_msgSend_526(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_526(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_526Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_526 = __objc_msgSend_526Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_descriptorWithDescriptorType_bytes_length_1 =
+      _registerName1("descriptorWithDescriptorType:bytes:length:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_527(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int descriptorType,
+    ffi.Pointer<ffi.Void> bytes,
+    int byteCount,
+  ) {
+    return __objc_msgSend_527(
+      obj,
+      sel,
+      descriptorType,
+      bytes,
+      byteCount,
+    );
+  }
+
+  late final __objc_msgSend_527Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              DescType,
+              ffi.Pointer<ffi.Void>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_527 = __objc_msgSend_527Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, ffi.Pointer<ffi.Void>, int)>();
+
+  late final _sel_descriptorWithDescriptorType_data_1 =
+      _registerName1("descriptorWithDescriptorType:data:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_528(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int descriptorType,
+    ffi.Pointer<ObjCObject> data,
+  ) {
+    return __objc_msgSend_528(
+      obj,
+      sel,
+      descriptorType,
+      data,
+    );
+  }
+
+  late final __objc_msgSend_528Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              DescType,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_528 = __objc_msgSend_528Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_descriptorWithBoolean_1 =
+      _registerName1("descriptorWithBoolean:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_529(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int boolean,
+  ) {
+    return __objc_msgSend_529(
+      obj,
+      sel,
+      boolean,
+    );
+  }
+
+  late final __objc_msgSend_529Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, Boolean)>>('objc_msgSend');
+  late final __objc_msgSend_529 = __objc_msgSend_529Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_descriptorWithEnumCode_1 =
+      _registerName1("descriptorWithEnumCode:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_530(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int enumerator,
+  ) {
+    return __objc_msgSend_530(
+      obj,
+      sel,
+      enumerator,
+    );
+  }
+
+  late final __objc_msgSend_530Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, OSType)>>('objc_msgSend');
+  late final __objc_msgSend_530 = __objc_msgSend_530Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_descriptorWithInt32_1 =
+      _registerName1("descriptorWithInt32:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_531(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int signedInt,
+  ) {
+    return __objc_msgSend_531(
+      obj,
+      sel,
+      signedInt,
+    );
+  }
+
+  late final __objc_msgSend_531Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, SInt32)>>('objc_msgSend');
+  late final __objc_msgSend_531 = __objc_msgSend_531Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_descriptorWithDouble_1 =
+      _registerName1("descriptorWithDouble:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_532(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    double doubleValue,
+  ) {
+    return __objc_msgSend_532(
+      obj,
+      sel,
+      doubleValue,
+    );
+  }
+
+  late final __objc_msgSend_532Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Double)>>('objc_msgSend');
+  late final __objc_msgSend_532 = __objc_msgSend_532Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, double)>();
+
+  late final _sel_descriptorWithTypeCode_1 =
+      _registerName1("descriptorWithTypeCode:");
+  late final _sel_descriptorWithString_1 =
+      _registerName1("descriptorWithString:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_533(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> string,
+  ) {
+    return __objc_msgSend_533(
+      obj,
+      sel,
+      string,
+    );
+  }
+
+  late final __objc_msgSend_533Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_533 = __objc_msgSend_533Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_descriptorWithDate_1 = _registerName1("descriptorWithDate:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_534(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> date,
+  ) {
+    return __objc_msgSend_534(
+      obj,
+      sel,
+      date,
+    );
+  }
+
+  late final __objc_msgSend_534Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_534 = __objc_msgSend_534Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_descriptorWithFileURL_1 =
+      _registerName1("descriptorWithFileURL:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_535(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> fileURL,
+  ) {
+    return __objc_msgSend_535(
+      obj,
+      sel,
+      fileURL,
+    );
+  }
+
+  late final __objc_msgSend_535Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_535 = __objc_msgSend_535Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_appleEventWithEventClass_eventID_targetDescriptor_returnID_transactionID_1 =
+      _registerName1(
+          "appleEventWithEventClass:eventID:targetDescriptor:returnID:transactionID:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_536(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int eventClass,
+    int eventID,
+    ffi.Pointer<ObjCObject> targetDescriptor,
+    int returnID,
+    int transactionID,
+  ) {
+    return __objc_msgSend_536(
+      obj,
+      sel,
+      eventClass,
+      eventID,
+      targetDescriptor,
+      returnID,
+      transactionID,
+    );
+  }
+
+  late final __objc_msgSend_536Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              AEEventClass,
+              AEEventID,
+              ffi.Pointer<ObjCObject>,
+              AEReturnID,
+              AETransactionID)>>('objc_msgSend');
+  late final __objc_msgSend_536 = __objc_msgSend_536Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, int, ffi.Pointer<ObjCObject>, int, int)>();
+
+  late final _sel_listDescriptor1 = _registerName1("listDescriptor");
+  late final _sel_recordDescriptor1 = _registerName1("recordDescriptor");
+  late final _sel_currentProcessDescriptor1 =
+      _registerName1("currentProcessDescriptor");
+  late final _sel_descriptorWithProcessIdentifier_1 =
+      _registerName1("descriptorWithProcessIdentifier:");
+  late final _sel_descriptorWithBundleIdentifier_1 =
+      _registerName1("descriptorWithBundleIdentifier:");
+  late final _sel_descriptorWithApplicationURL_1 =
+      _registerName1("descriptorWithApplicationURL:");
+  late final _sel_initWithAEDescNoCopy_1 =
+      _registerName1("initWithAEDescNoCopy:");
+  instancetype _objc_msgSend_537(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<AEDesc> aeDesc,
+  ) {
+    return __objc_msgSend_537(
+      obj,
+      sel,
+      aeDesc,
+    );
+  }
+
+  late final __objc_msgSend_537Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<AEDesc>)>>('objc_msgSend');
+  late final __objc_msgSend_537 = __objc_msgSend_537Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<AEDesc>)>();
+
+  late final _sel_initWithDescriptorType_bytes_length_1 =
+      _registerName1("initWithDescriptorType:bytes:length:");
+  instancetype _objc_msgSend_538(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int descriptorType,
+    ffi.Pointer<ffi.Void> bytes,
+    int byteCount,
+  ) {
+    return __objc_msgSend_538(
+      obj,
+      sel,
+      descriptorType,
+      bytes,
+      byteCount,
+    );
+  }
+
+  late final __objc_msgSend_538Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              DescType, ffi.Pointer<ffi.Void>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_538 = __objc_msgSend_538Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ffi.Void>, int)>();
+
+  late final _sel_initWithDescriptorType_data_1 =
+      _registerName1("initWithDescriptorType:data:");
+  instancetype _objc_msgSend_539(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int descriptorType,
+    ffi.Pointer<ObjCObject> data,
+  ) {
+    return __objc_msgSend_539(
+      obj,
+      sel,
+      descriptorType,
+      data,
+    );
+  }
+
+  late final __objc_msgSend_539Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              DescType, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_539 = __objc_msgSend_539Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithEventClass_eventID_targetDescriptor_returnID_transactionID_1 =
+      _registerName1(
+          "initWithEventClass:eventID:targetDescriptor:returnID:transactionID:");
+  instancetype _objc_msgSend_540(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int eventClass,
+    int eventID,
+    ffi.Pointer<ObjCObject> targetDescriptor,
+    int returnID,
+    int transactionID,
+  ) {
+    return __objc_msgSend_540(
+      obj,
+      sel,
+      eventClass,
+      eventID,
+      targetDescriptor,
+      returnID,
+      transactionID,
+    );
+  }
+
+  late final __objc_msgSend_540Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              AEEventClass,
+              AEEventID,
+              ffi.Pointer<ObjCObject>,
+              AEReturnID,
+              AETransactionID)>>('objc_msgSend');
+  late final __objc_msgSend_540 = __objc_msgSend_540Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          int, ffi.Pointer<ObjCObject>, int, int)>();
+
+  late final _sel_initListDescriptor1 = _registerName1("initListDescriptor");
+  late final _sel_initRecordDescriptor1 =
+      _registerName1("initRecordDescriptor");
+  late final _sel_aeDesc1 = _registerName1("aeDesc");
+  ffi.Pointer<AEDesc> _objc_msgSend_541(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_541(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_541Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<AEDesc> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_541 = __objc_msgSend_541Ptr.asFunction<
+      ffi.Pointer<AEDesc> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_descriptorType1 = _registerName1("descriptorType");
+  late final _sel_booleanValue1 = _registerName1("booleanValue");
+  late final _sel_enumCodeValue1 = _registerName1("enumCodeValue");
+  late final _sel_int32Value1 = _registerName1("int32Value");
+  late final _sel_typeCodeValue1 = _registerName1("typeCodeValue");
+  late final _sel_dateValue1 = _registerName1("dateValue");
+  late final _sel_fileURLValue1 = _registerName1("fileURLValue");
+  late final _sel_eventClass1 = _registerName1("eventClass");
+  late final _sel_eventID1 = _registerName1("eventID");
+  late final _sel_returnID1 = _registerName1("returnID");
+  late final _sel_transactionID1 = _registerName1("transactionID");
+  late final _sel_setParamDescriptor_forKeyword_1 =
+      _registerName1("setParamDescriptor:forKeyword:");
+  void _objc_msgSend_542(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> descriptor,
+    int keyword,
+  ) {
+    return __objc_msgSend_542(
+      obj,
+      sel,
+      descriptor,
+      keyword,
+    );
+  }
+
+  late final __objc_msgSend_542Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, AEKeyword)>>('objc_msgSend');
+  late final __objc_msgSend_542 = __objc_msgSend_542Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_paramDescriptorForKeyword_1 =
+      _registerName1("paramDescriptorForKeyword:");
+  late final _sel_removeParamDescriptorWithKeyword_1 =
+      _registerName1("removeParamDescriptorWithKeyword:");
+  void _objc_msgSend_543(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int keyword,
+  ) {
+    return __objc_msgSend_543(
+      obj,
+      sel,
+      keyword,
+    );
+  }
+
+  late final __objc_msgSend_543Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              AEKeyword)>>('objc_msgSend');
+  late final __objc_msgSend_543 = __objc_msgSend_543Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_setAttributeDescriptor_forKeyword_1 =
+      _registerName1("setAttributeDescriptor:forKeyword:");
+  late final _sel_attributeDescriptorForKeyword_1 =
+      _registerName1("attributeDescriptorForKeyword:");
+  late final _sel_sendEventWithOptions_timeout_error_1 =
+      _registerName1("sendEventWithOptions:timeout:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_544(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int sendOptions,
+    double timeoutInSeconds,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_544(
+      obj,
+      sel,
+      sendOptions,
+      timeoutInSeconds,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_544Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              NSTimeInterval,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_544 = __objc_msgSend_544Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          int,
+          double,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_isRecordDescriptor1 = _registerName1("isRecordDescriptor");
+  late final _sel_numberOfItems1 = _registerName1("numberOfItems");
+  late final _sel_insertDescriptor_atIndex_1 =
+      _registerName1("insertDescriptor:atIndex:");
+  void _objc_msgSend_545(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> descriptor,
+    int index,
+  ) {
+    return __objc_msgSend_545(
+      obj,
+      sel,
+      descriptor,
+      index,
+    );
+  }
+
+  late final __objc_msgSend_545Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, NSInteger)>>('objc_msgSend');
+  late final __objc_msgSend_545 = __objc_msgSend_545Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_descriptorAtIndex_1 = _registerName1("descriptorAtIndex:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_546(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int index,
+  ) {
+    return __objc_msgSend_546(
+      obj,
+      sel,
+      index,
+    );
+  }
+
+  late final __objc_msgSend_546Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSInteger)>>('objc_msgSend');
+  late final __objc_msgSend_546 = __objc_msgSend_546Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_removeDescriptorAtIndex_1 =
+      _registerName1("removeDescriptorAtIndex:");
+  late final _sel_setDescriptor_forKeyword_1 =
+      _registerName1("setDescriptor:forKeyword:");
+  late final _sel_descriptorForKeyword_1 =
+      _registerName1("descriptorForKeyword:");
+  late final _sel_removeDescriptorWithKeyword_1 =
+      _registerName1("removeDescriptorWithKeyword:");
+  late final _sel_keywordForDescriptorAtIndex_1 =
+      _registerName1("keywordForDescriptorAtIndex:");
+  int _objc_msgSend_547(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int index,
+  ) {
+    return __objc_msgSend_547(
+      obj,
+      sel,
+      index,
+    );
+  }
+
+  late final __objc_msgSend_547Ptr = _lookup<
+      ffi.NativeFunction<
+          AEKeyword Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSInteger)>>('objc_msgSend');
+  late final __objc_msgSend_547 = __objc_msgSend_547Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_coerceToDescriptorType_1 =
+      _registerName1("coerceToDescriptorType:");
+  late final _sel_objectSpecifierWithDescriptor_1 =
+      _registerName1("objectSpecifierWithDescriptor:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_548(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> descriptor,
+  ) {
+    return __objc_msgSend_548(
+      obj,
+      sel,
+      descriptor,
+    );
+  }
+
+  late final __objc_msgSend_548Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_548 = __objc_msgSend_548Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithContainerSpecifier_key_1 =
+      _registerName1("initWithContainerSpecifier:key:");
+  instancetype _objc_msgSend_549(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> container,
+    ffi.Pointer<ObjCObject> property,
+  ) {
+    return __objc_msgSend_549(
+      obj,
+      sel,
+      container,
+      property,
+    );
+  }
+
+  late final __objc_msgSend_549Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_549 = __objc_msgSend_549Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSScriptClassDescription1 =
+      _getClass1("NSScriptClassDescription");
+  ffi.Pointer<ObjCObject> _objc_msgSend_550(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> aClass,
+  ) {
+    return __objc_msgSend_550(
+      obj,
+      sel,
+      aClass,
+    );
+  }
+
+  late final __objc_msgSend_550Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_550 = __objc_msgSend_550Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithSuiteName_className_dictionary_1 =
+      _registerName1("initWithSuiteName:className:dictionary:");
+  instancetype _objc_msgSend_551(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> suiteName,
+    ffi.Pointer<ObjCObject> className,
+    ffi.Pointer<ObjCObject> classDeclaration,
+  ) {
+    return __objc_msgSend_551(
+      obj,
+      sel,
+      suiteName,
+      className,
+      classDeclaration,
+    );
+  }
+
+  late final __objc_msgSend_551Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_551 = __objc_msgSend_551Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_suiteName1 = _registerName1("suiteName");
+  late final _sel_className1 = _registerName1("className");
+  late final _sel_implementationClassName1 =
+      _registerName1("implementationClassName");
+  late final _sel_superclassDescription1 =
+      _registerName1("superclassDescription");
+  ffi.Pointer<ObjCObject> _objc_msgSend_552(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_552(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_552Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_552 = __objc_msgSend_552Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_appleEventCode1 = _registerName1("appleEventCode");
+  late final _sel_matchesAppleEventCode_1 =
+      _registerName1("matchesAppleEventCode:");
+  late final _class_NSScriptCommandDescription1 =
+      _getClass1("NSScriptCommandDescription");
+  late final _sel_initWithSuiteName_commandName_dictionary_1 =
+      _registerName1("initWithSuiteName:commandName:dictionary:");
+  late final _sel_commandName1 = _registerName1("commandName");
+  late final _sel_appleEventClassCode1 = _registerName1("appleEventClassCode");
+  late final _sel_commandClassName1 = _registerName1("commandClassName");
+  late final _sel_returnType1 = _registerName1("returnType");
+  late final _sel_appleEventCodeForReturnType1 =
+      _registerName1("appleEventCodeForReturnType");
+  late final _sel_argumentNames1 = _registerName1("argumentNames");
+  late final _sel_typeForArgumentWithName_1 =
+      _registerName1("typeForArgumentWithName:");
+  late final _sel_appleEventCodeForArgumentWithName_1 =
+      _registerName1("appleEventCodeForArgumentWithName:");
+  int _objc_msgSend_553(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> argumentName,
+  ) {
+    return __objc_msgSend_553(
+      obj,
+      sel,
+      argumentName,
+    );
+  }
+
+  late final __objc_msgSend_553Ptr = _lookup<
+      ffi.NativeFunction<
+          FourCharCode Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_553 = __objc_msgSend_553Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_isOptionalArgumentWithName_1 =
+      _registerName1("isOptionalArgumentWithName:");
+  late final _class_NSScriptCommand1 = _getClass1("NSScriptCommand");
+  late final _sel_initWithCommandDescription_1 =
+      _registerName1("initWithCommandDescription:");
+  instancetype _objc_msgSend_554(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> commandDef,
+  ) {
+    return __objc_msgSend_554(
+      obj,
+      sel,
+      commandDef,
+    );
+  }
+
+  late final __objc_msgSend_554Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_554 = __objc_msgSend_554Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_commandDescription1 = _registerName1("commandDescription");
+  ffi.Pointer<ObjCObject> _objc_msgSend_555(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_555(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_555Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_555 = __objc_msgSend_555Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_directParameter1 = _registerName1("directParameter");
+  late final _sel_setDirectParameter_1 = _registerName1("setDirectParameter:");
+  late final _sel_receiversSpecifier1 = _registerName1("receiversSpecifier");
+  ffi.Pointer<ObjCObject> _objc_msgSend_556(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_556(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_556Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_556 = __objc_msgSend_556Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setReceiversSpecifier_1 =
+      _registerName1("setReceiversSpecifier:");
+  void _objc_msgSend_557(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_557(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_557Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_557 = __objc_msgSend_557Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_evaluatedReceivers1 = _registerName1("evaluatedReceivers");
+  late final _sel_arguments1 = _registerName1("arguments");
+  late final _sel_setArguments_1 = _registerName1("setArguments:");
+  late final _sel_evaluatedArguments1 = _registerName1("evaluatedArguments");
+  late final _sel_isWellFormed1 = _registerName1("isWellFormed");
+  late final _sel_performDefaultImplementation1 =
+      _registerName1("performDefaultImplementation");
+  late final _sel_executeCommand1 = _registerName1("executeCommand");
+  late final _sel_scriptErrorNumber1 = _registerName1("scriptErrorNumber");
+  late final _sel_setScriptErrorNumber_1 =
+      _registerName1("setScriptErrorNumber:");
+  void _objc_msgSend_558(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_558(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_558Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSInteger)>>('objc_msgSend');
+  late final __objc_msgSend_558 = __objc_msgSend_558Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_scriptErrorOffendingObjectDescriptor1 =
+      _registerName1("scriptErrorOffendingObjectDescriptor");
+  late final _sel_setScriptErrorOffendingObjectDescriptor_1 =
+      _registerName1("setScriptErrorOffendingObjectDescriptor:");
+  void _objc_msgSend_559(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_559(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_559Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_559 = __objc_msgSend_559Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_scriptErrorExpectedTypeDescriptor1 =
+      _registerName1("scriptErrorExpectedTypeDescriptor");
+  late final _sel_setScriptErrorExpectedTypeDescriptor_1 =
+      _registerName1("setScriptErrorExpectedTypeDescriptor:");
+  late final _sel_scriptErrorString1 = _registerName1("scriptErrorString");
+  late final _sel_setScriptErrorString_1 =
+      _registerName1("setScriptErrorString:");
+  late final _sel_currentCommand1 = _registerName1("currentCommand");
+  ffi.Pointer<ObjCObject> _objc_msgSend_560(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_560(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_560Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_560 = __objc_msgSend_560Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_appleEvent1 = _registerName1("appleEvent");
+  late final _sel_suspendExecution1 = _registerName1("suspendExecution");
+  late final _sel_resumeExecutionWithResult_1 =
+      _registerName1("resumeExecutionWithResult:");
+  late final _sel_createCommandInstance1 =
+      _registerName1("createCommandInstance");
+  late final _sel_createCommandInstanceWithZone_1 =
+      _registerName1("createCommandInstanceWithZone:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_561(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<NSZone> zone,
+  ) {
+    return __objc_msgSend_561(
+      obj,
+      sel,
+      zone,
+    );
+  }
+
+  late final __objc_msgSend_561Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<NSZone>)>>('objc_msgSend');
+  late final __objc_msgSend_561 = __objc_msgSend_561Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<NSZone>)>();
+
+  late final _sel_supportsCommand_1 = _registerName1("supportsCommand:");
+  bool _objc_msgSend_562(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> commandDescription,
+  ) {
+    return __objc_msgSend_562(
+      obj,
+      sel,
+      commandDescription,
+    );
+  }
+
+  late final __objc_msgSend_562Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_562 = __objc_msgSend_562Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_selectorForCommand_1 = _registerName1("selectorForCommand:");
+  ffi.Pointer<ObjCSel> _objc_msgSend_563(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> commandDescription,
+  ) {
+    return __objc_msgSend_563(
+      obj,
+      sel,
+      commandDescription,
+    );
+  }
+
+  late final __objc_msgSend_563Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCSel> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_563 = __objc_msgSend_563Ptr.asFunction<
+      ffi.Pointer<ObjCSel> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_typeForKey_1 = _registerName1("typeForKey:");
+  late final _sel_classDescriptionForKey_1 =
+      _registerName1("classDescriptionForKey:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_564(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_564(
+      obj,
+      sel,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_564Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_564 = __objc_msgSend_564Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_appleEventCodeForKey_1 =
+      _registerName1("appleEventCodeForKey:");
+  late final _sel_keyWithAppleEventCode_1 =
+      _registerName1("keyWithAppleEventCode:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_565(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int appleEventCode,
+  ) {
+    return __objc_msgSend_565(
+      obj,
+      sel,
+      appleEventCode,
+    );
+  }
+
+  late final __objc_msgSend_565Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, FourCharCode)>>('objc_msgSend');
+  late final __objc_msgSend_565 = __objc_msgSend_565Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_defaultSubcontainerAttributeKey1 =
+      _registerName1("defaultSubcontainerAttributeKey");
+  late final _sel_isLocationRequiredToCreateForKey_1 =
+      _registerName1("isLocationRequiredToCreateForKey:");
+  late final _sel_hasPropertyForKey_1 = _registerName1("hasPropertyForKey:");
+  late final _sel_hasOrderedToManyRelationshipForKey_1 =
+      _registerName1("hasOrderedToManyRelationshipForKey:");
+  late final _sel_hasReadablePropertyForKey_1 =
+      _registerName1("hasReadablePropertyForKey:");
+  late final _sel_hasWritablePropertyForKey_1 =
+      _registerName1("hasWritablePropertyForKey:");
+  late final _sel_isReadOnlyKey_1 = _registerName1("isReadOnlyKey:");
+  late final _sel_initWithContainerClassDescription_containerSpecifier_key_1 =
+      _registerName1(
+          "initWithContainerClassDescription:containerSpecifier:key:");
+  instancetype _objc_msgSend_566(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> classDesc,
+    ffi.Pointer<ObjCObject> container,
+    ffi.Pointer<ObjCObject> property,
+  ) {
+    return __objc_msgSend_566(
+      obj,
+      sel,
+      classDesc,
+      container,
+      property,
+    );
+  }
+
+  late final __objc_msgSend_566Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_566 = __objc_msgSend_566Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_childSpecifier1 = _registerName1("childSpecifier");
+  late final _sel_setChildSpecifier_1 = _registerName1("setChildSpecifier:");
+  late final _sel_containerSpecifier1 = _registerName1("containerSpecifier");
+  late final _sel_setContainerSpecifier_1 =
+      _registerName1("setContainerSpecifier:");
+  late final _sel_containerIsObjectBeingTested1 =
+      _registerName1("containerIsObjectBeingTested");
+  late final _sel_setContainerIsObjectBeingTested_1 =
+      _registerName1("setContainerIsObjectBeingTested:");
+  late final _sel_containerIsRangeContainerObject1 =
+      _registerName1("containerIsRangeContainerObject");
+  late final _sel_setContainerIsRangeContainerObject_1 =
+      _registerName1("setContainerIsRangeContainerObject:");
+  late final _sel_key1 = _registerName1("key");
+  late final _sel_setKey_1 = _registerName1("setKey:");
+  late final _sel_containerClassDescription1 =
+      _registerName1("containerClassDescription");
+  late final _sel_setContainerClassDescription_1 =
+      _registerName1("setContainerClassDescription:");
+  void _objc_msgSend_567(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_567(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_567Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_567 = __objc_msgSend_567Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_keyClassDescription1 = _registerName1("keyClassDescription");
+  late final _sel_indicesOfObjectsByEvaluatingWithContainer_count_1 =
+      _registerName1("indicesOfObjectsByEvaluatingWithContainer:count:");
+  ffi.Pointer<NSInteger> _objc_msgSend_568(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> container,
+    ffi.Pointer<NSInteger> count,
+  ) {
+    return __objc_msgSend_568(
+      obj,
+      sel,
+      container,
+      count,
+    );
+  }
+
+  late final __objc_msgSend_568Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<NSInteger> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<NSInteger>)>>('objc_msgSend');
+  late final __objc_msgSend_568 = __objc_msgSend_568Ptr.asFunction<
+      ffi.Pointer<NSInteger> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<NSInteger>)>();
+
+  late final _sel_objectsByEvaluatingWithContainers_1 =
+      _registerName1("objectsByEvaluatingWithContainers:");
+  late final _sel_objectsByEvaluatingSpecifier1 =
+      _registerName1("objectsByEvaluatingSpecifier");
+  late final _sel_evaluationErrorNumber1 =
+      _registerName1("evaluationErrorNumber");
+  late final _sel_setEvaluationErrorNumber_1 =
+      _registerName1("setEvaluationErrorNumber:");
+  late final _sel_evaluationErrorSpecifier1 =
+      _registerName1("evaluationErrorSpecifier");
+  late final _sel_descriptor1 = _registerName1("descriptor");
+  late final _sel_scriptingValueForSpecifier_1 =
+      _registerName1("scriptingValueForSpecifier:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_569(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> objectSpecifier,
+  ) {
+    return __objc_msgSend_569(
+      obj,
+      sel,
+      objectSpecifier,
+    );
+  }
+
+  late final __objc_msgSend_569Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_569 = __objc_msgSend_569Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_scriptingProperties1 = _registerName1("scriptingProperties");
+  late final _sel_setScriptingProperties_1 =
+      _registerName1("setScriptingProperties:");
+  late final _sel_copyScriptingValue_forKey_withProperties_1 =
+      _registerName1("copyScriptingValue:forKey:withProperties:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_570(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+    ffi.Pointer<ObjCObject> key,
+    ffi.Pointer<ObjCObject> properties,
+  ) {
+    return __objc_msgSend_570(
+      obj,
+      sel,
+      value,
+      key,
+      properties,
+    );
+  }
+
+  late final __objc_msgSend_570Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_570 = __objc_msgSend_570Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_newScriptingObjectOfClass_forValueForKey_withContentsValue_properties_1 =
+      _registerName1(
+          "newScriptingObjectOfClass:forValueForKey:withContentsValue:properties:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_571(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> objectClass,
+    ffi.Pointer<ObjCObject> key,
+    ffi.Pointer<ObjCObject> contentsValue,
+    ffi.Pointer<ObjCObject> properties,
+  ) {
+    return __objc_msgSend_571(
+      obj,
+      sel,
+      objectClass,
+      key,
+      contentsValue,
+      properties,
+    );
+  }
+
+  late final __objc_msgSend_571Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_571 = __objc_msgSend_571Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_classCode1 = _registerName1("classCode");
+  late final _sel_valueAtIndex_inPropertyWithKey_1 =
+      _registerName1("valueAtIndex:inPropertyWithKey:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_572(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int index,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_572(
+      obj,
+      sel,
+      index,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_572Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSUInteger,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_572 = __objc_msgSend_572Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_valueWithName_inPropertyWithKey_1 =
+      _registerName1("valueWithName:inPropertyWithKey:");
+  late final _sel_valueWithUniqueID_inPropertyWithKey_1 =
+      _registerName1("valueWithUniqueID:inPropertyWithKey:");
+  late final _sel_insertValue_atIndex_inPropertyWithKey_1 =
+      _registerName1("insertValue:atIndex:inPropertyWithKey:");
+  void _objc_msgSend_573(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+    int index,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_573(
+      obj,
+      sel,
+      value,
+      index,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_573Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSUInteger,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_573 = __objc_msgSend_573Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_removeValueAtIndex_fromPropertyWithKey_1 =
+      _registerName1("removeValueAtIndex:fromPropertyWithKey:");
+  void _objc_msgSend_574(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int index,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_574(
+      obj,
+      sel,
+      index,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_574Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSUInteger, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_574 = __objc_msgSend_574Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_replaceValueAtIndex_inPropertyWithKey_withValue_1 =
+      _registerName1("replaceValueAtIndex:inPropertyWithKey:withValue:");
+  void _objc_msgSend_575(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int index,
+    ffi.Pointer<ObjCObject> key,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_575(
+      obj,
+      sel,
+      index,
+      key,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_575Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSUInteger,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_575 = __objc_msgSend_575Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_insertValue_inPropertyWithKey_1 =
+      _registerName1("insertValue:inPropertyWithKey:");
+  late final _sel_coerceValue_forKey_1 = _registerName1("coerceValue:forKey:");
+  late final _sel_objectSpecifier1 = _registerName1("objectSpecifier");
+  late final _sel_indicesOfObjectsByEvaluatingObjectSpecifier_1 =
+      _registerName1("indicesOfObjectsByEvaluatingObjectSpecifier:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_576(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> specifier,
+  ) {
+    return __objc_msgSend_576(
+      obj,
+      sel,
+      specifier,
+    );
+  }
+
+  late final __objc_msgSend_576Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_576 = __objc_msgSend_576Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_isEqualTo_1 = _registerName1("isEqualTo:");
+  late final _sel_isLessThanOrEqualTo_1 =
+      _registerName1("isLessThanOrEqualTo:");
+  late final _sel_isLessThan_1 = _registerName1("isLessThan:");
+  late final _sel_isGreaterThanOrEqualTo_1 =
+      _registerName1("isGreaterThanOrEqualTo:");
+  late final _sel_isGreaterThan_1 = _registerName1("isGreaterThan:");
+  late final _sel_isNotEqualTo_1 = _registerName1("isNotEqualTo:");
+  late final _sel_doesContain_1 = _registerName1("doesContain:");
+  late final _sel_isLike_1 = _registerName1("isLike:");
+  late final _sel_isCaseInsensitiveLike_1 =
+      _registerName1("isCaseInsensitiveLike:");
+  late final _sel_scriptingIsEqualTo_1 = _registerName1("scriptingIsEqualTo:");
+  late final _sel_scriptingIsLessThanOrEqualTo_1 =
+      _registerName1("scriptingIsLessThanOrEqualTo:");
+  late final _sel_scriptingIsLessThan_1 =
+      _registerName1("scriptingIsLessThan:");
+  late final _sel_scriptingIsGreaterThanOrEqualTo_1 =
+      _registerName1("scriptingIsGreaterThanOrEqualTo:");
+  late final _sel_scriptingIsGreaterThan_1 =
+      _registerName1("scriptingIsGreaterThan:");
+  late final _sel_scriptingBeginsWith_1 =
+      _registerName1("scriptingBeginsWith:");
+  late final _sel_scriptingEndsWith_1 = _registerName1("scriptingEndsWith:");
+  late final _sel_scriptingContains_1 = _registerName1("scriptingContains:");
+  late final _class_NSItemProvider1 = _getClass1("NSItemProvider");
+  late final _class_NSProgress1 = _getClass1("NSProgress");
+  late final _sel_currentProgress1 = _registerName1("currentProgress");
+  ffi.Pointer<ObjCObject> _objc_msgSend_577(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_577(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_577Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_577 = __objc_msgSend_577Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_progressWithTotalUnitCount_1 =
+      _registerName1("progressWithTotalUnitCount:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_578(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int unitCount,
+  ) {
+    return __objc_msgSend_578(
+      obj,
+      sel,
+      unitCount,
+    );
+  }
+
+  late final __objc_msgSend_578Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Int64)>>('objc_msgSend');
+  late final __objc_msgSend_578 = __objc_msgSend_578Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_discreteProgressWithTotalUnitCount_1 =
+      _registerName1("discreteProgressWithTotalUnitCount:");
+  late final _sel_progressWithTotalUnitCount_parent_pendingUnitCount_1 =
+      _registerName1("progressWithTotalUnitCount:parent:pendingUnitCount:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_579(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int unitCount,
+    ffi.Pointer<ObjCObject> parent,
+    int portionOfParentTotalUnitCount,
+  ) {
+    return __objc_msgSend_579(
+      obj,
+      sel,
+      unitCount,
+      parent,
+      portionOfParentTotalUnitCount,
+    );
+  }
+
+  late final __objc_msgSend_579Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int64,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int64)>>('objc_msgSend');
+  late final __objc_msgSend_579 = __objc_msgSend_579Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_initWithParent_userInfo_1 =
+      _registerName1("initWithParent:userInfo:");
+  instancetype _objc_msgSend_580(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> parentProgressOrNil,
+  ) {
+    return __objc_msgSend_580(
+      obj,
+      sel,
+      parentProgressOrNil,
+    );
+  }
+
+  late final __objc_msgSend_580Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_580 = __objc_msgSend_580Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_becomeCurrentWithPendingUnitCount_1 =
+      _registerName1("becomeCurrentWithPendingUnitCount:");
+  void _objc_msgSend_581(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int unitCount,
+  ) {
+    return __objc_msgSend_581(
+      obj,
+      sel,
+      unitCount,
+    );
+  }
+
+  late final __objc_msgSend_581Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int64)>>('objc_msgSend');
+  late final __objc_msgSend_581 = __objc_msgSend_581Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_performAsCurrentWithPendingUnitCount_usingBlock_1 =
+      _registerName1("performAsCurrentWithPendingUnitCount:usingBlock:");
+  void _objc_msgSend_582(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int unitCount,
+    ffi.Pointer<_ObjCBlock> work,
+  ) {
+    return __objc_msgSend_582(
+      obj,
+      sel,
+      unitCount,
+      work,
+    );
+  }
+
+  late final __objc_msgSend_582Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int64, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_582 = __objc_msgSend_582Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_resignCurrent1 = _registerName1("resignCurrent");
+  late final _sel_addChild_withPendingUnitCount_1 =
+      _registerName1("addChild:withPendingUnitCount:");
+  void _objc_msgSend_583(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> child,
+    int inUnitCount,
+  ) {
+    return __objc_msgSend_583(
+      obj,
+      sel,
+      child,
+      inUnitCount,
+    );
+  }
+
+  late final __objc_msgSend_583Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Int64)>>('objc_msgSend');
+  late final __objc_msgSend_583 = __objc_msgSend_583Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_totalUnitCount1 = _registerName1("totalUnitCount");
+  int _objc_msgSend_584(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_584(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_584Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int64 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_584 = __objc_msgSend_584Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setTotalUnitCount_1 = _registerName1("setTotalUnitCount:");
+  void _objc_msgSend_585(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_585(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_585Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int64)>>('objc_msgSend');
+  late final __objc_msgSend_585 = __objc_msgSend_585Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_completedUnitCount1 = _registerName1("completedUnitCount");
+  late final _sel_setCompletedUnitCount_1 =
+      _registerName1("setCompletedUnitCount:");
+  late final _sel_localizedDescription1 =
+      _registerName1("localizedDescription");
+  late final _sel_setLocalizedDescription_1 =
+      _registerName1("setLocalizedDescription:");
+  late final _sel_localizedAdditionalDescription1 =
+      _registerName1("localizedAdditionalDescription");
+  late final _sel_setLocalizedAdditionalDescription_1 =
+      _registerName1("setLocalizedAdditionalDescription:");
+  late final _sel_isCancellable1 = _registerName1("isCancellable");
+  late final _sel_setCancellable_1 = _registerName1("setCancellable:");
+  late final _sel_isPausable1 = _registerName1("isPausable");
+  late final _sel_setPausable_1 = _registerName1("setPausable:");
+  late final _sel_isPaused1 = _registerName1("isPaused");
+  late final _sel_cancellationHandler1 = _registerName1("cancellationHandler");
+  ffi.Pointer<_ObjCBlock> _objc_msgSend_586(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_586(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_586Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<_ObjCBlock> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_586 = __objc_msgSend_586Ptr.asFunction<
+      ffi.Pointer<_ObjCBlock> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setCancellationHandler_1 =
+      _registerName1("setCancellationHandler:");
+  void _objc_msgSend_587(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> value,
+  ) {
+    return __objc_msgSend_587(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_587Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_587 = __objc_msgSend_587Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_pausingHandler1 = _registerName1("pausingHandler");
+  late final _sel_setPausingHandler_1 = _registerName1("setPausingHandler:");
+  late final _sel_resumingHandler1 = _registerName1("resumingHandler");
+  late final _sel_setResumingHandler_1 = _registerName1("setResumingHandler:");
+  late final _sel_setUserInfoObject_forKey_1 =
+      _registerName1("setUserInfoObject:forKey:");
+  late final _sel_isIndeterminate1 = _registerName1("isIndeterminate");
+  late final _sel_fractionCompleted1 = _registerName1("fractionCompleted");
+  late final _sel_pause1 = _registerName1("pause");
+  late final _sel_resume1 = _registerName1("resume");
+  late final _sel_registerDataRepresentationForTypeIdentifier_visibility_loadHandler_1 =
+      _registerName1(
+          "registerDataRepresentationForTypeIdentifier:visibility:loadHandler:");
+  void _objc_msgSend_588(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> typeIdentifier,
+    int visibility,
+    ffi.Pointer<_ObjCBlock> loadHandler,
+  ) {
+    return __objc_msgSend_588(
+      obj,
+      sel,
+      typeIdentifier,
+      visibility,
+      loadHandler,
+    );
+  }
+
+  late final __objc_msgSend_588Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_588 = __objc_msgSend_588Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_registerFileRepresentationForTypeIdentifier_fileOptions_visibility_loadHandler_1 =
+      _registerName1(
+          "registerFileRepresentationForTypeIdentifier:fileOptions:visibility:loadHandler:");
+  void _objc_msgSend_589(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> typeIdentifier,
+    int fileOptions,
+    int visibility,
+    ffi.Pointer<_ObjCBlock> loadHandler,
+  ) {
+    return __objc_msgSend_589(
+      obj,
+      sel,
+      typeIdentifier,
+      fileOptions,
+      visibility,
+      loadHandler,
+    );
+  }
+
+  late final __objc_msgSend_589Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Int32,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_589 = __objc_msgSend_589Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, int, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_registeredTypeIdentifiers1 =
+      _registerName1("registeredTypeIdentifiers");
+  late final _sel_registeredTypeIdentifiersWithFileOptions_1 =
+      _registerName1("registeredTypeIdentifiersWithFileOptions:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_590(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int fileOptions,
+  ) {
+    return __objc_msgSend_590(
+      obj,
+      sel,
+      fileOptions,
+    );
+  }
+
+  late final __objc_msgSend_590Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_590 = __objc_msgSend_590Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_hasItemConformingToTypeIdentifier_1 =
+      _registerName1("hasItemConformingToTypeIdentifier:");
+  late final _sel_hasRepresentationConformingToTypeIdentifier_fileOptions_1 =
+      _registerName1(
+          "hasRepresentationConformingToTypeIdentifier:fileOptions:");
+  bool _objc_msgSend_591(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> typeIdentifier,
+    int fileOptions,
+  ) {
+    return __objc_msgSend_591(
+      obj,
+      sel,
+      typeIdentifier,
+      fileOptions,
+    );
+  }
+
+  late final __objc_msgSend_591Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_591 = __objc_msgSend_591Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_loadDataRepresentationForTypeIdentifier_completionHandler_1 =
+      _registerName1(
+          "loadDataRepresentationForTypeIdentifier:completionHandler:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_592(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> typeIdentifier,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_592(
+      obj,
+      sel,
+      typeIdentifier,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_592Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_592 = __objc_msgSend_592Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_loadFileRepresentationForTypeIdentifier_completionHandler_1 =
+      _registerName1(
+          "loadFileRepresentationForTypeIdentifier:completionHandler:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_593(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> typeIdentifier,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_593(
+      obj,
+      sel,
+      typeIdentifier,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_593Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_593 = __objc_msgSend_593Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_loadInPlaceFileRepresentationForTypeIdentifier_completionHandler_1 =
+      _registerName1(
+          "loadInPlaceFileRepresentationForTypeIdentifier:completionHandler:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_594(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> typeIdentifier,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_594(
+      obj,
+      sel,
+      typeIdentifier,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_594Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_594 = __objc_msgSend_594Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_suggestedName1 = _registerName1("suggestedName");
+  late final _sel_setSuggestedName_1 = _registerName1("setSuggestedName:");
+  late final _sel_registerObject_visibility_1 =
+      _registerName1("registerObject:visibility:");
+  void _objc_msgSend_595(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> object,
+    int visibility,
+  ) {
+    return __objc_msgSend_595(
+      obj,
+      sel,
+      object,
+      visibility,
+    );
+  }
+
+  late final __objc_msgSend_595Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_595 = __objc_msgSend_595Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_registerObjectOfClass_visibility_loadHandler_1 =
+      _registerName1("registerObjectOfClass:visibility:loadHandler:");
+  void _objc_msgSend_596(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> aClass,
+    int visibility,
+    ffi.Pointer<_ObjCBlock> loadHandler,
+  ) {
+    return __objc_msgSend_596(
+      obj,
+      sel,
+      aClass,
+      visibility,
+      loadHandler,
+    );
+  }
+
+  late final __objc_msgSend_596Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_596 = __objc_msgSend_596Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_canLoadObjectOfClass_1 =
+      _registerName1("canLoadObjectOfClass:");
+  late final _sel_loadObjectOfClass_completionHandler_1 =
+      _registerName1("loadObjectOfClass:completionHandler:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_597(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> aClass,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_597(
+      obj,
+      sel,
+      aClass,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_597Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_597 = __objc_msgSend_597Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_initWithItem_typeIdentifier_1 =
+      _registerName1("initWithItem:typeIdentifier:");
+  late final _sel_registerItemForTypeIdentifier_loadHandler_1 =
+      _registerName1("registerItemForTypeIdentifier:loadHandler:");
+  void _objc_msgSend_598(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> typeIdentifier,
+    NSItemProviderLoadHandler loadHandler,
+  ) {
+    return __objc_msgSend_598(
+      obj,
+      sel,
+      typeIdentifier,
+      loadHandler,
+    );
+  }
+
+  late final __objc_msgSend_598Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSItemProviderLoadHandler)>>('objc_msgSend');
+  late final __objc_msgSend_598 = __objc_msgSend_598Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, NSItemProviderLoadHandler)>();
+
+  late final _sel_loadItemForTypeIdentifier_options_completionHandler_1 =
+      _registerName1("loadItemForTypeIdentifier:options:completionHandler:");
+  void _objc_msgSend_599(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> typeIdentifier,
+    ffi.Pointer<ObjCObject> options,
+    NSItemProviderCompletionHandler completionHandler,
+  ) {
+    return __objc_msgSend_599(
+      obj,
+      sel,
+      typeIdentifier,
+      options,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_599Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              NSItemProviderCompletionHandler)>>('objc_msgSend');
+  late final __objc_msgSend_599 = __objc_msgSend_599Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          NSItemProviderCompletionHandler)>();
+
+  late final _sel_previewImageHandler1 = _registerName1("previewImageHandler");
+  NSItemProviderLoadHandler _objc_msgSend_600(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_600(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_600Ptr = _lookup<
+      ffi.NativeFunction<
+          NSItemProviderLoadHandler Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_600 = __objc_msgSend_600Ptr.asFunction<
+      NSItemProviderLoadHandler Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setPreviewImageHandler_1 =
+      _registerName1("setPreviewImageHandler:");
+  void _objc_msgSend_601(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSItemProviderLoadHandler value,
+  ) {
+    return __objc_msgSend_601(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_601Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSItemProviderLoadHandler)>>('objc_msgSend');
+  late final __objc_msgSend_601 = __objc_msgSend_601Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          NSItemProviderLoadHandler)>();
+
+  late final _sel_loadPreviewImageWithOptions_completionHandler_1 =
+      _registerName1("loadPreviewImageWithOptions:completionHandler:");
+  void _objc_msgSend_602(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> options,
+    NSItemProviderCompletionHandler completionHandler,
+  ) {
+    return __objc_msgSend_602(
+      obj,
+      sel,
+      options,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_602Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSItemProviderCompletionHandler)>>('objc_msgSend');
+  late final __objc_msgSend_602 = __objc_msgSend_602Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, NSItemProviderCompletionHandler)>();
+
+  late final _class_NSMutableString1 = _getClass1("NSMutableString");
+  late final _sel_replaceCharactersInRange_withString_1 =
+      _registerName1("replaceCharactersInRange:withString:");
+  void _objc_msgSend_603(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    ffi.Pointer<ObjCObject> aString,
+  ) {
+    return __objc_msgSend_603(
+      obj,
+      sel,
+      range,
+      aString,
+    );
+  }
+
+  late final __objc_msgSend_603Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRange, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_603 = __objc_msgSend_603Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_insertString_atIndex_1 =
+      _registerName1("insertString:atIndex:");
+  void _objc_msgSend_604(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> aString,
+    int loc,
+  ) {
+    return __objc_msgSend_604(
+      obj,
+      sel,
+      aString,
+      loc,
+    );
+  }
+
+  late final __objc_msgSend_604Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_604 = __objc_msgSend_604Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_deleteCharactersInRange_1 =
+      _registerName1("deleteCharactersInRange:");
+  late final _sel_appendString_1 = _registerName1("appendString:");
+  late final _sel_appendFormat_1 = _registerName1("appendFormat:");
+  late final _sel_setString_1 = _registerName1("setString:");
+  late final _sel_replaceOccurrencesOfString_withString_options_range_1 =
+      _registerName1("replaceOccurrencesOfString:withString:options:range:");
+  int _objc_msgSend_605(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> target,
+    ffi.Pointer<ObjCObject> replacement,
+    int options,
+    NSRange searchRange,
+  ) {
+    return __objc_msgSend_605(
+      obj,
+      sel,
+      target,
+      replacement,
+      options,
+      searchRange,
+    );
+  }
+
+  late final __objc_msgSend_605Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_605 = __objc_msgSend_605Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>, int, NSRange)>();
+
+  late final _sel_applyTransform_reverse_range_updatedRange_1 =
+      _registerName1("applyTransform:reverse:range:updatedRange:");
+  bool _objc_msgSend_606(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSStringTransform transform,
+    bool reverse,
+    NSRange range,
+    NSRangePointer resultingRange,
+  ) {
+    return __objc_msgSend_606(
+      obj,
+      sel,
+      transform,
+      reverse,
+      range,
+      resultingRange,
+    );
+  }
+
+  late final __objc_msgSend_606Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSStringTransform,
+              ffi.Bool,
+              NSRange,
+              NSRangePointer)>>('objc_msgSend');
+  late final __objc_msgSend_606 = __objc_msgSend_606Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          NSStringTransform, bool, NSRange, NSRangePointer)>();
+
+  ffi.Pointer<ObjCObject> _objc_msgSend_607(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int capacity,
+  ) {
+    return __objc_msgSend_607(
+      obj,
+      sel,
+      capacity,
+    );
+  }
+
+  late final __objc_msgSend_607Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_607 = __objc_msgSend_607Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_stringWithCapacity_1 = _registerName1("stringWithCapacity:");
+  late final _class_NSNotification1 = _getClass1("NSNotification");
+  late final _sel_object1 = _registerName1("object");
+  late final _sel_initWithName_object_userInfo_1 =
+      _registerName1("initWithName:object:userInfo:");
+  instancetype _objc_msgSend_608(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSNotificationName name,
+    ffi.Pointer<ObjCObject> object,
+    ffi.Pointer<ObjCObject> userInfo,
+  ) {
+    return __objc_msgSend_608(
+      obj,
+      sel,
+      name,
+      object,
+      userInfo,
+    );
+  }
+
+  late final __objc_msgSend_608Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSNotificationName,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_608 = __objc_msgSend_608Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          NSNotificationName,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_notificationWithName_object_1 =
+      _registerName1("notificationWithName:object:");
+  late final _sel_notificationWithName_object_userInfo_1 =
+      _registerName1("notificationWithName:object:userInfo:");
+  late final _class_NSBundle1 = _getClass1("NSBundle");
+  late final _sel_mainBundle1 = _registerName1("mainBundle");
+  ffi.Pointer<ObjCObject> _objc_msgSend_609(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_609(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_609Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_609 = __objc_msgSend_609Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_bundleWithPath_1 = _registerName1("bundleWithPath:");
+  late final _sel_initWithPath_1 = _registerName1("initWithPath:");
+  late final _sel_bundleWithURL_1 = _registerName1("bundleWithURL:");
+  late final _sel_initWithURL_1 = _registerName1("initWithURL:");
+  late final _sel_bundleForClass_1 = _registerName1("bundleForClass:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_610(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> aClass,
+  ) {
+    return __objc_msgSend_610(
+      obj,
+      sel,
+      aClass,
+    );
+  }
+
+  late final __objc_msgSend_610Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_610 = __objc_msgSend_610Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_bundleWithIdentifier_1 =
+      _registerName1("bundleWithIdentifier:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_611(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> identifier,
+  ) {
+    return __objc_msgSend_611(
+      obj,
+      sel,
+      identifier,
+    );
+  }
+
+  late final __objc_msgSend_611Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_611 = __objc_msgSend_611Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_allBundles1 = _registerName1("allBundles");
+  late final _sel_allFrameworks1 = _registerName1("allFrameworks");
+  late final _sel_isLoaded1 = _registerName1("isLoaded");
+  late final _sel_unload1 = _registerName1("unload");
+  late final _sel_preflightAndReturnError_1 =
+      _registerName1("preflightAndReturnError:");
+  late final _sel_loadAndReturnError_1 = _registerName1("loadAndReturnError:");
+  late final _sel_bundleURL1 = _registerName1("bundleURL");
+  late final _sel_resourceURL1 = _registerName1("resourceURL");
+  late final _sel_executableURL1 = _registerName1("executableURL");
+  late final _sel_URLForAuxiliaryExecutable_1 =
+      _registerName1("URLForAuxiliaryExecutable:");
+  late final _sel_privateFrameworksURL1 =
+      _registerName1("privateFrameworksURL");
+  late final _sel_sharedFrameworksURL1 = _registerName1("sharedFrameworksURL");
+  late final _sel_sharedSupportURL1 = _registerName1("sharedSupportURL");
+  late final _sel_builtInPlugInsURL1 = _registerName1("builtInPlugInsURL");
+  late final _sel_appStoreReceiptURL1 = _registerName1("appStoreReceiptURL");
+  late final _sel_bundlePath1 = _registerName1("bundlePath");
+  late final _sel_resourcePath1 = _registerName1("resourcePath");
+  late final _sel_executablePath1 = _registerName1("executablePath");
+  late final _sel_pathForAuxiliaryExecutable_1 =
+      _registerName1("pathForAuxiliaryExecutable:");
+  late final _sel_privateFrameworksPath1 =
+      _registerName1("privateFrameworksPath");
+  late final _sel_sharedFrameworksPath1 =
+      _registerName1("sharedFrameworksPath");
+  late final _sel_sharedSupportPath1 = _registerName1("sharedSupportPath");
+  late final _sel_builtInPlugInsPath1 = _registerName1("builtInPlugInsPath");
+  late final _sel_URLForResource_withExtension_subdirectory_inBundleWithURL_1 =
+      _registerName1(
+          "URLForResource:withExtension:subdirectory:inBundleWithURL:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_612(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> name,
+    ffi.Pointer<ObjCObject> ext,
+    ffi.Pointer<ObjCObject> subpath,
+    ffi.Pointer<ObjCObject> bundleURL,
+  ) {
+    return __objc_msgSend_612(
+      obj,
+      sel,
+      name,
+      ext,
+      subpath,
+      bundleURL,
+    );
+  }
+
+  late final __objc_msgSend_612Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_612 = __objc_msgSend_612Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_URLsForResourcesWithExtension_subdirectory_inBundleWithURL_1 =
+      _registerName1(
+          "URLsForResourcesWithExtension:subdirectory:inBundleWithURL:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_613(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> ext,
+    ffi.Pointer<ObjCObject> subpath,
+    ffi.Pointer<ObjCObject> bundleURL,
+  ) {
+    return __objc_msgSend_613(
+      obj,
+      sel,
+      ext,
+      subpath,
+      bundleURL,
+    );
+  }
+
+  late final __objc_msgSend_613Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_613 = __objc_msgSend_613Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_URLForResource_withExtension_1 =
+      _registerName1("URLForResource:withExtension:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_614(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> name,
+    ffi.Pointer<ObjCObject> ext,
+  ) {
+    return __objc_msgSend_614(
+      obj,
+      sel,
+      name,
+      ext,
+    );
+  }
+
+  late final __objc_msgSend_614Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_614 = __objc_msgSend_614Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_URLForResource_withExtension_subdirectory_1 =
+      _registerName1("URLForResource:withExtension:subdirectory:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_615(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> name,
+    ffi.Pointer<ObjCObject> ext,
+    ffi.Pointer<ObjCObject> subpath,
+  ) {
+    return __objc_msgSend_615(
+      obj,
+      sel,
+      name,
+      ext,
+      subpath,
+    );
+  }
+
+  late final __objc_msgSend_615Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_615 = __objc_msgSend_615Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_URLForResource_withExtension_subdirectory_localization_1 =
+      _registerName1("URLForResource:withExtension:subdirectory:localization:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_616(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> name,
+    ffi.Pointer<ObjCObject> ext,
+    ffi.Pointer<ObjCObject> subpath,
+    ffi.Pointer<ObjCObject> localizationName,
+  ) {
+    return __objc_msgSend_616(
+      obj,
+      sel,
+      name,
+      ext,
+      subpath,
+      localizationName,
+    );
+  }
+
+  late final __objc_msgSend_616Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_616 = __objc_msgSend_616Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_URLsForResourcesWithExtension_subdirectory_1 =
+      _registerName1("URLsForResourcesWithExtension:subdirectory:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_617(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> ext,
+    ffi.Pointer<ObjCObject> subpath,
+  ) {
+    return __objc_msgSend_617(
+      obj,
+      sel,
+      ext,
+      subpath,
+    );
+  }
+
+  late final __objc_msgSend_617Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_617 = __objc_msgSend_617Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_URLsForResourcesWithExtension_subdirectory_localization_1 =
+      _registerName1(
+          "URLsForResourcesWithExtension:subdirectory:localization:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_618(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> ext,
+    ffi.Pointer<ObjCObject> subpath,
+    ffi.Pointer<ObjCObject> localizationName,
+  ) {
+    return __objc_msgSend_618(
+      obj,
+      sel,
+      ext,
+      subpath,
+      localizationName,
+    );
+  }
+
+  late final __objc_msgSend_618Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_618 = __objc_msgSend_618Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_pathForResource_ofType_inDirectory_1 =
+      _registerName1("pathForResource:ofType:inDirectory:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_619(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> name,
+    ffi.Pointer<ObjCObject> ext,
+    ffi.Pointer<ObjCObject> bundlePath,
+  ) {
+    return __objc_msgSend_619(
+      obj,
+      sel,
+      name,
+      ext,
+      bundlePath,
+    );
+  }
+
+  late final __objc_msgSend_619Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_619 = __objc_msgSend_619Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_pathsForResourcesOfType_inDirectory_1 =
+      _registerName1("pathsForResourcesOfType:inDirectory:");
+  late final _sel_pathForResource_ofType_1 =
+      _registerName1("pathForResource:ofType:");
+  late final _sel_pathForResource_ofType_inDirectory_forLocalization_1 =
+      _registerName1("pathForResource:ofType:inDirectory:forLocalization:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_620(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> name,
+    ffi.Pointer<ObjCObject> ext,
+    ffi.Pointer<ObjCObject> subpath,
+    ffi.Pointer<ObjCObject> localizationName,
+  ) {
+    return __objc_msgSend_620(
+      obj,
+      sel,
+      name,
+      ext,
+      subpath,
+      localizationName,
+    );
+  }
+
+  late final __objc_msgSend_620Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_620 = __objc_msgSend_620Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_pathsForResourcesOfType_inDirectory_forLocalization_1 =
+      _registerName1("pathsForResourcesOfType:inDirectory:forLocalization:");
+  late final _sel_localizedStringForKey_value_table_1 =
+      _registerName1("localizedStringForKey:value:table:");
+  late final _class_NSAttributedString1 = _getClass1("NSAttributedString");
+  late final _sel_attributesAtIndex_effectiveRange_1 =
+      _registerName1("attributesAtIndex:effectiveRange:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_621(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int location,
+    NSRangePointer range,
+  ) {
+    return __objc_msgSend_621(
+      obj,
+      sel,
+      location,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_621Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSUInteger,
+              NSRangePointer)>>('objc_msgSend');
+  late final __objc_msgSend_621 = __objc_msgSend_621Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, NSRangePointer)>();
+
+  late final _sel_attribute_atIndex_effectiveRange_1 =
+      _registerName1("attribute:atIndex:effectiveRange:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_622(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSAttributedStringKey attrName,
+    int location,
+    NSRangePointer range,
+  ) {
+    return __objc_msgSend_622(
+      obj,
+      sel,
+      attrName,
+      location,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_622Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSAttributedStringKey,
+              NSUInteger,
+              NSRangePointer)>>('objc_msgSend');
+  late final __objc_msgSend_622 = __objc_msgSend_622Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, NSAttributedStringKey, int, NSRangePointer)>();
+
+  late final _sel_attributedSubstringFromRange_1 =
+      _registerName1("attributedSubstringFromRange:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_623(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+  ) {
+    return __objc_msgSend_623(
+      obj,
+      sel,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_623Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_623 = __objc_msgSend_623Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange)>();
+
+  late final _sel_attributesAtIndex_longestEffectiveRange_inRange_1 =
+      _registerName1("attributesAtIndex:longestEffectiveRange:inRange:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_624(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int location,
+    NSRangePointer range,
+    NSRange rangeLimit,
+  ) {
+    return __objc_msgSend_624(
+      obj,
+      sel,
+      location,
+      range,
+      rangeLimit,
+    );
+  }
+
+  late final __objc_msgSend_624Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSUInteger,
+              NSRangePointer,
+              NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_624 = __objc_msgSend_624Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, NSRangePointer, NSRange)>();
+
+  late final _sel_attribute_atIndex_longestEffectiveRange_inRange_1 =
+      _registerName1("attribute:atIndex:longestEffectiveRange:inRange:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_625(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSAttributedStringKey attrName,
+    int location,
+    NSRangePointer range,
+    NSRange rangeLimit,
+  ) {
+    return __objc_msgSend_625(
+      obj,
+      sel,
+      attrName,
+      location,
+      range,
+      rangeLimit,
+    );
+  }
+
+  late final __objc_msgSend_625Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSAttributedStringKey,
+              NSUInteger,
+              NSRangePointer,
+              NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_625 = __objc_msgSend_625Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          NSAttributedStringKey,
+          int,
+          NSRangePointer,
+          NSRange)>();
+
+  late final _sel_isEqualToAttributedString_1 =
+      _registerName1("isEqualToAttributedString:");
+  bool _objc_msgSend_626(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> other,
+  ) {
+    return __objc_msgSend_626(
+      obj,
+      sel,
+      other,
+    );
+  }
+
+  late final __objc_msgSend_626Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_626 = __objc_msgSend_626Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithString_attributes_1 =
+      _registerName1("initWithString:attributes:");
+  late final _sel_initWithAttributedString_1 =
+      _registerName1("initWithAttributedString:");
+  instancetype _objc_msgSend_627(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> attrStr,
+  ) {
+    return __objc_msgSend_627(
+      obj,
+      sel,
+      attrStr,
+    );
+  }
+
+  late final __objc_msgSend_627Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_627 = __objc_msgSend_627Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_enumerateAttributesInRange_options_usingBlock_1 =
+      _registerName1("enumerateAttributesInRange:options:usingBlock:");
+  void _objc_msgSend_628(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange enumerationRange,
+    int opts,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_628(
+      obj,
+      sel,
+      enumerationRange,
+      opts,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_628Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRange, ffi.Int32, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_628 = __objc_msgSend_628Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange, int,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_enumerateAttribute_inRange_options_usingBlock_1 =
+      _registerName1("enumerateAttribute:inRange:options:usingBlock:");
+  void _objc_msgSend_629(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSAttributedStringKey attrName,
+    NSRange enumerationRange,
+    int opts,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_629(
+      obj,
+      sel,
+      attrName,
+      enumerationRange,
+      opts,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_629Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSAttributedStringKey,
+              NSRange,
+              ffi.Int32,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_629 = __objc_msgSend_629Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          NSAttributedStringKey, NSRange, int, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _class_NSAttributedStringMarkdownParsingOptions1 =
+      _getClass1("NSAttributedStringMarkdownParsingOptions");
+  late final _sel_allowsExtendedAttributes1 =
+      _registerName1("allowsExtendedAttributes");
+  late final _sel_setAllowsExtendedAttributes_1 =
+      _registerName1("setAllowsExtendedAttributes:");
+  late final _sel_interpretedSyntax1 = _registerName1("interpretedSyntax");
+  int _objc_msgSend_630(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_630(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_630Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_630 = __objc_msgSend_630Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setInterpretedSyntax_1 =
+      _registerName1("setInterpretedSyntax:");
+  void _objc_msgSend_631(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_631(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_631Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_631 = __objc_msgSend_631Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_failurePolicy1 = _registerName1("failurePolicy");
+  int _objc_msgSend_632(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_632(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_632Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_632 = __objc_msgSend_632Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setFailurePolicy_1 = _registerName1("setFailurePolicy:");
+  void _objc_msgSend_633(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_633(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_633Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_633 = __objc_msgSend_633Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_setLanguageCode_1 = _registerName1("setLanguageCode:");
+  late final _sel_initWithContentsOfMarkdownFileAtURL_options_baseURL_error_1 =
+      _registerName1(
+          "initWithContentsOfMarkdownFileAtURL:options:baseURL:error:");
+  instancetype _objc_msgSend_634(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> markdownFile,
+    ffi.Pointer<ObjCObject> options,
+    ffi.Pointer<ObjCObject> baseURL,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_634(
+      obj,
+      sel,
+      markdownFile,
+      options,
+      baseURL,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_634Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_634 = __objc_msgSend_634Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_initWithMarkdown_options_baseURL_error_1 =
+      _registerName1("initWithMarkdown:options:baseURL:error:");
+  instancetype _objc_msgSend_635(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> markdown,
+    ffi.Pointer<ObjCObject> options,
+    ffi.Pointer<ObjCObject> baseURL,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_635(
+      obj,
+      sel,
+      markdown,
+      options,
+      baseURL,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_635Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_635 = __objc_msgSend_635Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_initWithMarkdownString_options_baseURL_error_1 =
+      _registerName1("initWithMarkdownString:options:baseURL:error:");
+  instancetype _objc_msgSend_636(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> markdownString,
+    ffi.Pointer<ObjCObject> options,
+    ffi.Pointer<ObjCObject> baseURL,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_636(
+      obj,
+      sel,
+      markdownString,
+      options,
+      baseURL,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_636Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_636 = __objc_msgSend_636Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_initWithFormat_options_locale_1 =
+      _registerName1("initWithFormat:options:locale:");
+  instancetype _objc_msgSend_637(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> format,
+    int options,
+    ffi.Pointer<ObjCObject> locale,
+  ) {
+    return __objc_msgSend_637(
+      obj,
+      sel,
+      format,
+      options,
+      locale,
+    );
+  }
+
+  late final __objc_msgSend_637Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_637 = __objc_msgSend_637Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithFormat_options_locale_arguments_1 =
+      _registerName1("initWithFormat:options:locale:arguments:");
+  instancetype _objc_msgSend_638(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> format,
+    int options,
+    ffi.Pointer<ObjCObject> locale,
+    ffi.Pointer<__va_list_tag> arguments,
+  ) {
+    return __objc_msgSend_638(
+      obj,
+      sel,
+      format,
+      options,
+      locale,
+      arguments,
+    );
+  }
+
+  late final __objc_msgSend_638Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<__va_list_tag>)>>('objc_msgSend');
+  late final __objc_msgSend_638 = __objc_msgSend_638Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<__va_list_tag>)>();
+
+  late final _sel_localizedAttributedStringWithFormat_1 =
+      _registerName1("localizedAttributedStringWithFormat:");
+  late final _sel_localizedAttributedStringWithFormat_options_1 =
+      _registerName1("localizedAttributedStringWithFormat:options:");
+  instancetype _objc_msgSend_639(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> format,
+    int options,
+  ) {
+    return __objc_msgSend_639(
+      obj,
+      sel,
+      format,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_639Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_639 = __objc_msgSend_639Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_attributedStringByInflectingString1 =
+      _registerName1("attributedStringByInflectingString");
+  ffi.Pointer<ObjCObject> _objc_msgSend_640(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_640(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_640Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_640 = __objc_msgSend_640Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_localizedAttributedStringForKey_value_table_1 =
+      _registerName1("localizedAttributedStringForKey:value:table:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_641(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+    ffi.Pointer<ObjCObject> value,
+    ffi.Pointer<ObjCObject> tableName,
+  ) {
+    return __objc_msgSend_641(
+      obj,
+      sel,
+      key,
+      value,
+      tableName,
+    );
+  }
+
+  late final __objc_msgSend_641Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_641 = __objc_msgSend_641Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_bundleIdentifier1 = _registerName1("bundleIdentifier");
+  late final _sel_infoDictionary1 = _registerName1("infoDictionary");
+  late final _sel_localizedInfoDictionary1 =
+      _registerName1("localizedInfoDictionary");
+  late final _sel_objectForInfoDictionaryKey_1 =
+      _registerName1("objectForInfoDictionaryKey:");
+  late final _sel_classNamed_1 = _registerName1("classNamed:");
+  late final _sel_principalClass1 = _registerName1("principalClass");
+  late final _sel_preferredLocalizations1 =
+      _registerName1("preferredLocalizations");
+  late final _sel_localizations1 = _registerName1("localizations");
+  late final _sel_developmentLocalization1 =
+      _registerName1("developmentLocalization");
+  late final _sel_preferredLocalizationsFromArray_1 =
+      _registerName1("preferredLocalizationsFromArray:");
+  late final _sel_preferredLocalizationsFromArray_forPreferences_1 =
+      _registerName1("preferredLocalizationsFromArray:forPreferences:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_642(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> localizationsArray,
+    ffi.Pointer<ObjCObject> preferencesArray,
+  ) {
+    return __objc_msgSend_642(
+      obj,
+      sel,
+      localizationsArray,
+      preferencesArray,
+    );
+  }
+
+  late final __objc_msgSend_642Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_642 = __objc_msgSend_642Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_executableArchitectures1 =
+      _registerName1("executableArchitectures");
+  late final _sel_setPreservationPriority_forTags_1 =
+      _registerName1("setPreservationPriority:forTags:");
+  void _objc_msgSend_643(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    double priority,
+    ffi.Pointer<ObjCObject> tags,
+  ) {
+    return __objc_msgSend_643(
+      obj,
+      sel,
+      priority,
+      tags,
+    );
+  }
+
+  late final __objc_msgSend_643Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Double, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_643 = __objc_msgSend_643Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, double,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_preservationPriorityForTag_1 =
+      _registerName1("preservationPriorityForTag:");
+  late final _class_NSMutableAttributedString1 =
+      _getClass1("NSMutableAttributedString");
+  late final _sel_setAttributes_range_1 =
+      _registerName1("setAttributes:range:");
+  void _objc_msgSend_644(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> attrs,
+    NSRange range,
+  ) {
+    return __objc_msgSend_644(
+      obj,
+      sel,
+      attrs,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_644Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_644 = __objc_msgSend_644Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, NSRange)>();
+
+  late final _sel_mutableString1 = _registerName1("mutableString");
+  ffi.Pointer<ObjCObject> _objc_msgSend_645(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_645(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_645Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_645 = __objc_msgSend_645Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_addAttribute_value_range_1 =
+      _registerName1("addAttribute:value:range:");
+  void _objc_msgSend_646(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSAttributedStringKey name,
+    ffi.Pointer<ObjCObject> value,
+    NSRange range,
+  ) {
+    return __objc_msgSend_646(
+      obj,
+      sel,
+      name,
+      value,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_646Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSAttributedStringKey,
+              ffi.Pointer<ObjCObject>,
+              NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_646 = __objc_msgSend_646Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          NSAttributedStringKey, ffi.Pointer<ObjCObject>, NSRange)>();
+
+  late final _sel_addAttributes_range_1 =
+      _registerName1("addAttributes:range:");
+  late final _sel_removeAttribute_range_1 =
+      _registerName1("removeAttribute:range:");
+  void _objc_msgSend_647(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSAttributedStringKey name,
+    NSRange range,
+  ) {
+    return __objc_msgSend_647(
+      obj,
+      sel,
+      name,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_647Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSAttributedStringKey, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_647 = __objc_msgSend_647Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          NSAttributedStringKey, NSRange)>();
+
+  late final _sel_replaceCharactersInRange_withAttributedString_1 =
+      _registerName1("replaceCharactersInRange:withAttributedString:");
+  void _objc_msgSend_648(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    ffi.Pointer<ObjCObject> attrString,
+  ) {
+    return __objc_msgSend_648(
+      obj,
+      sel,
+      range,
+      attrString,
+    );
+  }
+
+  late final __objc_msgSend_648Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRange, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_648 = __objc_msgSend_648Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_insertAttributedString_atIndex_1 =
+      _registerName1("insertAttributedString:atIndex:");
+  void _objc_msgSend_649(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> attrString,
+    int loc,
+  ) {
+    return __objc_msgSend_649(
+      obj,
+      sel,
+      attrString,
+      loc,
+    );
+  }
+
+  late final __objc_msgSend_649Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_649 = __objc_msgSend_649Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_appendAttributedString_1 =
+      _registerName1("appendAttributedString:");
+  void _objc_msgSend_650(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> attrString,
+  ) {
+    return __objc_msgSend_650(
+      obj,
+      sel,
+      attrString,
+    );
+  }
+
+  late final __objc_msgSend_650Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_650 = __objc_msgSend_650Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_setAttributedString_1 =
+      _registerName1("setAttributedString:");
+  late final _sel_beginEditing1 = _registerName1("beginEditing");
+  late final _sel_endEditing1 = _registerName1("endEditing");
+  late final _sel_appendLocalizedFormat_1 =
+      _registerName1("appendLocalizedFormat:");
+  late final _class_NSDateFormatter1 = _getClass1("NSDateFormatter");
+  late final _class_NSFormatter1 = _getClass1("NSFormatter");
+  late final _sel_stringForObjectValue_1 =
+      _registerName1("stringForObjectValue:");
+  late final _sel_attributedStringForObjectValue_withDefaultAttributes_1 =
+      _registerName1("attributedStringForObjectValue:withDefaultAttributes:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_651(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> obj1,
+    ffi.Pointer<ObjCObject> attrs,
+  ) {
+    return __objc_msgSend_651(
+      obj,
+      sel,
+      obj1,
+      attrs,
+    );
+  }
+
+  late final __objc_msgSend_651Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_651 = __objc_msgSend_651Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_editingStringForObjectValue_1 =
+      _registerName1("editingStringForObjectValue:");
+  late final _sel_getObjectValue_forString_errorDescription_1 =
+      _registerName1("getObjectValue:forString:errorDescription:");
+  bool _objc_msgSend_652(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> obj1,
+    ffi.Pointer<ObjCObject> string,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_652(
+      obj,
+      sel,
+      obj1,
+      string,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_652Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_652 = __objc_msgSend_652Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_isPartialStringValid_newEditingString_errorDescription_1 =
+      _registerName1("isPartialStringValid:newEditingString:errorDescription:");
+  bool _objc_msgSend_653(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> partialString,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> newString,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_653(
+      obj,
+      sel,
+      partialString,
+      newString,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_653Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_653 = __objc_msgSend_653Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_isPartialStringValid_proposedSelectedRange_originalString_originalSelectedRange_errorDescription_1 =
+      _registerName1(
+          "isPartialStringValid:proposedSelectedRange:originalString:originalSelectedRange:errorDescription:");
+  bool _objc_msgSend_654(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> partialStringPtr,
+    NSRangePointer proposedSelRangePtr,
+    ffi.Pointer<ObjCObject> origString,
+    NSRange origSelRange,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_654(
+      obj,
+      sel,
+      partialStringPtr,
+      proposedSelRangePtr,
+      origString,
+      origSelRange,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_654Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              NSRangePointer,
+              ffi.Pointer<ObjCObject>,
+              NSRange,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_654 = __objc_msgSend_654Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          NSRangePointer,
+          ffi.Pointer<ObjCObject>,
+          NSRange,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_formattingContext1 = _registerName1("formattingContext");
+  int _objc_msgSend_655(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_655(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_655Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_655 = __objc_msgSend_655Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setFormattingContext_1 =
+      _registerName1("setFormattingContext:");
+  void _objc_msgSend_656(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_656(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_656Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_656 = __objc_msgSend_656Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_getObjectValue_forString_range_error_1 =
+      _registerName1("getObjectValue:forString:range:error:");
+  bool _objc_msgSend_657(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> obj1,
+    ffi.Pointer<ObjCObject> string,
+    ffi.Pointer<NSRange> rangep,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_657(
+      obj,
+      sel,
+      obj1,
+      string,
+      rangep,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_657Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<NSRange>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_657 = __objc_msgSend_657Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<NSRange>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_stringFromDate_1 = _registerName1("stringFromDate:");
+  late final _sel_dateFromString_1 = _registerName1("dateFromString:");
+  late final _sel_localizedStringFromDate_dateStyle_timeStyle_1 =
+      _registerName1("localizedStringFromDate:dateStyle:timeStyle:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_658(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> date,
+    int dstyle,
+    int tstyle,
+  ) {
+    return __objc_msgSend_658(
+      obj,
+      sel,
+      date,
+      dstyle,
+      tstyle,
+    );
+  }
+
+  late final __objc_msgSend_658Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_658 = __objc_msgSend_658Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>, int, int)>();
+
+  late final _sel_dateFormatFromTemplate_options_locale_1 =
+      _registerName1("dateFormatFromTemplate:options:locale:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_659(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> tmplate,
+    int opts,
+    ffi.Pointer<ObjCObject> locale,
+  ) {
+    return __objc_msgSend_659(
+      obj,
+      sel,
+      tmplate,
+      opts,
+      locale,
+    );
+  }
+
+  late final __objc_msgSend_659Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSUInteger,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_659 = __objc_msgSend_659Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_defaultFormatterBehavior1 =
+      _registerName1("defaultFormatterBehavior");
+  int _objc_msgSend_660(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_660(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_660Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_660 = __objc_msgSend_660Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setDefaultFormatterBehavior_1 =
+      _registerName1("setDefaultFormatterBehavior:");
+  void _objc_msgSend_661(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_661(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_661Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_661 = __objc_msgSend_661Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_setLocalizedDateFormatFromTemplate_1 =
+      _registerName1("setLocalizedDateFormatFromTemplate:");
+  late final _sel_dateFormat1 = _registerName1("dateFormat");
+  late final _sel_setDateFormat_1 = _registerName1("setDateFormat:");
+  late final _sel_dateStyle1 = _registerName1("dateStyle");
+  int _objc_msgSend_662(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_662(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_662Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_662 = __objc_msgSend_662Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setDateStyle_1 = _registerName1("setDateStyle:");
+  void _objc_msgSend_663(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_663(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_663Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_663 = __objc_msgSend_663Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_timeStyle1 = _registerName1("timeStyle");
+  late final _sel_setTimeStyle_1 = _registerName1("setTimeStyle:");
+  late final _sel_locale1 = _registerName1("locale");
+  late final _sel_setLocale_1 = _registerName1("setLocale:");
+  void _objc_msgSend_664(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_664(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_664Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_664 = __objc_msgSend_664Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_generatesCalendarDates1 =
+      _registerName1("generatesCalendarDates");
+  late final _sel_setGeneratesCalendarDates_1 =
+      _registerName1("setGeneratesCalendarDates:");
+  late final _sel_formatterBehavior1 = _registerName1("formatterBehavior");
+  late final _sel_setFormatterBehavior_1 =
+      _registerName1("setFormatterBehavior:");
+  late final _class_NSCalendar1 = _getClass1("NSCalendar");
+  late final _sel_currentCalendar1 = _registerName1("currentCalendar");
+  ffi.Pointer<ObjCObject> _objc_msgSend_665(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_665(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_665Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_665 = __objc_msgSend_665Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_autoupdatingCurrentCalendar1 =
+      _registerName1("autoupdatingCurrentCalendar");
+  late final _sel_calendarWithIdentifier_1 =
+      _registerName1("calendarWithIdentifier:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_666(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSCalendarIdentifier calendarIdentifierConstant,
+  ) {
+    return __objc_msgSend_666(
+      obj,
+      sel,
+      calendarIdentifierConstant,
+    );
+  }
+
+  late final __objc_msgSend_666Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSCalendarIdentifier)>>('objc_msgSend');
+  late final __objc_msgSend_666 = __objc_msgSend_666Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, NSCalendarIdentifier)>();
+
+  late final _sel_initWithCalendarIdentifier_1 =
+      _registerName1("initWithCalendarIdentifier:");
+  late final _sel_firstWeekday1 = _registerName1("firstWeekday");
+  late final _sel_setFirstWeekday_1 = _registerName1("setFirstWeekday:");
+  late final _sel_minimumDaysInFirstWeek1 =
+      _registerName1("minimumDaysInFirstWeek");
+  late final _sel_setMinimumDaysInFirstWeek_1 =
+      _registerName1("setMinimumDaysInFirstWeek:");
+  late final _sel_eraSymbols1 = _registerName1("eraSymbols");
+  late final _sel_longEraSymbols1 = _registerName1("longEraSymbols");
+  late final _sel_monthSymbols1 = _registerName1("monthSymbols");
+  late final _sel_shortMonthSymbols1 = _registerName1("shortMonthSymbols");
+  late final _sel_veryShortMonthSymbols1 =
+      _registerName1("veryShortMonthSymbols");
+  late final _sel_standaloneMonthSymbols1 =
+      _registerName1("standaloneMonthSymbols");
+  late final _sel_shortStandaloneMonthSymbols1 =
+      _registerName1("shortStandaloneMonthSymbols");
+  late final _sel_veryShortStandaloneMonthSymbols1 =
+      _registerName1("veryShortStandaloneMonthSymbols");
+  late final _sel_weekdaySymbols1 = _registerName1("weekdaySymbols");
+  late final _sel_shortWeekdaySymbols1 = _registerName1("shortWeekdaySymbols");
+  late final _sel_veryShortWeekdaySymbols1 =
+      _registerName1("veryShortWeekdaySymbols");
+  late final _sel_standaloneWeekdaySymbols1 =
+      _registerName1("standaloneWeekdaySymbols");
+  late final _sel_shortStandaloneWeekdaySymbols1 =
+      _registerName1("shortStandaloneWeekdaySymbols");
+  late final _sel_veryShortStandaloneWeekdaySymbols1 =
+      _registerName1("veryShortStandaloneWeekdaySymbols");
+  late final _sel_quarterSymbols1 = _registerName1("quarterSymbols");
+  late final _sel_shortQuarterSymbols1 = _registerName1("shortQuarterSymbols");
+  late final _sel_standaloneQuarterSymbols1 =
+      _registerName1("standaloneQuarterSymbols");
+  late final _sel_shortStandaloneQuarterSymbols1 =
+      _registerName1("shortStandaloneQuarterSymbols");
+  late final _sel_AMSymbol1 = _registerName1("AMSymbol");
+  late final _sel_PMSymbol1 = _registerName1("PMSymbol");
+  late final _sel_minimumRangeOfUnit_1 = _registerName1("minimumRangeOfUnit:");
+  NSRange _objc_msgSend_667(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int unit,
+  ) {
+    return __objc_msgSend_667(
+      obj,
+      sel,
+      unit,
+    );
+  }
+
+  late final __objc_msgSend_667Ptr = _lookup<
+      ffi.NativeFunction<
+          NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_667 = __objc_msgSend_667Ptr.asFunction<
+      NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_maximumRangeOfUnit_1 = _registerName1("maximumRangeOfUnit:");
+  late final _sel_rangeOfUnit_inUnit_forDate_1 =
+      _registerName1("rangeOfUnit:inUnit:forDate:");
+  NSRange _objc_msgSend_668(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int smaller,
+    int larger,
+    ffi.Pointer<ObjCObject> date,
+  ) {
+    return __objc_msgSend_668(
+      obj,
+      sel,
+      smaller,
+      larger,
+      date,
+    );
+  }
+
+  late final __objc_msgSend_668Ptr = _lookup<
+      ffi.NativeFunction<
+          NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32, ffi.Int32, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_668 = __objc_msgSend_668Ptr.asFunction<
+      NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int, int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_ordinalityOfUnit_inUnit_forDate_1 =
+      _registerName1("ordinalityOfUnit:inUnit:forDate:");
+  int _objc_msgSend_669(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int smaller,
+    int larger,
+    ffi.Pointer<ObjCObject> date,
+  ) {
+    return __objc_msgSend_669(
+      obj,
+      sel,
+      smaller,
+      larger,
+      date,
+    );
+  }
+
+  late final __objc_msgSend_669Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32, ffi.Int32, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_669 = __objc_msgSend_669Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int, int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_rangeOfUnit_startDate_interval_forDate_1 =
+      _registerName1("rangeOfUnit:startDate:interval:forDate:");
+  bool _objc_msgSend_670(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int unit,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> datep,
+    ffi.Pointer<NSTimeInterval> tip,
+    ffi.Pointer<ObjCObject> date,
+  ) {
+    return __objc_msgSend_670(
+      obj,
+      sel,
+      unit,
+      datep,
+      tip,
+      date,
+    );
+  }
+
+  late final __objc_msgSend_670Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Pointer<NSTimeInterval>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_670 = __objc_msgSend_670Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          ffi.Pointer<NSTimeInterval>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSDateComponents1 = _getClass1("NSDateComponents");
+  late final _sel_calendar1 = _registerName1("calendar");
+  late final _sel_setCalendar_1 = _registerName1("setCalendar:");
+  void _objc_msgSend_671(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_671(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_671Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_671 = __objc_msgSend_671Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_era1 = _registerName1("era");
+  late final _sel_setEra_1 = _registerName1("setEra:");
+  late final _sel_year1 = _registerName1("year");
+  late final _sel_setYear_1 = _registerName1("setYear:");
+  late final _sel_month1 = _registerName1("month");
+  late final _sel_setMonth_1 = _registerName1("setMonth:");
+  late final _sel_day1 = _registerName1("day");
+  late final _sel_setDay_1 = _registerName1("setDay:");
+  late final _sel_hour1 = _registerName1("hour");
+  late final _sel_setHour_1 = _registerName1("setHour:");
+  late final _sel_minute1 = _registerName1("minute");
+  late final _sel_setMinute_1 = _registerName1("setMinute:");
+  late final _sel_second1 = _registerName1("second");
+  late final _sel_setSecond_1 = _registerName1("setSecond:");
+  late final _sel_nanosecond1 = _registerName1("nanosecond");
+  late final _sel_setNanosecond_1 = _registerName1("setNanosecond:");
+  late final _sel_weekday1 = _registerName1("weekday");
+  late final _sel_setWeekday_1 = _registerName1("setWeekday:");
+  late final _sel_weekdayOrdinal1 = _registerName1("weekdayOrdinal");
+  late final _sel_setWeekdayOrdinal_1 = _registerName1("setWeekdayOrdinal:");
+  late final _sel_quarter1 = _registerName1("quarter");
+  late final _sel_setQuarter_1 = _registerName1("setQuarter:");
+  late final _sel_weekOfMonth1 = _registerName1("weekOfMonth");
+  late final _sel_setWeekOfMonth_1 = _registerName1("setWeekOfMonth:");
+  late final _sel_weekOfYear1 = _registerName1("weekOfYear");
+  late final _sel_setWeekOfYear_1 = _registerName1("setWeekOfYear:");
+  late final _sel_yearForWeekOfYear1 = _registerName1("yearForWeekOfYear");
+  late final _sel_setYearForWeekOfYear_1 =
+      _registerName1("setYearForWeekOfYear:");
+  late final _sel_isLeapMonth1 = _registerName1("isLeapMonth");
+  late final _sel_setLeapMonth_1 = _registerName1("setLeapMonth:");
+  late final _sel_week1 = _registerName1("week");
+  late final _sel_setWeek_1 = _registerName1("setWeek:");
+  late final _sel_setValue_forComponent_1 =
+      _registerName1("setValue:forComponent:");
+  void _objc_msgSend_672(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+    int unit,
+  ) {
+    return __objc_msgSend_672(
+      obj,
+      sel,
+      value,
+      unit,
+    );
+  }
+
+  late final __objc_msgSend_672Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSInteger, ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_672 = __objc_msgSend_672Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int, int)>();
+
+  late final _sel_valueForComponent_1 = _registerName1("valueForComponent:");
+  int _objc_msgSend_673(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int unit,
+  ) {
+    return __objc_msgSend_673(
+      obj,
+      sel,
+      unit,
+    );
+  }
+
+  late final __objc_msgSend_673Ptr = _lookup<
+      ffi.NativeFunction<
+          NSInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_673 = __objc_msgSend_673Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_isValidDate1 = _registerName1("isValidDate");
+  late final _sel_isValidDateInCalendar_1 =
+      _registerName1("isValidDateInCalendar:");
+  bool _objc_msgSend_674(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> calendar,
+  ) {
+    return __objc_msgSend_674(
+      obj,
+      sel,
+      calendar,
+    );
+  }
+
+  late final __objc_msgSend_674Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_674 = __objc_msgSend_674Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dateFromComponents_1 = _registerName1("dateFromComponents:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_675(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> comps,
+  ) {
+    return __objc_msgSend_675(
+      obj,
+      sel,
+      comps,
+    );
+  }
+
+  late final __objc_msgSend_675Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_675 = __objc_msgSend_675Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_components_fromDate_1 =
+      _registerName1("components:fromDate:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_676(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int unitFlags,
+    ffi.Pointer<ObjCObject> date,
+  ) {
+    return __objc_msgSend_676(
+      obj,
+      sel,
+      unitFlags,
+      date,
+    );
+  }
+
+  late final __objc_msgSend_676Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_676 = __objc_msgSend_676Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dateByAddingComponents_toDate_options_1 =
+      _registerName1("dateByAddingComponents:toDate:options:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_677(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> comps,
+    ffi.Pointer<ObjCObject> date,
+    int opts,
+  ) {
+    return __objc_msgSend_677(
+      obj,
+      sel,
+      comps,
+      date,
+      opts,
+    );
+  }
+
+  late final __objc_msgSend_677Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_677 = __objc_msgSend_677Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          int)>();
+
+  late final _sel_components_fromDate_toDate_options_1 =
+      _registerName1("components:fromDate:toDate:options:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_678(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int unitFlags,
+    ffi.Pointer<ObjCObject> startingDate,
+    ffi.Pointer<ObjCObject> resultDate,
+    int opts,
+  ) {
+    return __objc_msgSend_678(
+      obj,
+      sel,
+      unitFlags,
+      startingDate,
+      resultDate,
+      opts,
+    );
+  }
+
+  late final __objc_msgSend_678Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_678 = __objc_msgSend_678Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          int,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          int)>();
+
+  late final _sel_getEra_year_month_day_fromDate_1 =
+      _registerName1("getEra:year:month:day:fromDate:");
+  void _objc_msgSend_679(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<NSInteger> eraValuePointer,
+    ffi.Pointer<NSInteger> yearValuePointer,
+    ffi.Pointer<NSInteger> monthValuePointer,
+    ffi.Pointer<NSInteger> dayValuePointer,
+    ffi.Pointer<ObjCObject> date,
+  ) {
+    return __objc_msgSend_679(
+      obj,
+      sel,
+      eraValuePointer,
+      yearValuePointer,
+      monthValuePointer,
+      dayValuePointer,
+      date,
+    );
+  }
+
+  late final __objc_msgSend_679Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<NSInteger>,
+              ffi.Pointer<NSInteger>,
+              ffi.Pointer<NSInteger>,
+              ffi.Pointer<NSInteger>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_679 = __objc_msgSend_679Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<NSInteger>,
+          ffi.Pointer<NSInteger>,
+          ffi.Pointer<NSInteger>,
+          ffi.Pointer<NSInteger>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_getEra_yearForWeekOfYear_weekOfYear_weekday_fromDate_1 =
+      _registerName1("getEra:yearForWeekOfYear:weekOfYear:weekday:fromDate:");
+  late final _sel_getHour_minute_second_nanosecond_fromDate_1 =
+      _registerName1("getHour:minute:second:nanosecond:fromDate:");
+  late final _sel_component_fromDate_1 = _registerName1("component:fromDate:");
+  int _objc_msgSend_680(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int unit,
+    ffi.Pointer<ObjCObject> date,
+  ) {
+    return __objc_msgSend_680(
+      obj,
+      sel,
+      unit,
+      date,
+    );
+  }
+
+  late final __objc_msgSend_680Ptr = _lookup<
+      ffi.NativeFunction<
+          NSInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_680 = __objc_msgSend_680Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dateWithEra_year_month_day_hour_minute_second_nanosecond_1 =
+      _registerName1(
+          "dateWithEra:year:month:day:hour:minute:second:nanosecond:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_681(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int eraValue,
+    int yearValue,
+    int monthValue,
+    int dayValue,
+    int hourValue,
+    int minuteValue,
+    int secondValue,
+    int nanosecondValue,
+  ) {
+    return __objc_msgSend_681(
+      obj,
+      sel,
+      eraValue,
+      yearValue,
+      monthValue,
+      dayValue,
+      hourValue,
+      minuteValue,
+      secondValue,
+      nanosecondValue,
+    );
+  }
+
+  late final __objc_msgSend_681Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSInteger,
+              NSInteger,
+              NSInteger,
+              NSInteger,
+              NSInteger,
+              NSInteger,
+              NSInteger,
+              NSInteger)>>('objc_msgSend');
+  late final __objc_msgSend_681 = __objc_msgSend_681Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, int, int, int, int, int, int, int)>();
+
+  late final _sel_dateWithEra_yearForWeekOfYear_weekOfYear_weekday_hour_minute_second_nanosecond_1 =
+      _registerName1(
+          "dateWithEra:yearForWeekOfYear:weekOfYear:weekday:hour:minute:second:nanosecond:");
+  late final _sel_startOfDayForDate_1 = _registerName1("startOfDayForDate:");
+  late final _sel_componentsInTimeZone_fromDate_1 =
+      _registerName1("componentsInTimeZone:fromDate:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_682(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> timezone,
+    ffi.Pointer<ObjCObject> date,
+  ) {
+    return __objc_msgSend_682(
+      obj,
+      sel,
+      timezone,
+      date,
+    );
+  }
+
+  late final __objc_msgSend_682Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_682 = __objc_msgSend_682Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_compareDate_toDate_toUnitGranularity_1 =
+      _registerName1("compareDate:toDate:toUnitGranularity:");
+  int _objc_msgSend_683(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> date1,
+    ffi.Pointer<ObjCObject> date2,
+    int unit,
+  ) {
+    return __objc_msgSend_683(
+      obj,
+      sel,
+      date1,
+      date2,
+      unit,
+    );
+  }
+
+  late final __objc_msgSend_683Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_683 = __objc_msgSend_683Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_isDate_equalToDate_toUnitGranularity_1 =
+      _registerName1("isDate:equalToDate:toUnitGranularity:");
+  bool _objc_msgSend_684(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> date1,
+    ffi.Pointer<ObjCObject> date2,
+    int unit,
+  ) {
+    return __objc_msgSend_684(
+      obj,
+      sel,
+      date1,
+      date2,
+      unit,
+    );
+  }
+
+  late final __objc_msgSend_684Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_684 = __objc_msgSend_684Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_isDate_inSameDayAsDate_1 =
+      _registerName1("isDate:inSameDayAsDate:");
+  bool _objc_msgSend_685(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> date1,
+    ffi.Pointer<ObjCObject> date2,
+  ) {
+    return __objc_msgSend_685(
+      obj,
+      sel,
+      date1,
+      date2,
+    );
+  }
+
+  late final __objc_msgSend_685Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_685 = __objc_msgSend_685Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_isDateInToday_1 = _registerName1("isDateInToday:");
+  late final _sel_isDateInYesterday_1 = _registerName1("isDateInYesterday:");
+  late final _sel_isDateInTomorrow_1 = _registerName1("isDateInTomorrow:");
+  late final _sel_isDateInWeekend_1 = _registerName1("isDateInWeekend:");
+  late final _sel_rangeOfWeekendStartDate_interval_containingDate_1 =
+      _registerName1("rangeOfWeekendStartDate:interval:containingDate:");
+  bool _objc_msgSend_686(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> datep,
+    ffi.Pointer<NSTimeInterval> tip,
+    ffi.Pointer<ObjCObject> date,
+  ) {
+    return __objc_msgSend_686(
+      obj,
+      sel,
+      datep,
+      tip,
+      date,
+    );
+  }
+
+  late final __objc_msgSend_686Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Pointer<NSTimeInterval>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_686 = __objc_msgSend_686Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          ffi.Pointer<NSTimeInterval>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_nextWeekendStartDate_interval_options_afterDate_1 =
+      _registerName1("nextWeekendStartDate:interval:options:afterDate:");
+  bool _objc_msgSend_687(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> datep,
+    ffi.Pointer<NSTimeInterval> tip,
+    int options,
+    ffi.Pointer<ObjCObject> date,
+  ) {
+    return __objc_msgSend_687(
+      obj,
+      sel,
+      datep,
+      tip,
+      options,
+      date,
+    );
+  }
+
+  late final __objc_msgSend_687Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Pointer<NSTimeInterval>,
+              ffi.Int32,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_687 = __objc_msgSend_687Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          ffi.Pointer<NSTimeInterval>,
+          int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_components_fromDateComponents_toDateComponents_options_1 =
+      _registerName1("components:fromDateComponents:toDateComponents:options:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_688(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int unitFlags,
+    ffi.Pointer<ObjCObject> startingDateComp,
+    ffi.Pointer<ObjCObject> resultDateComp,
+    int options,
+  ) {
+    return __objc_msgSend_688(
+      obj,
+      sel,
+      unitFlags,
+      startingDateComp,
+      resultDateComp,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_688Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_688 = __objc_msgSend_688Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          int,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          int)>();
+
+  late final _sel_dateByAddingUnit_value_toDate_options_1 =
+      _registerName1("dateByAddingUnit:value:toDate:options:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_689(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int unit,
+    int value,
+    ffi.Pointer<ObjCObject> date,
+    int options,
+  ) {
+    return __objc_msgSend_689(
+      obj,
+      sel,
+      unit,
+      value,
+      date,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_689Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              NSInteger,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_689 = __objc_msgSend_689Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, int, ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_enumerateDatesStartingAfterDate_matchingComponents_options_usingBlock_1 =
+      _registerName1(
+          "enumerateDatesStartingAfterDate:matchingComponents:options:usingBlock:");
+  void _objc_msgSend_690(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> start,
+    ffi.Pointer<ObjCObject> comps,
+    int opts,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_690(
+      obj,
+      sel,
+      start,
+      comps,
+      opts,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_690Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_690 = __objc_msgSend_690Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_nextDateAfterDate_matchingComponents_options_1 =
+      _registerName1("nextDateAfterDate:matchingComponents:options:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_691(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> date,
+    ffi.Pointer<ObjCObject> comps,
+    int options,
+  ) {
+    return __objc_msgSend_691(
+      obj,
+      sel,
+      date,
+      comps,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_691Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_691 = __objc_msgSend_691Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          int)>();
+
+  late final _sel_nextDateAfterDate_matchingUnit_value_options_1 =
+      _registerName1("nextDateAfterDate:matchingUnit:value:options:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_692(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> date,
+    int unit,
+    int value,
+    int options,
+  ) {
+    return __objc_msgSend_692(
+      obj,
+      sel,
+      date,
+      unit,
+      value,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_692Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              NSInteger,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_692 = __objc_msgSend_692Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>, int, int, int)>();
+
+  late final _sel_nextDateAfterDate_matchingHour_minute_second_options_1 =
+      _registerName1("nextDateAfterDate:matchingHour:minute:second:options:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_693(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> date,
+    int hourValue,
+    int minuteValue,
+    int secondValue,
+    int options,
+  ) {
+    return __objc_msgSend_693(
+      obj,
+      sel,
+      date,
+      hourValue,
+      minuteValue,
+      secondValue,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_693Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSInteger,
+              NSInteger,
+              NSInteger,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_693 = __objc_msgSend_693Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>, int, int, int, int)>();
+
+  late final _sel_dateBySettingUnit_value_ofDate_options_1 =
+      _registerName1("dateBySettingUnit:value:ofDate:options:");
+  late final _sel_dateBySettingHour_minute_second_ofDate_options_1 =
+      _registerName1("dateBySettingHour:minute:second:ofDate:options:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_694(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int h,
+    int m,
+    int s,
+    ffi.Pointer<ObjCObject> date,
+    int opts,
+  ) {
+    return __objc_msgSend_694(
+      obj,
+      sel,
+      h,
+      m,
+      s,
+      date,
+      opts,
+    );
+  }
+
+  late final __objc_msgSend_694Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSInteger,
+              NSInteger,
+              NSInteger,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_694 = __objc_msgSend_694Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, int, int, ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_date_matchesComponents_1 =
+      _registerName1("date:matchesComponents:");
+  bool _objc_msgSend_695(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> date,
+    ffi.Pointer<ObjCObject> components,
+  ) {
+    return __objc_msgSend_695(
+      obj,
+      sel,
+      date,
+      components,
+    );
+  }
+
+  late final __objc_msgSend_695Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_695 = __objc_msgSend_695Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_isLenient1 = _registerName1("isLenient");
+  late final _sel_setLenient_1 = _registerName1("setLenient:");
+  late final _sel_twoDigitStartDate1 = _registerName1("twoDigitStartDate");
+  late final _sel_setTwoDigitStartDate_1 =
+      _registerName1("setTwoDigitStartDate:");
+  late final _sel_defaultDate1 = _registerName1("defaultDate");
+  late final _sel_setDefaultDate_1 = _registerName1("setDefaultDate:");
+  late final _sel_setEraSymbols_1 = _registerName1("setEraSymbols:");
+  void _objc_msgSend_696(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_696(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_696Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_696 = __objc_msgSend_696Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_setMonthSymbols_1 = _registerName1("setMonthSymbols:");
+  late final _sel_setShortMonthSymbols_1 =
+      _registerName1("setShortMonthSymbols:");
+  late final _sel_setWeekdaySymbols_1 = _registerName1("setWeekdaySymbols:");
+  late final _sel_setShortWeekdaySymbols_1 =
+      _registerName1("setShortWeekdaySymbols:");
+  late final _sel_setAMSymbol_1 = _registerName1("setAMSymbol:");
+  late final _sel_setPMSymbol_1 = _registerName1("setPMSymbol:");
+  late final _sel_setLongEraSymbols_1 = _registerName1("setLongEraSymbols:");
+  late final _sel_setVeryShortMonthSymbols_1 =
+      _registerName1("setVeryShortMonthSymbols:");
+  late final _sel_setStandaloneMonthSymbols_1 =
+      _registerName1("setStandaloneMonthSymbols:");
+  late final _sel_setShortStandaloneMonthSymbols_1 =
+      _registerName1("setShortStandaloneMonthSymbols:");
+  late final _sel_setVeryShortStandaloneMonthSymbols_1 =
+      _registerName1("setVeryShortStandaloneMonthSymbols:");
+  late final _sel_setVeryShortWeekdaySymbols_1 =
+      _registerName1("setVeryShortWeekdaySymbols:");
+  late final _sel_setStandaloneWeekdaySymbols_1 =
+      _registerName1("setStandaloneWeekdaySymbols:");
+  late final _sel_setShortStandaloneWeekdaySymbols_1 =
+      _registerName1("setShortStandaloneWeekdaySymbols:");
+  late final _sel_setVeryShortStandaloneWeekdaySymbols_1 =
+      _registerName1("setVeryShortStandaloneWeekdaySymbols:");
+  late final _sel_setQuarterSymbols_1 = _registerName1("setQuarterSymbols:");
+  late final _sel_setShortQuarterSymbols_1 =
+      _registerName1("setShortQuarterSymbols:");
+  late final _sel_setStandaloneQuarterSymbols_1 =
+      _registerName1("setStandaloneQuarterSymbols:");
+  late final _sel_setShortStandaloneQuarterSymbols_1 =
+      _registerName1("setShortStandaloneQuarterSymbols:");
+  late final _sel_gregorianStartDate1 = _registerName1("gregorianStartDate");
+  late final _sel_setGregorianStartDate_1 =
+      _registerName1("setGregorianStartDate:");
+  late final _sel_doesRelativeDateFormatting1 =
+      _registerName1("doesRelativeDateFormatting");
+  late final _sel_setDoesRelativeDateFormatting_1 =
+      _registerName1("setDoesRelativeDateFormatting:");
+  late final _sel_initWithDateFormat_allowNaturalLanguage_1 =
+      _registerName1("initWithDateFormat:allowNaturalLanguage:");
+  late final _sel_allowsNaturalLanguage1 =
+      _registerName1("allowsNaturalLanguage");
+  late final _class_NSNumberFormatter1 = _getClass1("NSNumberFormatter");
+  late final _sel_stringFromNumber_1 = _registerName1("stringFromNumber:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_697(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> number,
+  ) {
+    return __objc_msgSend_697(
+      obj,
+      sel,
+      number,
+    );
+  }
+
+  late final __objc_msgSend_697Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_697 = __objc_msgSend_697Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_numberFromString_1 = _registerName1("numberFromString:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_698(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> string,
+  ) {
+    return __objc_msgSend_698(
+      obj,
+      sel,
+      string,
+    );
+  }
+
+  late final __objc_msgSend_698Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_698 = __objc_msgSend_698Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_localizedStringFromNumber_numberStyle_1 =
+      _registerName1("localizedStringFromNumber:numberStyle:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_699(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> num,
+    int nstyle,
+  ) {
+    return __objc_msgSend_699(
+      obj,
+      sel,
+      num,
+      nstyle,
+    );
+  }
+
+  late final __objc_msgSend_699Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_699 = __objc_msgSend_699Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>, int)>();
+
+  int _objc_msgSend_700(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_700(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_700Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_700 = __objc_msgSend_700Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  void _objc_msgSend_701(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int behavior,
+  ) {
+    return __objc_msgSend_701(
+      obj,
+      sel,
+      behavior,
+    );
+  }
+
+  late final __objc_msgSend_701Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_701 = __objc_msgSend_701Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_numberStyle1 = _registerName1("numberStyle");
+  int _objc_msgSend_702(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_702(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_702Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_702 = __objc_msgSend_702Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setNumberStyle_1 = _registerName1("setNumberStyle:");
+  void _objc_msgSend_703(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_703(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_703Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_703 = __objc_msgSend_703Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_generatesDecimalNumbers1 =
+      _registerName1("generatesDecimalNumbers");
+  late final _sel_setGeneratesDecimalNumbers_1 =
+      _registerName1("setGeneratesDecimalNumbers:");
+  void _objc_msgSend_704(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_704(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_704Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_704 = __objc_msgSend_704Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_negativeFormat1 = _registerName1("negativeFormat");
+  late final _sel_setNegativeFormat_1 = _registerName1("setNegativeFormat:");
+  late final _sel_textAttributesForNegativeValues1 =
+      _registerName1("textAttributesForNegativeValues");
+  late final _sel_setTextAttributesForNegativeValues_1 =
+      _registerName1("setTextAttributesForNegativeValues:");
+  late final _sel_positiveFormat1 = _registerName1("positiveFormat");
+  late final _sel_setPositiveFormat_1 = _registerName1("setPositiveFormat:");
+  late final _sel_textAttributesForPositiveValues1 =
+      _registerName1("textAttributesForPositiveValues");
+  late final _sel_setTextAttributesForPositiveValues_1 =
+      _registerName1("setTextAttributesForPositiveValues:");
+  late final _sel_allowsFloats1 = _registerName1("allowsFloats");
+  late final _sel_setAllowsFloats_1 = _registerName1("setAllowsFloats:");
+  late final _sel_setDecimalSeparator_1 =
+      _registerName1("setDecimalSeparator:");
+  late final _sel_alwaysShowsDecimalSeparator1 =
+      _registerName1("alwaysShowsDecimalSeparator");
+  late final _sel_setAlwaysShowsDecimalSeparator_1 =
+      _registerName1("setAlwaysShowsDecimalSeparator:");
+  late final _sel_currencyDecimalSeparator1 =
+      _registerName1("currencyDecimalSeparator");
+  late final _sel_setCurrencyDecimalSeparator_1 =
+      _registerName1("setCurrencyDecimalSeparator:");
+  late final _sel_usesGroupingSeparator1 =
+      _registerName1("usesGroupingSeparator");
+  late final _sel_setUsesGroupingSeparator_1 =
+      _registerName1("setUsesGroupingSeparator:");
+  late final _sel_setGroupingSeparator_1 =
+      _registerName1("setGroupingSeparator:");
+  late final _sel_zeroSymbol1 = _registerName1("zeroSymbol");
+  late final _sel_setZeroSymbol_1 = _registerName1("setZeroSymbol:");
+  late final _sel_textAttributesForZero1 =
+      _registerName1("textAttributesForZero");
+  late final _sel_setTextAttributesForZero_1 =
+      _registerName1("setTextAttributesForZero:");
+  late final _sel_nilSymbol1 = _registerName1("nilSymbol");
+  late final _sel_setNilSymbol_1 = _registerName1("setNilSymbol:");
+  late final _sel_textAttributesForNil1 =
+      _registerName1("textAttributesForNil");
+  late final _sel_setTextAttributesForNil_1 =
+      _registerName1("setTextAttributesForNil:");
+  late final _sel_notANumberSymbol1 = _registerName1("notANumberSymbol");
+  late final _sel_setNotANumberSymbol_1 =
+      _registerName1("setNotANumberSymbol:");
+  late final _sel_textAttributesForNotANumber1 =
+      _registerName1("textAttributesForNotANumber");
+  late final _sel_setTextAttributesForNotANumber_1 =
+      _registerName1("setTextAttributesForNotANumber:");
+  late final _sel_positiveInfinitySymbol1 =
+      _registerName1("positiveInfinitySymbol");
+  late final _sel_setPositiveInfinitySymbol_1 =
+      _registerName1("setPositiveInfinitySymbol:");
+  late final _sel_textAttributesForPositiveInfinity1 =
+      _registerName1("textAttributesForPositiveInfinity");
+  late final _sel_setTextAttributesForPositiveInfinity_1 =
+      _registerName1("setTextAttributesForPositiveInfinity:");
+  late final _sel_negativeInfinitySymbol1 =
+      _registerName1("negativeInfinitySymbol");
+  late final _sel_setNegativeInfinitySymbol_1 =
+      _registerName1("setNegativeInfinitySymbol:");
+  late final _sel_textAttributesForNegativeInfinity1 =
+      _registerName1("textAttributesForNegativeInfinity");
+  late final _sel_setTextAttributesForNegativeInfinity_1 =
+      _registerName1("setTextAttributesForNegativeInfinity:");
+  late final _sel_positivePrefix1 = _registerName1("positivePrefix");
+  late final _sel_setPositivePrefix_1 = _registerName1("setPositivePrefix:");
+  late final _sel_positiveSuffix1 = _registerName1("positiveSuffix");
+  late final _sel_setPositiveSuffix_1 = _registerName1("setPositiveSuffix:");
+  late final _sel_negativePrefix1 = _registerName1("negativePrefix");
+  late final _sel_setNegativePrefix_1 = _registerName1("setNegativePrefix:");
+  late final _sel_negativeSuffix1 = _registerName1("negativeSuffix");
+  late final _sel_setNegativeSuffix_1 = _registerName1("setNegativeSuffix:");
+  late final _sel_setCurrencyCode_1 = _registerName1("setCurrencyCode:");
+  late final _sel_setCurrencySymbol_1 = _registerName1("setCurrencySymbol:");
+  late final _sel_internationalCurrencySymbol1 =
+      _registerName1("internationalCurrencySymbol");
+  late final _sel_setInternationalCurrencySymbol_1 =
+      _registerName1("setInternationalCurrencySymbol:");
+  late final _sel_percentSymbol1 = _registerName1("percentSymbol");
+  late final _sel_setPercentSymbol_1 = _registerName1("setPercentSymbol:");
+  late final _sel_perMillSymbol1 = _registerName1("perMillSymbol");
+  late final _sel_setPerMillSymbol_1 = _registerName1("setPerMillSymbol:");
+  late final _sel_minusSign1 = _registerName1("minusSign");
+  late final _sel_setMinusSign_1 = _registerName1("setMinusSign:");
+  late final _sel_plusSign1 = _registerName1("plusSign");
+  late final _sel_setPlusSign_1 = _registerName1("setPlusSign:");
+  late final _sel_exponentSymbol1 = _registerName1("exponentSymbol");
+  late final _sel_setExponentSymbol_1 = _registerName1("setExponentSymbol:");
+  late final _sel_groupingSize1 = _registerName1("groupingSize");
+  late final _sel_setGroupingSize_1 = _registerName1("setGroupingSize:");
+  late final _sel_secondaryGroupingSize1 =
+      _registerName1("secondaryGroupingSize");
+  late final _sel_setSecondaryGroupingSize_1 =
+      _registerName1("setSecondaryGroupingSize:");
+  late final _sel_multiplier1 = _registerName1("multiplier");
+  late final _sel_setMultiplier_1 = _registerName1("setMultiplier:");
+  void _objc_msgSend_705(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_705(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_705Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_705 = __objc_msgSend_705Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_formatWidth1 = _registerName1("formatWidth");
+  late final _sel_setFormatWidth_1 = _registerName1("setFormatWidth:");
+  late final _sel_paddingCharacter1 = _registerName1("paddingCharacter");
+  late final _sel_setPaddingCharacter_1 =
+      _registerName1("setPaddingCharacter:");
+  late final _sel_paddingPosition1 = _registerName1("paddingPosition");
+  int _objc_msgSend_706(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_706(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_706Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_706 = __objc_msgSend_706Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setPaddingPosition_1 = _registerName1("setPaddingPosition:");
+  void _objc_msgSend_707(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_707(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_707Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_707 = __objc_msgSend_707Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_roundingMode1 = _registerName1("roundingMode");
+  int _objc_msgSend_708(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_708(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_708Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_708 = __objc_msgSend_708Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setRoundingMode_1 = _registerName1("setRoundingMode:");
+  void _objc_msgSend_709(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_709(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_709Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_709 = __objc_msgSend_709Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_roundingIncrement1 = _registerName1("roundingIncrement");
+  late final _sel_setRoundingIncrement_1 =
+      _registerName1("setRoundingIncrement:");
+  late final _sel_minimumIntegerDigits1 =
+      _registerName1("minimumIntegerDigits");
+  late final _sel_setMinimumIntegerDigits_1 =
+      _registerName1("setMinimumIntegerDigits:");
+  late final _sel_maximumIntegerDigits1 =
+      _registerName1("maximumIntegerDigits");
+  late final _sel_setMaximumIntegerDigits_1 =
+      _registerName1("setMaximumIntegerDigits:");
+  late final _sel_minimumFractionDigits1 =
+      _registerName1("minimumFractionDigits");
+  late final _sel_setMinimumFractionDigits_1 =
+      _registerName1("setMinimumFractionDigits:");
+  late final _sel_maximumFractionDigits1 =
+      _registerName1("maximumFractionDigits");
+  late final _sel_setMaximumFractionDigits_1 =
+      _registerName1("setMaximumFractionDigits:");
+  late final _sel_minimum1 = _registerName1("minimum");
+  late final _sel_setMinimum_1 = _registerName1("setMinimum:");
+  late final _sel_maximum1 = _registerName1("maximum");
+  late final _sel_setMaximum_1 = _registerName1("setMaximum:");
+  late final _sel_currencyGroupingSeparator1 =
+      _registerName1("currencyGroupingSeparator");
+  late final _sel_setCurrencyGroupingSeparator_1 =
+      _registerName1("setCurrencyGroupingSeparator:");
+  late final _sel_usesSignificantDigits1 =
+      _registerName1("usesSignificantDigits");
+  late final _sel_setUsesSignificantDigits_1 =
+      _registerName1("setUsesSignificantDigits:");
+  late final _sel_minimumSignificantDigits1 =
+      _registerName1("minimumSignificantDigits");
+  late final _sel_setMinimumSignificantDigits_1 =
+      _registerName1("setMinimumSignificantDigits:");
+  late final _sel_maximumSignificantDigits1 =
+      _registerName1("maximumSignificantDigits");
+  late final _sel_setMaximumSignificantDigits_1 =
+      _registerName1("setMaximumSignificantDigits:");
+  late final _sel_isPartialStringValidationEnabled1 =
+      _registerName1("isPartialStringValidationEnabled");
+  late final _sel_setPartialStringValidationEnabled_1 =
+      _registerName1("setPartialStringValidationEnabled:");
+  late final _sel_hasThousandSeparators1 =
+      _registerName1("hasThousandSeparators");
+  late final _sel_setHasThousandSeparators_1 =
+      _registerName1("setHasThousandSeparators:");
+  late final _sel_thousandSeparator1 = _registerName1("thousandSeparator");
+  late final _sel_setThousandSeparator_1 =
+      _registerName1("setThousandSeparator:");
+  late final _sel_localizesFormat1 = _registerName1("localizesFormat");
+  late final _sel_setLocalizesFormat_1 = _registerName1("setLocalizesFormat:");
+  late final _sel_format1 = _registerName1("format");
+  late final _sel_setFormat_1 = _registerName1("setFormat:");
+  late final _sel_attributedStringForZero1 =
+      _registerName1("attributedStringForZero");
+  late final _sel_setAttributedStringForZero_1 =
+      _registerName1("setAttributedStringForZero:");
+  void _objc_msgSend_710(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_710(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_710Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_710 = __objc_msgSend_710Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_attributedStringForNil1 =
+      _registerName1("attributedStringForNil");
+  late final _sel_setAttributedStringForNil_1 =
+      _registerName1("setAttributedStringForNil:");
+  late final _sel_attributedStringForNotANumber1 =
+      _registerName1("attributedStringForNotANumber");
+  late final _sel_setAttributedStringForNotANumber_1 =
+      _registerName1("setAttributedStringForNotANumber:");
+  late final _class_NSDecimalNumberHandler1 =
+      _getClass1("NSDecimalNumberHandler");
+  late final _sel_defaultDecimalNumberHandler1 =
+      _registerName1("defaultDecimalNumberHandler");
+  ffi.Pointer<ObjCObject> _objc_msgSend_711(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_711(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_711Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_711 = __objc_msgSend_711Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_initWithRoundingMode_scale_raiseOnExactness_raiseOnOverflow_raiseOnUnderflow_raiseOnDivideByZero_1 =
+      _registerName1(
+          "initWithRoundingMode:scale:raiseOnExactness:raiseOnOverflow:raiseOnUnderflow:raiseOnDivideByZero:");
+  instancetype _objc_msgSend_712(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int roundingMode,
+    int scale,
+    bool exact,
+    bool overflow,
+    bool underflow,
+    bool divideByZero,
+  ) {
+    return __objc_msgSend_712(
+      obj,
+      sel,
+      roundingMode,
+      scale,
+      exact,
+      overflow,
+      underflow,
+      divideByZero,
+    );
+  }
+
+  late final __objc_msgSend_712Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Short,
+              ffi.Bool,
+              ffi.Bool,
+              ffi.Bool,
+              ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_712 = __objc_msgSend_712Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          int, bool, bool, bool, bool)>();
+
+  late final _sel_decimalNumberHandlerWithRoundingMode_scale_raiseOnExactness_raiseOnOverflow_raiseOnUnderflow_raiseOnDivideByZero_1 =
+      _registerName1(
+          "decimalNumberHandlerWithRoundingMode:scale:raiseOnExactness:raiseOnOverflow:raiseOnUnderflow:raiseOnDivideByZero:");
+  late final _sel_roundingBehavior1 = _registerName1("roundingBehavior");
+  late final _sel_setRoundingBehavior_1 =
+      _registerName1("setRoundingBehavior:");
+  void _objc_msgSend_713(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_713(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_713Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_713 = __objc_msgSend_713Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSScanner1 = _getClass1("NSScanner");
+  late final _sel_scanLocation1 = _registerName1("scanLocation");
+  late final _sel_setScanLocation_1 = _registerName1("setScanLocation:");
+  late final _sel_charactersToBeSkipped1 =
+      _registerName1("charactersToBeSkipped");
+  late final _sel_setCharactersToBeSkipped_1 =
+      _registerName1("setCharactersToBeSkipped:");
+  void _objc_msgSend_714(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_714(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_714Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_714 = __objc_msgSend_714Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_caseSensitive1 = _registerName1("caseSensitive");
+  late final _sel_setCaseSensitive_1 = _registerName1("setCaseSensitive:");
+  late final _sel_scanInt_1 = _registerName1("scanInt:");
+  bool _objc_msgSend_715(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Int> result,
+  ) {
+    return __objc_msgSend_715(
+      obj,
+      sel,
+      result,
+    );
+  }
+
+  late final __objc_msgSend_715Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Int>)>>('objc_msgSend');
+  late final __objc_msgSend_715 = __objc_msgSend_715Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Int>)>();
+
+  late final _sel_scanInteger_1 = _registerName1("scanInteger:");
+  bool _objc_msgSend_716(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<NSInteger> result,
+  ) {
+    return __objc_msgSend_716(
+      obj,
+      sel,
+      result,
+    );
+  }
+
+  late final __objc_msgSend_716Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<NSInteger>)>>('objc_msgSend');
+  late final __objc_msgSend_716 = __objc_msgSend_716Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<NSInteger>)>();
+
+  late final _sel_scanLongLong_1 = _registerName1("scanLongLong:");
+  bool _objc_msgSend_717(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.LongLong> result,
+  ) {
+    return __objc_msgSend_717(
+      obj,
+      sel,
+      result,
+    );
+  }
+
+  late final __objc_msgSend_717Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.LongLong>)>>('objc_msgSend');
+  late final __objc_msgSend_717 = __objc_msgSend_717Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.LongLong>)>();
+
+  late final _sel_scanUnsignedLongLong_1 =
+      _registerName1("scanUnsignedLongLong:");
+  bool _objc_msgSend_718(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.UnsignedLongLong> result,
+  ) {
+    return __objc_msgSend_718(
+      obj,
+      sel,
+      result,
+    );
+  }
+
+  late final __objc_msgSend_718Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.UnsignedLongLong>)>>('objc_msgSend');
+  late final __objc_msgSend_718 = __objc_msgSend_718Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.UnsignedLongLong>)>();
+
+  late final _sel_scanFloat_1 = _registerName1("scanFloat:");
+  bool _objc_msgSend_719(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Float> result,
+  ) {
+    return __objc_msgSend_719(
+      obj,
+      sel,
+      result,
+    );
+  }
+
+  late final __objc_msgSend_719Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Float>)>>('objc_msgSend');
+  late final __objc_msgSend_719 = __objc_msgSend_719Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Float>)>();
+
+  late final _sel_scanDouble_1 = _registerName1("scanDouble:");
+  bool _objc_msgSend_720(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Double> result,
+  ) {
+    return __objc_msgSend_720(
+      obj,
+      sel,
+      result,
+    );
+  }
+
+  late final __objc_msgSend_720Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Double>)>>('objc_msgSend');
+  late final __objc_msgSend_720 = __objc_msgSend_720Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Double>)>();
+
+  late final _sel_scanHexInt_1 = _registerName1("scanHexInt:");
+  bool _objc_msgSend_721(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.UnsignedInt> result,
+  ) {
+    return __objc_msgSend_721(
+      obj,
+      sel,
+      result,
+    );
+  }
+
+  late final __objc_msgSend_721Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.UnsignedInt>)>>('objc_msgSend');
+  late final __objc_msgSend_721 = __objc_msgSend_721Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.UnsignedInt>)>();
+
+  late final _sel_scanHexLongLong_1 = _registerName1("scanHexLongLong:");
+  late final _sel_scanHexFloat_1 = _registerName1("scanHexFloat:");
+  late final _sel_scanHexDouble_1 = _registerName1("scanHexDouble:");
+  late final _sel_scanString_intoString_1 =
+      _registerName1("scanString:intoString:");
+  bool _objc_msgSend_722(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> string,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> result,
+  ) {
+    return __objc_msgSend_722(
+      obj,
+      sel,
+      string,
+      result,
+    );
+  }
+
+  late final __objc_msgSend_722Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_722 = __objc_msgSend_722Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_scanCharactersFromSet_intoString_1 =
+      _registerName1("scanCharactersFromSet:intoString:");
+  bool _objc_msgSend_723(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> set1,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> result,
+  ) {
+    return __objc_msgSend_723(
+      obj,
+      sel,
+      set1,
+      result,
+    );
+  }
+
+  late final __objc_msgSend_723Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_723 = __objc_msgSend_723Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_scanUpToString_intoString_1 =
+      _registerName1("scanUpToString:intoString:");
+  late final _sel_scanUpToCharactersFromSet_intoString_1 =
+      _registerName1("scanUpToCharactersFromSet:intoString:");
+  late final _sel_isAtEnd1 = _registerName1("isAtEnd");
+  late final _sel_scannerWithString_1 = _registerName1("scannerWithString:");
+  late final _sel_localizedScannerWithString_1 =
+      _registerName1("localizedScannerWithString:");
+  late final _sel_scanDecimal_1 = _registerName1("scanDecimal:");
+  bool _objc_msgSend_724(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<NSDecimal> dcm,
+  ) {
+    return __objc_msgSend_724(
+      obj,
+      sel,
+      dcm,
+    );
+  }
+
+  late final __objc_msgSend_724Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<NSDecimal>)>>('objc_msgSend');
+  late final __objc_msgSend_724 = __objc_msgSend_724Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<NSDecimal>)>();
+
+  late final _class_NSException1 = _getClass1("NSException");
+  late final _sel_exceptionWithName_reason_userInfo_1 =
+      _registerName1("exceptionWithName:reason:userInfo:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_725(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSExceptionName name,
+    ffi.Pointer<ObjCObject> reason,
+    ffi.Pointer<ObjCObject> userInfo,
+  ) {
+    return __objc_msgSend_725(
+      obj,
+      sel,
+      name,
+      reason,
+      userInfo,
+    );
+  }
+
+  late final __objc_msgSend_725Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSExceptionName,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_725 = __objc_msgSend_725Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          NSExceptionName,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithName_reason_userInfo_1 =
+      _registerName1("initWithName:reason:userInfo:");
+  late final _sel_reason1 = _registerName1("reason");
+  late final _sel_raise1 = _registerName1("raise");
+  late final _sel_raise_format_1 = _registerName1("raise:format:");
+  late final _sel_raise_format_arguments_1 =
+      _registerName1("raise:format:arguments:");
+  void _objc_msgSend_726(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSExceptionName name,
+    ffi.Pointer<ObjCObject> format,
+    ffi.Pointer<__va_list_tag> argList,
+  ) {
+    return __objc_msgSend_726(
+      obj,
+      sel,
+      name,
+      format,
+      argList,
+    );
+  }
+
+  late final __objc_msgSend_726Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSExceptionName,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<__va_list_tag>)>>('objc_msgSend');
+  late final __objc_msgSend_726 = __objc_msgSend_726Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          NSExceptionName,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<__va_list_tag>)>();
+
+  late final _class_NSFileHandle1 = _getClass1("NSFileHandle");
+  late final _sel_availableData1 = _registerName1("availableData");
+  late final _sel_initWithFileDescriptor_closeOnDealloc_1 =
+      _registerName1("initWithFileDescriptor:closeOnDealloc:");
+  instancetype _objc_msgSend_727(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int fd,
+    bool closeopt,
+  ) {
+    return __objc_msgSend_727(
+      obj,
+      sel,
+      fd,
+      closeopt,
+    );
+  }
+
+  late final __objc_msgSend_727Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_727 = __objc_msgSend_727Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int, bool)>();
+
+  late final _sel_readDataToEndOfFileAndReturnError_1 =
+      _registerName1("readDataToEndOfFileAndReturnError:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_728(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_728(
+      obj,
+      sel,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_728Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_728 = __objc_msgSend_728Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_readDataUpToLength_error_1 =
+      _registerName1("readDataUpToLength:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_729(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int length,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_729(
+      obj,
+      sel,
+      length,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_729Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSUInteger,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_729 = __objc_msgSend_729Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_writeData_error_1 = _registerName1("writeData:error:");
+  bool _objc_msgSend_730(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> data,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_730(
+      obj,
+      sel,
+      data,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_730Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_730 = __objc_msgSend_730Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_getOffset_error_1 = _registerName1("getOffset:error:");
+  bool _objc_msgSend_731(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.UnsignedLongLong> offsetInFile,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_731(
+      obj,
+      sel,
+      offsetInFile,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_731Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.UnsignedLongLong>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_731 = __objc_msgSend_731Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.UnsignedLongLong>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_seekToEndReturningOffset_error_1 =
+      _registerName1("seekToEndReturningOffset:error:");
+  late final _sel_seekToOffset_error_1 = _registerName1("seekToOffset:error:");
+  bool _objc_msgSend_732(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int offset,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_732(
+      obj,
+      sel,
+      offset,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_732Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.UnsignedLongLong,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_732 = __objc_msgSend_732Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_truncateAtOffset_error_1 =
+      _registerName1("truncateAtOffset:error:");
+  late final _sel_synchronizeAndReturnError_1 =
+      _registerName1("synchronizeAndReturnError:");
+  late final _sel_closeAndReturnError_1 =
+      _registerName1("closeAndReturnError:");
+  late final _sel_fileHandleWithStandardInput1 =
+      _registerName1("fileHandleWithStandardInput");
+  ffi.Pointer<ObjCObject> _objc_msgSend_733(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_733(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_733Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_733 = __objc_msgSend_733Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_fileHandleWithStandardOutput1 =
+      _registerName1("fileHandleWithStandardOutput");
+  late final _sel_fileHandleWithStandardError1 =
+      _registerName1("fileHandleWithStandardError");
+  late final _sel_fileHandleWithNullDevice1 =
+      _registerName1("fileHandleWithNullDevice");
+  late final _sel_fileHandleForReadingAtPath_1 =
+      _registerName1("fileHandleForReadingAtPath:");
+  late final _sel_fileHandleForWritingAtPath_1 =
+      _registerName1("fileHandleForWritingAtPath:");
+  late final _sel_fileHandleForUpdatingAtPath_1 =
+      _registerName1("fileHandleForUpdatingAtPath:");
+  late final _sel_fileHandleForReadingFromURL_error_1 =
+      _registerName1("fileHandleForReadingFromURL:error:");
+  instancetype _objc_msgSend_734(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_734(
+      obj,
+      sel,
+      url,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_734Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_734 = __objc_msgSend_734Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_fileHandleForWritingToURL_error_1 =
+      _registerName1("fileHandleForWritingToURL:error:");
+  late final _sel_fileHandleForUpdatingURL_error_1 =
+      _registerName1("fileHandleForUpdatingURL:error:");
+  late final _sel_readInBackgroundAndNotifyForModes_1 =
+      _registerName1("readInBackgroundAndNotifyForModes:");
+  late final _sel_readInBackgroundAndNotify1 =
+      _registerName1("readInBackgroundAndNotify");
+  late final _sel_readToEndOfFileInBackgroundAndNotifyForModes_1 =
+      _registerName1("readToEndOfFileInBackgroundAndNotifyForModes:");
+  late final _sel_readToEndOfFileInBackgroundAndNotify1 =
+      _registerName1("readToEndOfFileInBackgroundAndNotify");
+  late final _sel_acceptConnectionInBackgroundAndNotifyForModes_1 =
+      _registerName1("acceptConnectionInBackgroundAndNotifyForModes:");
+  late final _sel_acceptConnectionInBackgroundAndNotify1 =
+      _registerName1("acceptConnectionInBackgroundAndNotify");
+  late final _sel_waitForDataInBackgroundAndNotifyForModes_1 =
+      _registerName1("waitForDataInBackgroundAndNotifyForModes:");
+  late final _sel_waitForDataInBackgroundAndNotify1 =
+      _registerName1("waitForDataInBackgroundAndNotify");
+  late final _sel_readabilityHandler1 = _registerName1("readabilityHandler");
+  ffi.Pointer<_ObjCBlock> _objc_msgSend_735(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_735(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_735Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<_ObjCBlock> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_735 = __objc_msgSend_735Ptr.asFunction<
+      ffi.Pointer<_ObjCBlock> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setReadabilityHandler_1 =
+      _registerName1("setReadabilityHandler:");
+  void _objc_msgSend_736(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> value,
+  ) {
+    return __objc_msgSend_736(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_736Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_736 = __objc_msgSend_736Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_writeabilityHandler1 = _registerName1("writeabilityHandler");
+  late final _sel_setWriteabilityHandler_1 =
+      _registerName1("setWriteabilityHandler:");
+  late final _sel_initWithFileDescriptor_1 =
+      _registerName1("initWithFileDescriptor:");
+  instancetype _objc_msgSend_737(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int fd,
+  ) {
+    return __objc_msgSend_737(
+      obj,
+      sel,
+      fd,
+    );
+  }
+
+  late final __objc_msgSend_737Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int)>>('objc_msgSend');
+  late final __objc_msgSend_737 = __objc_msgSend_737Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_fileDescriptor1 = _registerName1("fileDescriptor");
+  late final _sel_readDataToEndOfFile1 = _registerName1("readDataToEndOfFile");
+  late final _sel_readDataOfLength_1 = _registerName1("readDataOfLength:");
+  late final _sel_offsetInFile1 = _registerName1("offsetInFile");
+  late final _sel_seekToEndOfFile1 = _registerName1("seekToEndOfFile");
+  late final _sel_seekToFileOffset_1 = _registerName1("seekToFileOffset:");
+  void _objc_msgSend_738(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int offset,
+  ) {
+    return __objc_msgSend_738(
+      obj,
+      sel,
+      offset,
+    );
+  }
+
+  late final __objc_msgSend_738Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.UnsignedLongLong)>>('objc_msgSend');
+  late final __objc_msgSend_738 = __objc_msgSend_738Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_truncateFileAtOffset_1 =
+      _registerName1("truncateFileAtOffset:");
+  late final _sel_synchronizeFile1 = _registerName1("synchronizeFile");
+  late final _sel_closeFile1 = _registerName1("closeFile");
+  late final _class_NSHTTPCookieStorage1 = _getClass1("NSHTTPCookieStorage");
+  late final _sel_sharedHTTPCookieStorage1 =
+      _registerName1("sharedHTTPCookieStorage");
+  ffi.Pointer<ObjCObject> _objc_msgSend_739(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_739(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_739Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_739 = __objc_msgSend_739Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_sharedCookieStorageForGroupContainerIdentifier_1 =
+      _registerName1("sharedCookieStorageForGroupContainerIdentifier:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_740(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> identifier,
+  ) {
+    return __objc_msgSend_740(
+      obj,
+      sel,
+      identifier,
+    );
+  }
+
+  late final __objc_msgSend_740Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_740 = __objc_msgSend_740Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_cookies1 = _registerName1("cookies");
+  late final _class_NSHTTPCookie1 = _getClass1("NSHTTPCookie");
+  late final _sel_initWithProperties_1 = _registerName1("initWithProperties:");
+  late final _sel_cookieWithProperties_1 =
+      _registerName1("cookieWithProperties:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_741(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> properties,
+  ) {
+    return __objc_msgSend_741(
+      obj,
+      sel,
+      properties,
+    );
+  }
+
+  late final __objc_msgSend_741Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_741 = __objc_msgSend_741Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_requestHeaderFieldsWithCookies_1 =
+      _registerName1("requestHeaderFieldsWithCookies:");
+  late final _sel_cookiesWithResponseHeaderFields_forURL_1 =
+      _registerName1("cookiesWithResponseHeaderFields:forURL:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_742(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> headerFields,
+    ffi.Pointer<ObjCObject> URL,
+  ) {
+    return __objc_msgSend_742(
+      obj,
+      sel,
+      headerFields,
+      URL,
+    );
+  }
+
+  late final __objc_msgSend_742Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_742 = __objc_msgSend_742Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_properties1 = _registerName1("properties");
+  late final _sel_value1 = _registerName1("value");
+  late final _sel_expiresDate1 = _registerName1("expiresDate");
+  late final _sel_isSessionOnly1 = _registerName1("isSessionOnly");
+  late final _sel_isSecure1 = _registerName1("isSecure");
+  late final _sel_isHTTPOnly1 = _registerName1("isHTTPOnly");
+  late final _sel_comment1 = _registerName1("comment");
+  late final _sel_commentURL1 = _registerName1("commentURL");
+  late final _sel_portList1 = _registerName1("portList");
+  late final _sel_sameSitePolicy1 = _registerName1("sameSitePolicy");
+  late final _sel_setCookie_1 = _registerName1("setCookie:");
+  void _objc_msgSend_743(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> cookie,
+  ) {
+    return __objc_msgSend_743(
+      obj,
+      sel,
+      cookie,
+    );
+  }
+
+  late final __objc_msgSend_743Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_743 = __objc_msgSend_743Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_deleteCookie_1 = _registerName1("deleteCookie:");
+  late final _sel_removeCookiesSinceDate_1 =
+      _registerName1("removeCookiesSinceDate:");
+  late final _sel_cookiesForURL_1 = _registerName1("cookiesForURL:");
+  late final _sel_setCookies_forURL_mainDocumentURL_1 =
+      _registerName1("setCookies:forURL:mainDocumentURL:");
+  void _objc_msgSend_744(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> cookies,
+    ffi.Pointer<ObjCObject> URL,
+    ffi.Pointer<ObjCObject> mainDocumentURL,
+  ) {
+    return __objc_msgSend_744(
+      obj,
+      sel,
+      cookies,
+      URL,
+      mainDocumentURL,
+    );
+  }
+
+  late final __objc_msgSend_744Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_744 = __objc_msgSend_744Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_cookieAcceptPolicy1 = _registerName1("cookieAcceptPolicy");
+  int _objc_msgSend_745(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_745(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_745Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_745 = __objc_msgSend_745Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setCookieAcceptPolicy_1 =
+      _registerName1("setCookieAcceptPolicy:");
+  void _objc_msgSend_746(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_746(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_746Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_746 = __objc_msgSend_746Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_sortedCookiesUsingDescriptors_1 =
+      _registerName1("sortedCookiesUsingDescriptors:");
+  late final _class_NSURLSessionTask1 = _getClass1("NSURLSessionTask");
+  late final _sel_taskIdentifier1 = _registerName1("taskIdentifier");
+  late final _class_NSURLRequest1 = _getClass1("NSURLRequest");
+  late final _sel_requestWithURL_1 = _registerName1("requestWithURL:");
+  late final _sel_supportsSecureCoding1 =
+      _registerName1("supportsSecureCoding");
+  late final _sel_requestWithURL_cachePolicy_timeoutInterval_1 =
+      _registerName1("requestWithURL:cachePolicy:timeoutInterval:");
+  instancetype _objc_msgSend_747(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> URL,
+    int cachePolicy,
+    double timeoutInterval,
+  ) {
+    return __objc_msgSend_747(
+      obj,
+      sel,
+      URL,
+      cachePolicy,
+      timeoutInterval,
+    );
+  }
+
+  late final __objc_msgSend_747Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              NSTimeInterval)>>('objc_msgSend');
+  late final __objc_msgSend_747 = __objc_msgSend_747Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, double)>();
+
+  late final _sel_initWithURL_cachePolicy_timeoutInterval_1 =
+      _registerName1("initWithURL:cachePolicy:timeoutInterval:");
+  late final _sel_URL1 = _registerName1("URL");
+  late final _sel_cachePolicy1 = _registerName1("cachePolicy");
+  int _objc_msgSend_748(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_748(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_748Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_748 = __objc_msgSend_748Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_timeoutInterval1 = _registerName1("timeoutInterval");
+  late final _sel_mainDocumentURL1 = _registerName1("mainDocumentURL");
+  late final _sel_networkServiceType1 = _registerName1("networkServiceType");
+  int _objc_msgSend_749(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_749(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_749Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_749 = __objc_msgSend_749Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_allowsCellularAccess1 =
+      _registerName1("allowsCellularAccess");
+  late final _sel_allowsExpensiveNetworkAccess1 =
+      _registerName1("allowsExpensiveNetworkAccess");
+  late final _sel_allowsConstrainedNetworkAccess1 =
+      _registerName1("allowsConstrainedNetworkAccess");
+  late final _sel_assumesHTTP3Capable1 = _registerName1("assumesHTTP3Capable");
+  late final _sel_attribution1 = _registerName1("attribution");
+  int _objc_msgSend_750(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_750(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_750Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_750 = __objc_msgSend_750Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_HTTPMethod1 = _registerName1("HTTPMethod");
+  late final _sel_allHTTPHeaderFields1 = _registerName1("allHTTPHeaderFields");
+  late final _sel_valueForHTTPHeaderField_1 =
+      _registerName1("valueForHTTPHeaderField:");
+  late final _sel_HTTPBody1 = _registerName1("HTTPBody");
+  late final _class_NSInputStream1 = _getClass1("NSInputStream");
+  late final _class_NSStream1 = _getClass1("NSStream");
+  late final _sel_open1 = _registerName1("open");
+  late final _sel_close1 = _registerName1("close");
+  late final _sel_streamStatus1 = _registerName1("streamStatus");
+  int _objc_msgSend_751(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_751(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_751Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_751 = __objc_msgSend_751Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_streamError1 = _registerName1("streamError");
+  late final _class_NSOutputStream1 = _getClass1("NSOutputStream");
+  late final _sel_write_maxLength_1 = _registerName1("write:maxLength:");
+  int _objc_msgSend_752(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Uint8> buffer,
+    int len,
+  ) {
+    return __objc_msgSend_752(
+      obj,
+      sel,
+      buffer,
+      len,
+    );
+  }
+
+  late final __objc_msgSend_752Ptr = _lookup<
+      ffi.NativeFunction<
+          NSInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Uint8>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_752 = __objc_msgSend_752Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Uint8>, int)>();
+
+  late final _sel_hasSpaceAvailable1 = _registerName1("hasSpaceAvailable");
+  late final _sel_initToMemory1 = _registerName1("initToMemory");
+  late final _sel_initToBuffer_capacity_1 =
+      _registerName1("initToBuffer:capacity:");
+  instancetype _objc_msgSend_753(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Uint8> buffer,
+    int capacity,
+  ) {
+    return __objc_msgSend_753(
+      obj,
+      sel,
+      buffer,
+      capacity,
+    );
+  }
+
+  late final __objc_msgSend_753Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Uint8>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_753 = __objc_msgSend_753Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Uint8>, int)>();
+
+  late final _sel_initWithURL_append_1 = _registerName1("initWithURL:append:");
+  late final _sel_initToFileAtPath_append_1 =
+      _registerName1("initToFileAtPath:append:");
+  late final _sel_outputStreamToMemory1 =
+      _registerName1("outputStreamToMemory");
+  late final _sel_outputStreamToBuffer_capacity_1 =
+      _registerName1("outputStreamToBuffer:capacity:");
+  late final _sel_outputStreamToFileAtPath_append_1 =
+      _registerName1("outputStreamToFileAtPath:append:");
+  late final _sel_outputStreamWithURL_append_1 =
+      _registerName1("outputStreamWithURL:append:");
+  late final _sel_getStreamsToHostWithName_port_inputStream_outputStream_1 =
+      _registerName1("getStreamsToHostWithName:port:inputStream:outputStream:");
+  void _objc_msgSend_754(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> hostname,
+    int port,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> inputStream,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outputStream,
+  ) {
+    return __objc_msgSend_754(
+      obj,
+      sel,
+      hostname,
+      port,
+      inputStream,
+      outputStream,
+    );
+  }
+
+  late final __objc_msgSend_754Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSInteger,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_754 = __objc_msgSend_754Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _class_NSHost1 = _getClass1("NSHost");
+  late final _sel_currentHost1 = _registerName1("currentHost");
+  late final _sel_hostWithName_1 = _registerName1("hostWithName:");
+  late final _sel_hostWithAddress_1 = _registerName1("hostWithAddress:");
+  late final _sel_isEqualToHost_1 = _registerName1("isEqualToHost:");
+  bool _objc_msgSend_755(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> aHost,
+  ) {
+    return __objc_msgSend_755(
+      obj,
+      sel,
+      aHost,
+    );
+  }
+
+  late final __objc_msgSend_755Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_755 = __objc_msgSend_755Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_names1 = _registerName1("names");
+  late final _sel_address1 = _registerName1("address");
+  late final _sel_addresses1 = _registerName1("addresses");
+  late final _sel_localizedName1 = _registerName1("localizedName");
+  late final _sel_setHostCacheEnabled_1 =
+      _registerName1("setHostCacheEnabled:");
+  void _objc_msgSend_756(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    bool flag,
+  ) {
+    return __objc_msgSend_756(
+      obj,
+      sel,
+      flag,
+    );
+  }
+
+  late final __objc_msgSend_756Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_756 = __objc_msgSend_756Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, bool)>();
+
+  late final _sel_isHostCacheEnabled1 = _registerName1("isHostCacheEnabled");
+  late final _sel_flushHostCache1 = _registerName1("flushHostCache");
+  late final _sel_getStreamsToHost_port_inputStream_outputStream_1 =
+      _registerName1("getStreamsToHost:port:inputStream:outputStream:");
+  void _objc_msgSend_757(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> host,
+    int port,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> inputStream,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outputStream,
+  ) {
+    return __objc_msgSend_757(
+      obj,
+      sel,
+      host,
+      port,
+      inputStream,
+      outputStream,
+    );
+  }
+
+  late final __objc_msgSend_757Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSInteger,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_757 = __objc_msgSend_757Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_getBoundStreamsWithBufferSize_inputStream_outputStream_1 =
+      _registerName1("getBoundStreamsWithBufferSize:inputStream:outputStream:");
+  void _objc_msgSend_758(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int bufferSize,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> inputStream,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outputStream,
+  ) {
+    return __objc_msgSend_758(
+      obj,
+      sel,
+      bufferSize,
+      inputStream,
+      outputStream,
+    );
+  }
+
+  late final __objc_msgSend_758Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSUInteger,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_758 = __objc_msgSend_758Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_read_maxLength_1 = _registerName1("read:maxLength:");
+  late final _sel_getBuffer_length_1 = _registerName1("getBuffer:length:");
+  bool _objc_msgSend_759(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ffi.Uint8>> buffer,
+    ffi.Pointer<NSUInteger> len,
+  ) {
+    return __objc_msgSend_759(
+      obj,
+      sel,
+      buffer,
+      len,
+    );
+  }
+
+  late final __objc_msgSend_759Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ffi.Uint8>>,
+              ffi.Pointer<NSUInteger>)>>('objc_msgSend');
+  late final __objc_msgSend_759 = __objc_msgSend_759Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Pointer<ffi.Uint8>>, ffi.Pointer<NSUInteger>)>();
+
+  late final _sel_hasBytesAvailable1 = _registerName1("hasBytesAvailable");
+  late final _sel_initWithFileAtPath_1 = _registerName1("initWithFileAtPath:");
+  late final _sel_inputStreamWithData_1 =
+      _registerName1("inputStreamWithData:");
+  late final _sel_inputStreamWithFileAtPath_1 =
+      _registerName1("inputStreamWithFileAtPath:");
+  late final _sel_inputStreamWithURL_1 = _registerName1("inputStreamWithURL:");
+  late final _sel_HTTPBodyStream1 = _registerName1("HTTPBodyStream");
+  ffi.Pointer<ObjCObject> _objc_msgSend_760(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_760(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_760Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_760 = __objc_msgSend_760Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_HTTPShouldHandleCookies1 =
+      _registerName1("HTTPShouldHandleCookies");
+  late final _sel_HTTPShouldUsePipelining1 =
+      _registerName1("HTTPShouldUsePipelining");
+  late final _sel_originalRequest1 = _registerName1("originalRequest");
+  ffi.Pointer<ObjCObject> _objc_msgSend_761(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_761(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_761Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_761 = __objc_msgSend_761Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_currentRequest1 = _registerName1("currentRequest");
+  late final _class_NSURLResponse1 = _getClass1("NSURLResponse");
+  late final _sel_initWithURL_MIMEType_expectedContentLength_textEncodingName_1 =
+      _registerName1(
+          "initWithURL:MIMEType:expectedContentLength:textEncodingName:");
+  instancetype _objc_msgSend_762(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> URL,
+    ffi.Pointer<ObjCObject> MIMEType,
+    int length,
+    ffi.Pointer<ObjCObject> name,
+  ) {
+    return __objc_msgSend_762(
+      obj,
+      sel,
+      URL,
+      MIMEType,
+      length,
+      name,
+    );
+  }
+
+  late final __objc_msgSend_762Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              NSInteger,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_762 = __objc_msgSend_762Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_MIMEType1 = _registerName1("MIMEType");
+  late final _sel_expectedContentLength1 =
+      _registerName1("expectedContentLength");
+  late final _sel_textEncodingName1 = _registerName1("textEncodingName");
+  late final _sel_suggestedFilename1 = _registerName1("suggestedFilename");
+  late final _sel_response1 = _registerName1("response");
+  ffi.Pointer<ObjCObject> _objc_msgSend_763(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_763(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_763Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_763 = __objc_msgSend_763Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_progress1 = _registerName1("progress");
+  late final _sel_earliestBeginDate1 = _registerName1("earliestBeginDate");
+  late final _sel_setEarliestBeginDate_1 =
+      _registerName1("setEarliestBeginDate:");
+  late final _sel_countOfBytesClientExpectsToSend1 =
+      _registerName1("countOfBytesClientExpectsToSend");
+  late final _sel_setCountOfBytesClientExpectsToSend_1 =
+      _registerName1("setCountOfBytesClientExpectsToSend:");
+  late final _sel_countOfBytesClientExpectsToReceive1 =
+      _registerName1("countOfBytesClientExpectsToReceive");
+  late final _sel_setCountOfBytesClientExpectsToReceive_1 =
+      _registerName1("setCountOfBytesClientExpectsToReceive:");
+  late final _sel_countOfBytesSent1 = _registerName1("countOfBytesSent");
+  late final _sel_countOfBytesReceived1 =
+      _registerName1("countOfBytesReceived");
+  late final _sel_countOfBytesExpectedToSend1 =
+      _registerName1("countOfBytesExpectedToSend");
+  late final _sel_countOfBytesExpectedToReceive1 =
+      _registerName1("countOfBytesExpectedToReceive");
+  late final _sel_taskDescription1 = _registerName1("taskDescription");
+  late final _sel_setTaskDescription_1 = _registerName1("setTaskDescription:");
+  late final _sel_state1 = _registerName1("state");
+  int _objc_msgSend_764(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_764(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_764Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_764 = __objc_msgSend_764Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_suspend1 = _registerName1("suspend");
+  late final _sel_priority1 = _registerName1("priority");
+  late final _sel_setPriority_1 = _registerName1("setPriority:");
+  void _objc_msgSend_765(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    double value,
+  ) {
+    return __objc_msgSend_765(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_765Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Float)>>('objc_msgSend');
+  late final __objc_msgSend_765 = __objc_msgSend_765Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, double)>();
+
+  late final _sel_prefersIncrementalDelivery1 =
+      _registerName1("prefersIncrementalDelivery");
+  late final _sel_setPrefersIncrementalDelivery_1 =
+      _registerName1("setPrefersIncrementalDelivery:");
+  late final _sel_storeCookies_forTask_1 =
+      _registerName1("storeCookies:forTask:");
+  void _objc_msgSend_766(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> cookies,
+    ffi.Pointer<ObjCObject> task,
+  ) {
+    return __objc_msgSend_766(
+      obj,
+      sel,
+      cookies,
+      task,
+    );
+  }
+
+  late final __objc_msgSend_766Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_766 = __objc_msgSend_766Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_getCookiesForTask_completionHandler_1 =
+      _registerName1("getCookiesForTask:completionHandler:");
+  void _objc_msgSend_767(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> task,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_767(
+      obj,
+      sel,
+      task,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_767Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_767 = __objc_msgSend_767Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _class_NSIndexPath1 = _getClass1("NSIndexPath");
+  late final _sel_indexPathWithIndex_1 = _registerName1("indexPathWithIndex:");
+  late final _sel_indexPathWithIndexes_length_1 =
+      _registerName1("indexPathWithIndexes:length:");
+  instancetype _objc_msgSend_768(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<NSUInteger> indexes,
+    int length,
+  ) {
+    return __objc_msgSend_768(
+      obj,
+      sel,
+      indexes,
+      length,
+    );
+  }
+
+  late final __objc_msgSend_768Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<NSUInteger>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_768 = __objc_msgSend_768Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<NSUInteger>, int)>();
+
+  late final _sel_initWithIndexes_length_1 =
+      _registerName1("initWithIndexes:length:");
+  late final _sel_indexPathByAddingIndex_1 =
+      _registerName1("indexPathByAddingIndex:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_769(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int index,
+  ) {
+    return __objc_msgSend_769(
+      obj,
+      sel,
+      index,
+    );
+  }
+
+  late final __objc_msgSend_769Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_769 = __objc_msgSend_769Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_indexPathByRemovingLastIndex1 =
+      _registerName1("indexPathByRemovingLastIndex");
+  ffi.Pointer<ObjCObject> _objc_msgSend_770(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_770(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_770Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_770 = __objc_msgSend_770Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_indexAtPosition_1 = _registerName1("indexAtPosition:");
+  late final _sel_getIndexes_range_1 = _registerName1("getIndexes:range:");
+  void _objc_msgSend_771(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<NSUInteger> indexes,
+    NSRange positionRange,
+  ) {
+    return __objc_msgSend_771(
+      obj,
+      sel,
+      indexes,
+      positionRange,
+    );
+  }
+
+  late final __objc_msgSend_771Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<NSUInteger>, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_771 = __objc_msgSend_771Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<NSUInteger>, NSRange)>();
+
+  int _objc_msgSend_772(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> otherObject,
+  ) {
+    return __objc_msgSend_772(
+      obj,
+      sel,
+      otherObject,
+    );
+  }
+
+  late final __objc_msgSend_772Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_772 = __objc_msgSend_772Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_getIndexes_1 = _registerName1("getIndexes:");
+  void _objc_msgSend_773(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<NSUInteger> indexes,
+  ) {
+    return __objc_msgSend_773(
+      obj,
+      sel,
+      indexes,
+    );
+  }
+
+  late final __objc_msgSend_773Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<NSUInteger>)>>('objc_msgSend');
+  late final __objc_msgSend_773 = __objc_msgSend_773Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<NSUInteger>)>();
+
+  late final _class_NSInflectionRule1 = _getClass1("NSInflectionRule");
+  late final _sel_automaticRule1 = _registerName1("automaticRule");
+  ffi.Pointer<ObjCObject> _objc_msgSend_774(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_774(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_774Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_774 = __objc_msgSend_774Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_canInflectLanguage_1 = _registerName1("canInflectLanguage:");
+  late final _sel_canInflectPreferredLocalization1 =
+      _registerName1("canInflectPreferredLocalization");
+  late final _class_NSMorphology1 = _getClass1("NSMorphology");
+  late final _sel_grammaticalGender1 = _registerName1("grammaticalGender");
+  int _objc_msgSend_775(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_775(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_775Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_775 = __objc_msgSend_775Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setGrammaticalGender_1 =
+      _registerName1("setGrammaticalGender:");
+  void _objc_msgSend_776(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_776(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_776Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_776 = __objc_msgSend_776Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_partOfSpeech1 = _registerName1("partOfSpeech");
+  int _objc_msgSend_777(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_777(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_777Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_777 = __objc_msgSend_777Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setPartOfSpeech_1 = _registerName1("setPartOfSpeech:");
+  void _objc_msgSend_778(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_778(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_778Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_778 = __objc_msgSend_778Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_number1 = _registerName1("number");
+  int _objc_msgSend_779(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_779(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_779Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_779 = __objc_msgSend_779Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setNumber_1 = _registerName1("setNumber:");
+  void _objc_msgSend_780(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_780(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_780Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_780 = __objc_msgSend_780Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _class_NSMorphologyCustomPronoun1 =
+      _getClass1("NSMorphologyCustomPronoun");
+  late final _sel_isSupportedForLanguage_1 =
+      _registerName1("isSupportedForLanguage:");
+  late final _sel_requiredKeysForLanguage_1 =
+      _registerName1("requiredKeysForLanguage:");
+  late final _sel_subjectForm1 = _registerName1("subjectForm");
+  late final _sel_setSubjectForm_1 = _registerName1("setSubjectForm:");
+  late final _sel_objectForm1 = _registerName1("objectForm");
+  late final _sel_setObjectForm_1 = _registerName1("setObjectForm:");
+  late final _sel_possessiveForm1 = _registerName1("possessiveForm");
+  late final _sel_setPossessiveForm_1 = _registerName1("setPossessiveForm:");
+  late final _sel_possessiveAdjectiveForm1 =
+      _registerName1("possessiveAdjectiveForm");
+  late final _sel_setPossessiveAdjectiveForm_1 =
+      _registerName1("setPossessiveAdjectiveForm:");
+  late final _sel_reflexiveForm1 = _registerName1("reflexiveForm");
+  late final _sel_setReflexiveForm_1 = _registerName1("setReflexiveForm:");
+  late final _sel_customPronounForLanguage_1 =
+      _registerName1("customPronounForLanguage:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_781(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> language,
+  ) {
+    return __objc_msgSend_781(
+      obj,
+      sel,
+      language,
+    );
+  }
+
+  late final __objc_msgSend_781Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_781 = __objc_msgSend_781Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_setCustomPronoun_forLanguage_error_1 =
+      _registerName1("setCustomPronoun:forLanguage:error:");
+  bool _objc_msgSend_782(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> features,
+    ffi.Pointer<ObjCObject> language,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_782(
+      obj,
+      sel,
+      features,
+      language,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_782Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_782 = __objc_msgSend_782Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_isUnspecified1 = _registerName1("isUnspecified");
+  late final _sel_userMorphology1 = _registerName1("userMorphology");
+  ffi.Pointer<ObjCObject> _objc_msgSend_783(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_783(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_783Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_783 = __objc_msgSend_783Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _class_NSOperationQueue1 = _getClass1("NSOperationQueue");
+  late final _class_NSOperation1 = _getClass1("NSOperation");
+  late final _sel_isConcurrent1 = _registerName1("isConcurrent");
+  late final _sel_isAsynchronous1 = _registerName1("isAsynchronous");
+  late final _sel_isReady1 = _registerName1("isReady");
+  late final _sel_addDependency_1 = _registerName1("addDependency:");
+  void _objc_msgSend_784(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> op,
+  ) {
+    return __objc_msgSend_784(
+      obj,
+      sel,
+      op,
+    );
+  }
+
+  late final __objc_msgSend_784Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_784 = __objc_msgSend_784Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_removeDependency_1 = _registerName1("removeDependency:");
+  late final _sel_dependencies1 = _registerName1("dependencies");
+  late final _sel_queuePriority1 = _registerName1("queuePriority");
+  int _objc_msgSend_785(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_785(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_785Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_785 = __objc_msgSend_785Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setQueuePriority_1 = _registerName1("setQueuePriority:");
+  void _objc_msgSend_786(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_786(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_786Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_786 = __objc_msgSend_786Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_completionBlock1 = _registerName1("completionBlock");
+  late final _sel_setCompletionBlock_1 = _registerName1("setCompletionBlock:");
+  late final _sel_waitUntilFinished1 = _registerName1("waitUntilFinished");
+  late final _sel_addOperation_1 = _registerName1("addOperation:");
+  late final _sel_addOperations_waitUntilFinished_1 =
+      _registerName1("addOperations:waitUntilFinished:");
+  void _objc_msgSend_787(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> ops,
+    bool wait,
+  ) {
+    return __objc_msgSend_787(
+      obj,
+      sel,
+      ops,
+      wait,
+    );
+  }
+
+  late final __objc_msgSend_787Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_787 = __objc_msgSend_787Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, bool)>();
+
+  late final _sel_addOperationWithBlock_1 =
+      _registerName1("addOperationWithBlock:");
+  late final _sel_addBarrierBlock_1 = _registerName1("addBarrierBlock:");
+  late final _sel_maxConcurrentOperationCount1 =
+      _registerName1("maxConcurrentOperationCount");
+  late final _sel_setMaxConcurrentOperationCount_1 =
+      _registerName1("setMaxConcurrentOperationCount:");
+  late final _sel_isSuspended1 = _registerName1("isSuspended");
+  late final _sel_setSuspended_1 = _registerName1("setSuspended:");
+  late final _sel_underlyingQueue1 = _registerName1("underlyingQueue");
+  dispatch_queue_t _objc_msgSend_788(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_788(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_788Ptr = _lookup<
+      ffi.NativeFunction<
+          dispatch_queue_t Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_788 = __objc_msgSend_788Ptr.asFunction<
+      dispatch_queue_t Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setUnderlyingQueue_1 = _registerName1("setUnderlyingQueue:");
+  void _objc_msgSend_789(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    dispatch_queue_t value,
+  ) {
+    return __objc_msgSend_789(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_789Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              dispatch_queue_t)>>('objc_msgSend');
+  late final __objc_msgSend_789 = __objc_msgSend_789Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, dispatch_queue_t)>();
+
+  late final _sel_cancelAllOperations1 = _registerName1("cancelAllOperations");
+  late final _sel_waitUntilAllOperationsAreFinished1 =
+      _registerName1("waitUntilAllOperationsAreFinished");
+  late final _sel_currentQueue1 = _registerName1("currentQueue");
+  ffi.Pointer<ObjCObject> _objc_msgSend_790(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_790(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_790Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_790 = __objc_msgSend_790Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_mainQueue1 = _registerName1("mainQueue");
+  late final _sel_operations1 = _registerName1("operations");
+  late final _sel_operationCount1 = _registerName1("operationCount");
+  late final _class_NSPointerArray1 = _getClass1("NSPointerArray");
+  late final _sel_initWithOptions_1 = _registerName1("initWithOptions:");
+  instancetype _objc_msgSend_791(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int options,
+  ) {
+    return __objc_msgSend_791(
+      obj,
+      sel,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_791Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_791 = __objc_msgSend_791Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _class_NSPointerFunctions1 = _getClass1("NSPointerFunctions");
+  late final _sel_pointerFunctionsWithOptions_1 =
+      _registerName1("pointerFunctionsWithOptions:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_792(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int options,
+  ) {
+    return __objc_msgSend_792(
+      obj,
+      sel,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_792Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_792 = __objc_msgSend_792Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_hashFunction1 = _registerName1("hashFunction");
+  ffi.Pointer<
+          ffi.NativeFunction<
+              NSUInteger Function(
+                  ffi.Pointer<ffi.Void>,
+                  ffi.Pointer<
+                      ffi.NativeFunction<
+                          NSUInteger Function(ffi.Pointer<ffi.Void>)>>)>>
+      _objc_msgSend_793(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_793(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_793Ptr = _lookup<
+          ffi.NativeFunction<
+              ffi.Pointer<
+                      ffi.NativeFunction<
+                          NSUInteger Function(
+                              ffi.Pointer<ffi.Void>,
+                              ffi.Pointer<
+                                  ffi.NativeFunction<
+                                      NSUInteger Function(
+                                          ffi.Pointer<ffi.Void>)>>)>>
+                  Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>(
+      'objc_msgSend');
+  late final __objc_msgSend_793 = __objc_msgSend_793Ptr.asFunction<
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  NSUInteger Function(
+                      ffi.Pointer<ffi.Void>,
+                      ffi.Pointer<
+                          ffi.NativeFunction<
+                              NSUInteger Function(ffi.Pointer<ffi.Void>)>>)>>
+          Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setHashFunction_1 = _registerName1("setHashFunction:");
+  void _objc_msgSend_794(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<
+            ffi.NativeFunction<
+                NSUInteger Function(
+                    ffi.Pointer<ffi.Void>,
+                    ffi.Pointer<
+                        ffi.NativeFunction<
+                            NSUInteger Function(ffi.Pointer<ffi.Void>)>>)>>
+        value,
+  ) {
+    return __objc_msgSend_794(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_794Ptr = _lookup<
+          ffi.NativeFunction<
+              ffi.Void Function(
+                  ffi.Pointer<ObjCObject>,
+                  ffi.Pointer<ObjCSel>,
+                  ffi.Pointer<
+                      ffi.NativeFunction<
+                          NSUInteger Function(
+                              ffi.Pointer<ffi.Void>,
+                              ffi.Pointer<
+                                  ffi.NativeFunction<
+                                      NSUInteger Function(
+                                          ffi.Pointer<ffi.Void>)>>)>>)>>(
+      'objc_msgSend');
+  late final __objc_msgSend_794 = __objc_msgSend_794Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<
+              ffi.NativeFunction<
+                  NSUInteger Function(
+                      ffi.Pointer<ffi.Void>,
+                      ffi.Pointer<
+                          ffi.NativeFunction<
+                              NSUInteger Function(
+                                  ffi.Pointer<ffi.Void>)>>)>>)>();
+
+  late final _sel_isEqualFunction1 = _registerName1("isEqualFunction");
+  ffi.Pointer<
+          ffi.NativeFunction<
+              ffi.Bool Function(
+                  ffi.Pointer<ffi.Void>,
+                  ffi.Pointer<ffi.Void>,
+                  ffi.Pointer<
+                      ffi.NativeFunction<
+                          NSUInteger Function(ffi.Pointer<ffi.Void>)>>)>>
+      _objc_msgSend_795(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_795(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_795Ptr = _lookup<
+          ffi.NativeFunction<
+              ffi.Pointer<
+                      ffi.NativeFunction<
+                          ffi.Bool Function(
+                              ffi.Pointer<ffi.Void>,
+                              ffi.Pointer<ffi.Void>,
+                              ffi.Pointer<
+                                  ffi.NativeFunction<
+                                      NSUInteger Function(
+                                          ffi.Pointer<ffi.Void>)>>)>>
+                  Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>(
+      'objc_msgSend');
+  late final __objc_msgSend_795 = __objc_msgSend_795Ptr.asFunction<
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Bool Function(
+                      ffi.Pointer<ffi.Void>,
+                      ffi.Pointer<ffi.Void>,
+                      ffi.Pointer<
+                          ffi.NativeFunction<
+                              NSUInteger Function(ffi.Pointer<ffi.Void>)>>)>>
+          Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setIsEqualFunction_1 = _registerName1("setIsEqualFunction:");
+  void _objc_msgSend_796(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<
+            ffi.NativeFunction<
+                ffi.Bool Function(
+                    ffi.Pointer<ffi.Void>,
+                    ffi.Pointer<ffi.Void>,
+                    ffi.Pointer<
+                        ffi.NativeFunction<
+                            NSUInteger Function(ffi.Pointer<ffi.Void>)>>)>>
+        value,
+  ) {
+    return __objc_msgSend_796(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_796Ptr = _lookup<
+          ffi.NativeFunction<
+              ffi.Void Function(
+                  ffi.Pointer<ObjCObject>,
+                  ffi.Pointer<ObjCSel>,
+                  ffi.Pointer<
+                      ffi.NativeFunction<
+                          ffi.Bool Function(
+                              ffi.Pointer<ffi.Void>,
+                              ffi.Pointer<ffi.Void>,
+                              ffi.Pointer<
+                                  ffi.NativeFunction<
+                                      NSUInteger Function(
+                                          ffi.Pointer<ffi.Void>)>>)>>)>>(
+      'objc_msgSend');
+  late final __objc_msgSend_796 = __objc_msgSend_796Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Bool Function(
+                      ffi.Pointer<ffi.Void>,
+                      ffi.Pointer<ffi.Void>,
+                      ffi.Pointer<
+                          ffi.NativeFunction<
+                              NSUInteger Function(
+                                  ffi.Pointer<ffi.Void>)>>)>>)>();
+
+  late final _sel_sizeFunction1 = _registerName1("sizeFunction");
+  ffi.Pointer<ffi.NativeFunction<NSUInteger Function(ffi.Pointer<ffi.Void>)>>
+      _objc_msgSend_797(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_797(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_797Ptr = _lookup<
+          ffi.NativeFunction<
+              ffi.Pointer<
+                      ffi.NativeFunction<
+                          NSUInteger Function(ffi.Pointer<ffi.Void>)>>
+                  Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>(
+      'objc_msgSend');
+  late final __objc_msgSend_797 = __objc_msgSend_797Ptr.asFunction<
+      ffi.Pointer<
+              ffi.NativeFunction<NSUInteger Function(ffi.Pointer<ffi.Void>)>>
+          Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setSizeFunction_1 = _registerName1("setSizeFunction:");
+  void _objc_msgSend_798(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.NativeFunction<NSUInteger Function(ffi.Pointer<ffi.Void>)>>
+        value,
+  ) {
+    return __objc_msgSend_798(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_798Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<
+                  ffi.NativeFunction<
+                      NSUInteger Function(
+                          ffi.Pointer<ffi.Void>)>>)>>('objc_msgSend');
+  late final __objc_msgSend_798 = __objc_msgSend_798Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<
+              ffi.NativeFunction<
+                  NSUInteger Function(ffi.Pointer<ffi.Void>)>>)>();
+
+  late final _sel_descriptionFunction1 = _registerName1("descriptionFunction");
+  ffi.Pointer<
+          ffi.NativeFunction<
+              ffi.Pointer<ObjCObject> Function(ffi.Pointer<ffi.Void>)>>
+      _objc_msgSend_799(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_799(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_799Ptr =
+      _lookup<
+              ffi.NativeFunction<
+                  ffi.Pointer<
+                          ffi.NativeFunction<
+                              ffi.Pointer<ObjCObject> Function(
+                                  ffi.Pointer<ffi.Void>)>>
+                      Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>(
+          'objc_msgSend');
+  late final __objc_msgSend_799 = __objc_msgSend_799Ptr.asFunction<
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Pointer<ObjCObject> Function(ffi.Pointer<ffi.Void>)>>
+          Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setDescriptionFunction_1 =
+      _registerName1("setDescriptionFunction:");
+  void _objc_msgSend_800(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<
+            ffi.NativeFunction<
+                ffi.Pointer<ObjCObject> Function(ffi.Pointer<ffi.Void>)>>
+        value,
+  ) {
+    return __objc_msgSend_800(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_800Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<
+                  ffi.NativeFunction<
+                      ffi.Pointer<ObjCObject> Function(
+                          ffi.Pointer<ffi.Void>)>>)>>('objc_msgSend');
+  late final __objc_msgSend_800 = __objc_msgSend_800Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Pointer<ObjCObject> Function(ffi.Pointer<ffi.Void>)>>)>();
+
+  late final _sel_relinquishFunction1 = _registerName1("relinquishFunction");
+  ffi.Pointer<
+          ffi.NativeFunction<
+              ffi.Void Function(
+                  ffi.Pointer<ffi.Void>,
+                  ffi.Pointer<
+                      ffi.NativeFunction<
+                          NSUInteger Function(ffi.Pointer<ffi.Void>)>>)>>
+      _objc_msgSend_801(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_801(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_801Ptr = _lookup<
+          ffi.NativeFunction<
+              ffi.Pointer<
+                      ffi.NativeFunction<
+                          ffi.Void Function(
+                              ffi.Pointer<ffi.Void>,
+                              ffi.Pointer<
+                                  ffi.NativeFunction<
+                                      NSUInteger Function(
+                                          ffi.Pointer<ffi.Void>)>>)>>
+                  Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>(
+      'objc_msgSend');
+  late final __objc_msgSend_801 = __objc_msgSend_801Ptr.asFunction<
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(
+                      ffi.Pointer<ffi.Void>,
+                      ffi.Pointer<
+                          ffi.NativeFunction<
+                              NSUInteger Function(ffi.Pointer<ffi.Void>)>>)>>
+          Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setRelinquishFunction_1 =
+      _registerName1("setRelinquishFunction:");
+  void _objc_msgSend_802(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<ffi.Void>,
+                    ffi.Pointer<
+                        ffi.NativeFunction<
+                            NSUInteger Function(ffi.Pointer<ffi.Void>)>>)>>
+        value,
+  ) {
+    return __objc_msgSend_802(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_802Ptr = _lookup<
+          ffi.NativeFunction<
+              ffi.Void Function(
+                  ffi.Pointer<ObjCObject>,
+                  ffi.Pointer<ObjCSel>,
+                  ffi.Pointer<
+                      ffi.NativeFunction<
+                          ffi.Void Function(
+                              ffi.Pointer<ffi.Void>,
+                              ffi.Pointer<
+                                  ffi.NativeFunction<
+                                      NSUInteger Function(
+                                          ffi.Pointer<ffi.Void>)>>)>>)>>(
+      'objc_msgSend');
+  late final __objc_msgSend_802 = __objc_msgSend_802Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(
+                      ffi.Pointer<ffi.Void>,
+                      ffi.Pointer<
+                          ffi.NativeFunction<
+                              NSUInteger Function(
+                                  ffi.Pointer<ffi.Void>)>>)>>)>();
+
+  late final _sel_acquireFunction1 = _registerName1("acquireFunction");
+  ffi.Pointer<
+      ffi.NativeFunction<
+          ffi.Pointer<ffi.Void> Function(
+              ffi.Pointer<ffi.Void>,
+              ffi.Pointer<
+                  ffi.NativeFunction<
+                      NSUInteger Function(ffi.Pointer<ffi.Void>)>>,
+              ffi.Bool)>> _objc_msgSend_803(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_803(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_803Ptr =
+      _lookup<
+              ffi.NativeFunction<
+                  ffi.Pointer<
+                          ffi.NativeFunction<
+                              ffi.Pointer<ffi.Void> Function(
+                                  ffi.Pointer<ffi.Void>,
+                                  ffi.Pointer<
+                                      ffi.NativeFunction<
+                                          NSUInteger Function(
+                                              ffi.Pointer<ffi.Void>)>>,
+                                  ffi.Bool)>>
+                      Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>(
+          'objc_msgSend');
+  late final __objc_msgSend_803 = __objc_msgSend_803Ptr.asFunction<
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Pointer<ffi.Void> Function(
+                      ffi.Pointer<ffi.Void>,
+                      ffi.Pointer<
+                          ffi.NativeFunction<
+                              NSUInteger Function(ffi.Pointer<ffi.Void>)>>,
+                      ffi.Bool)>>
+          Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setAcquireFunction_1 = _registerName1("setAcquireFunction:");
+  void _objc_msgSend_804(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<
+            ffi.NativeFunction<
+                ffi.Pointer<ffi.Void> Function(
+                    ffi.Pointer<ffi.Void>,
+                    ffi.Pointer<
+                        ffi.NativeFunction<
+                            NSUInteger Function(ffi.Pointer<ffi.Void>)>>,
+                    ffi.Bool)>>
+        value,
+  ) {
+    return __objc_msgSend_804(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_804Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<
+                  ffi.NativeFunction<
+                      ffi.Pointer<ffi.Void> Function(
+                          ffi.Pointer<ffi.Void>,
+                          ffi.Pointer<
+                              ffi.NativeFunction<
+                                  NSUInteger Function(ffi.Pointer<ffi.Void>)>>,
+                          ffi.Bool)>>)>>('objc_msgSend');
+  late final __objc_msgSend_804 = __objc_msgSend_804Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Pointer<ffi.Void> Function(
+                      ffi.Pointer<ffi.Void>,
+                      ffi.Pointer<
+                          ffi.NativeFunction<
+                              NSUInteger Function(ffi.Pointer<ffi.Void>)>>,
+                      ffi.Bool)>>)>();
+
+  late final _sel_usesStrongWriteBarrier1 =
+      _registerName1("usesStrongWriteBarrier");
+  late final _sel_setUsesStrongWriteBarrier_1 =
+      _registerName1("setUsesStrongWriteBarrier:");
+  late final _sel_usesWeakReadAndWriteBarriers1 =
+      _registerName1("usesWeakReadAndWriteBarriers");
+  late final _sel_setUsesWeakReadAndWriteBarriers_1 =
+      _registerName1("setUsesWeakReadAndWriteBarriers:");
+  late final _sel_initWithPointerFunctions_1 =
+      _registerName1("initWithPointerFunctions:");
+  instancetype _objc_msgSend_805(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> functions,
+  ) {
+    return __objc_msgSend_805(
+      obj,
+      sel,
+      functions,
+    );
+  }
+
+  late final __objc_msgSend_805Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_805 = __objc_msgSend_805Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_pointerArrayWithOptions_1 =
+      _registerName1("pointerArrayWithOptions:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_806(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int options,
+  ) {
+    return __objc_msgSend_806(
+      obj,
+      sel,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_806Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_806 = __objc_msgSend_806Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_pointerArrayWithPointerFunctions_1 =
+      _registerName1("pointerArrayWithPointerFunctions:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_807(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> functions,
+  ) {
+    return __objc_msgSend_807(
+      obj,
+      sel,
+      functions,
+    );
+  }
+
+  late final __objc_msgSend_807Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_807 = __objc_msgSend_807Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_pointerFunctions1 = _registerName1("pointerFunctions");
+  ffi.Pointer<ObjCObject> _objc_msgSend_808(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_808(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_808Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_808 = __objc_msgSend_808Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_pointerAtIndex_1 = _registerName1("pointerAtIndex:");
+  ffi.Pointer<ffi.Void> _objc_msgSend_809(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int index,
+  ) {
+    return __objc_msgSend_809(
+      obj,
+      sel,
+      index,
+    );
+  }
+
+  late final __objc_msgSend_809Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ffi.Void> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_809 = __objc_msgSend_809Ptr.asFunction<
+      ffi.Pointer<ffi.Void> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_addPointer_1 = _registerName1("addPointer:");
+  late final _sel_removePointerAtIndex_1 =
+      _registerName1("removePointerAtIndex:");
+  late final _sel_insertPointer_atIndex_1 =
+      _registerName1("insertPointer:atIndex:");
+  late final _sel_replacePointerAtIndex_withPointer_1 =
+      _registerName1("replacePointerAtIndex:withPointer:");
+  void _objc_msgSend_810(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int index,
+    ffi.Pointer<ffi.Void> item,
+  ) {
+    return __objc_msgSend_810(
+      obj,
+      sel,
+      index,
+      item,
+    );
+  }
+
+  late final __objc_msgSend_810Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSUInteger, ffi.Pointer<ffi.Void>)>>('objc_msgSend');
+  late final __objc_msgSend_810 = __objc_msgSend_810Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ffi.Void>)>();
+
+  late final _sel_compact1 = _registerName1("compact");
+  late final _sel_setCount_1 = _registerName1("setCount:");
+  late final _sel_pointerArrayWithStrongObjects1 =
+      _registerName1("pointerArrayWithStrongObjects");
+  late final _sel_pointerArrayWithWeakObjects1 =
+      _registerName1("pointerArrayWithWeakObjects");
+  late final _sel_strongObjectsPointerArray1 =
+      _registerName1("strongObjectsPointerArray");
+  ffi.Pointer<ObjCObject> _objc_msgSend_811(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_811(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_811Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_811 = __objc_msgSend_811Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_weakObjectsPointerArray1 =
+      _registerName1("weakObjectsPointerArray");
+  late final _class_NSProcessInfo1 = _getClass1("NSProcessInfo");
+  late final _sel_processInfo1 = _registerName1("processInfo");
+  ffi.Pointer<ObjCObject> _objc_msgSend_812(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_812(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_812Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_812 = __objc_msgSend_812Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_environment1 = _registerName1("environment");
+  late final _sel_hostName1 = _registerName1("hostName");
+  late final _sel_processName1 = _registerName1("processName");
+  late final _sel_setProcessName_1 = _registerName1("setProcessName:");
+  late final _sel_processIdentifier1 = _registerName1("processIdentifier");
+  late final _sel_globallyUniqueString1 =
+      _registerName1("globallyUniqueString");
+  late final _sel_operatingSystem1 = _registerName1("operatingSystem");
+  late final _sel_operatingSystemName1 = _registerName1("operatingSystemName");
+  late final _sel_operatingSystemVersionString1 =
+      _registerName1("operatingSystemVersionString");
+  late final _sel_operatingSystemVersion1 =
+      _registerName1("operatingSystemVersion");
+  NSOperatingSystemVersion _objc_msgSend_813(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_813(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_813Ptr = _lookup<
+      ffi.NativeFunction<
+          NSOperatingSystemVersion Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_813 = __objc_msgSend_813Ptr.asFunction<
+      NSOperatingSystemVersion Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_processorCount1 = _registerName1("processorCount");
+  late final _sel_activeProcessorCount1 =
+      _registerName1("activeProcessorCount");
+  late final _sel_physicalMemory1 = _registerName1("physicalMemory");
+  late final _sel_isOperatingSystemAtLeastVersion_1 =
+      _registerName1("isOperatingSystemAtLeastVersion:");
+  bool _objc_msgSend_814(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSOperatingSystemVersion version,
+  ) {
+    return __objc_msgSend_814(
+      obj,
+      sel,
+      version,
+    );
+  }
+
+  late final __objc_msgSend_814Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSOperatingSystemVersion)>>('objc_msgSend');
+  late final __objc_msgSend_814 = __objc_msgSend_814Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          NSOperatingSystemVersion)>();
+
+  late final _sel_systemUptime1 = _registerName1("systemUptime");
+  late final _sel_disableSuddenTermination1 =
+      _registerName1("disableSuddenTermination");
+  late final _sel_enableSuddenTermination1 =
+      _registerName1("enableSuddenTermination");
+  late final _sel_disableAutomaticTermination_1 =
+      _registerName1("disableAutomaticTermination:");
+  late final _sel_enableAutomaticTermination_1 =
+      _registerName1("enableAutomaticTermination:");
+  late final _sel_automaticTerminationSupportEnabled1 =
+      _registerName1("automaticTerminationSupportEnabled");
+  late final _sel_setAutomaticTerminationSupportEnabled_1 =
+      _registerName1("setAutomaticTerminationSupportEnabled:");
+  late final _sel_beginActivityWithOptions_reason_1 =
+      _registerName1("beginActivityWithOptions:reason:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_815(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int options,
+    ffi.Pointer<ObjCObject> reason,
+  ) {
+    return __objc_msgSend_815(
+      obj,
+      sel,
+      options,
+      reason,
+    );
+  }
+
+  late final __objc_msgSend_815Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_815 = __objc_msgSend_815Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_endActivity_1 = _registerName1("endActivity:");
+  late final _sel_performActivityWithOptions_reason_usingBlock_1 =
+      _registerName1("performActivityWithOptions:reason:usingBlock:");
+  void _objc_msgSend_816(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int options,
+    ffi.Pointer<ObjCObject> reason,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_816(
+      obj,
+      sel,
+      options,
+      reason,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_816Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_816 = __objc_msgSend_816Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_performExpiringActivityWithReason_usingBlock_1 =
+      _registerName1("performExpiringActivityWithReason:usingBlock:");
+  void _objc_msgSend_817(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> reason,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_817(
+      obj,
+      sel,
+      reason,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_817Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_817 = __objc_msgSend_817Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_userName1 = _registerName1("userName");
+  late final _sel_fullUserName1 = _registerName1("fullUserName");
+  late final _sel_thermalState1 = _registerName1("thermalState");
+  int _objc_msgSend_818(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_818(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_818Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_818 = __objc_msgSend_818Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_isLowPowerModeEnabled1 =
+      _registerName1("isLowPowerModeEnabled");
+  late final _sel_isMacCatalystApp1 = _registerName1("isMacCatalystApp");
+  late final _sel_isiOSAppOnMac1 = _registerName1("isiOSAppOnMac");
+  late final _class_NSTextCheckingResult1 = _getClass1("NSTextCheckingResult");
+  late final _sel_resultType1 = _registerName1("resultType");
+  int _objc_msgSend_819(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_819(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_819Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_819 = __objc_msgSend_819Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_range1 = _registerName1("range");
+  late final _sel_orthography1 = _registerName1("orthography");
+  ffi.Pointer<ObjCObject> _objc_msgSend_820(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_820(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_820Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_820 = __objc_msgSend_820Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_grammarDetails1 = _registerName1("grammarDetails");
+  late final _sel_duration1 = _registerName1("duration");
+  late final _sel_components1 = _registerName1("components");
+  late final _sel_replacementString1 = _registerName1("replacementString");
+  late final _sel_alternativeStrings1 = _registerName1("alternativeStrings");
+  late final _class_NSRegularExpression1 = _getClass1("NSRegularExpression");
+  late final _sel_regularExpressionWithPattern_options_error_1 =
+      _registerName1("regularExpressionWithPattern:options:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_821(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> pattern,
+    int options,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_821(
+      obj,
+      sel,
+      pattern,
+      options,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_821Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_821 = __objc_msgSend_821Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_initWithPattern_options_error_1 =
+      _registerName1("initWithPattern:options:error:");
+  instancetype _objc_msgSend_822(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> pattern,
+    int options,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_822(
+      obj,
+      sel,
+      pattern,
+      options,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_822Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_822 = __objc_msgSend_822Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_pattern1 = _registerName1("pattern");
+  late final _sel_options1 = _registerName1("options");
+  int _objc_msgSend_823(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_823(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_823Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_823 = __objc_msgSend_823Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_numberOfCaptureGroups1 =
+      _registerName1("numberOfCaptureGroups");
+  late final _sel_escapedPatternForString_1 =
+      _registerName1("escapedPatternForString:");
+  late final _sel_enumerateMatchesInString_options_range_usingBlock_1 =
+      _registerName1("enumerateMatchesInString:options:range:usingBlock:");
+  void _objc_msgSend_824(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> string,
+    int options,
+    NSRange range,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_824(
+      obj,
+      sel,
+      string,
+      options,
+      range,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_824Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              NSRange,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_824 = __objc_msgSend_824Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, NSRange, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_matchesInString_options_range_1 =
+      _registerName1("matchesInString:options:range:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_825(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> string,
+    int options,
+    NSRange range,
+  ) {
+    return __objc_msgSend_825(
+      obj,
+      sel,
+      string,
+      options,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_825Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_825 = __objc_msgSend_825Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>, int, NSRange)>();
+
+  late final _sel_numberOfMatchesInString_options_range_1 =
+      _registerName1("numberOfMatchesInString:options:range:");
+  int _objc_msgSend_826(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> string,
+    int options,
+    NSRange range,
+  ) {
+    return __objc_msgSend_826(
+      obj,
+      sel,
+      string,
+      options,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_826Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Int32, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_826 = __objc_msgSend_826Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, NSRange)>();
+
+  late final _sel_firstMatchInString_options_range_1 =
+      _registerName1("firstMatchInString:options:range:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_827(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> string,
+    int options,
+    NSRange range,
+  ) {
+    return __objc_msgSend_827(
+      obj,
+      sel,
+      string,
+      options,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_827Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_827 = __objc_msgSend_827Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>, int, NSRange)>();
+
+  late final _sel_rangeOfFirstMatchInString_options_range_1 =
+      _registerName1("rangeOfFirstMatchInString:options:range:");
+  NSRange _objc_msgSend_828(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> string,
+    int options,
+    NSRange range,
+  ) {
+    return __objc_msgSend_828(
+      obj,
+      sel,
+      string,
+      options,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_828Ptr = _lookup<
+      ffi.NativeFunction<
+          NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Int32, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_828 = __objc_msgSend_828Ptr.asFunction<
+      NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, NSRange)>();
+
+  late final _sel_stringByReplacingMatchesInString_options_range_withTemplate_1 =
+      _registerName1(
+          "stringByReplacingMatchesInString:options:range:withTemplate:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_829(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> string,
+    int options,
+    NSRange range,
+    ffi.Pointer<ObjCObject> templ,
+  ) {
+    return __objc_msgSend_829(
+      obj,
+      sel,
+      string,
+      options,
+      range,
+      templ,
+    );
+  }
+
+  late final __objc_msgSend_829Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              NSRange,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_829 = __objc_msgSend_829Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          NSRange,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_replaceMatchesInString_options_range_withTemplate_1 =
+      _registerName1("replaceMatchesInString:options:range:withTemplate:");
+  int _objc_msgSend_830(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> string,
+    int options,
+    NSRange range,
+    ffi.Pointer<ObjCObject> templ,
+  ) {
+    return __objc_msgSend_830(
+      obj,
+      sel,
+      string,
+      options,
+      range,
+      templ,
+    );
+  }
+
+  late final __objc_msgSend_830Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              NSRange,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_830 = __objc_msgSend_830Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, NSRange, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_replacementStringForResult_inString_offset_template_1 =
+      _registerName1("replacementStringForResult:inString:offset:template:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_831(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> result,
+    ffi.Pointer<ObjCObject> string,
+    int offset,
+    ffi.Pointer<ObjCObject> templ,
+  ) {
+    return __objc_msgSend_831(
+      obj,
+      sel,
+      result,
+      string,
+      offset,
+      templ,
+    );
+  }
+
+  late final __objc_msgSend_831Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              NSInteger,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_831 = __objc_msgSend_831Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_escapedTemplateForString_1 =
+      _registerName1("escapedTemplateForString:");
+  late final _sel_regularExpression1 = _registerName1("regularExpression");
+  ffi.Pointer<ObjCObject> _objc_msgSend_832(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_832(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_832Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_832 = __objc_msgSend_832Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_phoneNumber1 = _registerName1("phoneNumber");
+  late final _sel_numberOfRanges1 = _registerName1("numberOfRanges");
+  late final _sel_rangeAtIndex_1 = _registerName1("rangeAtIndex:");
+  late final _sel_rangeWithName_1 = _registerName1("rangeWithName:");
+  late final _sel_resultByAdjustingRangesWithOffset_1 =
+      _registerName1("resultByAdjustingRangesWithOffset:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_833(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int offset,
+  ) {
+    return __objc_msgSend_833(
+      obj,
+      sel,
+      offset,
+    );
+  }
+
+  late final __objc_msgSend_833Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSInteger)>>('objc_msgSend');
+  late final __objc_msgSend_833 = __objc_msgSend_833Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_addressComponents1 = _registerName1("addressComponents");
+  late final _sel_orthographyCheckingResultWithRange_orthography_1 =
+      _registerName1("orthographyCheckingResultWithRange:orthography:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_834(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    ffi.Pointer<ObjCObject> orthography,
+  ) {
+    return __objc_msgSend_834(
+      obj,
+      sel,
+      range,
+      orthography,
+    );
+  }
+
+  late final __objc_msgSend_834Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSRange,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_834 = __objc_msgSend_834Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, NSRange, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_spellCheckingResultWithRange_1 =
+      _registerName1("spellCheckingResultWithRange:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_835(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+  ) {
+    return __objc_msgSend_835(
+      obj,
+      sel,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_835Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_835 = __objc_msgSend_835Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange)>();
+
+  late final _sel_grammarCheckingResultWithRange_details_1 =
+      _registerName1("grammarCheckingResultWithRange:details:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_836(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    ffi.Pointer<ObjCObject> details,
+  ) {
+    return __objc_msgSend_836(
+      obj,
+      sel,
+      range,
+      details,
+    );
+  }
+
+  late final __objc_msgSend_836Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSRange,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_836 = __objc_msgSend_836Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, NSRange, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dateCheckingResultWithRange_date_1 =
+      _registerName1("dateCheckingResultWithRange:date:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_837(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    ffi.Pointer<ObjCObject> date,
+  ) {
+    return __objc_msgSend_837(
+      obj,
+      sel,
+      range,
+      date,
+    );
+  }
+
+  late final __objc_msgSend_837Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSRange,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_837 = __objc_msgSend_837Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, NSRange, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dateCheckingResultWithRange_date_timeZone_duration_1 =
+      _registerName1("dateCheckingResultWithRange:date:timeZone:duration:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_838(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    ffi.Pointer<ObjCObject> date,
+    ffi.Pointer<ObjCObject> timeZone,
+    double duration,
+  ) {
+    return __objc_msgSend_838(
+      obj,
+      sel,
+      range,
+      date,
+      timeZone,
+      duration,
+    );
+  }
+
+  late final __objc_msgSend_838Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSRange,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              NSTimeInterval)>>('objc_msgSend');
+  late final __objc_msgSend_838 = __objc_msgSend_838Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          NSRange,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          double)>();
+
+  late final _sel_addressCheckingResultWithRange_components_1 =
+      _registerName1("addressCheckingResultWithRange:components:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_839(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    ffi.Pointer<ObjCObject> components,
+  ) {
+    return __objc_msgSend_839(
+      obj,
+      sel,
+      range,
+      components,
+    );
+  }
+
+  late final __objc_msgSend_839Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSRange,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_839 = __objc_msgSend_839Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, NSRange, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_linkCheckingResultWithRange_URL_1 =
+      _registerName1("linkCheckingResultWithRange:URL:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_840(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    ffi.Pointer<ObjCObject> url,
+  ) {
+    return __objc_msgSend_840(
+      obj,
+      sel,
+      range,
+      url,
+    );
+  }
+
+  late final __objc_msgSend_840Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSRange,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_840 = __objc_msgSend_840Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, NSRange, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_quoteCheckingResultWithRange_replacementString_1 =
+      _registerName1("quoteCheckingResultWithRange:replacementString:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_841(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    ffi.Pointer<ObjCObject> replacementString,
+  ) {
+    return __objc_msgSend_841(
+      obj,
+      sel,
+      range,
+      replacementString,
+    );
+  }
+
+  late final __objc_msgSend_841Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSRange,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_841 = __objc_msgSend_841Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, NSRange, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dashCheckingResultWithRange_replacementString_1 =
+      _registerName1("dashCheckingResultWithRange:replacementString:");
+  late final _sel_replacementCheckingResultWithRange_replacementString_1 =
+      _registerName1("replacementCheckingResultWithRange:replacementString:");
+  late final _sel_correctionCheckingResultWithRange_replacementString_1 =
+      _registerName1("correctionCheckingResultWithRange:replacementString:");
+  late final _sel_correctionCheckingResultWithRange_replacementString_alternativeStrings_1 =
+      _registerName1(
+          "correctionCheckingResultWithRange:replacementString:alternativeStrings:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_842(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    ffi.Pointer<ObjCObject> replacementString,
+    ffi.Pointer<ObjCObject> alternativeStrings,
+  ) {
+    return __objc_msgSend_842(
+      obj,
+      sel,
+      range,
+      replacementString,
+      alternativeStrings,
+    );
+  }
+
+  late final __objc_msgSend_842Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSRange,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_842 = __objc_msgSend_842Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          NSRange,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_regularExpressionCheckingResultWithRanges_count_regularExpression_1 =
+      _registerName1(
+          "regularExpressionCheckingResultWithRanges:count:regularExpression:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_843(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRangePointer ranges,
+    int count,
+    ffi.Pointer<ObjCObject> regularExpression,
+  ) {
+    return __objc_msgSend_843(
+      obj,
+      sel,
+      ranges,
+      count,
+      regularExpression,
+    );
+  }
+
+  late final __objc_msgSend_843Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSRangePointer,
+              NSUInteger,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_843 = __objc_msgSend_843Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          NSRangePointer,
+          int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_phoneNumberCheckingResultWithRange_phoneNumber_1 =
+      _registerName1("phoneNumberCheckingResultWithRange:phoneNumber:");
+  late final _sel_transitInformationCheckingResultWithRange_components_1 =
+      _registerName1("transitInformationCheckingResultWithRange:components:");
+  late final _class_NSURLCache1 = _getClass1("NSURLCache");
+  late final _sel_sharedURLCache1 = _registerName1("sharedURLCache");
+  ffi.Pointer<ObjCObject> _objc_msgSend_844(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_844(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_844Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_844 = __objc_msgSend_844Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setSharedURLCache_1 = _registerName1("setSharedURLCache:");
+  void _objc_msgSend_845(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_845(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_845Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_845 = __objc_msgSend_845Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithMemoryCapacity_diskCapacity_diskPath_1 =
+      _registerName1("initWithMemoryCapacity:diskCapacity:diskPath:");
+  instancetype _objc_msgSend_846(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int memoryCapacity,
+    int diskCapacity,
+    ffi.Pointer<ObjCObject> path,
+  ) {
+    return __objc_msgSend_846(
+      obj,
+      sel,
+      memoryCapacity,
+      diskCapacity,
+      path,
+    );
+  }
+
+  late final __objc_msgSend_846Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSUInteger,
+              NSUInteger,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_846 = __objc_msgSend_846Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          int, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithMemoryCapacity_diskCapacity_directoryURL_1 =
+      _registerName1("initWithMemoryCapacity:diskCapacity:directoryURL:");
+  instancetype _objc_msgSend_847(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int memoryCapacity,
+    int diskCapacity,
+    ffi.Pointer<ObjCObject> directoryURL,
+  ) {
+    return __objc_msgSend_847(
+      obj,
+      sel,
+      memoryCapacity,
+      diskCapacity,
+      directoryURL,
+    );
+  }
+
+  late final __objc_msgSend_847Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSUInteger,
+              NSUInteger,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_847 = __objc_msgSend_847Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          int, ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSCachedURLResponse1 = _getClass1("NSCachedURLResponse");
+  late final _sel_initWithResponse_data_1 =
+      _registerName1("initWithResponse:data:");
+  instancetype _objc_msgSend_848(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> response,
+    ffi.Pointer<ObjCObject> data,
+  ) {
+    return __objc_msgSend_848(
+      obj,
+      sel,
+      response,
+      data,
+    );
+  }
+
+  late final __objc_msgSend_848Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_848 = __objc_msgSend_848Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithResponse_data_userInfo_storagePolicy_1 =
+      _registerName1("initWithResponse:data:userInfo:storagePolicy:");
+  instancetype _objc_msgSend_849(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> response,
+    ffi.Pointer<ObjCObject> data,
+    ffi.Pointer<ObjCObject> userInfo,
+    int storagePolicy,
+  ) {
+    return __objc_msgSend_849(
+      obj,
+      sel,
+      response,
+      data,
+      userInfo,
+      storagePolicy,
+    );
+  }
+
+  late final __objc_msgSend_849Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_849 = __objc_msgSend_849Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          int)>();
+
+  late final _sel_storagePolicy1 = _registerName1("storagePolicy");
+  int _objc_msgSend_850(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_850(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_850Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_850 = __objc_msgSend_850Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_cachedResponseForRequest_1 =
+      _registerName1("cachedResponseForRequest:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_851(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+  ) {
+    return __objc_msgSend_851(
+      obj,
+      sel,
+      request,
+    );
+  }
+
+  late final __objc_msgSend_851Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_851 = __objc_msgSend_851Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_storeCachedResponse_forRequest_1 =
+      _registerName1("storeCachedResponse:forRequest:");
+  void _objc_msgSend_852(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> cachedResponse,
+    ffi.Pointer<ObjCObject> request,
+  ) {
+    return __objc_msgSend_852(
+      obj,
+      sel,
+      cachedResponse,
+      request,
+    );
+  }
+
+  late final __objc_msgSend_852Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_852 = __objc_msgSend_852Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_removeCachedResponseForRequest_1 =
+      _registerName1("removeCachedResponseForRequest:");
+  void _objc_msgSend_853(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+  ) {
+    return __objc_msgSend_853(
+      obj,
+      sel,
+      request,
+    );
+  }
+
+  late final __objc_msgSend_853Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_853 = __objc_msgSend_853Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_removeAllCachedResponses1 =
+      _registerName1("removeAllCachedResponses");
+  late final _sel_removeCachedResponsesSinceDate_1 =
+      _registerName1("removeCachedResponsesSinceDate:");
+  late final _sel_memoryCapacity1 = _registerName1("memoryCapacity");
+  late final _sel_setMemoryCapacity_1 = _registerName1("setMemoryCapacity:");
+  late final _sel_diskCapacity1 = _registerName1("diskCapacity");
+  late final _sel_setDiskCapacity_1 = _registerName1("setDiskCapacity:");
+  late final _sel_currentMemoryUsage1 = _registerName1("currentMemoryUsage");
+  late final _sel_currentDiskUsage1 = _registerName1("currentDiskUsage");
+  late final _class_NSURLSessionDataTask1 = _getClass1("NSURLSessionDataTask");
+  late final _sel_storeCachedResponse_forDataTask_1 =
+      _registerName1("storeCachedResponse:forDataTask:");
+  void _objc_msgSend_854(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> cachedResponse,
+    ffi.Pointer<ObjCObject> dataTask,
+  ) {
+    return __objc_msgSend_854(
+      obj,
+      sel,
+      cachedResponse,
+      dataTask,
+    );
+  }
+
+  late final __objc_msgSend_854Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_854 = __objc_msgSend_854Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_getCachedResponseForDataTask_completionHandler_1 =
+      _registerName1("getCachedResponseForDataTask:completionHandler:");
+  void _objc_msgSend_855(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> dataTask,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_855(
+      obj,
+      sel,
+      dataTask,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_855Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_855 = __objc_msgSend_855Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_removeCachedResponseForDataTask_1 =
+      _registerName1("removeCachedResponseForDataTask:");
+  void _objc_msgSend_856(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> dataTask,
+  ) {
+    return __objc_msgSend_856(
+      obj,
+      sel,
+      dataTask,
+    );
+  }
+
+  late final __objc_msgSend_856Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_856 = __objc_msgSend_856Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSURLConnection1 = _getClass1("NSURLConnection");
+  late final _sel_initWithRequest_delegate_startImmediately_1 =
+      _registerName1("initWithRequest:delegate:startImmediately:");
+  instancetype _objc_msgSend_857(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+    ffi.Pointer<ObjCObject> delegate,
+    bool startImmediately,
+  ) {
+    return __objc_msgSend_857(
+      obj,
+      sel,
+      request,
+      delegate,
+      startImmediately,
+    );
+  }
+
+  late final __objc_msgSend_857Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_857 = __objc_msgSend_857Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>, bool)>();
+
+  late final _sel_initWithRequest_delegate_1 =
+      _registerName1("initWithRequest:delegate:");
+  instancetype _objc_msgSend_858(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+    ffi.Pointer<ObjCObject> delegate,
+  ) {
+    return __objc_msgSend_858(
+      obj,
+      sel,
+      request,
+      delegate,
+    );
+  }
+
+  late final __objc_msgSend_858Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_858 = __objc_msgSend_858Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_connectionWithRequest_delegate_1 =
+      _registerName1("connectionWithRequest:delegate:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_859(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+    ffi.Pointer<ObjCObject> delegate,
+  ) {
+    return __objc_msgSend_859(
+      obj,
+      sel,
+      request,
+      delegate,
+    );
+  }
+
+  late final __objc_msgSend_859Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_859 = __objc_msgSend_859Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_unscheduleFromRunLoop_forMode_1 =
+      _registerName1("unscheduleFromRunLoop:forMode:");
+  late final _sel_setDelegateQueue_1 = _registerName1("setDelegateQueue:");
+  void _objc_msgSend_860(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> queue,
+  ) {
+    return __objc_msgSend_860(
+      obj,
+      sel,
+      queue,
+    );
+  }
+
+  late final __objc_msgSend_860Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_860 = __objc_msgSend_860Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_canHandleRequest_1 = _registerName1("canHandleRequest:");
+  bool _objc_msgSend_861(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+  ) {
+    return __objc_msgSend_861(
+      obj,
+      sel,
+      request,
+    );
+  }
+
+  late final __objc_msgSend_861Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_861 = __objc_msgSend_861Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_sendSynchronousRequest_returningResponse_error_1 =
+      _registerName1("sendSynchronousRequest:returningResponse:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_862(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> response,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_862(
+      obj,
+      sel,
+      request,
+      response,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_862Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_862 = __objc_msgSend_862Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_sendAsynchronousRequest_queue_completionHandler_1 =
+      _registerName1("sendAsynchronousRequest:queue:completionHandler:");
+  void _objc_msgSend_863(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+    ffi.Pointer<ObjCObject> queue,
+    ffi.Pointer<_ObjCBlock> handler,
+  ) {
+    return __objc_msgSend_863(
+      obj,
+      sel,
+      request,
+      queue,
+      handler,
+    );
+  }
+
+  late final __objc_msgSend_863Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_863 = __objc_msgSend_863Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _class_NSURLCredential1 = _getClass1("NSURLCredential");
+  late final _sel_persistence1 = _registerName1("persistence");
+  int _objc_msgSend_864(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_864(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_864Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_864 = __objc_msgSend_864Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_initWithUser_password_persistence_1 =
+      _registerName1("initWithUser:password:persistence:");
+  instancetype _objc_msgSend_865(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> user,
+    ffi.Pointer<ObjCObject> password,
+    int persistence,
+  ) {
+    return __objc_msgSend_865(
+      obj,
+      sel,
+      user,
+      password,
+      persistence,
+    );
+  }
+
+  late final __objc_msgSend_865Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_865 = __objc_msgSend_865Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_credentialWithUser_password_persistence_1 =
+      _registerName1("credentialWithUser:password:persistence:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_866(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> user,
+    ffi.Pointer<ObjCObject> password,
+    int persistence,
+  ) {
+    return __objc_msgSend_866(
+      obj,
+      sel,
+      user,
+      password,
+      persistence,
+    );
+  }
+
+  late final __objc_msgSend_866Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_866 = __objc_msgSend_866Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          int)>();
+
+  late final _sel_hasPassword1 = _registerName1("hasPassword");
+  late final _sel_initWithIdentity_certificates_persistence_1 =
+      _registerName1("initWithIdentity:certificates:persistence:");
+  instancetype _objc_msgSend_867(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    SecIdentityRef identity,
+    ffi.Pointer<ObjCObject> certArray,
+    int persistence,
+  ) {
+    return __objc_msgSend_867(
+      obj,
+      sel,
+      identity,
+      certArray,
+      persistence,
+    );
+  }
+
+  late final __objc_msgSend_867Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              SecIdentityRef,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_867 = __objc_msgSend_867Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          SecIdentityRef, ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_credentialWithIdentity_certificates_persistence_1 =
+      _registerName1("credentialWithIdentity:certificates:persistence:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_868(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    SecIdentityRef identity,
+    ffi.Pointer<ObjCObject> certArray,
+    int persistence,
+  ) {
+    return __objc_msgSend_868(
+      obj,
+      sel,
+      identity,
+      certArray,
+      persistence,
+    );
+  }
+
+  late final __objc_msgSend_868Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              SecIdentityRef,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_868 = __objc_msgSend_868Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          SecIdentityRef,
+          ffi.Pointer<ObjCObject>,
+          int)>();
+
+  late final _sel_identity1 = _registerName1("identity");
+  SecIdentityRef _objc_msgSend_869(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_869(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_869Ptr = _lookup<
+      ffi.NativeFunction<
+          SecIdentityRef Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_869 = __objc_msgSend_869Ptr.asFunction<
+      SecIdentityRef Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_certificates1 = _registerName1("certificates");
+  late final _sel_initWithTrust_1 = _registerName1("initWithTrust:");
+  instancetype _objc_msgSend_870(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    SecTrustRef trust,
+  ) {
+    return __objc_msgSend_870(
+      obj,
+      sel,
+      trust,
+    );
+  }
+
+  late final __objc_msgSend_870Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              SecTrustRef)>>('objc_msgSend');
+  late final __objc_msgSend_870 = __objc_msgSend_870Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, SecTrustRef)>();
+
+  late final _sel_credentialForTrust_1 = _registerName1("credentialForTrust:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_871(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    SecTrustRef trust,
+  ) {
+    return __objc_msgSend_871(
+      obj,
+      sel,
+      trust,
+    );
+  }
+
+  late final __objc_msgSend_871Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, SecTrustRef)>>('objc_msgSend');
+  late final __objc_msgSend_871 = __objc_msgSend_871Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, SecTrustRef)>();
+
+  late final _class_NSURLProtectionSpace1 = _getClass1("NSURLProtectionSpace");
+  late final _sel_initWithHost_port_protocol_realm_authenticationMethod_1 =
+      _registerName1("initWithHost:port:protocol:realm:authenticationMethod:");
+  instancetype _objc_msgSend_872(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> host,
+    int port,
+    ffi.Pointer<ObjCObject> protocol,
+    ffi.Pointer<ObjCObject> realm,
+    ffi.Pointer<ObjCObject> authenticationMethod,
+  ) {
+    return __objc_msgSend_872(
+      obj,
+      sel,
+      host,
+      port,
+      protocol,
+      realm,
+      authenticationMethod,
+    );
+  }
+
+  late final __objc_msgSend_872Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSInteger,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_872 = __objc_msgSend_872Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithProxyHost_port_type_realm_authenticationMethod_1 =
+      _registerName1("initWithProxyHost:port:type:realm:authenticationMethod:");
+  late final _sel_realm1 = _registerName1("realm");
+  late final _sel_receivesCredentialSecurely1 =
+      _registerName1("receivesCredentialSecurely");
+  late final _sel_isProxy1 = _registerName1("isProxy");
+  late final _sel_proxyType1 = _registerName1("proxyType");
+  late final _sel_protocol1 = _registerName1("protocol");
+  late final _sel_authenticationMethod1 =
+      _registerName1("authenticationMethod");
+  late final _sel_distinguishedNames1 = _registerName1("distinguishedNames");
+  late final _sel_serverTrust1 = _registerName1("serverTrust");
+  SecTrustRef _objc_msgSend_873(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_873(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_873Ptr = _lookup<
+      ffi.NativeFunction<
+          SecTrustRef Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_873 = __objc_msgSend_873Ptr.asFunction<
+      SecTrustRef Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _class_NSURLCredentialStorage1 =
+      _getClass1("NSURLCredentialStorage");
+  late final _sel_sharedCredentialStorage1 =
+      _registerName1("sharedCredentialStorage");
+  ffi.Pointer<ObjCObject> _objc_msgSend_874(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_874(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_874Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_874 = __objc_msgSend_874Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_credentialsForProtectionSpace_1 =
+      _registerName1("credentialsForProtectionSpace:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_875(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> space,
+  ) {
+    return __objc_msgSend_875(
+      obj,
+      sel,
+      space,
+    );
+  }
+
+  late final __objc_msgSend_875Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_875 = __objc_msgSend_875Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_allCredentials1 = _registerName1("allCredentials");
+  late final _sel_setCredential_forProtectionSpace_1 =
+      _registerName1("setCredential:forProtectionSpace:");
+  void _objc_msgSend_876(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> credential,
+    ffi.Pointer<ObjCObject> space,
+  ) {
+    return __objc_msgSend_876(
+      obj,
+      sel,
+      credential,
+      space,
+    );
+  }
+
+  late final __objc_msgSend_876Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_876 = __objc_msgSend_876Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_removeCredential_forProtectionSpace_1 =
+      _registerName1("removeCredential:forProtectionSpace:");
+  late final _sel_removeCredential_forProtectionSpace_options_1 =
+      _registerName1("removeCredential:forProtectionSpace:options:");
+  void _objc_msgSend_877(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> credential,
+    ffi.Pointer<ObjCObject> space,
+    ffi.Pointer<ObjCObject> options,
+  ) {
+    return __objc_msgSend_877(
+      obj,
+      sel,
+      credential,
+      space,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_877Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_877 = __objc_msgSend_877Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_defaultCredentialForProtectionSpace_1 =
+      _registerName1("defaultCredentialForProtectionSpace:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_878(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> space,
+  ) {
+    return __objc_msgSend_878(
+      obj,
+      sel,
+      space,
+    );
+  }
+
+  late final __objc_msgSend_878Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_878 = __objc_msgSend_878Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_setDefaultCredential_forProtectionSpace_1 =
+      _registerName1("setDefaultCredential:forProtectionSpace:");
+  late final _sel_getCredentialsForProtectionSpace_task_completionHandler_1 =
+      _registerName1(
+          "getCredentialsForProtectionSpace:task:completionHandler:");
+  void _objc_msgSend_879(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> protectionSpace,
+    ffi.Pointer<ObjCObject> task,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_879(
+      obj,
+      sel,
+      protectionSpace,
+      task,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_879Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_879 = __objc_msgSend_879Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_setCredential_forProtectionSpace_task_1 =
+      _registerName1("setCredential:forProtectionSpace:task:");
+  void _objc_msgSend_880(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> credential,
+    ffi.Pointer<ObjCObject> protectionSpace,
+    ffi.Pointer<ObjCObject> task,
+  ) {
+    return __objc_msgSend_880(
+      obj,
+      sel,
+      credential,
+      protectionSpace,
+      task,
+    );
+  }
+
+  late final __objc_msgSend_880Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_880 = __objc_msgSend_880Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_removeCredential_forProtectionSpace_options_task_1 =
+      _registerName1("removeCredential:forProtectionSpace:options:task:");
+  void _objc_msgSend_881(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> credential,
+    ffi.Pointer<ObjCObject> protectionSpace,
+    ffi.Pointer<ObjCObject> options,
+    ffi.Pointer<ObjCObject> task,
+  ) {
+    return __objc_msgSend_881(
+      obj,
+      sel,
+      credential,
+      protectionSpace,
+      options,
+      task,
+    );
+  }
+
+  late final __objc_msgSend_881Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_881 = __objc_msgSend_881Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_getDefaultCredentialForProtectionSpace_task_completionHandler_1 =
+      _registerName1(
+          "getDefaultCredentialForProtectionSpace:task:completionHandler:");
+  void _objc_msgSend_882(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> space,
+    ffi.Pointer<ObjCObject> task,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_882(
+      obj,
+      sel,
+      space,
+      task,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_882Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_882 = __objc_msgSend_882Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_setDefaultCredential_forProtectionSpace_task_1 =
+      _registerName1("setDefaultCredential:forProtectionSpace:task:");
+  late final _class_NSURLProtocol1 = _getClass1("NSURLProtocol");
+  late final _sel_initWithRequest_cachedResponse_client_1 =
+      _registerName1("initWithRequest:cachedResponse:client:");
+  instancetype _objc_msgSend_883(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+    ffi.Pointer<ObjCObject> cachedResponse,
+    ffi.Pointer<ObjCObject> client,
+  ) {
+    return __objc_msgSend_883(
+      obj,
+      sel,
+      request,
+      cachedResponse,
+      client,
+    );
+  }
+
+  late final __objc_msgSend_883Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_883 = __objc_msgSend_883Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_client1 = _registerName1("client");
+  late final _sel_request1 = _registerName1("request");
+  late final _sel_cachedResponse1 = _registerName1("cachedResponse");
+  ffi.Pointer<ObjCObject> _objc_msgSend_884(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_884(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_884Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_884 = __objc_msgSend_884Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_canInitWithRequest_1 = _registerName1("canInitWithRequest:");
+  late final _sel_canonicalRequestForRequest_1 =
+      _registerName1("canonicalRequestForRequest:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_885(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+  ) {
+    return __objc_msgSend_885(
+      obj,
+      sel,
+      request,
+    );
+  }
+
+  late final __objc_msgSend_885Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_885 = __objc_msgSend_885Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_requestIsCacheEquivalent_toRequest_1 =
+      _registerName1("requestIsCacheEquivalent:toRequest:");
+  bool _objc_msgSend_886(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> a,
+    ffi.Pointer<ObjCObject> b,
+  ) {
+    return __objc_msgSend_886(
+      obj,
+      sel,
+      a,
+      b,
+    );
+  }
+
+  late final __objc_msgSend_886Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_886 = __objc_msgSend_886Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_startLoading1 = _registerName1("startLoading");
+  late final _sel_stopLoading1 = _registerName1("stopLoading");
+  late final _sel_propertyForKey_inRequest_1 =
+      _registerName1("propertyForKey:inRequest:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_887(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+    ffi.Pointer<ObjCObject> request,
+  ) {
+    return __objc_msgSend_887(
+      obj,
+      sel,
+      key,
+      request,
+    );
+  }
+
+  late final __objc_msgSend_887Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_887 = __objc_msgSend_887Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSMutableURLRequest1 = _getClass1("NSMutableURLRequest");
+  late final _sel_setURL_1 = _registerName1("setURL:");
+  void _objc_msgSend_888(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_888(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_888Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_888 = __objc_msgSend_888Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_setCachePolicy_1 = _registerName1("setCachePolicy:");
+  void _objc_msgSend_889(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_889(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_889Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_889 = __objc_msgSend_889Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_setTimeoutInterval_1 = _registerName1("setTimeoutInterval:");
+  late final _sel_setMainDocumentURL_1 = _registerName1("setMainDocumentURL:");
+  late final _sel_setNetworkServiceType_1 =
+      _registerName1("setNetworkServiceType:");
+  void _objc_msgSend_890(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_890(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_890Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_890 = __objc_msgSend_890Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_setAllowsCellularAccess_1 =
+      _registerName1("setAllowsCellularAccess:");
+  late final _sel_setAllowsExpensiveNetworkAccess_1 =
+      _registerName1("setAllowsExpensiveNetworkAccess:");
+  late final _sel_setAllowsConstrainedNetworkAccess_1 =
+      _registerName1("setAllowsConstrainedNetworkAccess:");
+  late final _sel_setAssumesHTTP3Capable_1 =
+      _registerName1("setAssumesHTTP3Capable:");
+  late final _sel_setAttribution_1 = _registerName1("setAttribution:");
+  void _objc_msgSend_891(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_891(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_891Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_891 = __objc_msgSend_891Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_setHTTPMethod_1 = _registerName1("setHTTPMethod:");
+  late final _sel_setAllHTTPHeaderFields_1 =
+      _registerName1("setAllHTTPHeaderFields:");
+  late final _sel_setValue_forHTTPHeaderField_1 =
+      _registerName1("setValue:forHTTPHeaderField:");
+  late final _sel_addValue_forHTTPHeaderField_1 =
+      _registerName1("addValue:forHTTPHeaderField:");
+  late final _sel_setHTTPBody_1 = _registerName1("setHTTPBody:");
+  void _objc_msgSend_892(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_892(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_892Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_892 = __objc_msgSend_892Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_setHTTPBodyStream_1 = _registerName1("setHTTPBodyStream:");
+  void _objc_msgSend_893(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_893(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_893Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_893 = __objc_msgSend_893Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_setHTTPShouldHandleCookies_1 =
+      _registerName1("setHTTPShouldHandleCookies:");
+  late final _sel_setHTTPShouldUsePipelining_1 =
+      _registerName1("setHTTPShouldUsePipelining:");
+  late final _sel_setProperty_forKey_inRequest_1 =
+      _registerName1("setProperty:forKey:inRequest:");
+  void _objc_msgSend_894(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+    ffi.Pointer<ObjCObject> key,
+    ffi.Pointer<ObjCObject> request,
+  ) {
+    return __objc_msgSend_894(
+      obj,
+      sel,
+      value,
+      key,
+      request,
+    );
+  }
+
+  late final __objc_msgSend_894Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_894 = __objc_msgSend_894Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_removePropertyForKey_inRequest_1 =
+      _registerName1("removePropertyForKey:inRequest:");
+  void _objc_msgSend_895(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+    ffi.Pointer<ObjCObject> request,
+  ) {
+    return __objc_msgSend_895(
+      obj,
+      sel,
+      key,
+      request,
+    );
+  }
+
+  late final __objc_msgSend_895Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_895 = __objc_msgSend_895Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_registerClass_1 = _registerName1("registerClass:");
+  late final _sel_unregisterClass_1 = _registerName1("unregisterClass:");
+  late final _sel_canInitWithTask_1 = _registerName1("canInitWithTask:");
+  bool _objc_msgSend_896(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> task,
+  ) {
+    return __objc_msgSend_896(
+      obj,
+      sel,
+      task,
+    );
+  }
+
+  late final __objc_msgSend_896Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_896 = __objc_msgSend_896Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithTask_cachedResponse_client_1 =
+      _registerName1("initWithTask:cachedResponse:client:");
+  instancetype _objc_msgSend_897(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> task,
+    ffi.Pointer<ObjCObject> cachedResponse,
+    ffi.Pointer<ObjCObject> client,
+  ) {
+    return __objc_msgSend_897(
+      obj,
+      sel,
+      task,
+      cachedResponse,
+      client,
+    );
+  }
+
+  late final __objc_msgSend_897Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_897 = __objc_msgSend_897Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_task1 = _registerName1("task");
+  ffi.Pointer<ObjCObject> _objc_msgSend_898(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_898(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_898Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_898 = __objc_msgSend_898Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _class_NSXMLParser1 = _getClass1("NSXMLParser");
+  late final _sel_initWithStream_1 = _registerName1("initWithStream:");
+  instancetype _objc_msgSend_899(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> stream,
+  ) {
+    return __objc_msgSend_899(
+      obj,
+      sel,
+      stream,
+    );
+  }
+
+  late final __objc_msgSend_899Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_899 = __objc_msgSend_899Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_shouldProcessNamespaces1 =
+      _registerName1("shouldProcessNamespaces");
+  late final _sel_setShouldProcessNamespaces_1 =
+      _registerName1("setShouldProcessNamespaces:");
+  late final _sel_shouldReportNamespacePrefixes1 =
+      _registerName1("shouldReportNamespacePrefixes");
+  late final _sel_setShouldReportNamespacePrefixes_1 =
+      _registerName1("setShouldReportNamespacePrefixes:");
+  late final _sel_externalEntityResolvingPolicy1 =
+      _registerName1("externalEntityResolvingPolicy");
+  int _objc_msgSend_900(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_900(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_900Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_900 = __objc_msgSend_900Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setExternalEntityResolvingPolicy_1 =
+      _registerName1("setExternalEntityResolvingPolicy:");
+  void _objc_msgSend_901(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_901(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_901Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_901 = __objc_msgSend_901Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_allowedExternalEntityURLs1 =
+      _registerName1("allowedExternalEntityURLs");
+  late final _sel_setAllowedExternalEntityURLs_1 =
+      _registerName1("setAllowedExternalEntityURLs:");
+  void _objc_msgSend_902(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_902(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_902Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_902 = __objc_msgSend_902Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_parse1 = _registerName1("parse");
+  late final _sel_abortParsing1 = _registerName1("abortParsing");
+  late final _sel_parserError1 = _registerName1("parserError");
+  late final _sel_shouldResolveExternalEntities1 =
+      _registerName1("shouldResolveExternalEntities");
+  late final _sel_setShouldResolveExternalEntities_1 =
+      _registerName1("setShouldResolveExternalEntities:");
+  late final _sel_publicID1 = _registerName1("publicID");
+  late final _sel_systemID1 = _registerName1("systemID");
+  late final _sel_lineNumber1 = _registerName1("lineNumber");
+  late final _sel_columnNumber1 = _registerName1("columnNumber");
+  late final _class_NSFileWrapper1 = _getClass1("NSFileWrapper");
+  late final _sel_initWithURL_options_error_1 =
+      _registerName1("initWithURL:options:error:");
+  instancetype _objc_msgSend_903(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    int options,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outError,
+  ) {
+    return __objc_msgSend_903(
+      obj,
+      sel,
+      url,
+      options,
+      outError,
+    );
+  }
+
+  late final __objc_msgSend_903Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_903 = __objc_msgSend_903Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_initDirectoryWithFileWrappers_1 =
+      _registerName1("initDirectoryWithFileWrappers:");
+  late final _sel_initRegularFileWithContents_1 =
+      _registerName1("initRegularFileWithContents:");
+  late final _sel_initSymbolicLinkWithDestinationURL_1 =
+      _registerName1("initSymbolicLinkWithDestinationURL:");
+  late final _sel_initWithSerializedRepresentation_1 =
+      _registerName1("initWithSerializedRepresentation:");
+  late final _sel_isDirectory1 = _registerName1("isDirectory");
+  late final _sel_isRegularFile1 = _registerName1("isRegularFile");
+  late final _sel_isSymbolicLink1 = _registerName1("isSymbolicLink");
+  late final _sel_preferredFilename1 = _registerName1("preferredFilename");
+  late final _sel_setPreferredFilename_1 =
+      _registerName1("setPreferredFilename:");
+  late final _sel_filename1 = _registerName1("filename");
+  late final _sel_setFilename_1 = _registerName1("setFilename:");
+  late final _sel_fileAttributes1 = _registerName1("fileAttributes");
+  late final _sel_setFileAttributes_1 = _registerName1("setFileAttributes:");
+  late final _sel_matchesContentsOfURL_1 =
+      _registerName1("matchesContentsOfURL:");
+  late final _sel_readFromURL_options_error_1 =
+      _registerName1("readFromURL:options:error:");
+  bool _objc_msgSend_904(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    int options,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outError,
+  ) {
+    return __objc_msgSend_904(
+      obj,
+      sel,
+      url,
+      options,
+      outError,
+    );
+  }
+
+  late final __objc_msgSend_904Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_904 = __objc_msgSend_904Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_writeToURL_options_originalContentsURL_error_1 =
+      _registerName1("writeToURL:options:originalContentsURL:error:");
+  bool _objc_msgSend_905(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    int options,
+    ffi.Pointer<ObjCObject> originalContentsURL,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outError,
+  ) {
+    return __objc_msgSend_905(
+      obj,
+      sel,
+      url,
+      options,
+      originalContentsURL,
+      outError,
+    );
+  }
+
+  late final __objc_msgSend_905Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_905 = __objc_msgSend_905Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_serializedRepresentation1 =
+      _registerName1("serializedRepresentation");
+  late final _sel_addFileWrapper_1 = _registerName1("addFileWrapper:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_906(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> child,
+  ) {
+    return __objc_msgSend_906(
+      obj,
+      sel,
+      child,
+    );
+  }
+
+  late final __objc_msgSend_906Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_906 = __objc_msgSend_906Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_addRegularFileWithContents_preferredFilename_1 =
+      _registerName1("addRegularFileWithContents:preferredFilename:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_907(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> data,
+    ffi.Pointer<ObjCObject> fileName,
+  ) {
+    return __objc_msgSend_907(
+      obj,
+      sel,
+      data,
+      fileName,
+    );
+  }
+
+  late final __objc_msgSend_907Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_907 = __objc_msgSend_907Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_removeFileWrapper_1 = _registerName1("removeFileWrapper:");
+  void _objc_msgSend_908(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> child,
+  ) {
+    return __objc_msgSend_908(
+      obj,
+      sel,
+      child,
+    );
+  }
+
+  late final __objc_msgSend_908Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_908 = __objc_msgSend_908Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_fileWrappers1 = _registerName1("fileWrappers");
+  late final _sel_keyForFileWrapper_1 = _registerName1("keyForFileWrapper:");
+  late final _sel_regularFileContents1 = _registerName1("regularFileContents");
+  late final _sel_symbolicLinkDestinationURL1 =
+      _registerName1("symbolicLinkDestinationURL");
+  late final _sel_initSymbolicLinkWithDestination_1 =
+      _registerName1("initSymbolicLinkWithDestination:");
+  late final _sel_needsToBeUpdatedFromPath_1 =
+      _registerName1("needsToBeUpdatedFromPath:");
+  late final _sel_updateFromPath_1 = _registerName1("updateFromPath:");
+  late final _sel_writeToFile_atomically_updateFilenames_1 =
+      _registerName1("writeToFile:atomically:updateFilenames:");
+  bool _objc_msgSend_909(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    bool atomicFlag,
+    bool updateFilenamesFlag,
+  ) {
+    return __objc_msgSend_909(
+      obj,
+      sel,
+      path,
+      atomicFlag,
+      updateFilenamesFlag,
+    );
+  }
+
+  late final __objc_msgSend_909Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Bool, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_909 = __objc_msgSend_909Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, bool, bool)>();
+
+  late final _sel_addFileWithPath_1 = _registerName1("addFileWithPath:");
+  late final _sel_addSymbolicLinkWithDestination_preferredFilename_1 =
+      _registerName1("addSymbolicLinkWithDestination:preferredFilename:");
+  late final _sel_symbolicLinkDestination1 =
+      _registerName1("symbolicLinkDestination");
+  late final _class_NSURLSession1 = _getClass1("NSURLSession");
+  late final _sel_sharedSession1 = _registerName1("sharedSession");
+  ffi.Pointer<ObjCObject> _objc_msgSend_910(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_910(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_910Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_910 = __objc_msgSend_910Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _class_NSURLSessionConfiguration1 =
+      _getClass1("NSURLSessionConfiguration");
+  late final _sel_defaultSessionConfiguration1 =
+      _registerName1("defaultSessionConfiguration");
+  ffi.Pointer<ObjCObject> _objc_msgSend_911(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_911(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_911Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_911 = __objc_msgSend_911Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_ephemeralSessionConfiguration1 =
+      _registerName1("ephemeralSessionConfiguration");
+  late final _sel_backgroundSessionConfigurationWithIdentifier_1 =
+      _registerName1("backgroundSessionConfigurationWithIdentifier:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_912(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> identifier,
+  ) {
+    return __objc_msgSend_912(
+      obj,
+      sel,
+      identifier,
+    );
+  }
+
+  late final __objc_msgSend_912Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_912 = __objc_msgSend_912Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_identifier1 = _registerName1("identifier");
+  late final _sel_requestCachePolicy1 = _registerName1("requestCachePolicy");
+  late final _sel_setRequestCachePolicy_1 =
+      _registerName1("setRequestCachePolicy:");
+  late final _sel_timeoutIntervalForRequest1 =
+      _registerName1("timeoutIntervalForRequest");
+  late final _sel_setTimeoutIntervalForRequest_1 =
+      _registerName1("setTimeoutIntervalForRequest:");
+  late final _sel_timeoutIntervalForResource1 =
+      _registerName1("timeoutIntervalForResource");
+  late final _sel_setTimeoutIntervalForResource_1 =
+      _registerName1("setTimeoutIntervalForResource:");
+  late final _sel_waitsForConnectivity1 =
+      _registerName1("waitsForConnectivity");
+  late final _sel_setWaitsForConnectivity_1 =
+      _registerName1("setWaitsForConnectivity:");
+  late final _sel_isDiscretionary1 = _registerName1("isDiscretionary");
+  late final _sel_setDiscretionary_1 = _registerName1("setDiscretionary:");
+  late final _sel_sharedContainerIdentifier1 =
+      _registerName1("sharedContainerIdentifier");
+  late final _sel_setSharedContainerIdentifier_1 =
+      _registerName1("setSharedContainerIdentifier:");
+  late final _sel_sessionSendsLaunchEvents1 =
+      _registerName1("sessionSendsLaunchEvents");
+  late final _sel_setSessionSendsLaunchEvents_1 =
+      _registerName1("setSessionSendsLaunchEvents:");
+  late final _sel_connectionProxyDictionary1 =
+      _registerName1("connectionProxyDictionary");
+  late final _sel_setConnectionProxyDictionary_1 =
+      _registerName1("setConnectionProxyDictionary:");
+  late final _sel_TLSMinimumSupportedProtocol1 =
+      _registerName1("TLSMinimumSupportedProtocol");
+  int _objc_msgSend_913(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_913(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_913Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_913 = __objc_msgSend_913Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setTLSMinimumSupportedProtocol_1 =
+      _registerName1("setTLSMinimumSupportedProtocol:");
+  void _objc_msgSend_914(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_914(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_914Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_914 = __objc_msgSend_914Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_TLSMaximumSupportedProtocol1 =
+      _registerName1("TLSMaximumSupportedProtocol");
+  late final _sel_setTLSMaximumSupportedProtocol_1 =
+      _registerName1("setTLSMaximumSupportedProtocol:");
+  late final _sel_TLSMinimumSupportedProtocolVersion1 =
+      _registerName1("TLSMinimumSupportedProtocolVersion");
+  int _objc_msgSend_915(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_915(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_915Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_915 = __objc_msgSend_915Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setTLSMinimumSupportedProtocolVersion_1 =
+      _registerName1("setTLSMinimumSupportedProtocolVersion:");
+  void _objc_msgSend_916(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_916(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_916Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_916 = __objc_msgSend_916Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_TLSMaximumSupportedProtocolVersion1 =
+      _registerName1("TLSMaximumSupportedProtocolVersion");
+  late final _sel_setTLSMaximumSupportedProtocolVersion_1 =
+      _registerName1("setTLSMaximumSupportedProtocolVersion:");
+  late final _sel_HTTPShouldSetCookies1 =
+      _registerName1("HTTPShouldSetCookies");
+  late final _sel_setHTTPShouldSetCookies_1 =
+      _registerName1("setHTTPShouldSetCookies:");
+  late final _sel_HTTPCookieAcceptPolicy1 =
+      _registerName1("HTTPCookieAcceptPolicy");
+  late final _sel_setHTTPCookieAcceptPolicy_1 =
+      _registerName1("setHTTPCookieAcceptPolicy:");
+  late final _sel_HTTPAdditionalHeaders1 =
+      _registerName1("HTTPAdditionalHeaders");
+  late final _sel_setHTTPAdditionalHeaders_1 =
+      _registerName1("setHTTPAdditionalHeaders:");
+  late final _sel_HTTPMaximumConnectionsPerHost1 =
+      _registerName1("HTTPMaximumConnectionsPerHost");
+  late final _sel_setHTTPMaximumConnectionsPerHost_1 =
+      _registerName1("setHTTPMaximumConnectionsPerHost:");
+  late final _sel_HTTPCookieStorage1 = _registerName1("HTTPCookieStorage");
+  late final _sel_setHTTPCookieStorage_1 =
+      _registerName1("setHTTPCookieStorage:");
+  void _objc_msgSend_917(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_917(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_917Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_917 = __objc_msgSend_917Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_URLCredentialStorage1 =
+      _registerName1("URLCredentialStorage");
+  late final _sel_setURLCredentialStorage_1 =
+      _registerName1("setURLCredentialStorage:");
+  void _objc_msgSend_918(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_918(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_918Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_918 = __objc_msgSend_918Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_URLCache1 = _registerName1("URLCache");
+  late final _sel_setURLCache_1 = _registerName1("setURLCache:");
+  late final _sel_shouldUseExtendedBackgroundIdleMode1 =
+      _registerName1("shouldUseExtendedBackgroundIdleMode");
+  late final _sel_setShouldUseExtendedBackgroundIdleMode_1 =
+      _registerName1("setShouldUseExtendedBackgroundIdleMode:");
+  late final _sel_protocolClasses1 = _registerName1("protocolClasses");
+  late final _sel_setProtocolClasses_1 = _registerName1("setProtocolClasses:");
+  late final _sel_multipathServiceType1 =
+      _registerName1("multipathServiceType");
+  int _objc_msgSend_919(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_919(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_919Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_919 = __objc_msgSend_919Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setMultipathServiceType_1 =
+      _registerName1("setMultipathServiceType:");
+  void _objc_msgSend_920(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_920(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_920Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_920 = __objc_msgSend_920Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_backgroundSessionConfiguration_1 =
+      _registerName1("backgroundSessionConfiguration:");
+  late final _sel_sessionWithConfiguration_1 =
+      _registerName1("sessionWithConfiguration:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_921(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> configuration,
+  ) {
+    return __objc_msgSend_921(
+      obj,
+      sel,
+      configuration,
+    );
+  }
+
+  late final __objc_msgSend_921Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_921 = __objc_msgSend_921Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_sessionWithConfiguration_delegate_delegateQueue_1 =
+      _registerName1("sessionWithConfiguration:delegate:delegateQueue:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_922(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> configuration,
+    ffi.Pointer<ObjCObject> delegate,
+    ffi.Pointer<ObjCObject> queue,
+  ) {
+    return __objc_msgSend_922(
+      obj,
+      sel,
+      configuration,
+      delegate,
+      queue,
+    );
+  }
+
+  late final __objc_msgSend_922Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_922 = __objc_msgSend_922Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_delegateQueue1 = _registerName1("delegateQueue");
+  late final _sel_configuration1 = _registerName1("configuration");
+  late final _sel_sessionDescription1 = _registerName1("sessionDescription");
+  late final _sel_setSessionDescription_1 =
+      _registerName1("setSessionDescription:");
+  late final _sel_finishTasksAndInvalidate1 =
+      _registerName1("finishTasksAndInvalidate");
+  late final _sel_invalidateAndCancel1 = _registerName1("invalidateAndCancel");
+  late final _sel_resetWithCompletionHandler_1 =
+      _registerName1("resetWithCompletionHandler:");
+  late final _sel_flushWithCompletionHandler_1 =
+      _registerName1("flushWithCompletionHandler:");
+  late final _sel_getTasksWithCompletionHandler_1 =
+      _registerName1("getTasksWithCompletionHandler:");
+  void _objc_msgSend_923(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_923(
+      obj,
+      sel,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_923Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_923 = __objc_msgSend_923Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_getAllTasksWithCompletionHandler_1 =
+      _registerName1("getAllTasksWithCompletionHandler:");
+  void _objc_msgSend_924(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_924(
+      obj,
+      sel,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_924Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_924 = __objc_msgSend_924Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_dataTaskWithRequest_1 =
+      _registerName1("dataTaskWithRequest:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_925(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+  ) {
+    return __objc_msgSend_925(
+      obj,
+      sel,
+      request,
+    );
+  }
+
+  late final __objc_msgSend_925Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_925 = __objc_msgSend_925Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dataTaskWithURL_1 = _registerName1("dataTaskWithURL:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_926(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+  ) {
+    return __objc_msgSend_926(
+      obj,
+      sel,
+      url,
+    );
+  }
+
+  late final __objc_msgSend_926Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_926 = __objc_msgSend_926Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSURLSessionUploadTask1 =
+      _getClass1("NSURLSessionUploadTask");
+  late final _sel_uploadTaskWithRequest_fromFile_1 =
+      _registerName1("uploadTaskWithRequest:fromFile:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_927(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+    ffi.Pointer<ObjCObject> fileURL,
+  ) {
+    return __objc_msgSend_927(
+      obj,
+      sel,
+      request,
+      fileURL,
+    );
+  }
+
+  late final __objc_msgSend_927Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_927 = __objc_msgSend_927Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_uploadTaskWithRequest_fromData_1 =
+      _registerName1("uploadTaskWithRequest:fromData:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_928(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+    ffi.Pointer<ObjCObject> bodyData,
+  ) {
+    return __objc_msgSend_928(
+      obj,
+      sel,
+      request,
+      bodyData,
+    );
+  }
+
+  late final __objc_msgSend_928Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_928 = __objc_msgSend_928Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_uploadTaskWithStreamedRequest_1 =
+      _registerName1("uploadTaskWithStreamedRequest:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_929(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+  ) {
+    return __objc_msgSend_929(
+      obj,
+      sel,
+      request,
+    );
+  }
+
+  late final __objc_msgSend_929Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_929 = __objc_msgSend_929Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSURLSessionDownloadTask1 =
+      _getClass1("NSURLSessionDownloadTask");
+  late final _sel_cancelByProducingResumeData_1 =
+      _registerName1("cancelByProducingResumeData:");
+  void _objc_msgSend_930(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_930(
+      obj,
+      sel,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_930Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_930 = __objc_msgSend_930Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_downloadTaskWithRequest_1 =
+      _registerName1("downloadTaskWithRequest:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_931(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+  ) {
+    return __objc_msgSend_931(
+      obj,
+      sel,
+      request,
+    );
+  }
+
+  late final __objc_msgSend_931Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_931 = __objc_msgSend_931Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_downloadTaskWithURL_1 =
+      _registerName1("downloadTaskWithURL:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_932(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+  ) {
+    return __objc_msgSend_932(
+      obj,
+      sel,
+      url,
+    );
+  }
+
+  late final __objc_msgSend_932Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_932 = __objc_msgSend_932Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_downloadTaskWithResumeData_1 =
+      _registerName1("downloadTaskWithResumeData:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_933(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> resumeData,
+  ) {
+    return __objc_msgSend_933(
+      obj,
+      sel,
+      resumeData,
+    );
+  }
+
+  late final __objc_msgSend_933Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_933 = __objc_msgSend_933Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSURLSessionStreamTask1 =
+      _getClass1("NSURLSessionStreamTask");
+  late final _sel_readDataOfMinLength_maxLength_timeout_completionHandler_1 =
+      _registerName1(
+          "readDataOfMinLength:maxLength:timeout:completionHandler:");
+  void _objc_msgSend_934(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int minBytes,
+    int maxBytes,
+    double timeout,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_934(
+      obj,
+      sel,
+      minBytes,
+      maxBytes,
+      timeout,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_934Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSUInteger,
+              NSUInteger,
+              NSTimeInterval,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_934 = __objc_msgSend_934Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int, int,
+          double, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_writeData_timeout_completionHandler_1 =
+      _registerName1("writeData:timeout:completionHandler:");
+  void _objc_msgSend_935(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> data,
+    double timeout,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_935(
+      obj,
+      sel,
+      data,
+      timeout,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_935Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSTimeInterval,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_935 = __objc_msgSend_935Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, double, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_captureStreams1 = _registerName1("captureStreams");
+  late final _sel_closeWrite1 = _registerName1("closeWrite");
+  late final _sel_closeRead1 = _registerName1("closeRead");
+  late final _sel_startSecureConnection1 =
+      _registerName1("startSecureConnection");
+  late final _sel_stopSecureConnection1 =
+      _registerName1("stopSecureConnection");
+  late final _sel_streamTaskWithHostName_port_1 =
+      _registerName1("streamTaskWithHostName:port:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_936(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> hostname,
+    int port,
+  ) {
+    return __objc_msgSend_936(
+      obj,
+      sel,
+      hostname,
+      port,
+    );
+  }
+
+  late final __objc_msgSend_936Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSInteger)>>('objc_msgSend');
+  late final __objc_msgSend_936 = __objc_msgSend_936Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>, int)>();
+
+  late final _class_NSNetService1 = _getClass1("NSNetService");
+  late final _sel_initWithDomain_type_name_port_1 =
+      _registerName1("initWithDomain:type:name:port:");
+  instancetype _objc_msgSend_937(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> domain,
+    ffi.Pointer<ObjCObject> type,
+    ffi.Pointer<ObjCObject> name,
+    int port,
+  ) {
+    return __objc_msgSend_937(
+      obj,
+      sel,
+      domain,
+      type,
+      name,
+      port,
+    );
+  }
+
+  late final __objc_msgSend_937Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int)>>('objc_msgSend');
+  late final __objc_msgSend_937 = __objc_msgSend_937Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          int)>();
+
+  late final _sel_initWithDomain_type_name_1 =
+      _registerName1("initWithDomain:type:name:");
+  late final _sel_includesPeerToPeer1 = _registerName1("includesPeerToPeer");
+  late final _sel_setIncludesPeerToPeer_1 =
+      _registerName1("setIncludesPeerToPeer:");
+  late final _sel_type1 = _registerName1("type");
+  late final _sel_publish1 = _registerName1("publish");
+  late final _sel_publishWithOptions_1 = _registerName1("publishWithOptions:");
+  void _objc_msgSend_938(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int options,
+  ) {
+    return __objc_msgSend_938(
+      obj,
+      sel,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_938Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_938 = __objc_msgSend_938Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_resolve1 = _registerName1("resolve");
+  late final _sel_stop1 = _registerName1("stop");
+  late final _sel_dictionaryFromTXTRecordData_1 =
+      _registerName1("dictionaryFromTXTRecordData:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_939(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> txtData,
+  ) {
+    return __objc_msgSend_939(
+      obj,
+      sel,
+      txtData,
+    );
+  }
+
+  late final __objc_msgSend_939Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_939 = __objc_msgSend_939Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dataFromTXTRecordDictionary_1 =
+      _registerName1("dataFromTXTRecordDictionary:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_940(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> txtDictionary,
+  ) {
+    return __objc_msgSend_940(
+      obj,
+      sel,
+      txtDictionary,
+    );
+  }
+
+  late final __objc_msgSend_940Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_940 = __objc_msgSend_940Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_resolveWithTimeout_1 = _registerName1("resolveWithTimeout:");
+  late final _sel_getInputStream_outputStream_1 =
+      _registerName1("getInputStream:outputStream:");
+  bool _objc_msgSend_941(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> inputStream,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outputStream,
+  ) {
+    return __objc_msgSend_941(
+      obj,
+      sel,
+      inputStream,
+      outputStream,
+    );
+  }
+
+  late final __objc_msgSend_941Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_941 = __objc_msgSend_941Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_setTXTRecordData_1 = _registerName1("setTXTRecordData:");
+  late final _sel_TXTRecordData1 = _registerName1("TXTRecordData");
+  late final _sel_startMonitoring1 = _registerName1("startMonitoring");
+  late final _sel_stopMonitoring1 = _registerName1("stopMonitoring");
+  late final _sel_streamTaskWithNetService_1 =
+      _registerName1("streamTaskWithNetService:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_942(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> service,
+  ) {
+    return __objc_msgSend_942(
+      obj,
+      sel,
+      service,
+    );
+  }
+
+  late final __objc_msgSend_942Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_942 = __objc_msgSend_942Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSURLSessionWebSocketTask1 =
+      _getClass1("NSURLSessionWebSocketTask");
+  late final _class_NSURLSessionWebSocketMessage1 =
+      _getClass1("NSURLSessionWebSocketMessage");
+  int _objc_msgSend_943(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_943(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_943Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_943 = __objc_msgSend_943Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_sendMessage_completionHandler_1 =
+      _registerName1("sendMessage:completionHandler:");
+  void _objc_msgSend_944(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> message,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_944(
+      obj,
+      sel,
+      message,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_944Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_944 = __objc_msgSend_944Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_receiveMessageWithCompletionHandler_1 =
+      _registerName1("receiveMessageWithCompletionHandler:");
+  void _objc_msgSend_945(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_945(
+      obj,
+      sel,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_945Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_945 = __objc_msgSend_945Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_sendPingWithPongReceiveHandler_1 =
+      _registerName1("sendPingWithPongReceiveHandler:");
+  void _objc_msgSend_946(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> pongReceiveHandler,
+  ) {
+    return __objc_msgSend_946(
+      obj,
+      sel,
+      pongReceiveHandler,
+    );
+  }
+
+  late final __objc_msgSend_946Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_946 = __objc_msgSend_946Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_cancelWithCloseCode_reason_1 =
+      _registerName1("cancelWithCloseCode:reason:");
+  void _objc_msgSend_947(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int closeCode,
+    ffi.Pointer<ObjCObject> reason,
+  ) {
+    return __objc_msgSend_947(
+      obj,
+      sel,
+      closeCode,
+      reason,
+    );
+  }
+
+  late final __objc_msgSend_947Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_947 = __objc_msgSend_947Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_maximumMessageSize1 = _registerName1("maximumMessageSize");
+  late final _sel_setMaximumMessageSize_1 =
+      _registerName1("setMaximumMessageSize:");
+  late final _sel_closeCode1 = _registerName1("closeCode");
+  int _objc_msgSend_948(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_948(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_948Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_948 = __objc_msgSend_948Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_closeReason1 = _registerName1("closeReason");
+  late final _sel_webSocketTaskWithURL_1 =
+      _registerName1("webSocketTaskWithURL:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_949(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+  ) {
+    return __objc_msgSend_949(
+      obj,
+      sel,
+      url,
+    );
+  }
+
+  late final __objc_msgSend_949Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_949 = __objc_msgSend_949Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_webSocketTaskWithURL_protocols_1 =
+      _registerName1("webSocketTaskWithURL:protocols:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_950(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    ffi.Pointer<ObjCObject> protocols,
+  ) {
+    return __objc_msgSend_950(
+      obj,
+      sel,
+      url,
+      protocols,
+    );
+  }
+
+  late final __objc_msgSend_950Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_950 = __objc_msgSend_950Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_webSocketTaskWithRequest_1 =
+      _registerName1("webSocketTaskWithRequest:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_951(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+  ) {
+    return __objc_msgSend_951(
+      obj,
+      sel,
+      request,
+    );
+  }
+
+  late final __objc_msgSend_951Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_951 = __objc_msgSend_951Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dataTaskWithRequest_completionHandler_1 =
+      _registerName1("dataTaskWithRequest:completionHandler:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_952(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_952(
+      obj,
+      sel,
+      request,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_952Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_952 = __objc_msgSend_952Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_dataTaskWithURL_completionHandler_1 =
+      _registerName1("dataTaskWithURL:completionHandler:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_953(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_953(
+      obj,
+      sel,
+      url,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_953Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_953 = __objc_msgSend_953Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_uploadTaskWithRequest_fromFile_completionHandler_1 =
+      _registerName1("uploadTaskWithRequest:fromFile:completionHandler:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_954(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+    ffi.Pointer<ObjCObject> fileURL,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_954(
+      obj,
+      sel,
+      request,
+      fileURL,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_954Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_954 = __objc_msgSend_954Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_uploadTaskWithRequest_fromData_completionHandler_1 =
+      _registerName1("uploadTaskWithRequest:fromData:completionHandler:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_955(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+    ffi.Pointer<ObjCObject> bodyData,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_955(
+      obj,
+      sel,
+      request,
+      bodyData,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_955Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_955 = __objc_msgSend_955Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_downloadTaskWithRequest_completionHandler_1 =
+      _registerName1("downloadTaskWithRequest:completionHandler:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_956(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_956(
+      obj,
+      sel,
+      request,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_956Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_956 = __objc_msgSend_956Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_downloadTaskWithURL_completionHandler_1 =
+      _registerName1("downloadTaskWithURL:completionHandler:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_957(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_957(
+      obj,
+      sel,
+      url,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_957Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_957 = __objc_msgSend_957Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_downloadTaskWithResumeData_completionHandler_1 =
+      _registerName1("downloadTaskWithResumeData:completionHandler:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_958(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> resumeData,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_958(
+      obj,
+      sel,
+      resumeData,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_958Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_958 = __objc_msgSend_958Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _class_NSProtocolChecker1 = _getClass1("NSProtocolChecker");
+  ffi.Pointer<ObjCObject> _objc_msgSend_959(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_959(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_959Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_959 = __objc_msgSend_959Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_protocolCheckerWithTarget_protocol_1 =
+      _registerName1("protocolCheckerWithTarget:protocol:");
+  instancetype _objc_msgSend_960(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> anObject,
+    ffi.Pointer<ObjCObject> aProtocol,
+  ) {
+    return __objc_msgSend_960(
+      obj,
+      sel,
+      anObject,
+      aProtocol,
+    );
+  }
+
+  late final __objc_msgSend_960Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_960 = __objc_msgSend_960Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithTarget_protocol_1 =
+      _registerName1("initWithTarget:protocol:");
+  late final _class_NSTask1 = _getClass1("NSTask");
+  late final _sel_setExecutableURL_1 = _registerName1("setExecutableURL:");
+  late final _sel_setEnvironment_1 = _registerName1("setEnvironment:");
+  late final _sel_currentDirectoryURL1 = _registerName1("currentDirectoryURL");
+  late final _sel_setCurrentDirectoryURL_1 =
+      _registerName1("setCurrentDirectoryURL:");
+  late final _sel_standardInput1 = _registerName1("standardInput");
+  late final _sel_setStandardInput_1 = _registerName1("setStandardInput:");
+  late final _sel_standardOutput1 = _registerName1("standardOutput");
+  late final _sel_setStandardOutput_1 = _registerName1("setStandardOutput:");
+  late final _sel_standardError1 = _registerName1("standardError");
+  late final _sel_setStandardError_1 = _registerName1("setStandardError:");
+  late final _sel_launchAndReturnError_1 =
+      _registerName1("launchAndReturnError:");
+  late final _sel_interrupt1 = _registerName1("interrupt");
+  late final _sel_terminate1 = _registerName1("terminate");
+  late final _sel_isRunning1 = _registerName1("isRunning");
+  late final _sel_terminationStatus1 = _registerName1("terminationStatus");
+  late final _sel_terminationReason1 = _registerName1("terminationReason");
+  int _objc_msgSend_961(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_961(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_961Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_961 = __objc_msgSend_961Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_terminationHandler1 = _registerName1("terminationHandler");
+  ffi.Pointer<_ObjCBlock> _objc_msgSend_962(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_962(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_962Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<_ObjCBlock> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_962 = __objc_msgSend_962Ptr.asFunction<
+      ffi.Pointer<_ObjCBlock> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setTerminationHandler_1 =
+      _registerName1("setTerminationHandler:");
+  void _objc_msgSend_963(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> value,
+  ) {
+    return __objc_msgSend_963(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_963Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_963 = __objc_msgSend_963Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_launchedTaskWithExecutableURL_arguments_error_terminationHandler_1 =
+      _registerName1(
+          "launchedTaskWithExecutableURL:arguments:error:terminationHandler:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_964(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    ffi.Pointer<ObjCObject> arguments,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+    ffi.Pointer<_ObjCBlock> terminationHandler,
+  ) {
+    return __objc_msgSend_964(
+      obj,
+      sel,
+      url,
+      arguments,
+      error,
+      terminationHandler,
+    );
+  }
+
+  late final __objc_msgSend_964Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_964 = __objc_msgSend_964Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_waitUntilExit1 = _registerName1("waitUntilExit");
+  late final _sel_launchPath1 = _registerName1("launchPath");
+  late final _sel_setLaunchPath_1 = _registerName1("setLaunchPath:");
+  late final _sel_setCurrentDirectoryPath_1 =
+      _registerName1("setCurrentDirectoryPath:");
+  late final _sel_launch1 = _registerName1("launch");
+  late final _sel_launchedTaskWithLaunchPath_arguments_1 =
+      _registerName1("launchedTaskWithLaunchPath:arguments:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_965(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    ffi.Pointer<ObjCObject> arguments,
+  ) {
+    return __objc_msgSend_965(
+      obj,
+      sel,
+      path,
+      arguments,
+    );
+  }
+
+  late final __objc_msgSend_965Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_965 = __objc_msgSend_965Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSXMLElement1 = _getClass1("NSXMLElement");
+  late final _class_NSXMLNode1 = _getClass1("NSXMLNode");
+  late final _sel_initWithKind_1 = _registerName1("initWithKind:");
+  instancetype _objc_msgSend_966(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int kind,
+  ) {
+    return __objc_msgSend_966(
+      obj,
+      sel,
+      kind,
+    );
+  }
+
+  late final __objc_msgSend_966Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_966 = __objc_msgSend_966Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_initWithKind_options_1 =
+      _registerName1("initWithKind:options:");
+  instancetype _objc_msgSend_967(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int kind,
+    int options,
+  ) {
+    return __objc_msgSend_967(
+      obj,
+      sel,
+      kind,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_967Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32, ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_967 = __objc_msgSend_967Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int, int)>();
+
+  late final _sel_document1 = _registerName1("document");
+  late final _sel_documentWithRootElement_1 =
+      _registerName1("documentWithRootElement:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_968(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> element,
+  ) {
+    return __objc_msgSend_968(
+      obj,
+      sel,
+      element,
+    );
+  }
+
+  late final __objc_msgSend_968Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_968 = __objc_msgSend_968Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_elementWithName_1 = _registerName1("elementWithName:");
+  late final _sel_elementWithName_URI_1 =
+      _registerName1("elementWithName:URI:");
+  late final _sel_elementWithName_stringValue_1 =
+      _registerName1("elementWithName:stringValue:");
+  late final _sel_elementWithName_children_attributes_1 =
+      _registerName1("elementWithName:children:attributes:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_969(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> name,
+    ffi.Pointer<ObjCObject> children,
+    ffi.Pointer<ObjCObject> attributes,
+  ) {
+    return __objc_msgSend_969(
+      obj,
+      sel,
+      name,
+      children,
+      attributes,
+    );
+  }
+
+  late final __objc_msgSend_969Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_969 = __objc_msgSend_969Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_attributeWithName_stringValue_1 =
+      _registerName1("attributeWithName:stringValue:");
+  late final _sel_attributeWithName_URI_stringValue_1 =
+      _registerName1("attributeWithName:URI:stringValue:");
+  late final _sel_namespaceWithName_stringValue_1 =
+      _registerName1("namespaceWithName:stringValue:");
+  late final _sel_processingInstructionWithName_stringValue_1 =
+      _registerName1("processingInstructionWithName:stringValue:");
+  late final _sel_commentWithStringValue_1 =
+      _registerName1("commentWithStringValue:");
+  late final _sel_textWithStringValue_1 =
+      _registerName1("textWithStringValue:");
+  late final _sel_DTDNodeWithXMLString_1 =
+      _registerName1("DTDNodeWithXMLString:");
+  late final _sel_kind1 = _registerName1("kind");
+  int _objc_msgSend_970(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_970(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_970Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_970 = __objc_msgSend_970Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_objectValue1 = _registerName1("objectValue");
+  late final _sel_setObjectValue_1 = _registerName1("setObjectValue:");
+  late final _sel_setStringValue_1 = _registerName1("setStringValue:");
+  late final _sel_setStringValue_resolvingEntities_1 =
+      _registerName1("setStringValue:resolvingEntities:");
+  void _objc_msgSend_971(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> string,
+    bool resolve,
+  ) {
+    return __objc_msgSend_971(
+      obj,
+      sel,
+      string,
+      resolve,
+    );
+  }
+
+  late final __objc_msgSend_971Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_971 = __objc_msgSend_971Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, bool)>();
+
+  late final _sel_index1 = _registerName1("index");
+  late final _sel_level1 = _registerName1("level");
+  late final _class_NSXMLDocument1 = _getClass1("NSXMLDocument");
+  late final _sel_initWithXMLString_options_error_1 =
+      _registerName1("initWithXMLString:options:error:");
+  instancetype _objc_msgSend_972(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> string,
+    int mask,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_972(
+      obj,
+      sel,
+      string,
+      mask,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_972Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_972 = __objc_msgSend_972Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  instancetype _objc_msgSend_973(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    int mask,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_973(
+      obj,
+      sel,
+      url,
+      mask,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_973Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_973 = __objc_msgSend_973Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_initWithData_options_error_1 =
+      _registerName1("initWithData:options:error:");
+  instancetype _objc_msgSend_974(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> data,
+    int mask,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_974(
+      obj,
+      sel,
+      data,
+      mask,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_974Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_974 = __objc_msgSend_974Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_initWithRootElement_1 =
+      _registerName1("initWithRootElement:");
+  late final _sel_replacementClassForClass_1 =
+      _registerName1("replacementClassForClass:");
+  late final _sel_characterEncoding1 = _registerName1("characterEncoding");
+  late final _sel_setCharacterEncoding_1 =
+      _registerName1("setCharacterEncoding:");
+  late final _sel_isStandalone1 = _registerName1("isStandalone");
+  late final _sel_setStandalone_1 = _registerName1("setStandalone:");
+  late final _sel_documentContentKind1 = _registerName1("documentContentKind");
+  int _objc_msgSend_975(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_975(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_975Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_975 = __objc_msgSend_975Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setDocumentContentKind_1 =
+      _registerName1("setDocumentContentKind:");
+  void _objc_msgSend_976(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_976(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_976Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_976 = __objc_msgSend_976Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_setMIMEType_1 = _registerName1("setMIMEType:");
+  late final _class_NSXMLDTD1 = _getClass1("NSXMLDTD");
+  late final _sel_setPublicID_1 = _registerName1("setPublicID:");
+  late final _sel_setSystemID_1 = _registerName1("setSystemID:");
+  late final _sel_insertChild_atIndex_1 =
+      _registerName1("insertChild:atIndex:");
+  void _objc_msgSend_977(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> child,
+    int index,
+  ) {
+    return __objc_msgSend_977(
+      obj,
+      sel,
+      child,
+      index,
+    );
+  }
+
+  late final __objc_msgSend_977Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_977 = __objc_msgSend_977Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_insertChildren_atIndex_1 =
+      _registerName1("insertChildren:atIndex:");
+  void _objc_msgSend_978(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> children,
+    int index,
+  ) {
+    return __objc_msgSend_978(
+      obj,
+      sel,
+      children,
+      index,
+    );
+  }
+
+  late final __objc_msgSend_978Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_978 = __objc_msgSend_978Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_removeChildAtIndex_1 = _registerName1("removeChildAtIndex:");
+  late final _sel_setChildren_1 = _registerName1("setChildren:");
+  late final _sel_addChild_1 = _registerName1("addChild:");
+  void _objc_msgSend_979(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> child,
+  ) {
+    return __objc_msgSend_979(
+      obj,
+      sel,
+      child,
+    );
+  }
+
+  late final __objc_msgSend_979Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_979 = __objc_msgSend_979Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_replaceChildAtIndex_withNode_1 =
+      _registerName1("replaceChildAtIndex:withNode:");
+  void _objc_msgSend_980(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int index,
+    ffi.Pointer<ObjCObject> node,
+  ) {
+    return __objc_msgSend_980(
+      obj,
+      sel,
+      index,
+      node,
+    );
+  }
+
+  late final __objc_msgSend_980Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSUInteger, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_980 = __objc_msgSend_980Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSXMLDTDNode1 = _getClass1("NSXMLDTDNode");
+  late final _sel_initWithXMLString_1 = _registerName1("initWithXMLString:");
+  late final _sel_DTDKind1 = _registerName1("DTDKind");
+  int _objc_msgSend_981(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_981(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_981Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_981 = __objc_msgSend_981Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setDTDKind_1 = _registerName1("setDTDKind:");
+  void _objc_msgSend_982(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_982(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_982Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_982 = __objc_msgSend_982Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_isExternal1 = _registerName1("isExternal");
+  late final _sel_notationName1 = _registerName1("notationName");
+  late final _sel_setNotationName_1 = _registerName1("setNotationName:");
+  late final _sel_localNameForName_1 = _registerName1("localNameForName:");
+  late final _sel_prefixForName_1 = _registerName1("prefixForName:");
+  late final _sel_predefinedNamespaceForPrefix_1 =
+      _registerName1("predefinedNamespaceForPrefix:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_983(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> name,
+  ) {
+    return __objc_msgSend_983(
+      obj,
+      sel,
+      name,
+    );
+  }
+
+  late final __objc_msgSend_983Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_983 = __objc_msgSend_983Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_entityDeclarationForName_1 =
+      _registerName1("entityDeclarationForName:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_984(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> name,
+  ) {
+    return __objc_msgSend_984(
+      obj,
+      sel,
+      name,
+    );
+  }
+
+  late final __objc_msgSend_984Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_984 = __objc_msgSend_984Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_notationDeclarationForName_1 =
+      _registerName1("notationDeclarationForName:");
+  late final _sel_elementDeclarationForName_1 =
+      _registerName1("elementDeclarationForName:");
+  late final _sel_attributeDeclarationForName_elementName_1 =
+      _registerName1("attributeDeclarationForName:elementName:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_985(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> name,
+    ffi.Pointer<ObjCObject> elementName,
+  ) {
+    return __objc_msgSend_985(
+      obj,
+      sel,
+      name,
+      elementName,
+    );
+  }
+
+  late final __objc_msgSend_985Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_985 = __objc_msgSend_985Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_predefinedEntityDeclarationForName_1 =
+      _registerName1("predefinedEntityDeclarationForName:");
+  late final _sel_DTD1 = _registerName1("DTD");
+  ffi.Pointer<ObjCObject> _objc_msgSend_986(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_986(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_986Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_986 = __objc_msgSend_986Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setDTD_1 = _registerName1("setDTD:");
+  void _objc_msgSend_987(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_987(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_987Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_987 = __objc_msgSend_987Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_setRootElement_1 = _registerName1("setRootElement:");
+  void _objc_msgSend_988(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> root,
+  ) {
+    return __objc_msgSend_988(
+      obj,
+      sel,
+      root,
+    );
+  }
+
+  late final __objc_msgSend_988Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_988 = __objc_msgSend_988Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_rootElement1 = _registerName1("rootElement");
+  ffi.Pointer<ObjCObject> _objc_msgSend_989(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_989(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_989Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_989 = __objc_msgSend_989Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_XMLData1 = _registerName1("XMLData");
+  late final _sel_XMLDataWithOptions_1 = _registerName1("XMLDataWithOptions:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_990(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int options,
+  ) {
+    return __objc_msgSend_990(
+      obj,
+      sel,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_990Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_990 = __objc_msgSend_990Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_objectByApplyingXSLT_arguments_error_1 =
+      _registerName1("objectByApplyingXSLT:arguments:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_991(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> xslt,
+    ffi.Pointer<ObjCObject> arguments,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_991(
+      obj,
+      sel,
+      xslt,
+      arguments,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_991Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_991 = __objc_msgSend_991Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_objectByApplyingXSLTString_arguments_error_1 =
+      _registerName1("objectByApplyingXSLTString:arguments:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_992(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> xslt,
+    ffi.Pointer<ObjCObject> arguments,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_992(
+      obj,
+      sel,
+      xslt,
+      arguments,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_992Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_992 = __objc_msgSend_992Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_objectByApplyingXSLTAtURL_arguments_error_1 =
+      _registerName1("objectByApplyingXSLTAtURL:arguments:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_993(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> xsltURL,
+    ffi.Pointer<ObjCObject> argument,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_993(
+      obj,
+      sel,
+      xsltURL,
+      argument,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_993Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_993 = __objc_msgSend_993Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_validateAndReturnError_1 =
+      _registerName1("validateAndReturnError:");
+  late final _sel_rootDocument1 = _registerName1("rootDocument");
+  ffi.Pointer<ObjCObject> _objc_msgSend_994(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_994(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_994Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_994 = __objc_msgSend_994Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_parent1 = _registerName1("parent");
+  ffi.Pointer<ObjCObject> _objc_msgSend_995(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_995(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_995Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_995 = __objc_msgSend_995Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_childCount1 = _registerName1("childCount");
+  late final _sel_children1 = _registerName1("children");
+  late final _sel_childAtIndex_1 = _registerName1("childAtIndex:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_996(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int index,
+  ) {
+    return __objc_msgSend_996(
+      obj,
+      sel,
+      index,
+    );
+  }
+
+  late final __objc_msgSend_996Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_996 = __objc_msgSend_996Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_previousSibling1 = _registerName1("previousSibling");
+  late final _sel_nextSibling1 = _registerName1("nextSibling");
+  late final _sel_previousNode1 = _registerName1("previousNode");
+  late final _sel_nextNode1 = _registerName1("nextNode");
+  late final _sel_detach1 = _registerName1("detach");
+  late final _sel_XPath1 = _registerName1("XPath");
+  late final _sel_localName1 = _registerName1("localName");
+  late final _sel_prefix1 = _registerName1("prefix");
+  late final _sel_URI1 = _registerName1("URI");
+  late final _sel_setURI_1 = _registerName1("setURI:");
+  late final _sel_XMLString1 = _registerName1("XMLString");
+  late final _sel_XMLStringWithOptions_1 =
+      _registerName1("XMLStringWithOptions:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_997(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int options,
+  ) {
+    return __objc_msgSend_997(
+      obj,
+      sel,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_997Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_997 = __objc_msgSend_997Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_canonicalXMLStringPreservingComments_1 =
+      _registerName1("canonicalXMLStringPreservingComments:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_998(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    bool comments,
+  ) {
+    return __objc_msgSend_998(
+      obj,
+      sel,
+      comments,
+    );
+  }
+
+  late final __objc_msgSend_998Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_998 = __objc_msgSend_998Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, bool)>();
+
+  late final _sel_nodesForXPath_error_1 =
+      _registerName1("nodesForXPath:error:");
+  late final _sel_objectsForXQuery_constants_error_1 =
+      _registerName1("objectsForXQuery:constants:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_999(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> xquery,
+    ffi.Pointer<ObjCObject> constants,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_999(
+      obj,
+      sel,
+      xquery,
+      constants,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_999Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_999 = __objc_msgSend_999Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_objectsForXQuery_error_1 =
+      _registerName1("objectsForXQuery:error:");
+  late final _sel_initWithName_URI_1 = _registerName1("initWithName:URI:");
+  late final _sel_initWithName_stringValue_1 =
+      _registerName1("initWithName:stringValue:");
+  late final _sel_initWithXMLString_error_1 =
+      _registerName1("initWithXMLString:error:");
+  late final _sel_elementsForName_1 = _registerName1("elementsForName:");
+  late final _sel_elementsForLocalName_URI_1 =
+      _registerName1("elementsForLocalName:URI:");
+  late final _sel_addAttribute_1 = _registerName1("addAttribute:");
+  late final _sel_removeAttributeForName_1 =
+      _registerName1("removeAttributeForName:");
+  late final _sel_attributes1 = _registerName1("attributes");
+  late final _sel_setAttributes_1 = _registerName1("setAttributes:");
+  late final _sel_setAttributesWithDictionary_1 =
+      _registerName1("setAttributesWithDictionary:");
+  late final _sel_attributeForName_1 = _registerName1("attributeForName:");
+  late final _sel_attributeForLocalName_URI_1 =
+      _registerName1("attributeForLocalName:URI:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_1000(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> localName,
+    ffi.Pointer<ObjCObject> URI,
+  ) {
+    return __objc_msgSend_1000(
+      obj,
+      sel,
+      localName,
+      URI,
+    );
+  }
+
+  late final __objc_msgSend_1000Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_1000 = __objc_msgSend_1000Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_addNamespace_1 = _registerName1("addNamespace:");
+  late final _sel_removeNamespaceForPrefix_1 =
+      _registerName1("removeNamespaceForPrefix:");
+  late final _sel_namespaces1 = _registerName1("namespaces");
+  late final _sel_setNamespaces_1 = _registerName1("setNamespaces:");
+  late final _sel_namespaceForPrefix_1 = _registerName1("namespaceForPrefix:");
+  late final _sel_resolveNamespaceForName_1 =
+      _registerName1("resolveNamespaceForName:");
+  late final _sel_resolvePrefixForNamespaceURI_1 =
+      _registerName1("resolvePrefixForNamespaceURI:");
+  late final _sel_normalizeAdjacentTextNodesPreservingCDATA_1 =
+      _registerName1("normalizeAdjacentTextNodesPreservingCDATA:");
+  late final _sel_setAttributesAsDictionary_1 =
+      _registerName1("setAttributesAsDictionary:");
+  late final _class_AVAudioSession1 = _getClass1("AVAudioSession");
+  late final _sel_sharedInstance1 = _registerName1("sharedInstance");
+  ffi.Pointer<ObjCObject> _objc_msgSend_1001(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_1001(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_1001Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_1001 = __objc_msgSend_1001Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_availableCategories1 = _registerName1("availableCategories");
+  late final _sel_setCategory_error_1 = _registerName1("setCategory:error:");
+  late final _sel_setCategory_withOptions_error_1 =
+      _registerName1("setCategory:withOptions:error:");
+  bool _objc_msgSend_1002(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    AVAudioSessionCategory category,
+    int options,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outError,
+  ) {
+    return __objc_msgSend_1002(
+      obj,
+      sel,
+      category,
+      options,
+      outError,
+    );
+  }
+
+  late final __objc_msgSend_1002Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              AVAudioSessionCategory,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_1002 = __objc_msgSend_1002Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          AVAudioSessionCategory, int, ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_setCategory_mode_options_error_1 =
+      _registerName1("setCategory:mode:options:error:");
+  bool _objc_msgSend_1003(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    AVAudioSessionCategory category,
+    AVAudioSessionMode mode,
+    int options,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outError,
+  ) {
+    return __objc_msgSend_1003(
+      obj,
+      sel,
+      category,
+      mode,
+      options,
+      outError,
+    );
+  }
+
+  late final __objc_msgSend_1003Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              AVAudioSessionCategory,
+              AVAudioSessionMode,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_1003 = __objc_msgSend_1003Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          AVAudioSessionCategory,
+          AVAudioSessionMode,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_setCategory_mode_routeSharingPolicy_options_error_1 =
+      _registerName1("setCategory:mode:routeSharingPolicy:options:error:");
+  bool _objc_msgSend_1004(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    AVAudioSessionCategory category,
+    AVAudioSessionMode mode,
+    int policy,
+    int options,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outError,
+  ) {
+    return __objc_msgSend_1004(
+      obj,
+      sel,
+      category,
+      mode,
+      policy,
+      options,
+      outError,
+    );
+  }
+
+  late final __objc_msgSend_1004Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              AVAudioSessionCategory,
+              AVAudioSessionMode,
+              ffi.Int32,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_1004 = __objc_msgSend_1004Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          AVAudioSessionCategory,
+          AVAudioSessionMode,
+          int,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_category1 = _registerName1("category");
+  late final _sel_categoryOptions1 = _registerName1("categoryOptions");
+  int _objc_msgSend_1005(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_1005(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_1005Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_1005 = __objc_msgSend_1005Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_routeSharingPolicy1 = _registerName1("routeSharingPolicy");
+  int _objc_msgSend_1006(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_1006(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_1006Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_1006 = __objc_msgSend_1006Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_availableModes1 = _registerName1("availableModes");
+  late final _sel_setMode_error_1 = _registerName1("setMode:error:");
+  late final _sel_mode1 = _registerName1("mode");
+  late final _sel_setAllowHapticsAndSystemSoundsDuringRecording_error_1 =
+      _registerName1("setAllowHapticsAndSystemSoundsDuringRecording:error:");
+  bool _objc_msgSend_1007(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    bool inValue,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outError,
+  ) {
+    return __objc_msgSend_1007(
+      obj,
+      sel,
+      inValue,
+      outError,
+    );
+  }
+
+  late final __objc_msgSend_1007Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Bool, ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_1007 = __objc_msgSend_1007Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, bool,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_allowHapticsAndSystemSoundsDuringRecording1 =
+      _registerName1("allowHapticsAndSystemSoundsDuringRecording");
+  late final _sel_recordPermission1 = _registerName1("recordPermission");
+  int _objc_msgSend_1008(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_1008(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_1008Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_1008 = __objc_msgSend_1008Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_requestRecordPermission_1 =
+      _registerName1("requestRecordPermission:");
+  void _objc_msgSend_1009(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> response,
+  ) {
+    return __objc_msgSend_1009(
+      obj,
+      sel,
+      response,
+    );
+  }
+
+  late final __objc_msgSend_1009Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_1009 = __objc_msgSend_1009Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_overrideOutputAudioPort_error_1 =
+      _registerName1("overrideOutputAudioPort:error:");
+  bool _objc_msgSend_1010(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int portOverride,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outError,
+  ) {
+    return __objc_msgSend_1010(
+      obj,
+      sel,
+      portOverride,
+      outError,
+    );
+  }
+
+  late final __objc_msgSend_1010Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_1010 = __objc_msgSend_1010Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _class_AVAudioSessionPortDescription1 =
+      _getClass1("AVAudioSessionPortDescription");
+  late final _sel_portType1 = _registerName1("portType");
+  late final _sel_portName1 = _registerName1("portName");
+  late final _sel_UID1 = _registerName1("UID");
+  late final _sel_hasHardwareVoiceCallProcessing1 =
+      _registerName1("hasHardwareVoiceCallProcessing");
+  late final _sel_isSpatialAudioEnabled1 =
+      _registerName1("isSpatialAudioEnabled");
+  late final _sel_channels1 = _registerName1("channels");
+  late final _sel_dataSources1 = _registerName1("dataSources");
+  late final _class_AVAudioSessionDataSourceDescription1 =
+      _getClass1("AVAudioSessionDataSourceDescription");
+  late final _sel_dataSourceID1 = _registerName1("dataSourceID");
+  late final _sel_dataSourceName1 = _registerName1("dataSourceName");
+  late final _sel_location1 = _registerName1("location");
+  late final _sel_orientation1 = _registerName1("orientation");
+  late final _sel_supportedPolarPatterns1 =
+      _registerName1("supportedPolarPatterns");
+  late final _sel_selectedPolarPattern1 =
+      _registerName1("selectedPolarPattern");
+  late final _sel_preferredPolarPattern1 =
+      _registerName1("preferredPolarPattern");
+  late final _sel_setPreferredPolarPattern_error_1 =
+      _registerName1("setPreferredPolarPattern:error:");
+  late final _sel_selectedDataSource1 = _registerName1("selectedDataSource");
+  ffi.Pointer<ObjCObject> _objc_msgSend_1011(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_1011(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_1011Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_1011 = __objc_msgSend_1011Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_preferredDataSource1 = _registerName1("preferredDataSource");
+  late final _sel_setPreferredDataSource_error_1 =
+      _registerName1("setPreferredDataSource:error:");
+  bool _objc_msgSend_1012(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> dataSource,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outError,
+  ) {
+    return __objc_msgSend_1012(
+      obj,
+      sel,
+      dataSource,
+      outError,
+    );
+  }
+
+  late final __objc_msgSend_1012Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_1012 = __objc_msgSend_1012Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_setPreferredInput_error_1 =
+      _registerName1("setPreferredInput:error:");
+  bool _objc_msgSend_1013(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> inPort,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outError,
+  ) {
+    return __objc_msgSend_1013(
+      obj,
+      sel,
+      inPort,
+      outError,
+    );
+  }
+
+  late final __objc_msgSend_1013Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_1013 = __objc_msgSend_1013Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_preferredInput1 = _registerName1("preferredInput");
+  ffi.Pointer<ObjCObject> _objc_msgSend_1014(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_1014(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_1014Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_1014 = __objc_msgSend_1014Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setPrefersNoInterruptionsFromSystemAlerts_error_1 =
+      _registerName1("setPrefersNoInterruptionsFromSystemAlerts:error:");
+  late final _sel_prefersNoInterruptionsFromSystemAlerts1 =
+      _registerName1("prefersNoInterruptionsFromSystemAlerts");
+  late final _sel_setActive_error_1 = _registerName1("setActive:error:");
+  late final _sel_setActive_withOptions_error_1 =
+      _registerName1("setActive:withOptions:error:");
+  bool _objc_msgSend_1015(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    bool active,
+    int options,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outError,
+  ) {
+    return __objc_msgSend_1015(
+      obj,
+      sel,
+      active,
+      options,
+      outError,
+    );
+  }
+
+  late final __objc_msgSend_1015Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Bool,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_1015 = __objc_msgSend_1015Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, bool, int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_activateWithOptions_completionHandler_1 =
+      _registerName1("activateWithOptions:completionHandler:");
+  void _objc_msgSend_1016(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int options,
+    ffi.Pointer<_ObjCBlock> handler,
+  ) {
+    return __objc_msgSend_1016(
+      obj,
+      sel,
+      options,
+      handler,
+    );
+  }
+
+  late final __objc_msgSend_1016Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_1016 = __objc_msgSend_1016Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_setPreferredSampleRate_error_1 =
+      _registerName1("setPreferredSampleRate:error:");
+  bool _objc_msgSend_1017(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    double sampleRate,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outError,
+  ) {
+    return __objc_msgSend_1017(
+      obj,
+      sel,
+      sampleRate,
+      outError,
+    );
+  }
+
+  late final __objc_msgSend_1017Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Double,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_1017 = __objc_msgSend_1017Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, double,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_preferredSampleRate1 = _registerName1("preferredSampleRate");
+  late final _sel_setPreferredIOBufferDuration_error_1 =
+      _registerName1("setPreferredIOBufferDuration:error:");
+  late final _sel_preferredIOBufferDuration1 =
+      _registerName1("preferredIOBufferDuration");
+  late final _sel_setPreferredInputNumberOfChannels_error_1 =
+      _registerName1("setPreferredInputNumberOfChannels:error:");
+  bool _objc_msgSend_1018(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int count,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outError,
+  ) {
+    return __objc_msgSend_1018(
+      obj,
+      sel,
+      count,
+      outError,
+    );
+  }
+
+  late final __objc_msgSend_1018Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSInteger,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_1018 = __objc_msgSend_1018Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_preferredInputNumberOfChannels1 =
+      _registerName1("preferredInputNumberOfChannels");
+  late final _sel_setPreferredOutputNumberOfChannels_error_1 =
+      _registerName1("setPreferredOutputNumberOfChannels:error:");
+  late final _sel_preferredOutputNumberOfChannels1 =
+      _registerName1("preferredOutputNumberOfChannels");
+  late final _sel_setPreferredInputOrientation_error_1 =
+      _registerName1("setPreferredInputOrientation:error:");
+  bool _objc_msgSend_1019(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int orientation,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outError,
+  ) {
+    return __objc_msgSend_1019(
+      obj,
+      sel,
+      orientation,
+      outError,
+    );
+  }
+
+  late final __objc_msgSend_1019Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_1019 = __objc_msgSend_1019Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_preferredInputOrientation1 =
+      _registerName1("preferredInputOrientation");
+  int _objc_msgSend_1020(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_1020(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_1020Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_1020 = __objc_msgSend_1020Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_inputOrientation1 = _registerName1("inputOrientation");
+  late final _sel_maximumInputNumberOfChannels1 =
+      _registerName1("maximumInputNumberOfChannels");
+  late final _sel_maximumOutputNumberOfChannels1 =
+      _registerName1("maximumOutputNumberOfChannels");
+  late final _sel_setInputGain_error_1 = _registerName1("setInputGain:error:");
+  bool _objc_msgSend_1021(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    double gain,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outError,
+  ) {
+    return __objc_msgSend_1021(
+      obj,
+      sel,
+      gain,
+      outError,
+    );
+  }
+
+  late final __objc_msgSend_1021Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Float,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_1021 = __objc_msgSend_1021Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, double,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_inputGain1 = _registerName1("inputGain");
+  late final _sel_isInputGainSettable1 = _registerName1("isInputGainSettable");
+  late final _sel_isInputAvailable1 = _registerName1("isInputAvailable");
+  late final _sel_inputDataSources1 = _registerName1("inputDataSources");
+  late final _sel_inputDataSource1 = _registerName1("inputDataSource");
+  late final _sel_setInputDataSource_error_1 =
+      _registerName1("setInputDataSource:error:");
+  late final _sel_outputDataSources1 = _registerName1("outputDataSources");
+  late final _sel_outputDataSource1 = _registerName1("outputDataSource");
+  late final _sel_setOutputDataSource_error_1 =
+      _registerName1("setOutputDataSource:error:");
+  late final _sel_sampleRate1 = _registerName1("sampleRate");
+  late final _sel_inputNumberOfChannels1 =
+      _registerName1("inputNumberOfChannels");
+  late final _sel_outputNumberOfChannels1 =
+      _registerName1("outputNumberOfChannels");
+  late final _sel_inputLatency1 = _registerName1("inputLatency");
+  late final _sel_outputLatency1 = _registerName1("outputLatency");
+  late final _sel_IOBufferDuration1 = _registerName1("IOBufferDuration");
+  late final _sel_isOtherAudioPlaying1 = _registerName1("isOtherAudioPlaying");
+  late final _sel_secondaryAudioShouldBeSilencedHint1 =
+      _registerName1("secondaryAudioShouldBeSilencedHint");
+  late final _sel_outputVolume1 = _registerName1("outputVolume");
+  late final _sel_promptStyle1 = _registerName1("promptStyle");
+  int _objc_msgSend_1022(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_1022(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_1022Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_1022 = __objc_msgSend_1022Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_availableInputs1 = _registerName1("availableInputs");
+  late final _class_AVAudioSessionRouteDescription1 =
+      _getClass1("AVAudioSessionRouteDescription");
+  late final _sel_inputs1 = _registerName1("inputs");
+  late final _sel_outputs1 = _registerName1("outputs");
+  late final _sel_currentRoute1 = _registerName1("currentRoute");
+  ffi.Pointer<ObjCObject> _objc_msgSend_1023(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_1023(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_1023Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_1023 = __objc_msgSend_1023Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setAggregatedIOPreference_error_1 =
+      _registerName1("setAggregatedIOPreference:error:");
+  bool _objc_msgSend_1024(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int inIOType,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outError,
+  ) {
+    return __objc_msgSend_1024(
+      obj,
+      sel,
+      inIOType,
+      outError,
+    );
+  }
+
+  late final __objc_msgSend_1024Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_1024 = __objc_msgSend_1024Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_setSupportsMultichannelContent_error_1 =
+      _registerName1("setSupportsMultichannelContent:error:");
+  late final _sel_supportsMultichannelContent1 =
+      _registerName1("supportsMultichannelContent");
+  late final _sel_setActive_withFlags_error_1 =
+      _registerName1("setActive:withFlags:error:");
+  bool _objc_msgSend_1025(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    bool active,
+    int flags,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outError,
+  ) {
+    return __objc_msgSend_1025(
+      obj,
+      sel,
+      active,
+      flags,
+      outError,
+    );
+  }
+
+  late final __objc_msgSend_1025Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Bool,
+              NSInteger,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_1025 = __objc_msgSend_1025Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, bool, int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_inputIsAvailable1 = _registerName1("inputIsAvailable");
+  late final _sel_currentHardwareSampleRate1 =
+      _registerName1("currentHardwareSampleRate");
+  late final _sel_currentHardwareInputNumberOfChannels1 =
+      _registerName1("currentHardwareInputNumberOfChannels");
+  late final _sel_currentHardwareOutputNumberOfChannels1 =
+      _registerName1("currentHardwareOutputNumberOfChannels");
+  late final _sel_setPreferredHardwareSampleRate_error_1 =
+      _registerName1("setPreferredHardwareSampleRate:error:");
+  late final _sel_preferredHardwareSampleRate1 =
+      _registerName1("preferredHardwareSampleRate");
+  late final _class_AVAudioPlayer1 = _getClass1("AVAudioPlayer");
+  late final _sel_initWithData_error_1 = _registerName1("initWithData:error:");
+  instancetype _objc_msgSend_1026(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> data,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outError,
+  ) {
+    return __objc_msgSend_1026(
+      obj,
+      sel,
+      data,
+      outError,
+    );
+  }
+
+  late final __objc_msgSend_1026Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_1026 = __objc_msgSend_1026Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_initWithContentsOfURL_fileTypeHint_error_1 =
+      _registerName1("initWithContentsOfURL:fileTypeHint:error:");
+  instancetype _objc_msgSend_1027(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    ffi.Pointer<ObjCObject> utiString,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outError,
+  ) {
+    return __objc_msgSend_1027(
+      obj,
+      sel,
+      url,
+      utiString,
+      outError,
+    );
+  }
+
+  late final __objc_msgSend_1027Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_1027 = __objc_msgSend_1027Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_initWithData_fileTypeHint_error_1 =
+      _registerName1("initWithData:fileTypeHint:error:");
+  instancetype _objc_msgSend_1028(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> data,
+    ffi.Pointer<ObjCObject> utiString,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outError,
+  ) {
+    return __objc_msgSend_1028(
+      obj,
+      sel,
+      data,
+      utiString,
+      outError,
+    );
+  }
+
+  late final __objc_msgSend_1028Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_1028 = __objc_msgSend_1028Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_prepareToPlay1 = _registerName1("prepareToPlay");
+  late final _sel_play1 = _registerName1("play");
+  late final _sel_playAtTime_1 = _registerName1("playAtTime:");
+  bool _objc_msgSend_1029(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    double time,
+  ) {
+    return __objc_msgSend_1029(
+      obj,
+      sel,
+      time,
+    );
+  }
+
+  late final __objc_msgSend_1029Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSTimeInterval)>>('objc_msgSend');
+  late final __objc_msgSend_1029 = __objc_msgSend_1029Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, double)>();
+
+  late final _sel_isPlaying1 = _registerName1("isPlaying");
+  late final _sel_numberOfChannels1 = _registerName1("numberOfChannels");
+  late final _sel_currentDevice1 = _registerName1("currentDevice");
+  late final _sel_setCurrentDevice_1 = _registerName1("setCurrentDevice:");
+  late final _sel_url1 = _registerName1("url");
+  late final _sel_pan1 = _registerName1("pan");
+  late final _sel_setPan_1 = _registerName1("setPan:");
+  late final _sel_volume1 = _registerName1("volume");
+  late final _sel_setVolume_1 = _registerName1("setVolume:");
+  late final _sel_setVolume_fadeDuration_1 =
+      _registerName1("setVolume:fadeDuration:");
+  void _objc_msgSend_1030(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    double volume,
+    double duration,
+  ) {
+    return __objc_msgSend_1030(
+      obj,
+      sel,
+      volume,
+      duration,
+    );
+  }
+
+  late final __objc_msgSend_1030Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Float, NSTimeInterval)>>('objc_msgSend');
+  late final __objc_msgSend_1030 = __objc_msgSend_1030Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, double, double)>();
+
+  late final _sel_enableRate1 = _registerName1("enableRate");
+  late final _sel_setEnableRate_1 = _registerName1("setEnableRate:");
+  late final _sel_rate1 = _registerName1("rate");
+  late final _sel_setRate_1 = _registerName1("setRate:");
+  late final _sel_currentTime1 = _registerName1("currentTime");
+  late final _sel_setCurrentTime_1 = _registerName1("setCurrentTime:");
+  late final _sel_deviceCurrentTime1 = _registerName1("deviceCurrentTime");
+  late final _sel_numberOfLoops1 = _registerName1("numberOfLoops");
+  late final _sel_setNumberOfLoops_1 = _registerName1("setNumberOfLoops:");
+  late final _sel_settings1 = _registerName1("settings");
+  late final _class_AVAudioFormat1 = _getClass1("AVAudioFormat");
+  late final _sel_initWithStreamDescription_1 =
+      _registerName1("initWithStreamDescription:");
+  instancetype _objc_msgSend_1031(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<AudioStreamBasicDescription> asbd,
+  ) {
+    return __objc_msgSend_1031(
+      obj,
+      sel,
+      asbd,
+    );
+  }
+
+  late final __objc_msgSend_1031Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<AudioStreamBasicDescription>)>>('objc_msgSend');
+  late final __objc_msgSend_1031 = __objc_msgSend_1031Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<AudioStreamBasicDescription>)>();
+
+  late final _class_AVAudioChannelLayout1 = _getClass1("AVAudioChannelLayout");
+  late final _sel_initWithLayoutTag_1 = _registerName1("initWithLayoutTag:");
+  instancetype _objc_msgSend_1032(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int layoutTag,
+  ) {
+    return __objc_msgSend_1032(
+      obj,
+      sel,
+      layoutTag,
+    );
+  }
+
+  late final __objc_msgSend_1032Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              AudioChannelLayoutTag)>>('objc_msgSend');
+  late final __objc_msgSend_1032 = __objc_msgSend_1032Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_initWithLayout_1 = _registerName1("initWithLayout:");
+  instancetype _objc_msgSend_1033(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<AudioChannelLayout> layout,
+  ) {
+    return __objc_msgSend_1033(
+      obj,
+      sel,
+      layout,
+    );
+  }
+
+  late final __objc_msgSend_1033Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<AudioChannelLayout>)>>('objc_msgSend');
+  late final __objc_msgSend_1033 = __objc_msgSend_1033Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<AudioChannelLayout>)>();
+
+  late final _sel_isEqual_1 = _registerName1("isEqual:");
+  late final _sel_layoutWithLayoutTag_1 =
+      _registerName1("layoutWithLayoutTag:");
+  late final _sel_layoutWithLayout_1 = _registerName1("layoutWithLayout:");
+  late final _sel_layoutTag1 = _registerName1("layoutTag");
+  late final _sel_layout1 = _registerName1("layout");
+  ffi.Pointer<AudioChannelLayout> _objc_msgSend_1034(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_1034(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_1034Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<AudioChannelLayout> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_1034 = __objc_msgSend_1034Ptr.asFunction<
+      ffi.Pointer<AudioChannelLayout> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_channelCount1 = _registerName1("channelCount");
+  int _objc_msgSend_1035(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_1035(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_1035Ptr = _lookup<
+      ffi.NativeFunction<
+          AVAudioChannelCount Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_1035 = __objc_msgSend_1035Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_initWithStreamDescription_channelLayout_1 =
+      _registerName1("initWithStreamDescription:channelLayout:");
+  instancetype _objc_msgSend_1036(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<AudioStreamBasicDescription> asbd,
+    ffi.Pointer<ObjCObject> layout,
+  ) {
+    return __objc_msgSend_1036(
+      obj,
+      sel,
+      asbd,
+      layout,
+    );
+  }
+
+  late final __objc_msgSend_1036Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<AudioStreamBasicDescription>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_1036 = __objc_msgSend_1036Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<AudioStreamBasicDescription>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initStandardFormatWithSampleRate_channels_1 =
+      _registerName1("initStandardFormatWithSampleRate:channels:");
+  instancetype _objc_msgSend_1037(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    double sampleRate,
+    int channels,
+  ) {
+    return __objc_msgSend_1037(
+      obj,
+      sel,
+      sampleRate,
+      channels,
+    );
+  }
+
+  late final __objc_msgSend_1037Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Double, AVAudioChannelCount)>>('objc_msgSend');
+  late final __objc_msgSend_1037 = __objc_msgSend_1037Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, double, int)>();
+
+  late final _sel_initStandardFormatWithSampleRate_channelLayout_1 =
+      _registerName1("initStandardFormatWithSampleRate:channelLayout:");
+  instancetype _objc_msgSend_1038(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    double sampleRate,
+    ffi.Pointer<ObjCObject> layout,
+  ) {
+    return __objc_msgSend_1038(
+      obj,
+      sel,
+      sampleRate,
+      layout,
+    );
+  }
+
+  late final __objc_msgSend_1038Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Double, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_1038 = __objc_msgSend_1038Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          double, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithCommonFormat_sampleRate_channels_interleaved_1 =
+      _registerName1("initWithCommonFormat:sampleRate:channels:interleaved:");
+  instancetype _objc_msgSend_1039(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int format,
+    double sampleRate,
+    int channels,
+    bool interleaved,
+  ) {
+    return __objc_msgSend_1039(
+      obj,
+      sel,
+      format,
+      sampleRate,
+      channels,
+      interleaved,
+    );
+  }
+
+  late final __objc_msgSend_1039Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Double,
+              AVAudioChannelCount,
+              ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_1039 = __objc_msgSend_1039Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          double, int, bool)>();
+
+  late final _sel_initWithCommonFormat_sampleRate_interleaved_channelLayout_1 =
+      _registerName1(
+          "initWithCommonFormat:sampleRate:interleaved:channelLayout:");
+  instancetype _objc_msgSend_1040(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int format,
+    double sampleRate,
+    bool interleaved,
+    ffi.Pointer<ObjCObject> layout,
+  ) {
+    return __objc_msgSend_1040(
+      obj,
+      sel,
+      format,
+      sampleRate,
+      interleaved,
+      layout,
+    );
+  }
+
+  late final __objc_msgSend_1040Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Double,
+              ffi.Bool,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_1040 = __objc_msgSend_1040Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          double, bool, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithSettings_1 = _registerName1("initWithSettings:");
+  late final _sel_initWithCMAudioFormatDescription_1 =
+      _registerName1("initWithCMAudioFormatDescription:");
+  instancetype _objc_msgSend_1041(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    CMAudioFormatDescriptionRef formatDescription,
+  ) {
+    return __objc_msgSend_1041(
+      obj,
+      sel,
+      formatDescription,
+    );
+  }
+
+  late final __objc_msgSend_1041Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              CMAudioFormatDescriptionRef)>>('objc_msgSend');
+  late final __objc_msgSend_1041 = __objc_msgSend_1041Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          CMAudioFormatDescriptionRef)>();
+
+  late final _sel_isStandard1 = _registerName1("isStandard");
+  late final _sel_commonFormat1 = _registerName1("commonFormat");
+  int _objc_msgSend_1042(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_1042(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_1042Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_1042 = __objc_msgSend_1042Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_isInterleaved1 = _registerName1("isInterleaved");
+  late final _sel_streamDescription1 = _registerName1("streamDescription");
+  ffi.Pointer<AudioStreamBasicDescription> _objc_msgSend_1043(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_1043(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_1043Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<AudioStreamBasicDescription> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_1043 = __objc_msgSend_1043Ptr.asFunction<
+      ffi.Pointer<AudioStreamBasicDescription> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_channelLayout1 = _registerName1("channelLayout");
+  ffi.Pointer<ObjCObject> _objc_msgSend_1044(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_1044(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_1044Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_1044 = __objc_msgSend_1044Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_magicCookie1 = _registerName1("magicCookie");
+  late final _sel_setMagicCookie_1 = _registerName1("setMagicCookie:");
+  late final _sel_formatDescription1 = _registerName1("formatDescription");
+  CMAudioFormatDescriptionRef _objc_msgSend_1045(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_1045(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_1045Ptr = _lookup<
+      ffi.NativeFunction<
+          CMAudioFormatDescriptionRef Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_1045 = __objc_msgSend_1045Ptr.asFunction<
+      CMAudioFormatDescriptionRef Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  ffi.Pointer<ObjCObject> _objc_msgSend_1046(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_1046(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_1046Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_1046 = __objc_msgSend_1046Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_isMeteringEnabled1 = _registerName1("isMeteringEnabled");
+  late final _sel_setMeteringEnabled_1 = _registerName1("setMeteringEnabled:");
+  late final _sel_updateMeters1 = _registerName1("updateMeters");
+  late final _sel_peakPowerForChannel_1 =
+      _registerName1("peakPowerForChannel:");
+  double _objc_msgSend_1047(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int channelNumber,
+  ) {
+    return __objc_msgSend_1047(
+      obj,
+      sel,
+      channelNumber,
+    );
+  }
+
+  late final __objc_msgSend_1047Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Float Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_1047 = __objc_msgSend_1047Ptr.asFunction<
+      double Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_averagePowerForChannel_1 =
+      _registerName1("averagePowerForChannel:");
+  late final _sel_channelAssignments1 = _registerName1("channelAssignments");
+  late final _sel_setChannelAssignments_1 =
+      _registerName1("setChannelAssignments:");
+}
+
+class _ObjCWrapper implements ffi.Finalizable {
+  final ffi.Pointer<ObjCObject> _id;
+  final AVFAudio _lib;
+  bool _pendingRelease;
+
+  _ObjCWrapper._(this._id, this._lib,
+      {bool retain = false, bool release = false})
+      : _pendingRelease = release {
+    if (retain) {
+      _lib._objc_retain(_id.cast());
+    }
+    if (release) {
+      _lib._objc_releaseFinalizer2.attach(this, _id.cast(), detach: this);
+    }
+  }
+
+  /// Releases the reference to the underlying ObjC object held by this wrapper.
+  /// Throws a StateError if this wrapper doesn't currently hold a reference.
+  void release() {
+    if (_pendingRelease) {
+      _pendingRelease = false;
+      _lib._objc_release(_id.cast());
+      _lib._objc_releaseFinalizer2.detach(this);
+    } else {
+      throw StateError(
+          'Released an ObjC object that was unowned or already released.');
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    return other is _ObjCWrapper && _id == other._id;
+  }
+
+  @override
+  int get hashCode => _id.hashCode;
+}
+
+class NSObject extends _ObjCWrapper {
+  NSObject._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSObject] that points to the same underlying object as [other].
+  static NSObject castFrom<T extends _ObjCWrapper>(T other) {
+    return NSObject._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSObject] that wraps the given raw object pointer.
+  static NSObject castFromPointer(AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSObject._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSObject].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSObject1);
+  }
+
+  static void load(AVFAudio _lib) {
+    return _lib._objc_msgSend_1(_lib._class_NSObject1, _lib._sel_load1);
+  }
+
+  static void initialize(AVFAudio _lib) {
+    return _lib._objc_msgSend_1(_lib._class_NSObject1, _lib._sel_initialize1);
+  }
+
+  NSObject init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSObject1, _lib._sel_new1);
+    return NSObject._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSObject allocWithZone_(AVFAudio _lib, ffi.Pointer<_NSZone> zone) {
+    final _ret = _lib._objc_msgSend_3(
+        _lib._class_NSObject1, _lib._sel_allocWithZone_1, zone);
+    return NSObject._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSObject alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSObject1, _lib._sel_alloc1);
+    return NSObject._(_ret, _lib, retain: false, release: true);
+  }
+
+  void dealloc() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_dealloc1);
+  }
+
+  void finalize() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_finalize1);
+  }
+
+  NSObject copy() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_copy1);
+    return NSObject._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSObject mutableCopy() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_mutableCopy1);
+    return NSObject._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSObject copyWithZone_(AVFAudio _lib, ffi.Pointer<_NSZone> zone) {
+    final _ret = _lib._objc_msgSend_3(
+        _lib._class_NSObject1, _lib._sel_copyWithZone_1, zone);
+    return NSObject._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSObject mutableCopyWithZone_(
+      AVFAudio _lib, ffi.Pointer<_NSZone> zone) {
+    final _ret = _lib._objc_msgSend_3(
+        _lib._class_NSObject1, _lib._sel_mutableCopyWithZone_1, zone);
+    return NSObject._(_ret, _lib, retain: false, release: true);
+  }
+
+  static bool instancesRespondToSelector_(
+      AVFAudio _lib, ffi.Pointer<ObjCSel> aSelector) {
+    return _lib._objc_msgSend_4(_lib._class_NSObject1,
+        _lib._sel_instancesRespondToSelector_1, aSelector);
+  }
+
+  static bool conformsToProtocol_(AVFAudio _lib, Protocol? protocol) {
+    return _lib._objc_msgSend_5(_lib._class_NSObject1,
+        _lib._sel_conformsToProtocol_1, protocol?._id ?? ffi.nullptr);
+  }
+
+  IMP methodForSelector_(ffi.Pointer<ObjCSel> aSelector) {
+    return _lib._objc_msgSend_6(_id, _lib._sel_methodForSelector_1, aSelector);
+  }
+
+  static IMP instanceMethodForSelector_(
+      AVFAudio _lib, ffi.Pointer<ObjCSel> aSelector) {
+    return _lib._objc_msgSend_6(_lib._class_NSObject1,
+        _lib._sel_instanceMethodForSelector_1, aSelector);
+  }
+
+  void doesNotRecognizeSelector_(ffi.Pointer<ObjCSel> aSelector) {
+    return _lib._objc_msgSend_7(
+        _id, _lib._sel_doesNotRecognizeSelector_1, aSelector);
+  }
+
+  NSObject forwardingTargetForSelector_(ffi.Pointer<ObjCSel> aSelector) {
+    final _ret = _lib._objc_msgSend_8(
+        _id, _lib._sel_forwardingTargetForSelector_1, aSelector);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void forwardInvocation_(NSInvocation? anInvocation) {
+    return _lib._objc_msgSend_372(
+        _id, _lib._sel_forwardInvocation_1, anInvocation?._id ?? ffi.nullptr);
+  }
+
+  NSMethodSignature methodSignatureForSelector_(
+      ffi.Pointer<ObjCSel> aSelector) {
+    final _ret = _lib._objc_msgSend_373(
+        _id, _lib._sel_methodSignatureForSelector_1, aSelector);
+    return NSMethodSignature._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMethodSignature instanceMethodSignatureForSelector_(
+      AVFAudio _lib, ffi.Pointer<ObjCSel> aSelector) {
+    final _ret = _lib._objc_msgSend_373(_lib._class_NSObject1,
+        _lib._sel_instanceMethodSignatureForSelector_1, aSelector);
+    return NSMethodSignature._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool allowsWeakReference() {
+    return _lib._objc_msgSend_12(_id, _lib._sel_allowsWeakReference1);
+  }
+
+  bool retainWeakReference() {
+    return _lib._objc_msgSend_12(_id, _lib._sel_retainWeakReference1);
+  }
+
+  static bool isSubclassOfClass_(AVFAudio _lib, NSObject aClass) {
+    return _lib._objc_msgSend_0(
+        _lib._class_NSObject1, _lib._sel_isSubclassOfClass_1, aClass._id);
+  }
+
+  static bool resolveClassMethod_(AVFAudio _lib, ffi.Pointer<ObjCSel> sel) {
+    return _lib._objc_msgSend_4(
+        _lib._class_NSObject1, _lib._sel_resolveClassMethod_1, sel);
+  }
+
+  static bool resolveInstanceMethod_(AVFAudio _lib, ffi.Pointer<ObjCSel> sel) {
+    return _lib._objc_msgSend_4(
+        _lib._class_NSObject1, _lib._sel_resolveInstanceMethod_1, sel);
+  }
+
+  static int hash(AVFAudio _lib) {
+    return _lib._objc_msgSend_10(_lib._class_NSObject1, _lib._sel_hash1);
+  }
+
+  static NSObject superclass(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSObject1, _lib._sel_superclass1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject class1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSObject1, _lib._sel_class1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString description(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_20(_lib._class_NSObject1, _lib._sel_description1);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString debugDescription(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_20(
+        _lib._class_NSObject1, _lib._sel_debugDescription1);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static int version(AVFAudio _lib) {
+    return _lib._objc_msgSend_78(_lib._class_NSObject1, _lib._sel_version1);
+  }
+
+  static void setVersion_(AVFAudio _lib, int aVersion) {
+    return _lib._objc_msgSend_374(
+        _lib._class_NSObject1, _lib._sel_setVersion_1, aVersion);
+  }
+
+  NSObject get classForCoder {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_classForCoder1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject replacementObjectForCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_replacementObjectForCoder_1, coder?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject awakeAfterUsingCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_awakeAfterUsingCoder_1, coder?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void poseAsClass_(AVFAudio _lib, NSObject aClass) {
+    return _lib._objc_msgSend_15(
+        _lib._class_NSObject1, _lib._sel_poseAsClass_1, aClass._id);
+  }
+
+  NSObject get autoContentAccessingProxy {
+    final _ret =
+        _lib._objc_msgSend_2(_id, _lib._sel_autoContentAccessingProxy1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void
+      attemptRecoveryFromError_optionIndex_delegate_didRecoverSelector_contextInfo_(
+          NSError? error,
+          int recoveryOptionIndex,
+          NSObject delegate,
+          ffi.Pointer<ObjCSel> didRecoverSelector,
+          ffi.Pointer<ffi.Void> contextInfo) {
+    return _lib._objc_msgSend_375(
+        _id,
+        _lib._sel_attemptRecoveryFromError_optionIndex_delegate_didRecoverSelector_contextInfo_1,
+        error?._id ?? ffi.nullptr,
+        recoveryOptionIndex,
+        delegate._id,
+        didRecoverSelector,
+        contextInfo);
+  }
+
+  bool attemptRecoveryFromError_optionIndex_(
+      NSError? error, int recoveryOptionIndex) {
+    return _lib._objc_msgSend_376(
+        _id,
+        _lib._sel_attemptRecoveryFromError_optionIndex_1,
+        error?._id ?? ffi.nullptr,
+        recoveryOptionIndex);
+  }
+
+  void performSelector_withObject_afterDelay_inModes_(
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument,
+      double delay,
+      NSArray? modes) {
+    return _lib._objc_msgSend_377(
+        _id,
+        _lib._sel_performSelector_withObject_afterDelay_inModes_1,
+        aSelector,
+        anArgument._id,
+        delay,
+        modes?._id ?? ffi.nullptr);
+  }
+
+  void performSelector_withObject_afterDelay_(
+      ffi.Pointer<ObjCSel> aSelector, NSObject anArgument, double delay) {
+    return _lib._objc_msgSend_378(
+        _id,
+        _lib._sel_performSelector_withObject_afterDelay_1,
+        aSelector,
+        anArgument._id,
+        delay);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSObject1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSObject1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  void URL_resourceDataDidBecomeAvailable_(NSURL? sender, NSData? newBytes) {
+    return _lib._objc_msgSend_379(
+        _id,
+        _lib._sel_URL_resourceDataDidBecomeAvailable_1,
+        sender?._id ?? ffi.nullptr,
+        newBytes?._id ?? ffi.nullptr);
+  }
+
+  void URLResourceDidFinishLoading_(NSURL? sender) {
+    return _lib._objc_msgSend_380(_id, _lib._sel_URLResourceDidFinishLoading_1,
+        sender?._id ?? ffi.nullptr);
+  }
+
+  void URLResourceDidCancelLoading_(NSURL? sender) {
+    return _lib._objc_msgSend_380(_id, _lib._sel_URLResourceDidCancelLoading_1,
+        sender?._id ?? ffi.nullptr);
+  }
+
+  void URL_resourceDidFailLoadingWithReason_(NSURL? sender, NSString? reason) {
+    return _lib._objc_msgSend_381(
+        _id,
+        _lib._sel_URL_resourceDidFailLoadingWithReason_1,
+        sender?._id ?? ffi.nullptr,
+        reason?._id ?? ffi.nullptr);
+  }
+
+  bool fileManager_shouldProceedAfterError_(
+      NSFileManager? fm, NSDictionary? errorInfo) {
+    return _lib._objc_msgSend_407(
+        _id,
+        _lib._sel_fileManager_shouldProceedAfterError_1,
+        fm?._id ?? ffi.nullptr,
+        errorInfo?._id ?? ffi.nullptr);
+  }
+
+  void fileManager_willProcessPath_(NSFileManager? fm, NSString? path) {
+    return _lib._objc_msgSend_408(_id, _lib._sel_fileManager_willProcessPath_1,
+        fm?._id ?? ffi.nullptr, path?._id ?? ffi.nullptr);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSObject1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  NSObject valueForKey_(NSString? key) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_valueForKey_1, key?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void setValue_forKey_(NSObject value, NSString? key) {
+    return _lib._objc_msgSend_122(
+        _id, _lib._sel_setValue_forKey_1, value._id, key?._id ?? ffi.nullptr);
+  }
+
+  bool validateValue_forKey_error_(ffi.Pointer<ffi.Pointer<ObjCObject>> ioValue,
+      NSString? inKey, ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    return _lib._objc_msgSend_220(_id, _lib._sel_validateValue_forKey_error_1,
+        ioValue, inKey?._id ?? ffi.nullptr, outError);
+  }
+
+  NSMutableArray mutableArrayValueForKey_(NSString? key) {
+    final _ret = _lib._objc_msgSend_425(
+        _id, _lib._sel_mutableArrayValueForKey_1, key?._id ?? ffi.nullptr);
+    return NSMutableArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSMutableOrderedSet mutableOrderedSetValueForKey_(NSString? key) {
+    final _ret = _lib._objc_msgSend_441(
+        _id, _lib._sel_mutableOrderedSetValueForKey_1, key?._id ?? ffi.nullptr);
+    return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSMutableSet mutableSetValueForKey_(NSString? key) {
+    final _ret = _lib._objc_msgSend_442(
+        _id, _lib._sel_mutableSetValueForKey_1, key?._id ?? ffi.nullptr);
+    return NSMutableSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject valueForKeyPath_(NSString? keyPath) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_valueForKeyPath_1, keyPath?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void setValue_forKeyPath_(NSObject value, NSString? keyPath) {
+    return _lib._objc_msgSend_122(_id, _lib._sel_setValue_forKeyPath_1,
+        value._id, keyPath?._id ?? ffi.nullptr);
+  }
+
+  bool validateValue_forKeyPath_error_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> ioValue,
+      NSString? inKeyPath,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    return _lib._objc_msgSend_220(
+        _id,
+        _lib._sel_validateValue_forKeyPath_error_1,
+        ioValue,
+        inKeyPath?._id ?? ffi.nullptr,
+        outError);
+  }
+
+  NSMutableArray mutableArrayValueForKeyPath_(NSString? keyPath) {
+    final _ret = _lib._objc_msgSend_425(_id,
+        _lib._sel_mutableArrayValueForKeyPath_1, keyPath?._id ?? ffi.nullptr);
+    return NSMutableArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSMutableOrderedSet mutableOrderedSetValueForKeyPath_(NSString? keyPath) {
+    final _ret = _lib._objc_msgSend_441(
+        _id,
+        _lib._sel_mutableOrderedSetValueForKeyPath_1,
+        keyPath?._id ?? ffi.nullptr);
+    return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSMutableSet mutableSetValueForKeyPath_(NSString? keyPath) {
+    final _ret = _lib._objc_msgSend_442(_id,
+        _lib._sel_mutableSetValueForKeyPath_1, keyPath?._id ?? ffi.nullptr);
+    return NSMutableSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject valueForUndefinedKey_(NSString? key) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_valueForUndefinedKey_1, key?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void setValue_forUndefinedKey_(NSObject value, NSString? key) {
+    return _lib._objc_msgSend_122(_id, _lib._sel_setValue_forUndefinedKey_1,
+        value._id, key?._id ?? ffi.nullptr);
+  }
+
+  void setNilValueForKey_(NSString? key) {
+    return _lib._objc_msgSend_186(
+        _id, _lib._sel_setNilValueForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  NSDictionary dictionaryWithValuesForKeys_(NSArray? keys) {
+    final _ret = _lib._objc_msgSend_443(
+        _id, _lib._sel_dictionaryWithValuesForKeys_1, keys?._id ?? ffi.nullptr);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  void setValuesForKeysWithDictionary_(NSDictionary? keyedValues) {
+    return _lib._objc_msgSend_444(
+        _id,
+        _lib._sel_setValuesForKeysWithDictionary_1,
+        keyedValues?._id ?? ffi.nullptr);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSObject1, _lib._sel_useStoredAccessor1);
+  }
+
+  NSObject storedValueForKey_(NSString? key) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_storedValueForKey_1, key?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void takeStoredValue_forKey_(NSObject value, NSString? key) {
+    return _lib._objc_msgSend_122(_id, _lib._sel_takeStoredValue_forKey_1,
+        value._id, key?._id ?? ffi.nullptr);
+  }
+
+  void takeValue_forKey_(NSObject value, NSString? key) {
+    return _lib._objc_msgSend_122(
+        _id, _lib._sel_takeValue_forKey_1, value._id, key?._id ?? ffi.nullptr);
+  }
+
+  void takeValue_forKeyPath_(NSObject value, NSString? keyPath) {
+    return _lib._objc_msgSend_122(_id, _lib._sel_takeValue_forKeyPath_1,
+        value._id, keyPath?._id ?? ffi.nullptr);
+  }
+
+  NSObject handleQueryWithUnboundKey_(NSString? key) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_handleQueryWithUnboundKey_1, key?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void handleTakeValue_forUnboundKey_(NSObject value, NSString? key) {
+    return _lib._objc_msgSend_122(
+        _id,
+        _lib._sel_handleTakeValue_forUnboundKey_1,
+        value._id,
+        key?._id ?? ffi.nullptr);
+  }
+
+  void unableToSetNilForKey_(NSString? key) {
+    return _lib._objc_msgSend_186(
+        _id, _lib._sel_unableToSetNilForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  NSDictionary valuesForKeys_(NSArray? keys) {
+    final _ret = _lib._objc_msgSend_443(
+        _id, _lib._sel_valuesForKeys_1, keys?._id ?? ffi.nullptr);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  void takeValuesFromDictionary_(NSDictionary? properties) {
+    return _lib._objc_msgSend_444(_id, _lib._sel_takeValuesFromDictionary_1,
+        properties?._id ?? ffi.nullptr);
+  }
+
+  void observeValueForKeyPath_ofObject_change_context_(NSString? keyPath,
+      NSObject object, NSDictionary? change, ffi.Pointer<ffi.Void> context) {
+    return _lib._objc_msgSend_445(
+        _id,
+        _lib._sel_observeValueForKeyPath_ofObject_change_context_1,
+        keyPath?._id ?? ffi.nullptr,
+        object._id,
+        change?._id ?? ffi.nullptr,
+        context);
+  }
+
+  void addObserver_forKeyPath_options_context_(NSObject? observer,
+      NSString? keyPath, int options, ffi.Pointer<ffi.Void> context) {
+    return _lib._objc_msgSend_126(
+        _id,
+        _lib._sel_addObserver_forKeyPath_options_context_1,
+        observer?._id ?? ffi.nullptr,
+        keyPath?._id ?? ffi.nullptr,
+        options,
+        context);
+  }
+
+  void removeObserver_forKeyPath_context_(
+      NSObject? observer, NSString? keyPath, ffi.Pointer<ffi.Void> context) {
+    return _lib._objc_msgSend_127(
+        _id,
+        _lib._sel_removeObserver_forKeyPath_context_1,
+        observer?._id ?? ffi.nullptr,
+        keyPath?._id ?? ffi.nullptr,
+        context);
+  }
+
+  void removeObserver_forKeyPath_(NSObject? observer, NSString? keyPath) {
+    return _lib._objc_msgSend_128(_id, _lib._sel_removeObserver_forKeyPath_1,
+        observer?._id ?? ffi.nullptr, keyPath?._id ?? ffi.nullptr);
+  }
+
+  void willChangeValueForKey_(NSString? key) {
+    return _lib._objc_msgSend_186(
+        _id, _lib._sel_willChangeValueForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  void didChangeValueForKey_(NSString? key) {
+    return _lib._objc_msgSend_186(
+        _id, _lib._sel_didChangeValueForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  void willChange_valuesAtIndexes_forKey_(
+      int changeKind, NSIndexSet? indexes, NSString? key) {
+    return _lib._objc_msgSend_446(
+        _id,
+        _lib._sel_willChange_valuesAtIndexes_forKey_1,
+        changeKind,
+        indexes?._id ?? ffi.nullptr,
+        key?._id ?? ffi.nullptr);
+  }
+
+  void didChange_valuesAtIndexes_forKey_(
+      int changeKind, NSIndexSet? indexes, NSString? key) {
+    return _lib._objc_msgSend_446(
+        _id,
+        _lib._sel_didChange_valuesAtIndexes_forKey_1,
+        changeKind,
+        indexes?._id ?? ffi.nullptr,
+        key?._id ?? ffi.nullptr);
+  }
+
+  void willChangeValueForKey_withSetMutation_usingObjects_(
+      NSString? key, int mutationKind, NSSet? objects) {
+    return _lib._objc_msgSend_447(
+        _id,
+        _lib._sel_willChangeValueForKey_withSetMutation_usingObjects_1,
+        key?._id ?? ffi.nullptr,
+        mutationKind,
+        objects?._id ?? ffi.nullptr);
+  }
+
+  void didChangeValueForKey_withSetMutation_usingObjects_(
+      NSString? key, int mutationKind, NSSet? objects) {
+    return _lib._objc_msgSend_447(
+        _id,
+        _lib._sel_didChangeValueForKey_withSetMutation_usingObjects_1,
+        key?._id ?? ffi.nullptr,
+        mutationKind,
+        objects?._id ?? ffi.nullptr);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSObject1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSObject1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  ffi.Pointer<ffi.Void> get observationInfo {
+    return _lib._objc_msgSend_19(_id, _lib._sel_observationInfo1);
+  }
+
+  set observationInfo(ffi.Pointer<ffi.Void> value) {
+    _lib._objc_msgSend_448(_id, _lib._sel_setObservationInfo_1, value);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSObject1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  NSObject get classForKeyedArchiver {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_classForKeyedArchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject replacementObjectForKeyedArchiver_(NSKeyedArchiver? archiver) {
+    final _ret = _lib._objc_msgSend_461(
+        _id,
+        _lib._sel_replacementObjectForKeyedArchiver_1,
+        archiver?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSObject1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSObject1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void performSelectorOnMainThread_withObject_waitUntilDone_modes_(
+      ffi.Pointer<ObjCSel> aSelector, NSObject arg, bool wait, NSArray? array) {
+    return _lib._objc_msgSend_462(
+        _id,
+        _lib._sel_performSelectorOnMainThread_withObject_waitUntilDone_modes_1,
+        aSelector,
+        arg._id,
+        wait,
+        array?._id ?? ffi.nullptr);
+  }
+
+  void performSelectorOnMainThread_withObject_waitUntilDone_(
+      ffi.Pointer<ObjCSel> aSelector, NSObject arg, bool wait) {
+    return _lib._objc_msgSend_463(
+        _id,
+        _lib._sel_performSelectorOnMainThread_withObject_waitUntilDone_1,
+        aSelector,
+        arg._id,
+        wait);
+  }
+
+  void performSelector_onThread_withObject_waitUntilDone_modes_(
+      ffi.Pointer<ObjCSel> aSelector,
+      NSThread? thr,
+      NSObject arg,
+      bool wait,
+      NSArray? array) {
+    return _lib._objc_msgSend_480(
+        _id,
+        _lib._sel_performSelector_onThread_withObject_waitUntilDone_modes_1,
+        aSelector,
+        thr?._id ?? ffi.nullptr,
+        arg._id,
+        wait,
+        array?._id ?? ffi.nullptr);
+  }
+
+  void performSelector_onThread_withObject_waitUntilDone_(
+      ffi.Pointer<ObjCSel> aSelector, NSThread? thr, NSObject arg, bool wait) {
+    return _lib._objc_msgSend_481(
+        _id,
+        _lib._sel_performSelector_onThread_withObject_waitUntilDone_1,
+        aSelector,
+        thr?._id ?? ffi.nullptr,
+        arg._id,
+        wait);
+  }
+
+  void performSelectorInBackground_withObject_(
+      ffi.Pointer<ObjCSel> aSelector, NSObject arg) {
+    return _lib._objc_msgSend_82(_id,
+        _lib._sel_performSelectorInBackground_withObject_1, aSelector, arg._id);
+  }
+
+  NSObject get classForArchiver {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_classForArchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject replacementObjectForArchiver_(NSArchiver? archiver) {
+    final _ret = _lib._objc_msgSend_484(_id,
+        _lib._sel_replacementObjectForArchiver_1, archiver?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject get classForPortCoder {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_classForPortCoder1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject replacementObjectForPortCoder_(NSPortCoder? coder) {
+    final _ret = _lib._objc_msgSend_522(_id,
+        _lib._sel_replacementObjectForPortCoder_1, coder?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSClassDescription? get classDescription {
+    final _ret = _lib._objc_msgSend_525(_id, _lib._sel_classDescription1);
+    return _ret.address == 0
+        ? null
+        : NSClassDescription._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get attributeKeys {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_attributeKeys1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get toOneRelationshipKeys {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_toOneRelationshipKeys1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get toManyRelationshipKeys {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_toManyRelationshipKeys1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString inverseForRelationshipKey_(NSString? relationshipKey) {
+    final _ret = _lib._objc_msgSend_64(
+        _id,
+        _lib._sel_inverseForRelationshipKey_1,
+        relationshipKey?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject scriptingValueForSpecifier_(
+      NSScriptObjectSpecifier? objectSpecifier) {
+    final _ret = _lib._objc_msgSend_569(
+        _id,
+        _lib._sel_scriptingValueForSpecifier_1,
+        objectSpecifier?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary? get scriptingProperties {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_scriptingProperties1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  set scriptingProperties(NSDictionary? value) {
+    _lib._objc_msgSend_165(
+        _id, _lib._sel_setScriptingProperties_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSObject copyScriptingValue_forKey_withProperties_(
+      NSObject value, NSString? key, NSDictionary? properties) {
+    final _ret = _lib._objc_msgSend_570(
+        _id,
+        _lib._sel_copyScriptingValue_forKey_withProperties_1,
+        value._id,
+        key?._id ?? ffi.nullptr,
+        properties?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSObject
+      newScriptingObjectOfClass_forValueForKey_withContentsValue_properties_(
+          NSObject objectClass,
+          NSString? key,
+          NSObject contentsValue,
+          NSDictionary? properties) {
+    final _ret = _lib._objc_msgSend_571(
+        _id,
+        _lib._sel_newScriptingObjectOfClass_forValueForKey_withContentsValue_properties_1,
+        objectClass._id,
+        key?._id ?? ffi.nullptr,
+        contentsValue._id,
+        properties?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: false, release: true);
+  }
+
+  int get classCode {
+    return _lib._objc_msgSend_191(_id, _lib._sel_classCode1);
+  }
+
+  NSString? get className {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_className1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject valueAtIndex_inPropertyWithKey_(int index, NSString? key) {
+    final _ret = _lib._objc_msgSend_572(
+        _id,
+        _lib._sel_valueAtIndex_inPropertyWithKey_1,
+        index,
+        key?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject valueWithName_inPropertyWithKey_(NSString? name, NSString? key) {
+    final _ret = _lib._objc_msgSend_159(
+        _id,
+        _lib._sel_valueWithName_inPropertyWithKey_1,
+        name?._id ?? ffi.nullptr,
+        key?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject valueWithUniqueID_inPropertyWithKey_(
+      NSObject uniqueID, NSString? key) {
+    final _ret = _lib._objc_msgSend_272(
+        _id,
+        _lib._sel_valueWithUniqueID_inPropertyWithKey_1,
+        uniqueID._id,
+        key?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void insertValue_atIndex_inPropertyWithKey_(
+      NSObject value, int index, NSString? key) {
+    return _lib._objc_msgSend_573(
+        _id,
+        _lib._sel_insertValue_atIndex_inPropertyWithKey_1,
+        value._id,
+        index,
+        key?._id ?? ffi.nullptr);
+  }
+
+  void removeValueAtIndex_fromPropertyWithKey_(int index, NSString? key) {
+    return _lib._objc_msgSend_574(
+        _id,
+        _lib._sel_removeValueAtIndex_fromPropertyWithKey_1,
+        index,
+        key?._id ?? ffi.nullptr);
+  }
+
+  void replaceValueAtIndex_inPropertyWithKey_withValue_(
+      int index, NSString? key, NSObject value) {
+    return _lib._objc_msgSend_575(
+        _id,
+        _lib._sel_replaceValueAtIndex_inPropertyWithKey_withValue_1,
+        index,
+        key?._id ?? ffi.nullptr,
+        value._id);
+  }
+
+  void insertValue_inPropertyWithKey_(NSObject value, NSString? key) {
+    return _lib._objc_msgSend_122(
+        _id,
+        _lib._sel_insertValue_inPropertyWithKey_1,
+        value._id,
+        key?._id ?? ffi.nullptr);
+  }
+
+  NSObject coerceValue_forKey_(NSObject value, NSString? key) {
+    final _ret = _lib._objc_msgSend_272(_id, _lib._sel_coerceValue_forKey_1,
+        value._id, key?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSScriptObjectSpecifier? get objectSpecifier {
+    final _ret = _lib._objc_msgSend_556(_id, _lib._sel_objectSpecifier1);
+    return _ret.address == 0
+        ? null
+        : NSScriptObjectSpecifier._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray indicesOfObjectsByEvaluatingObjectSpecifier_(
+      NSScriptObjectSpecifier? specifier) {
+    final _ret = _lib._objc_msgSend_576(
+        _id,
+        _lib._sel_indicesOfObjectsByEvaluatingObjectSpecifier_1,
+        specifier?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool isEqualTo_(NSObject object) {
+    return _lib._objc_msgSend_0(_id, _lib._sel_isEqualTo_1, object._id);
+  }
+
+  bool isLessThanOrEqualTo_(NSObject object) {
+    return _lib._objc_msgSend_0(
+        _id, _lib._sel_isLessThanOrEqualTo_1, object._id);
+  }
+
+  bool isLessThan_(NSObject object) {
+    return _lib._objc_msgSend_0(_id, _lib._sel_isLessThan_1, object._id);
+  }
+
+  bool isGreaterThanOrEqualTo_(NSObject object) {
+    return _lib._objc_msgSend_0(
+        _id, _lib._sel_isGreaterThanOrEqualTo_1, object._id);
+  }
+
+  bool isGreaterThan_(NSObject object) {
+    return _lib._objc_msgSend_0(_id, _lib._sel_isGreaterThan_1, object._id);
+  }
+
+  bool isNotEqualTo_(NSObject object) {
+    return _lib._objc_msgSend_0(_id, _lib._sel_isNotEqualTo_1, object._id);
+  }
+
+  bool doesContain_(NSObject object) {
+    return _lib._objc_msgSend_0(_id, _lib._sel_doesContain_1, object._id);
+  }
+
+  bool isLike_(NSString? object) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_isLike_1, object?._id ?? ffi.nullptr);
+  }
+
+  bool isCaseInsensitiveLike_(NSString? object) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_isCaseInsensitiveLike_1, object?._id ?? ffi.nullptr);
+  }
+
+  bool scriptingIsEqualTo_(NSObject object) {
+    return _lib._objc_msgSend_0(
+        _id, _lib._sel_scriptingIsEqualTo_1, object._id);
+  }
+
+  bool scriptingIsLessThanOrEqualTo_(NSObject object) {
+    return _lib._objc_msgSend_0(
+        _id, _lib._sel_scriptingIsLessThanOrEqualTo_1, object._id);
+  }
+
+  bool scriptingIsLessThan_(NSObject object) {
+    return _lib._objc_msgSend_0(
+        _id, _lib._sel_scriptingIsLessThan_1, object._id);
+  }
+
+  bool scriptingIsGreaterThanOrEqualTo_(NSObject object) {
+    return _lib._objc_msgSend_0(
+        _id, _lib._sel_scriptingIsGreaterThanOrEqualTo_1, object._id);
+  }
+
+  bool scriptingIsGreaterThan_(NSObject object) {
+    return _lib._objc_msgSend_0(
+        _id, _lib._sel_scriptingIsGreaterThan_1, object._id);
+  }
+
+  bool scriptingBeginsWith_(NSObject object) {
+    return _lib._objc_msgSend_0(
+        _id, _lib._sel_scriptingBeginsWith_1, object._id);
+  }
+
+  bool scriptingEndsWith_(NSObject object) {
+    return _lib._objc_msgSend_0(_id, _lib._sel_scriptingEndsWith_1, object._id);
+  }
+
+  bool scriptingContains_(NSObject object) {
+    return _lib._objc_msgSend_0(_id, _lib._sel_scriptingContains_1, object._id);
+  }
+}
+
+class ObjCSel extends ffi.Opaque {}
+
+class ObjCObject extends ffi.Opaque {}
+
+typedef instancetype = ffi.Pointer<ObjCObject>;
+
+class _NSZone extends ffi.Opaque {}
+
+class Protocol extends _ObjCWrapper {
+  Protocol._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [Protocol] that points to the same underlying object as [other].
+  static Protocol castFrom<T extends _ObjCWrapper>(T other) {
+    return Protocol._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [Protocol] that wraps the given raw object pointer.
+  static Protocol castFromPointer(AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return Protocol._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [Protocol].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_Protocol1);
+  }
+}
+
+typedef IMP = ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>;
+
+class NSInvocation extends NSObject {
+  NSInvocation._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSInvocation] that points to the same underlying object as [other].
+  static NSInvocation castFrom<T extends _ObjCWrapper>(T other) {
+    return NSInvocation._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSInvocation] that wraps the given raw object pointer.
+  static NSInvocation castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSInvocation._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSInvocation].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSInvocation1);
+  }
+
+  static NSInvocation invocationWithMethodSignature_(
+      AVFAudio _lib, NSMethodSignature? sig) {
+    final _ret = _lib._objc_msgSend_366(_lib._class_NSInvocation1,
+        _lib._sel_invocationWithMethodSignature_1, sig?._id ?? ffi.nullptr);
+    return NSInvocation._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSMethodSignature? get methodSignature {
+    final _ret = _lib._objc_msgSend_367(_id, _lib._sel_methodSignature1);
+    return _ret.address == 0
+        ? null
+        : NSMethodSignature._(_ret, _lib, retain: true, release: true);
+  }
+
+  void retainArguments() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_retainArguments1);
+  }
+
+  bool get argumentsRetained {
+    return _lib._objc_msgSend_12(_id, _lib._sel_argumentsRetained1);
+  }
+
+  NSObject get target {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_target1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  set target(NSObject value) {
+    _lib._objc_msgSend_368(_id, _lib._sel_setTarget_1, value._id);
+  }
+
+  ffi.Pointer<ObjCSel> get selector {
+    return _lib._objc_msgSend_369(_id, _lib._sel_selector1);
+  }
+
+  set selector(ffi.Pointer<ObjCSel> value) {
+    _lib._objc_msgSend_370(_id, _lib._sel_setSelector_1, value);
+  }
+
+  void getReturnValue_(ffi.Pointer<ffi.Void> retLoc) {
+    return _lib._objc_msgSend_47(_id, _lib._sel_getReturnValue_1, retLoc);
+  }
+
+  void setReturnValue_(ffi.Pointer<ffi.Void> retLoc) {
+    return _lib._objc_msgSend_47(_id, _lib._sel_setReturnValue_1, retLoc);
+  }
+
+  void getArgument_atIndex_(ffi.Pointer<ffi.Void> argumentLocation, int idx) {
+    return _lib._objc_msgSend_371(
+        _id, _lib._sel_getArgument_atIndex_1, argumentLocation, idx);
+  }
+
+  void setArgument_atIndex_(ffi.Pointer<ffi.Void> argumentLocation, int idx) {
+    return _lib._objc_msgSend_371(
+        _id, _lib._sel_setArgument_atIndex_1, argumentLocation, idx);
+  }
+
+  void invoke() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_invoke1);
+  }
+
+  void invokeWithTarget_(NSObject target) {
+    return _lib._objc_msgSend_15(_id, _lib._sel_invokeWithTarget_1, target._id);
+  }
+
+  static NSInvocation new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSInvocation1, _lib._sel_new1);
+    return NSInvocation._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSInvocation alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSInvocation1, _lib._sel_alloc1);
+    return NSInvocation._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSInvocation1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSInvocation1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSInvocation1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSInvocation1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSInvocation1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSInvocation1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSInvocation1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSInvocation1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSInvocation1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSMethodSignature extends NSObject {
+  NSMethodSignature._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSMethodSignature] that points to the same underlying object as [other].
+  static NSMethodSignature castFrom<T extends _ObjCWrapper>(T other) {
+    return NSMethodSignature._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSMethodSignature] that wraps the given raw object pointer.
+  static NSMethodSignature castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSMethodSignature._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSMethodSignature].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSMethodSignature1);
+  }
+
+  static NSMethodSignature signatureWithObjCTypes_(
+      AVFAudio _lib, ffi.Pointer<ffi.Char> types) {
+    final _ret = _lib._objc_msgSend_9(_lib._class_NSMethodSignature1,
+        _lib._sel_signatureWithObjCTypes_1, types);
+    return NSMethodSignature._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get numberOfArguments {
+    return _lib._objc_msgSend_10(_id, _lib._sel_numberOfArguments1);
+  }
+
+  ffi.Pointer<ffi.Char> getArgumentTypeAtIndex_(int idx) {
+    return _lib._objc_msgSend_11(_id, _lib._sel_getArgumentTypeAtIndex_1, idx);
+  }
+
+  int get frameLength {
+    return _lib._objc_msgSend_10(_id, _lib._sel_frameLength1);
+  }
+
+  bool isOneway() {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isOneway1);
+  }
+
+  ffi.Pointer<ffi.Char> get methodReturnType {
+    return _lib._objc_msgSend_13(_id, _lib._sel_methodReturnType1);
+  }
+
+  int get methodReturnLength {
+    return _lib._objc_msgSend_10(_id, _lib._sel_methodReturnLength1);
+  }
+
+  static NSMethodSignature new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMethodSignature1, _lib._sel_new1);
+    return NSMethodSignature._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSMethodSignature alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMethodSignature1, _lib._sel_alloc1);
+    return NSMethodSignature._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSMethodSignature1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSMethodSignature1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSMethodSignature1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSMethodSignature1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSMethodSignature1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSMethodSignature1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSMethodSignature1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSMethodSignature1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSMethodSignature1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef NSUInteger = ffi.UnsignedLong;
+
+class NSSet extends NSObject {
+  NSSet._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSSet] that points to the same underlying object as [other].
+  static NSSet castFrom<T extends _ObjCWrapper>(T other) {
+    return NSSet._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSSet] that wraps the given raw object pointer.
+  static NSSet castFromPointer(AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSSet._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSSet].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSSet1);
+  }
+
+  int get count {
+    return _lib._objc_msgSend_10(_id, _lib._sel_count1);
+  }
+
+  NSObject member_(NSObject object) {
+    final _ret = _lib._objc_msgSend_16(_id, _lib._sel_member_1, object._id);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSEnumerator objectEnumerator() {
+    final _ret = _lib._objc_msgSend_72(_id, _lib._sel_objectEnumerator1);
+    return NSEnumerator._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSSet init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSSet initWithObjects_count_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> objects, int cnt) {
+    final _ret = _lib._objc_msgSend_61(
+        _id, _lib._sel_initWithObjects_count_1, objects, cnt);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSSet initWithCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get allObjects {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_allObjects1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject anyObject() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_anyObject1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool containsObject_(NSObject anObject) {
+    return _lib._objc_msgSend_0(_id, _lib._sel_containsObject_1, anObject._id);
+  }
+
+  NSString? get description {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_description1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString descriptionWithLocale_(NSObject locale) {
+    final _ret = _lib._objc_msgSend_65(
+        _id, _lib._sel_descriptionWithLocale_1, locale._id);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool intersectsSet_(NSSet? otherSet) {
+    return _lib._objc_msgSend_355(
+        _id, _lib._sel_intersectsSet_1, otherSet?._id ?? ffi.nullptr);
+  }
+
+  bool isEqualToSet_(NSSet? otherSet) {
+    return _lib._objc_msgSend_355(
+        _id, _lib._sel_isEqualToSet_1, otherSet?._id ?? ffi.nullptr);
+  }
+
+  bool isSubsetOfSet_(NSSet? otherSet) {
+    return _lib._objc_msgSend_355(
+        _id, _lib._sel_isSubsetOfSet_1, otherSet?._id ?? ffi.nullptr);
+  }
+
+  void makeObjectsPerformSelector_(ffi.Pointer<ObjCSel> aSelector) {
+    return _lib._objc_msgSend_7(
+        _id, _lib._sel_makeObjectsPerformSelector_1, aSelector);
+  }
+
+  void makeObjectsPerformSelector_withObject_(
+      ffi.Pointer<ObjCSel> aSelector, NSObject argument) {
+    return _lib._objc_msgSend_82(
+        _id,
+        _lib._sel_makeObjectsPerformSelector_withObject_1,
+        aSelector,
+        argument._id);
+  }
+
+  NSSet setByAddingObject_(NSObject anObject) {
+    final _ret = _lib._objc_msgSend_356(
+        _id, _lib._sel_setByAddingObject_1, anObject._id);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSSet setByAddingObjectsFromSet_(NSSet? other) {
+    final _ret = _lib._objc_msgSend_357(
+        _id, _lib._sel_setByAddingObjectsFromSet_1, other?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSSet setByAddingObjectsFromArray_(NSArray? other) {
+    final _ret = _lib._objc_msgSend_358(_id,
+        _lib._sel_setByAddingObjectsFromArray_1, other?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  void enumerateObjectsUsingBlock_(ObjCBlock13 block) {
+    return _lib._objc_msgSend_359(
+        _id, _lib._sel_enumerateObjectsUsingBlock_1, block._id);
+  }
+
+  void enumerateObjectsWithOptions_usingBlock_(int opts, ObjCBlock13 block) {
+    return _lib._objc_msgSend_360(_id,
+        _lib._sel_enumerateObjectsWithOptions_usingBlock_1, opts, block._id);
+  }
+
+  NSSet objectsPassingTest_(ObjCBlock14 predicate) {
+    final _ret = _lib._objc_msgSend_361(
+        _id, _lib._sel_objectsPassingTest_1, predicate._id);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSSet objectsWithOptions_passingTest_(int opts, ObjCBlock14 predicate) {
+    final _ret = _lib._objc_msgSend_362(
+        _id, _lib._sel_objectsWithOptions_passingTest_1, opts, predicate._id);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSSet set1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSSet1, _lib._sel_set1);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSSet setWithObject_(AVFAudio _lib, NSObject object) {
+    final _ret = _lib._objc_msgSend_16(
+        _lib._class_NSSet1, _lib._sel_setWithObject_1, object._id);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSSet setWithObjects_count_(
+      AVFAudio _lib, ffi.Pointer<ffi.Pointer<ObjCObject>> objects, int cnt) {
+    final _ret = _lib._objc_msgSend_61(
+        _lib._class_NSSet1, _lib._sel_setWithObjects_count_1, objects, cnt);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSSet setWithObjects_(AVFAudio _lib, NSObject firstObj) {
+    final _ret = _lib._objc_msgSend_16(
+        _lib._class_NSSet1, _lib._sel_setWithObjects_1, firstObj._id);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSSet setWithSet_(AVFAudio _lib, NSSet? set) {
+    final _ret = _lib._objc_msgSend_363(
+        _lib._class_NSSet1, _lib._sel_setWithSet_1, set?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSSet setWithArray_(AVFAudio _lib, NSArray? array) {
+    final _ret = _lib._objc_msgSend_67(_lib._class_NSSet1,
+        _lib._sel_setWithArray_1, array?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSSet initWithObjects_(NSObject firstObj) {
+    final _ret =
+        _lib._objc_msgSend_16(_id, _lib._sel_initWithObjects_1, firstObj._id);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSSet initWithSet_(NSSet? set) {
+    final _ret = _lib._objc_msgSend_363(
+        _id, _lib._sel_initWithSet_1, set?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSSet initWithSet_copyItems_(NSSet? set, bool flag) {
+    final _ret = _lib._objc_msgSend_364(
+        _id, _lib._sel_initWithSet_copyItems_1, set?._id ?? ffi.nullptr, flag);
+    return NSSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSSet initWithArray_(NSArray? array) {
+    final _ret = _lib._objc_msgSend_67(
+        _id, _lib._sel_initWithArray_1, array?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSObject valueForKey_(NSString? key) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_valueForKey_1, key?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  void setValue_forKey_(NSObject value, NSString? key) {
+    return _lib._objc_msgSend_122(
+        _id, _lib._sel_setValue_forKey_1, value._id, key?._id ?? ffi.nullptr);
+  }
+
+  @override
+  void addObserver_forKeyPath_options_context_(NSObject? observer,
+      NSString? keyPath, int options, ffi.Pointer<ffi.Void> context) {
+    return _lib._objc_msgSend_126(
+        _id,
+        _lib._sel_addObserver_forKeyPath_options_context_1,
+        observer?._id ?? ffi.nullptr,
+        keyPath?._id ?? ffi.nullptr,
+        options,
+        context);
+  }
+
+  @override
+  void removeObserver_forKeyPath_context_(
+      NSObject? observer, NSString? keyPath, ffi.Pointer<ffi.Void> context) {
+    return _lib._objc_msgSend_127(
+        _id,
+        _lib._sel_removeObserver_forKeyPath_context_1,
+        observer?._id ?? ffi.nullptr,
+        keyPath?._id ?? ffi.nullptr,
+        context);
+  }
+
+  @override
+  void removeObserver_forKeyPath_(NSObject? observer, NSString? keyPath) {
+    return _lib._objc_msgSend_128(_id, _lib._sel_removeObserver_forKeyPath_1,
+        observer?._id ?? ffi.nullptr, keyPath?._id ?? ffi.nullptr);
+  }
+
+  NSArray sortedArrayUsingDescriptors_(NSArray? sortDescriptors) {
+    final _ret = _lib._objc_msgSend_63(
+        _id,
+        _lib._sel_sortedArrayUsingDescriptors_1,
+        sortDescriptors?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSSet filteredSetUsingPredicate_(NSPredicate? predicate) {
+    final _ret = _lib._objc_msgSend_365(_id,
+        _lib._sel_filteredSetUsingPredicate_1, predicate?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSSet new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSSet1, _lib._sel_new1);
+    return NSSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSSet alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSSet1, _lib._sel_alloc1);
+    return NSSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSSet1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSSet1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSSet1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSSet1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSSet1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSSet1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSSet1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSSet1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSSet1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSEnumerator extends NSObject {
+  NSEnumerator._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSEnumerator] that points to the same underlying object as [other].
+  static NSEnumerator castFrom<T extends _ObjCWrapper>(T other) {
+    return NSEnumerator._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSEnumerator] that wraps the given raw object pointer.
+  static NSEnumerator castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSEnumerator._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSEnumerator].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSEnumerator1);
+  }
+
+  NSObject nextObject() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_nextObject1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSEnumerator new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSEnumerator1, _lib._sel_new1);
+    return NSEnumerator._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSEnumerator alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSEnumerator1, _lib._sel_alloc1);
+    return NSEnumerator._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSEnumerator1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSEnumerator1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSEnumerator1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSEnumerator1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSEnumerator1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSEnumerator1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSEnumerator1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSEnumerator1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSEnumerator1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSString extends NSObject {
+  NSString._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSString] that points to the same underlying object as [other].
+  static NSString castFrom<T extends _ObjCWrapper>(T other) {
+    return NSString._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSString] that wraps the given raw object pointer.
+  static NSString castFromPointer(AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSString._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSString].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSString1);
+  }
+
+  factory NSString(AVFAudio _lib, String str) {
+    final cstr = str.toNativeUtf8();
+    final nsstr = stringWithCString_encoding_(_lib, cstr.cast(), 4 /* UTF8 */);
+    pkg_ffi.calloc.free(cstr);
+    return nsstr;
+  }
+
+  @override
+  String toString() => (UTF8String).cast<pkg_ffi.Utf8>().toDartString();
+  int get length {
+    return _lib._objc_msgSend_10(_id, _lib._sel_length1);
+  }
+
+  int characterAtIndex_(int index) {
+    return _lib._objc_msgSend_17(_id, _lib._sel_characterAtIndex_1, index);
+  }
+
+  @override
+  NSString init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString initWithCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString substringFromIndex_(int from) {
+    final _ret =
+        _lib._objc_msgSend_293(_id, _lib._sel_substringFromIndex_1, from);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString substringToIndex_(int to) {
+    final _ret = _lib._objc_msgSend_293(_id, _lib._sel_substringToIndex_1, to);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString substringWithRange_(NSRange range) {
+    final _ret =
+        _lib._objc_msgSend_294(_id, _lib._sel_substringWithRange_1, range);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  void getCharacters_range_(ffi.Pointer<unichar> buffer, NSRange range) {
+    return _lib._objc_msgSend_295(
+        _id, _lib._sel_getCharacters_range_1, buffer, range);
+  }
+
+  int compare_(NSString? string) {
+    return _lib._objc_msgSend_296(
+        _id, _lib._sel_compare_1, string?._id ?? ffi.nullptr);
+  }
+
+  int compare_options_(NSString? string, int mask) {
+    return _lib._objc_msgSend_297(
+        _id, _lib._sel_compare_options_1, string?._id ?? ffi.nullptr, mask);
+  }
+
+  int compare_options_range_(
+      NSString? string, int mask, NSRange rangeOfReceiverToCompare) {
+    return _lib._objc_msgSend_298(_id, _lib._sel_compare_options_range_1,
+        string?._id ?? ffi.nullptr, mask, rangeOfReceiverToCompare);
+  }
+
+  int compare_options_range_locale_(NSString? string, int mask,
+      NSRange rangeOfReceiverToCompare, NSObject locale) {
+    return _lib._objc_msgSend_299(_id, _lib._sel_compare_options_range_locale_1,
+        string?._id ?? ffi.nullptr, mask, rangeOfReceiverToCompare, locale._id);
+  }
+
+  int caseInsensitiveCompare_(NSString? string) {
+    return _lib._objc_msgSend_296(
+        _id, _lib._sel_caseInsensitiveCompare_1, string?._id ?? ffi.nullptr);
+  }
+
+  int localizedCompare_(NSString? string) {
+    return _lib._objc_msgSend_296(
+        _id, _lib._sel_localizedCompare_1, string?._id ?? ffi.nullptr);
+  }
+
+  int localizedCaseInsensitiveCompare_(NSString? string) {
+    return _lib._objc_msgSend_296(
+        _id,
+        _lib._sel_localizedCaseInsensitiveCompare_1,
+        string?._id ?? ffi.nullptr);
+  }
+
+  int localizedStandardCompare_(NSString? string) {
+    return _lib._objc_msgSend_296(
+        _id, _lib._sel_localizedStandardCompare_1, string?._id ?? ffi.nullptr);
+  }
+
+  bool isEqualToString_(NSString? aString) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_isEqualToString_1, aString?._id ?? ffi.nullptr);
+  }
+
+  bool hasPrefix_(NSString? str) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_hasPrefix_1, str?._id ?? ffi.nullptr);
+  }
+
+  bool hasSuffix_(NSString? str) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_hasSuffix_1, str?._id ?? ffi.nullptr);
+  }
+
+  NSString commonPrefixWithString_options_(NSString? str, int mask) {
+    final _ret = _lib._objc_msgSend_300(
+        _id,
+        _lib._sel_commonPrefixWithString_options_1,
+        str?._id ?? ffi.nullptr,
+        mask);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool containsString_(NSString? str) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_containsString_1, str?._id ?? ffi.nullptr);
+  }
+
+  bool localizedCaseInsensitiveContainsString_(NSString? str) {
+    return _lib._objc_msgSend_59(
+        _id,
+        _lib._sel_localizedCaseInsensitiveContainsString_1,
+        str?._id ?? ffi.nullptr);
+  }
+
+  bool localizedStandardContainsString_(NSString? str) {
+    return _lib._objc_msgSend_59(_id,
+        _lib._sel_localizedStandardContainsString_1, str?._id ?? ffi.nullptr);
+  }
+
+  NSRange localizedStandardRangeOfString_(NSString? str) {
+    return _lib._objc_msgSend_301(_id,
+        _lib._sel_localizedStandardRangeOfString_1, str?._id ?? ffi.nullptr);
+  }
+
+  NSRange rangeOfString_(NSString? searchString) {
+    return _lib._objc_msgSend_301(
+        _id, _lib._sel_rangeOfString_1, searchString?._id ?? ffi.nullptr);
+  }
+
+  NSRange rangeOfString_options_(NSString? searchString, int mask) {
+    return _lib._objc_msgSend_302(_id, _lib._sel_rangeOfString_options_1,
+        searchString?._id ?? ffi.nullptr, mask);
+  }
+
+  NSRange rangeOfString_options_range_(
+      NSString? searchString, int mask, NSRange rangeOfReceiverToSearch) {
+    return _lib._objc_msgSend_303(_id, _lib._sel_rangeOfString_options_range_1,
+        searchString?._id ?? ffi.nullptr, mask, rangeOfReceiverToSearch);
+  }
+
+  NSRange rangeOfString_options_range_locale_(NSString? searchString, int mask,
+      NSRange rangeOfReceiverToSearch, NSLocale? locale) {
+    return _lib._objc_msgSend_304(
+        _id,
+        _lib._sel_rangeOfString_options_range_locale_1,
+        searchString?._id ?? ffi.nullptr,
+        mask,
+        rangeOfReceiverToSearch,
+        locale?._id ?? ffi.nullptr);
+  }
+
+  NSRange rangeOfCharacterFromSet_(NSCharacterSet? searchSet) {
+    return _lib._objc_msgSend_305(_id, _lib._sel_rangeOfCharacterFromSet_1,
+        searchSet?._id ?? ffi.nullptr);
+  }
+
+  NSRange rangeOfCharacterFromSet_options_(
+      NSCharacterSet? searchSet, int mask) {
+    return _lib._objc_msgSend_306(
+        _id,
+        _lib._sel_rangeOfCharacterFromSet_options_1,
+        searchSet?._id ?? ffi.nullptr,
+        mask);
+  }
+
+  NSRange rangeOfCharacterFromSet_options_range_(
+      NSCharacterSet? searchSet, int mask, NSRange rangeOfReceiverToSearch) {
+    return _lib._objc_msgSend_307(
+        _id,
+        _lib._sel_rangeOfCharacterFromSet_options_range_1,
+        searchSet?._id ?? ffi.nullptr,
+        mask,
+        rangeOfReceiverToSearch);
+  }
+
+  NSRange rangeOfComposedCharacterSequenceAtIndex_(int index) {
+    return _lib._objc_msgSend_308(
+        _id, _lib._sel_rangeOfComposedCharacterSequenceAtIndex_1, index);
+  }
+
+  NSRange rangeOfComposedCharacterSequencesForRange_(NSRange range) {
+    return _lib._objc_msgSend_309(
+        _id, _lib._sel_rangeOfComposedCharacterSequencesForRange_1, range);
+  }
+
+  NSString stringByAppendingString_(NSString? aString) {
+    final _ret = _lib._objc_msgSend_64(
+        _id, _lib._sel_stringByAppendingString_1, aString?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString stringByAppendingFormat_(NSString? format) {
+    final _ret = _lib._objc_msgSend_64(
+        _id, _lib._sel_stringByAppendingFormat_1, format?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  double get doubleValue {
+    return _lib._objc_msgSend_149(_id, _lib._sel_doubleValue1);
+  }
+
+  double get floatValue {
+    return _lib._objc_msgSend_215(_id, _lib._sel_floatValue1);
+  }
+
+  int get intValue {
+    return _lib._objc_msgSend_213(_id, _lib._sel_intValue1);
+  }
+
+  int get integerValue {
+    return _lib._objc_msgSend_78(_id, _lib._sel_integerValue1);
+  }
+
+  int get longLongValue {
+    return _lib._objc_msgSend_214(_id, _lib._sel_longLongValue1);
+  }
+
+  bool get boolValue {
+    return _lib._objc_msgSend_12(_id, _lib._sel_boolValue1);
+  }
+
+  NSString? get uppercaseString {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_uppercaseString1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get lowercaseString {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_lowercaseString1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get capitalizedString {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_capitalizedString1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get localizedUppercaseString {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_localizedUppercaseString1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get localizedLowercaseString {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_localizedLowercaseString1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get localizedCapitalizedString {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_localizedCapitalizedString1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString uppercaseStringWithLocale_(NSLocale? locale) {
+    final _ret = _lib._objc_msgSend_310(
+        _id, _lib._sel_uppercaseStringWithLocale_1, locale?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString lowercaseStringWithLocale_(NSLocale? locale) {
+    final _ret = _lib._objc_msgSend_310(
+        _id, _lib._sel_lowercaseStringWithLocale_1, locale?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString capitalizedStringWithLocale_(NSLocale? locale) {
+    final _ret = _lib._objc_msgSend_310(_id,
+        _lib._sel_capitalizedStringWithLocale_1, locale?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  void getLineStart_end_contentsEnd_forRange_(
+      ffi.Pointer<NSUInteger> startPtr,
+      ffi.Pointer<NSUInteger> lineEndPtr,
+      ffi.Pointer<NSUInteger> contentsEndPtr,
+      NSRange range) {
+    return _lib._objc_msgSend_311(
+        _id,
+        _lib._sel_getLineStart_end_contentsEnd_forRange_1,
+        startPtr,
+        lineEndPtr,
+        contentsEndPtr,
+        range);
+  }
+
+  NSRange lineRangeForRange_(NSRange range) {
+    return _lib._objc_msgSend_309(_id, _lib._sel_lineRangeForRange_1, range);
+  }
+
+  void getParagraphStart_end_contentsEnd_forRange_(
+      ffi.Pointer<NSUInteger> startPtr,
+      ffi.Pointer<NSUInteger> parEndPtr,
+      ffi.Pointer<NSUInteger> contentsEndPtr,
+      NSRange range) {
+    return _lib._objc_msgSend_311(
+        _id,
+        _lib._sel_getParagraphStart_end_contentsEnd_forRange_1,
+        startPtr,
+        parEndPtr,
+        contentsEndPtr,
+        range);
+  }
+
+  NSRange paragraphRangeForRange_(NSRange range) {
+    return _lib._objc_msgSend_309(
+        _id, _lib._sel_paragraphRangeForRange_1, range);
+  }
+
+  void enumerateSubstringsInRange_options_usingBlock_(
+      NSRange range, int opts, ObjCBlock10 block) {
+    return _lib._objc_msgSend_312(
+        _id,
+        _lib._sel_enumerateSubstringsInRange_options_usingBlock_1,
+        range,
+        opts,
+        block._id);
+  }
+
+  void enumerateLinesUsingBlock_(ObjCBlock11 block) {
+    return _lib._objc_msgSend_313(
+        _id, _lib._sel_enumerateLinesUsingBlock_1, block._id);
+  }
+
+  ffi.Pointer<ffi.Char> get UTF8String {
+    return _lib._objc_msgSend_13(_id, _lib._sel_UTF8String1);
+  }
+
+  int get fastestEncoding {
+    return _lib._objc_msgSend_10(_id, _lib._sel_fastestEncoding1);
+  }
+
+  int get smallestEncoding {
+    return _lib._objc_msgSend_10(_id, _lib._sel_smallestEncoding1);
+  }
+
+  NSData dataUsingEncoding_allowLossyConversion_(int encoding, bool lossy) {
+    final _ret = _lib._objc_msgSend_314(_id,
+        _lib._sel_dataUsingEncoding_allowLossyConversion_1, encoding, lossy);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData dataUsingEncoding_(int encoding) {
+    final _ret =
+        _lib._objc_msgSend_315(_id, _lib._sel_dataUsingEncoding_1, encoding);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool canBeConvertedToEncoding_(int encoding) {
+    return _lib._objc_msgSend_89(
+        _id, _lib._sel_canBeConvertedToEncoding_1, encoding);
+  }
+
+  ffi.Pointer<ffi.Char> cStringUsingEncoding_(int encoding) {
+    return _lib._objc_msgSend_11(
+        _id, _lib._sel_cStringUsingEncoding_1, encoding);
+  }
+
+  bool getCString_maxLength_encoding_(
+      ffi.Pointer<ffi.Char> buffer, int maxBufferCount, int encoding) {
+    return _lib._objc_msgSend_316(
+        _id,
+        _lib._sel_getCString_maxLength_encoding_1,
+        buffer,
+        maxBufferCount,
+        encoding);
+  }
+
+  bool getBytes_maxLength_usedLength_encoding_options_range_remainingRange_(
+      ffi.Pointer<ffi.Void> buffer,
+      int maxBufferCount,
+      ffi.Pointer<NSUInteger> usedBufferCount,
+      int encoding,
+      int options,
+      NSRange range,
+      NSRangePointer leftover) {
+    return _lib._objc_msgSend_317(
+        _id,
+        _lib._sel_getBytes_maxLength_usedLength_encoding_options_range_remainingRange_1,
+        buffer,
+        maxBufferCount,
+        usedBufferCount,
+        encoding,
+        options,
+        range,
+        leftover);
+  }
+
+  int maximumLengthOfBytesUsingEncoding_(int enc) {
+    return _lib._objc_msgSend_86(
+        _id, _lib._sel_maximumLengthOfBytesUsingEncoding_1, enc);
+  }
+
+  int lengthOfBytesUsingEncoding_(int enc) {
+    return _lib._objc_msgSend_86(
+        _id, _lib._sel_lengthOfBytesUsingEncoding_1, enc);
+  }
+
+  static ffi.Pointer<NSStringEncoding> getAvailableStringEncodings(
+      AVFAudio _lib) {
+    return _lib._objc_msgSend_318(
+        _lib._class_NSString1, _lib._sel_availableStringEncodings1);
+  }
+
+  static NSString localizedNameOfStringEncoding_(AVFAudio _lib, int encoding) {
+    final _ret = _lib._objc_msgSend_293(_lib._class_NSString1,
+        _lib._sel_localizedNameOfStringEncoding_1, encoding);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static int getDefaultCStringEncoding(AVFAudio _lib) {
+    return _lib._objc_msgSend_10(
+        _lib._class_NSString1, _lib._sel_defaultCStringEncoding1);
+  }
+
+  NSString? get decomposedStringWithCanonicalMapping {
+    final _ret = _lib._objc_msgSend_20(
+        _id, _lib._sel_decomposedStringWithCanonicalMapping1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get precomposedStringWithCanonicalMapping {
+    final _ret = _lib._objc_msgSend_20(
+        _id, _lib._sel_precomposedStringWithCanonicalMapping1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get decomposedStringWithCompatibilityMapping {
+    final _ret = _lib._objc_msgSend_20(
+        _id, _lib._sel_decomposedStringWithCompatibilityMapping1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get precomposedStringWithCompatibilityMapping {
+    final _ret = _lib._objc_msgSend_20(
+        _id, _lib._sel_precomposedStringWithCompatibilityMapping1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray componentsSeparatedByString_(NSString? separator) {
+    final _ret = _lib._objc_msgSend_119(_id,
+        _lib._sel_componentsSeparatedByString_1, separator?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray componentsSeparatedByCharactersInSet_(NSCharacterSet? separator) {
+    final _ret = _lib._objc_msgSend_319(
+        _id,
+        _lib._sel_componentsSeparatedByCharactersInSet_1,
+        separator?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString stringByTrimmingCharactersInSet_(NSCharacterSet? set) {
+    final _ret = _lib._objc_msgSend_320(_id,
+        _lib._sel_stringByTrimmingCharactersInSet_1, set?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString stringByPaddingToLength_withString_startingAtIndex_(
+      int newLength, NSString? padString, int padIndex) {
+    final _ret = _lib._objc_msgSend_321(
+        _id,
+        _lib._sel_stringByPaddingToLength_withString_startingAtIndex_1,
+        newLength,
+        padString?._id ?? ffi.nullptr,
+        padIndex);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString stringByFoldingWithOptions_locale_(int options, NSLocale? locale) {
+    final _ret = _lib._objc_msgSend_322(
+        _id,
+        _lib._sel_stringByFoldingWithOptions_locale_1,
+        options,
+        locale?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString stringByReplacingOccurrencesOfString_withString_options_range_(
+      NSString? target,
+      NSString? replacement,
+      int options,
+      NSRange searchRange) {
+    final _ret = _lib._objc_msgSend_323(
+        _id,
+        _lib._sel_stringByReplacingOccurrencesOfString_withString_options_range_1,
+        target?._id ?? ffi.nullptr,
+        replacement?._id ?? ffi.nullptr,
+        options,
+        searchRange);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString stringByReplacingOccurrencesOfString_withString_(
+      NSString? target, NSString? replacement) {
+    final _ret = _lib._objc_msgSend_324(
+        _id,
+        _lib._sel_stringByReplacingOccurrencesOfString_withString_1,
+        target?._id ?? ffi.nullptr,
+        replacement?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString stringByReplacingCharactersInRange_withString_(
+      NSRange range, NSString? replacement) {
+    final _ret = _lib._objc_msgSend_325(
+        _id,
+        _lib._sel_stringByReplacingCharactersInRange_withString_1,
+        range,
+        replacement?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString stringByApplyingTransform_reverse_(
+      NSStringTransform transform, bool reverse) {
+    final _ret = _lib._objc_msgSend_326(
+        _id, _lib._sel_stringByApplyingTransform_reverse_1, transform, reverse);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool writeToURL_atomically_encoding_error_(NSURL? url, bool useAuxiliaryFile,
+      int enc, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_327(
+        _id,
+        _lib._sel_writeToURL_atomically_encoding_error_1,
+        url?._id ?? ffi.nullptr,
+        useAuxiliaryFile,
+        enc,
+        error);
+  }
+
+  bool writeToFile_atomically_encoding_error_(
+      NSString? path,
+      bool useAuxiliaryFile,
+      int enc,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_328(
+        _id,
+        _lib._sel_writeToFile_atomically_encoding_error_1,
+        path?._id ?? ffi.nullptr,
+        useAuxiliaryFile,
+        enc,
+        error);
+  }
+
+  NSString? get description {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_description1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get hash {
+    return _lib._objc_msgSend_10(_id, _lib._sel_hash1);
+  }
+
+  NSString initWithCharactersNoCopy_length_freeWhenDone_(
+      ffi.Pointer<unichar> characters, int length, bool freeBuffer) {
+    final _ret = _lib._objc_msgSend_329(
+        _id,
+        _lib._sel_initWithCharactersNoCopy_length_freeWhenDone_1,
+        characters,
+        length,
+        freeBuffer);
+    return NSString._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSString initWithCharactersNoCopy_length_deallocator_(
+      ffi.Pointer<unichar> chars, int len, ObjCBlock12 deallocator) {
+    final _ret = _lib._objc_msgSend_330(
+        _id,
+        _lib._sel_initWithCharactersNoCopy_length_deallocator_1,
+        chars,
+        len,
+        deallocator._id);
+    return NSString._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSString initWithCharacters_length_(
+      ffi.Pointer<unichar> characters, int length) {
+    final _ret = _lib._objc_msgSend_331(
+        _id, _lib._sel_initWithCharacters_length_1, characters, length);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString initWithUTF8String_(ffi.Pointer<ffi.Char> nullTerminatedCString) {
+    final _ret = _lib._objc_msgSend_332(
+        _id, _lib._sel_initWithUTF8String_1, nullTerminatedCString);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString initWithString_(NSString? aString) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initWithString_1, aString?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString initWithFormat_(NSString? format) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initWithFormat_1, format?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString initWithFormat_arguments_(
+      NSString? format, ffi.Pointer<__va_list_tag> argList) {
+    final _ret = _lib._objc_msgSend_333(
+        _id,
+        _lib._sel_initWithFormat_arguments_1,
+        format?._id ?? ffi.nullptr,
+        argList);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString initWithFormat_locale_(NSString? format, NSObject locale) {
+    final _ret = _lib._objc_msgSend_157(_id, _lib._sel_initWithFormat_locale_1,
+        format?._id ?? ffi.nullptr, locale._id);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString initWithFormat_locale_arguments_(
+      NSString? format, NSObject locale, ffi.Pointer<__va_list_tag> argList) {
+    final _ret = _lib._objc_msgSend_334(
+        _id,
+        _lib._sel_initWithFormat_locale_arguments_1,
+        format?._id ?? ffi.nullptr,
+        locale._id,
+        argList);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString initWithData_encoding_(NSData? data, int encoding) {
+    final _ret = _lib._objc_msgSend_335(_id, _lib._sel_initWithData_encoding_1,
+        data?._id ?? ffi.nullptr, encoding);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString initWithBytes_length_encoding_(
+      ffi.Pointer<ffi.Void> bytes, int len, int encoding) {
+    final _ret = _lib._objc_msgSend_336(
+        _id, _lib._sel_initWithBytes_length_encoding_1, bytes, len, encoding);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString initWithBytesNoCopy_length_encoding_freeWhenDone_(
+      ffi.Pointer<ffi.Void> bytes, int len, int encoding, bool freeBuffer) {
+    final _ret = _lib._objc_msgSend_337(
+        _id,
+        _lib._sel_initWithBytesNoCopy_length_encoding_freeWhenDone_1,
+        bytes,
+        len,
+        encoding,
+        freeBuffer);
+    return NSString._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSString initWithBytesNoCopy_length_encoding_deallocator_(
+      ffi.Pointer<ffi.Void> bytes,
+      int len,
+      int encoding,
+      ObjCBlock9 deallocator) {
+    final _ret = _lib._objc_msgSend_338(
+        _id,
+        _lib._sel_initWithBytesNoCopy_length_encoding_deallocator_1,
+        bytes,
+        len,
+        encoding,
+        deallocator._id);
+    return NSString._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSString string(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSString1, _lib._sel_string1);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString stringWithString_(AVFAudio _lib, NSString? string) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSString1,
+        _lib._sel_stringWithString_1, string?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString stringWithCharacters_length_(
+      AVFAudio _lib, ffi.Pointer<unichar> characters, int length) {
+    final _ret = _lib._objc_msgSend_331(_lib._class_NSString1,
+        _lib._sel_stringWithCharacters_length_1, characters, length);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString stringWithUTF8String_(
+      AVFAudio _lib, ffi.Pointer<ffi.Char> nullTerminatedCString) {
+    final _ret = _lib._objc_msgSend_332(_lib._class_NSString1,
+        _lib._sel_stringWithUTF8String_1, nullTerminatedCString);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString stringWithFormat_(AVFAudio _lib, NSString? format) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSString1,
+        _lib._sel_stringWithFormat_1, format?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString localizedStringWithFormat_(AVFAudio _lib, NSString? format) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSString1,
+        _lib._sel_localizedStringWithFormat_1, format?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString initWithCString_encoding_(
+      ffi.Pointer<ffi.Char> nullTerminatedCString, int encoding) {
+    final _ret = _lib._objc_msgSend_339(_id,
+        _lib._sel_initWithCString_encoding_1, nullTerminatedCString, encoding);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString stringWithCString_encoding_(
+      AVFAudio _lib, ffi.Pointer<ffi.Char> cString, int enc) {
+    final _ret = _lib._objc_msgSend_339(_lib._class_NSString1,
+        _lib._sel_stringWithCString_encoding_1, cString, enc);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString initWithContentsOfURL_encoding_error_(
+      NSURL? url, int enc, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_340(
+        _id,
+        _lib._sel_initWithContentsOfURL_encoding_error_1,
+        url?._id ?? ffi.nullptr,
+        enc,
+        error);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString initWithContentsOfFile_encoding_error_(
+      NSString? path, int enc, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_341(
+        _id,
+        _lib._sel_initWithContentsOfFile_encoding_error_1,
+        path?._id ?? ffi.nullptr,
+        enc,
+        error);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString stringWithContentsOfURL_encoding_error_(AVFAudio _lib,
+      NSURL? url, int enc, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_340(
+        _lib._class_NSString1,
+        _lib._sel_stringWithContentsOfURL_encoding_error_1,
+        url?._id ?? ffi.nullptr,
+        enc,
+        error);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString stringWithContentsOfFile_encoding_error_(AVFAudio _lib,
+      NSString? path, int enc, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_341(
+        _lib._class_NSString1,
+        _lib._sel_stringWithContentsOfFile_encoding_error_1,
+        path?._id ?? ffi.nullptr,
+        enc,
+        error);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString initWithContentsOfURL_usedEncoding_error_(
+      NSURL? url,
+      ffi.Pointer<NSStringEncoding> enc,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_342(
+        _id,
+        _lib._sel_initWithContentsOfURL_usedEncoding_error_1,
+        url?._id ?? ffi.nullptr,
+        enc,
+        error);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString initWithContentsOfFile_usedEncoding_error_(
+      NSString? path,
+      ffi.Pointer<NSStringEncoding> enc,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_343(
+        _id,
+        _lib._sel_initWithContentsOfFile_usedEncoding_error_1,
+        path?._id ?? ffi.nullptr,
+        enc,
+        error);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString stringWithContentsOfURL_usedEncoding_error_(
+      AVFAudio _lib,
+      NSURL? url,
+      ffi.Pointer<NSStringEncoding> enc,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_342(
+        _lib._class_NSString1,
+        _lib._sel_stringWithContentsOfURL_usedEncoding_error_1,
+        url?._id ?? ffi.nullptr,
+        enc,
+        error);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString stringWithContentsOfFile_usedEncoding_error_(
+      AVFAudio _lib,
+      NSString? path,
+      ffi.Pointer<NSStringEncoding> enc,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_343(
+        _lib._class_NSString1,
+        _lib._sel_stringWithContentsOfFile_usedEncoding_error_1,
+        path?._id ?? ffi.nullptr,
+        enc,
+        error);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static int
+      stringEncodingForData_encodingOptions_convertedString_usedLossyConversion_(
+          AVFAudio _lib,
+          NSData? data,
+          NSDictionary? opts,
+          ffi.Pointer<ffi.Pointer<ObjCObject>> string,
+          ffi.Pointer<ffi.Bool> usedLossyConversion) {
+    return _lib._objc_msgSend_344(
+        _lib._class_NSString1,
+        _lib._sel_stringEncodingForData_encodingOptions_convertedString_usedLossyConversion_1,
+        data?._id ?? ffi.nullptr,
+        opts?._id ?? ffi.nullptr,
+        string,
+        usedLossyConversion);
+  }
+
+  NSObject propertyList() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_propertyList1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary propertyListFromStringsFileFormat() {
+    final _ret = _lib._objc_msgSend_164(
+        _id, _lib._sel_propertyListFromStringsFileFormat1);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  ffi.Pointer<ffi.Char> cString() {
+    return _lib._objc_msgSend_13(_id, _lib._sel_cString1);
+  }
+
+  ffi.Pointer<ffi.Char> lossyCString() {
+    return _lib._objc_msgSend_13(_id, _lib._sel_lossyCString1);
+  }
+
+  int cStringLength() {
+    return _lib._objc_msgSend_10(_id, _lib._sel_cStringLength1);
+  }
+
+  void getCString_(ffi.Pointer<ffi.Char> bytes) {
+    return _lib._objc_msgSend_251(_id, _lib._sel_getCString_1, bytes);
+  }
+
+  void getCString_maxLength_(ffi.Pointer<ffi.Char> bytes, int maxLength) {
+    return _lib._objc_msgSend_345(
+        _id, _lib._sel_getCString_maxLength_1, bytes, maxLength);
+  }
+
+  void getCString_maxLength_range_remainingRange_(ffi.Pointer<ffi.Char> bytes,
+      int maxLength, NSRange aRange, NSRangePointer leftoverRange) {
+    return _lib._objc_msgSend_346(
+        _id,
+        _lib._sel_getCString_maxLength_range_remainingRange_1,
+        bytes,
+        maxLength,
+        aRange,
+        leftoverRange);
+  }
+
+  bool writeToFile_atomically_(NSString? path, bool useAuxiliaryFile) {
+    return _lib._objc_msgSend_25(_id, _lib._sel_writeToFile_atomically_1,
+        path?._id ?? ffi.nullptr, useAuxiliaryFile);
+  }
+
+  bool writeToURL_atomically_(NSURL? url, bool atomically) {
+    return _lib._objc_msgSend_121(_id, _lib._sel_writeToURL_atomically_1,
+        url?._id ?? ffi.nullptr, atomically);
+  }
+
+  NSObject initWithContentsOfFile_(NSString? path) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initWithContentsOfFile_1, path?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject initWithContentsOfURL_(NSURL? url) {
+    final _ret = _lib._objc_msgSend_226(
+        _id, _lib._sel_initWithContentsOfURL_1, url?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject stringWithContentsOfFile_(AVFAudio _lib, NSString? path) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSString1,
+        _lib._sel_stringWithContentsOfFile_1, path?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject stringWithContentsOfURL_(AVFAudio _lib, NSURL? url) {
+    final _ret = _lib._objc_msgSend_226(_lib._class_NSString1,
+        _lib._sel_stringWithContentsOfURL_1, url?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject initWithCStringNoCopy_length_freeWhenDone_(
+      ffi.Pointer<ffi.Char> bytes, int length, bool freeBuffer) {
+    final _ret = _lib._objc_msgSend_347(
+        _id,
+        _lib._sel_initWithCStringNoCopy_length_freeWhenDone_1,
+        bytes,
+        length,
+        freeBuffer);
+    return NSObject._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSObject initWithCString_length_(ffi.Pointer<ffi.Char> bytes, int length) {
+    final _ret = _lib._objc_msgSend_339(
+        _id, _lib._sel_initWithCString_length_1, bytes, length);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject initWithCString_(ffi.Pointer<ffi.Char> bytes) {
+    final _ret =
+        _lib._objc_msgSend_332(_id, _lib._sel_initWithCString_1, bytes);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject stringWithCString_length_(
+      AVFAudio _lib, ffi.Pointer<ffi.Char> bytes, int length) {
+    final _ret = _lib._objc_msgSend_339(_lib._class_NSString1,
+        _lib._sel_stringWithCString_length_1, bytes, length);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject stringWithCString_(
+      AVFAudio _lib, ffi.Pointer<ffi.Char> bytes) {
+    final _ret = _lib._objc_msgSend_332(
+        _lib._class_NSString1, _lib._sel_stringWithCString_1, bytes);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void getCharacters_(ffi.Pointer<unichar> buffer) {
+    return _lib._objc_msgSend_348(_id, _lib._sel_getCharacters_1, buffer);
+  }
+
+  NSString variantFittingPresentationWidth_(int width) {
+    final _ret = _lib._objc_msgSend_349(
+        _id, _lib._sel_variantFittingPresentationWidth_1, width);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString pathWithComponents_(AVFAudio _lib, NSArray? components) {
+    final _ret = _lib._objc_msgSend_350(_lib._class_NSString1,
+        _lib._sel_pathWithComponents_1, components?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get pathComponents {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_pathComponents1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool get absolutePath {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isAbsolutePath1);
+  }
+
+  NSString? get lastPathComponent {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_lastPathComponent1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get stringByDeletingLastPathComponent {
+    final _ret = _lib._objc_msgSend_20(
+        _id, _lib._sel_stringByDeletingLastPathComponent1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString stringByAppendingPathComponent_(NSString? str) {
+    final _ret = _lib._objc_msgSend_64(_id,
+        _lib._sel_stringByAppendingPathComponent_1, str?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get pathExtension {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_pathExtension1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get stringByDeletingPathExtension {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_stringByDeletingPathExtension1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString stringByAppendingPathExtension_(NSString? str) {
+    final _ret = _lib._objc_msgSend_64(_id,
+        _lib._sel_stringByAppendingPathExtension_1, str?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get stringByAbbreviatingWithTildeInPath {
+    final _ret = _lib._objc_msgSend_20(
+        _id, _lib._sel_stringByAbbreviatingWithTildeInPath1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get stringByExpandingTildeInPath {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_stringByExpandingTildeInPath1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get stringByStandardizingPath {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_stringByStandardizingPath1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get stringByResolvingSymlinksInPath {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_stringByResolvingSymlinksInPath1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray stringsByAppendingPaths_(NSArray? paths) {
+    final _ret = _lib._objc_msgSend_63(
+        _id, _lib._sel_stringsByAppendingPaths_1, paths?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  int completePathIntoString_caseSensitive_matchesIntoArray_filterTypes_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outputName,
+      bool flag,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outputArray,
+      NSArray? filterTypes) {
+    return _lib._objc_msgSend_351(
+        _id,
+        _lib._sel_completePathIntoString_caseSensitive_matchesIntoArray_filterTypes_1,
+        outputName,
+        flag,
+        outputArray,
+        filterTypes?._id ?? ffi.nullptr);
+  }
+
+  ffi.Pointer<ffi.Char> get fileSystemRepresentation {
+    return _lib._objc_msgSend_13(_id, _lib._sel_fileSystemRepresentation1);
+  }
+
+  bool getFileSystemRepresentation_maxLength_(
+      ffi.Pointer<ffi.Char> cname, int max) {
+    return _lib._objc_msgSend_218(
+        _id, _lib._sel_getFileSystemRepresentation_maxLength_1, cname, max);
+  }
+
+  NSString stringByAddingPercentEncodingWithAllowedCharacters_(
+      NSCharacterSet? allowedCharacters) {
+    final _ret = _lib._objc_msgSend_320(
+        _id,
+        _lib._sel_stringByAddingPercentEncodingWithAllowedCharacters_1,
+        allowedCharacters?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get stringByRemovingPercentEncoding {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_stringByRemovingPercentEncoding1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString stringByAddingPercentEscapesUsingEncoding_(int enc) {
+    final _ret = _lib._objc_msgSend_293(
+        _id, _lib._sel_stringByAddingPercentEscapesUsingEncoding_1, enc);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString stringByReplacingPercentEscapesUsingEncoding_(int enc) {
+    final _ret = _lib._objc_msgSend_293(
+        _id, _lib._sel_stringByReplacingPercentEscapesUsingEncoding_1, enc);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray linguisticTagsInRange_scheme_options_orthography_tokenRanges_(
+      NSRange range,
+      NSLinguisticTagScheme scheme,
+      int options,
+      NSOrthography? orthography,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> tokenRanges) {
+    final _ret = _lib._objc_msgSend_353(
+        _id,
+        _lib._sel_linguisticTagsInRange_scheme_options_orthography_tokenRanges_1,
+        range,
+        scheme,
+        options,
+        orthography?._id ?? ffi.nullptr,
+        tokenRanges);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  void enumerateLinguisticTagsInRange_scheme_options_orthography_usingBlock_(
+      NSRange range,
+      NSLinguisticTagScheme scheme,
+      int options,
+      NSOrthography? orthography,
+      ObjCBlock10 block) {
+    return _lib._objc_msgSend_354(
+        _id,
+        _lib._sel_enumerateLinguisticTagsInRange_scheme_options_orthography_usingBlock_1,
+        range,
+        scheme,
+        options,
+        orthography?._id ?? ffi.nullptr,
+        block._id);
+  }
+
+  static NSString new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSString1, _lib._sel_new1);
+    return NSString._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSString alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSString1, _lib._sel_alloc1);
+    return NSString._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSString1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSString1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSString1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSString1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSString1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSString1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSString1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSString1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSString1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+extension StringToNSString on String {
+  NSString toNSString(AVFAudio lib) => NSString(lib, this);
+}
+
+typedef unichar = ffi.UnsignedShort;
+
+class NSCoder extends NSObject {
+  NSCoder._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSCoder] that points to the same underlying object as [other].
+  static NSCoder castFrom<T extends _ObjCWrapper>(T other) {
+    return NSCoder._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSCoder] that wraps the given raw object pointer.
+  static NSCoder castFromPointer(AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSCoder._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSCoder].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSCoder1);
+  }
+
+  void encodeValueOfObjCType_at_(
+      ffi.Pointer<ffi.Char> type, ffi.Pointer<ffi.Void> addr) {
+    return _lib._objc_msgSend_18(
+        _id, _lib._sel_encodeValueOfObjCType_at_1, type, addr);
+  }
+
+  void encodeDataObject_(NSData? data) {
+    return _lib._objc_msgSend_248(
+        _id, _lib._sel_encodeDataObject_1, data?._id ?? ffi.nullptr);
+  }
+
+  NSData decodeDataObject() {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_decodeDataObject1);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  void decodeValueOfObjCType_at_size_(
+      ffi.Pointer<ffi.Char> type, ffi.Pointer<ffi.Void> data, int size) {
+    return _lib._objc_msgSend_249(
+        _id, _lib._sel_decodeValueOfObjCType_at_size_1, type, data, size);
+  }
+
+  int versionForClassName_(NSString? className) {
+    return _lib._objc_msgSend_250(
+        _id, _lib._sel_versionForClassName_1, className?._id ?? ffi.nullptr);
+  }
+
+  void encodeObject_(NSObject object) {
+    return _lib._objc_msgSend_15(_id, _lib._sel_encodeObject_1, object._id);
+  }
+
+  void encodeRootObject_(NSObject rootObject) {
+    return _lib._objc_msgSend_15(
+        _id, _lib._sel_encodeRootObject_1, rootObject._id);
+  }
+
+  void encodeBycopyObject_(NSObject anObject) {
+    return _lib._objc_msgSend_15(
+        _id, _lib._sel_encodeBycopyObject_1, anObject._id);
+  }
+
+  void encodeByrefObject_(NSObject anObject) {
+    return _lib._objc_msgSend_15(
+        _id, _lib._sel_encodeByrefObject_1, anObject._id);
+  }
+
+  void encodeConditionalObject_(NSObject object) {
+    return _lib._objc_msgSend_15(
+        _id, _lib._sel_encodeConditionalObject_1, object._id);
+  }
+
+  void encodeValuesOfObjCTypes_(ffi.Pointer<ffi.Char> types) {
+    return _lib._objc_msgSend_251(
+        _id, _lib._sel_encodeValuesOfObjCTypes_1, types);
+  }
+
+  void encodeArrayOfObjCType_count_at_(
+      ffi.Pointer<ffi.Char> type, int count, ffi.Pointer<ffi.Void> array) {
+    return _lib._objc_msgSend_252(
+        _id, _lib._sel_encodeArrayOfObjCType_count_at_1, type, count, array);
+  }
+
+  void encodeBytes_length_(ffi.Pointer<ffi.Void> byteaddr, int length) {
+    return _lib._objc_msgSend_21(
+        _id, _lib._sel_encodeBytes_length_1, byteaddr, length);
+  }
+
+  NSObject decodeObject() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_decodeObject1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject decodeTopLevelObjectAndReturnError_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_253(
+        _id, _lib._sel_decodeTopLevelObjectAndReturnError_1, error);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void decodeValuesOfObjCTypes_(ffi.Pointer<ffi.Char> types) {
+    return _lib._objc_msgSend_251(
+        _id, _lib._sel_decodeValuesOfObjCTypes_1, types);
+  }
+
+  void decodeArrayOfObjCType_count_at_(
+      ffi.Pointer<ffi.Char> itemType, int count, ffi.Pointer<ffi.Void> array) {
+    return _lib._objc_msgSend_252(_id,
+        _lib._sel_decodeArrayOfObjCType_count_at_1, itemType, count, array);
+  }
+
+  ffi.Pointer<ffi.Void> decodeBytesWithReturnedLength_(
+      ffi.Pointer<NSUInteger> lengthp) {
+    return _lib._objc_msgSend_254(
+        _id, _lib._sel_decodeBytesWithReturnedLength_1, lengthp);
+  }
+
+  void encodePropertyList_(NSObject aPropertyList) {
+    return _lib._objc_msgSend_15(
+        _id, _lib._sel_encodePropertyList_1, aPropertyList._id);
+  }
+
+  NSObject decodePropertyList() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_decodePropertyList1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void setObjectZone_(ffi.Pointer<NSZone> zone) {
+    return _lib._objc_msgSend_255(_id, _lib._sel_setObjectZone_1, zone);
+  }
+
+  ffi.Pointer<NSZone> objectZone() {
+    return _lib._objc_msgSend_256(_id, _lib._sel_objectZone1);
+  }
+
+  int get systemVersion {
+    return _lib._objc_msgSend_191(_id, _lib._sel_systemVersion1);
+  }
+
+  bool get allowsKeyedCoding {
+    return _lib._objc_msgSend_12(_id, _lib._sel_allowsKeyedCoding1);
+  }
+
+  void encodeObject_forKey_(NSObject object, NSString? key) {
+    return _lib._objc_msgSend_122(_id, _lib._sel_encodeObject_forKey_1,
+        object._id, key?._id ?? ffi.nullptr);
+  }
+
+  void encodeConditionalObject_forKey_(NSObject object, NSString? key) {
+    return _lib._objc_msgSend_122(
+        _id,
+        _lib._sel_encodeConditionalObject_forKey_1,
+        object._id,
+        key?._id ?? ffi.nullptr);
+  }
+
+  void encodeBool_forKey_(bool value, NSString? key) {
+    return _lib._objc_msgSend_257(
+        _id, _lib._sel_encodeBool_forKey_1, value, key?._id ?? ffi.nullptr);
+  }
+
+  void encodeInt_forKey_(int value, NSString? key) {
+    return _lib._objc_msgSend_258(
+        _id, _lib._sel_encodeInt_forKey_1, value, key?._id ?? ffi.nullptr);
+  }
+
+  void encodeInt32_forKey_(int value, NSString? key) {
+    return _lib._objc_msgSend_259(
+        _id, _lib._sel_encodeInt32_forKey_1, value, key?._id ?? ffi.nullptr);
+  }
+
+  void encodeInt64_forKey_(int value, NSString? key) {
+    return _lib._objc_msgSend_260(
+        _id, _lib._sel_encodeInt64_forKey_1, value, key?._id ?? ffi.nullptr);
+  }
+
+  void encodeFloat_forKey_(double value, NSString? key) {
+    return _lib._objc_msgSend_261(
+        _id, _lib._sel_encodeFloat_forKey_1, value, key?._id ?? ffi.nullptr);
+  }
+
+  void encodeDouble_forKey_(double value, NSString? key) {
+    return _lib._objc_msgSend_262(
+        _id, _lib._sel_encodeDouble_forKey_1, value, key?._id ?? ffi.nullptr);
+  }
+
+  void encodeBytes_length_forKey_(
+      ffi.Pointer<ffi.Uint8> bytes, int length, NSString? key) {
+    return _lib._objc_msgSend_263(_id, _lib._sel_encodeBytes_length_forKey_1,
+        bytes, length, key?._id ?? ffi.nullptr);
+  }
+
+  bool containsValueForKey_(NSString? key) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_containsValueForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  NSObject decodeObjectForKey_(NSString? key) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_decodeObjectForKey_1, key?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject decodeTopLevelObjectForKey_error_(
+      NSString? key, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_264(
+        _id,
+        _lib._sel_decodeTopLevelObjectForKey_error_1,
+        key?._id ?? ffi.nullptr,
+        error);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool decodeBoolForKey_(NSString? key) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_decodeBoolForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  int decodeIntForKey_(NSString? key) {
+    return _lib._objc_msgSend_265(
+        _id, _lib._sel_decodeIntForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  int decodeInt32ForKey_(NSString? key) {
+    return _lib._objc_msgSend_266(
+        _id, _lib._sel_decodeInt32ForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  int decodeInt64ForKey_(NSString? key) {
+    return _lib._objc_msgSend_267(
+        _id, _lib._sel_decodeInt64ForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  double decodeFloatForKey_(NSString? key) {
+    return _lib._objc_msgSend_268(
+        _id, _lib._sel_decodeFloatForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  double decodeDoubleForKey_(NSString? key) {
+    return _lib._objc_msgSend_269(
+        _id, _lib._sel_decodeDoubleForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  ffi.Pointer<ffi.Uint8> decodeBytesForKey_returnedLength_(
+      NSString? key, ffi.Pointer<NSUInteger> lengthp) {
+    return _lib._objc_msgSend_270(
+        _id,
+        _lib._sel_decodeBytesForKey_returnedLength_1,
+        key?._id ?? ffi.nullptr,
+        lengthp);
+  }
+
+  void encodeInteger_forKey_(int value, NSString? key) {
+    return _lib._objc_msgSend_271(
+        _id, _lib._sel_encodeInteger_forKey_1, value, key?._id ?? ffi.nullptr);
+  }
+
+  int decodeIntegerForKey_(NSString? key) {
+    return _lib._objc_msgSend_250(
+        _id, _lib._sel_decodeIntegerForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  bool get requiresSecureCoding {
+    return _lib._objc_msgSend_12(_id, _lib._sel_requiresSecureCoding1);
+  }
+
+  NSObject decodeObjectOfClass_forKey_(NSObject aClass, NSString? key) {
+    final _ret = _lib._objc_msgSend_272(
+        _id,
+        _lib._sel_decodeObjectOfClass_forKey_1,
+        aClass._id,
+        key?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject decodeTopLevelObjectOfClass_forKey_error_(NSObject aClass,
+      NSString? key, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_273(
+        _id,
+        _lib._sel_decodeTopLevelObjectOfClass_forKey_error_1,
+        aClass._id,
+        key?._id ?? ffi.nullptr,
+        error);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray decodeArrayOfObjectsOfClass_forKey_(NSObject cls, NSString? key) {
+    final _ret = _lib._objc_msgSend_274(
+        _id,
+        _lib._sel_decodeArrayOfObjectsOfClass_forKey_1,
+        cls._id,
+        key?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary decodeDictionaryWithKeysOfClass_objectsOfClass_forKey_(
+      NSObject keyCls, NSObject objectCls, NSString? key) {
+    final _ret = _lib._objc_msgSend_275(
+        _id,
+        _lib._sel_decodeDictionaryWithKeysOfClass_objectsOfClass_forKey_1,
+        keyCls._id,
+        objectCls._id,
+        key?._id ?? ffi.nullptr);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject decodeObjectOfClasses_forKey_(NSSet? classes, NSString? key) {
+    final _ret = _lib._objc_msgSend_276(
+        _id,
+        _lib._sel_decodeObjectOfClasses_forKey_1,
+        classes?._id ?? ffi.nullptr,
+        key?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject decodeTopLevelObjectOfClasses_forKey_error_(NSSet? classes,
+      NSString? key, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_277(
+        _id,
+        _lib._sel_decodeTopLevelObjectOfClasses_forKey_error_1,
+        classes?._id ?? ffi.nullptr,
+        key?._id ?? ffi.nullptr,
+        error);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray decodeArrayOfObjectsOfClasses_forKey_(NSSet? classes, NSString? key) {
+    final _ret = _lib._objc_msgSend_278(
+        _id,
+        _lib._sel_decodeArrayOfObjectsOfClasses_forKey_1,
+        classes?._id ?? ffi.nullptr,
+        key?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary decodeDictionaryWithKeysOfClasses_objectsOfClasses_forKey_(
+      NSSet? keyClasses, NSSet? objectClasses, NSString? key) {
+    final _ret = _lib._objc_msgSend_279(
+        _id,
+        _lib._sel_decodeDictionaryWithKeysOfClasses_objectsOfClasses_forKey_1,
+        keyClasses?._id ?? ffi.nullptr,
+        objectClasses?._id ?? ffi.nullptr,
+        key?._id ?? ffi.nullptr);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject decodePropertyListForKey_(NSString? key) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_decodePropertyListForKey_1, key?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSSet? get allowedClasses {
+    final _ret = _lib._objc_msgSend_280(_id, _lib._sel_allowedClasses1);
+    return _ret.address == 0
+        ? null
+        : NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  void failWithError_(NSError? error) {
+    return _lib._objc_msgSend_281(
+        _id, _lib._sel_failWithError_1, error?._id ?? ffi.nullptr);
+  }
+
+  int get decodingFailurePolicy {
+    return _lib._objc_msgSend_282(_id, _lib._sel_decodingFailurePolicy1);
+  }
+
+  NSError? get error {
+    final _ret = _lib._objc_msgSend_283(_id, _lib._sel_error1);
+    return _ret.address == 0
+        ? null
+        : NSError._(_ret, _lib, retain: true, release: true);
+  }
+
+  void encodeNXObject_(NSObject object) {
+    return _lib._objc_msgSend_15(_id, _lib._sel_encodeNXObject_1, object._id);
+  }
+
+  NSObject decodeNXObject() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_decodeNXObject1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void decodeValueOfObjCType_at_(
+      ffi.Pointer<ffi.Char> type, ffi.Pointer<ffi.Void> data) {
+    return _lib._objc_msgSend_18(
+        _id, _lib._sel_decodeValueOfObjCType_at_1, type, data);
+  }
+
+  void encodePoint_(NSPoint point) {
+    return _lib._objc_msgSend_284(_id, _lib._sel_encodePoint_1, point);
+  }
+
+  NSPoint decodePoint() {
+    return _lib._objc_msgSend_54(_id, _lib._sel_decodePoint1);
+  }
+
+  void encodeSize_(NSSize size) {
+    return _lib._objc_msgSend_285(_id, _lib._sel_encodeSize_1, size);
+  }
+
+  NSSize decodeSize() {
+    return _lib._objc_msgSend_55(_id, _lib._sel_decodeSize1);
+  }
+
+  void encodeRect_(NSRect rect) {
+    return _lib._objc_msgSend_286(_id, _lib._sel_encodeRect_1, rect);
+  }
+
+  NSRect decodeRect() {
+    return _lib._objc_msgSend_56(_id, _lib._sel_decodeRect1);
+  }
+
+  void encodePoint_forKey_(NSPoint point, NSString? key) {
+    return _lib._objc_msgSend_287(
+        _id, _lib._sel_encodePoint_forKey_1, point, key?._id ?? ffi.nullptr);
+  }
+
+  void encodeSize_forKey_(NSSize size, NSString? key) {
+    return _lib._objc_msgSend_288(
+        _id, _lib._sel_encodeSize_forKey_1, size, key?._id ?? ffi.nullptr);
+  }
+
+  void encodeRect_forKey_(NSRect rect, NSString? key) {
+    return _lib._objc_msgSend_289(
+        _id, _lib._sel_encodeRect_forKey_1, rect, key?._id ?? ffi.nullptr);
+  }
+
+  NSPoint decodePointForKey_(NSString? key) {
+    return _lib._objc_msgSend_290(
+        _id, _lib._sel_decodePointForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  NSSize decodeSizeForKey_(NSString? key) {
+    return _lib._objc_msgSend_291(
+        _id, _lib._sel_decodeSizeForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  NSRect decodeRectForKey_(NSString? key) {
+    return _lib._objc_msgSend_292(
+        _id, _lib._sel_decodeRectForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  static NSCoder new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSCoder1, _lib._sel_new1);
+    return NSCoder._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSCoder alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSCoder1, _lib._sel_alloc1);
+    return NSCoder._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSCoder1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSCoder1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSCoder1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSCoder1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSCoder1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSCoder1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSCoder1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSCoder1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSCoder1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSData extends NSObject {
+  NSData._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSData] that points to the same underlying object as [other].
+  static NSData castFrom<T extends _ObjCWrapper>(T other) {
+    return NSData._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSData] that wraps the given raw object pointer.
+  static NSData castFromPointer(AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSData._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSData].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSData1);
+  }
+
+  int get length {
+    return _lib._objc_msgSend_10(_id, _lib._sel_length1);
+  }
+
+  ffi.Pointer<ffi.Void> get bytes {
+    return _lib._objc_msgSend_19(_id, _lib._sel_bytes1);
+  }
+
+  NSString? get description {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_description1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  void getBytes_length_(ffi.Pointer<ffi.Void> buffer, int length) {
+    return _lib._objc_msgSend_21(
+        _id, _lib._sel_getBytes_length_1, buffer, length);
+  }
+
+  void getBytes_range_(ffi.Pointer<ffi.Void> buffer, NSRange range) {
+    return _lib._objc_msgSend_22(
+        _id, _lib._sel_getBytes_range_1, buffer, range);
+  }
+
+  bool isEqualToData_(NSData? other) {
+    return _lib._objc_msgSend_23(
+        _id, _lib._sel_isEqualToData_1, other?._id ?? ffi.nullptr);
+  }
+
+  NSData subdataWithRange_(NSRange range) {
+    final _ret =
+        _lib._objc_msgSend_24(_id, _lib._sel_subdataWithRange_1, range);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool writeToFile_atomically_(NSString? path, bool useAuxiliaryFile) {
+    return _lib._objc_msgSend_25(_id, _lib._sel_writeToFile_atomically_1,
+        path?._id ?? ffi.nullptr, useAuxiliaryFile);
+  }
+
+  bool writeToURL_atomically_(NSURL? url, bool atomically) {
+    return _lib._objc_msgSend_121(_id, _lib._sel_writeToURL_atomically_1,
+        url?._id ?? ffi.nullptr, atomically);
+  }
+
+  bool writeToFile_options_error_(NSString? path, int writeOptionsMask,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> errorPtr) {
+    return _lib._objc_msgSend_233(_id, _lib._sel_writeToFile_options_error_1,
+        path?._id ?? ffi.nullptr, writeOptionsMask, errorPtr);
+  }
+
+  bool writeToURL_options_error_(NSURL? url, int writeOptionsMask,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> errorPtr) {
+    return _lib._objc_msgSend_234(_id, _lib._sel_writeToURL_options_error_1,
+        url?._id ?? ffi.nullptr, writeOptionsMask, errorPtr);
+  }
+
+  NSRange rangeOfData_options_range_(
+      NSData? dataToFind, int mask, NSRange searchRange) {
+    return _lib._objc_msgSend_235(_id, _lib._sel_rangeOfData_options_range_1,
+        dataToFind?._id ?? ffi.nullptr, mask, searchRange);
+  }
+
+  void enumerateByteRangesUsingBlock_(ObjCBlock8 block) {
+    return _lib._objc_msgSend_236(
+        _id, _lib._sel_enumerateByteRangesUsingBlock_1, block._id);
+  }
+
+  static NSData data(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSData1, _lib._sel_data1);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSData dataWithBytes_length_(
+      AVFAudio _lib, ffi.Pointer<ffi.Void> bytes, int length) {
+    final _ret = _lib._objc_msgSend_237(
+        _lib._class_NSData1, _lib._sel_dataWithBytes_length_1, bytes, length);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSData dataWithBytesNoCopy_length_(
+      AVFAudio _lib, ffi.Pointer<ffi.Void> bytes, int length) {
+    final _ret = _lib._objc_msgSend_237(_lib._class_NSData1,
+        _lib._sel_dataWithBytesNoCopy_length_1, bytes, length);
+    return NSData._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSData dataWithBytesNoCopy_length_freeWhenDone_(
+      AVFAudio _lib, ffi.Pointer<ffi.Void> bytes, int length, bool b) {
+    final _ret = _lib._objc_msgSend_238(_lib._class_NSData1,
+        _lib._sel_dataWithBytesNoCopy_length_freeWhenDone_1, bytes, length, b);
+    return NSData._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSData dataWithContentsOfFile_options_error_(
+      AVFAudio _lib,
+      NSString? path,
+      int readOptionsMask,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> errorPtr) {
+    final _ret = _lib._objc_msgSend_239(
+        _lib._class_NSData1,
+        _lib._sel_dataWithContentsOfFile_options_error_1,
+        path?._id ?? ffi.nullptr,
+        readOptionsMask,
+        errorPtr);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSData dataWithContentsOfURL_options_error_(AVFAudio _lib, NSURL? url,
+      int readOptionsMask, ffi.Pointer<ffi.Pointer<ObjCObject>> errorPtr) {
+    final _ret = _lib._objc_msgSend_240(
+        _lib._class_NSData1,
+        _lib._sel_dataWithContentsOfURL_options_error_1,
+        url?._id ?? ffi.nullptr,
+        readOptionsMask,
+        errorPtr);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSData dataWithContentsOfFile_(AVFAudio _lib, NSString? path) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSData1,
+        _lib._sel_dataWithContentsOfFile_1, path?._id ?? ffi.nullptr);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSData dataWithContentsOfURL_(AVFAudio _lib, NSURL? url) {
+    final _ret = _lib._objc_msgSend_226(_lib._class_NSData1,
+        _lib._sel_dataWithContentsOfURL_1, url?._id ?? ffi.nullptr);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData initWithBytes_length_(ffi.Pointer<ffi.Void> bytes, int length) {
+    final _ret = _lib._objc_msgSend_237(
+        _id, _lib._sel_initWithBytes_length_1, bytes, length);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData initWithBytesNoCopy_length_(ffi.Pointer<ffi.Void> bytes, int length) {
+    final _ret = _lib._objc_msgSend_237(
+        _id, _lib._sel_initWithBytesNoCopy_length_1, bytes, length);
+    return NSData._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSData initWithBytesNoCopy_length_freeWhenDone_(
+      ffi.Pointer<ffi.Void> bytes, int length, bool b) {
+    final _ret = _lib._objc_msgSend_238(_id,
+        _lib._sel_initWithBytesNoCopy_length_freeWhenDone_1, bytes, length, b);
+    return NSData._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSData initWithBytesNoCopy_length_deallocator_(
+      ffi.Pointer<ffi.Void> bytes, int length, ObjCBlock9 deallocator) {
+    final _ret = _lib._objc_msgSend_241(
+        _id,
+        _lib._sel_initWithBytesNoCopy_length_deallocator_1,
+        bytes,
+        length,
+        deallocator._id);
+    return NSData._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSData initWithContentsOfFile_options_error_(NSString? path,
+      int readOptionsMask, ffi.Pointer<ffi.Pointer<ObjCObject>> errorPtr) {
+    final _ret = _lib._objc_msgSend_239(
+        _id,
+        _lib._sel_initWithContentsOfFile_options_error_1,
+        path?._id ?? ffi.nullptr,
+        readOptionsMask,
+        errorPtr);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData initWithContentsOfURL_options_error_(NSURL? url, int readOptionsMask,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> errorPtr) {
+    final _ret = _lib._objc_msgSend_240(
+        _id,
+        _lib._sel_initWithContentsOfURL_options_error_1,
+        url?._id ?? ffi.nullptr,
+        readOptionsMask,
+        errorPtr);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData initWithContentsOfFile_(NSString? path) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initWithContentsOfFile_1, path?._id ?? ffi.nullptr);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData initWithContentsOfURL_(NSURL? url) {
+    final _ret = _lib._objc_msgSend_226(
+        _id, _lib._sel_initWithContentsOfURL_1, url?._id ?? ffi.nullptr);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData initWithData_(NSData? data) {
+    final _ret = _lib._objc_msgSend_242(
+        _id, _lib._sel_initWithData_1, data?._id ?? ffi.nullptr);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSData dataWithData_(AVFAudio _lib, NSData? data) {
+    final _ret = _lib._objc_msgSend_242(_lib._class_NSData1,
+        _lib._sel_dataWithData_1, data?._id ?? ffi.nullptr);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData initWithBase64EncodedString_options_(
+      NSString? base64String, int options) {
+    final _ret = _lib._objc_msgSend_243(
+        _id,
+        _lib._sel_initWithBase64EncodedString_options_1,
+        base64String?._id ?? ffi.nullptr,
+        options);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString base64EncodedStringWithOptions_(int options) {
+    final _ret = _lib._objc_msgSend_244(
+        _id, _lib._sel_base64EncodedStringWithOptions_1, options);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData initWithBase64EncodedData_options_(NSData? base64Data, int options) {
+    final _ret = _lib._objc_msgSend_245(
+        _id,
+        _lib._sel_initWithBase64EncodedData_options_1,
+        base64Data?._id ?? ffi.nullptr,
+        options);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData base64EncodedDataWithOptions_(int options) {
+    final _ret = _lib._objc_msgSend_246(
+        _id, _lib._sel_base64EncodedDataWithOptions_1, options);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData decompressedDataUsingAlgorithm_error_(
+      int algorithm, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_247(_id,
+        _lib._sel_decompressedDataUsingAlgorithm_error_1, algorithm, error);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData compressedDataUsingAlgorithm_error_(
+      int algorithm, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_247(
+        _id, _lib._sel_compressedDataUsingAlgorithm_error_1, algorithm, error);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  void getBytes_(ffi.Pointer<ffi.Void> buffer) {
+    return _lib._objc_msgSend_47(_id, _lib._sel_getBytes_1, buffer);
+  }
+
+  static NSObject dataWithContentsOfMappedFile_(AVFAudio _lib, NSString? path) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSData1,
+        _lib._sel_dataWithContentsOfMappedFile_1, path?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject initWithContentsOfMappedFile_(NSString? path) {
+    final _ret = _lib._objc_msgSend_30(_id,
+        _lib._sel_initWithContentsOfMappedFile_1, path?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject initWithBase64Encoding_(NSString? base64String) {
+    final _ret = _lib._objc_msgSend_30(_id, _lib._sel_initWithBase64Encoding_1,
+        base64String?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString base64Encoding() {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_base64Encoding1);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSData new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSData1, _lib._sel_new1);
+    return NSData._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSData alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSData1, _lib._sel_alloc1);
+    return NSData._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSData1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSData1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSData1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSData1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSData1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSData1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSData1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSData1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSData1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef NSRange = _NSRange;
+
+class _NSRange extends ffi.Struct {
+  @NSUInteger()
+  external int location;
+
+  @NSUInteger()
+  external int length;
+}
+
+class NSURL extends NSObject {
+  NSURL._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURL] that points to the same underlying object as [other].
+  static NSURL castFrom<T extends _ObjCWrapper>(T other) {
+    return NSURL._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSURL] that wraps the given raw object pointer.
+  static NSURL castFromPointer(AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURL._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURL].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSURL1);
+  }
+
+  NSURL initWithScheme_host_path_(
+      NSString? scheme, NSString? host, NSString? path) {
+    final _ret = _lib._objc_msgSend_26(
+        _id,
+        _lib._sel_initWithScheme_host_path_1,
+        scheme?._id ?? ffi.nullptr,
+        host?._id ?? ffi.nullptr,
+        path?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL initFileURLWithPath_isDirectory_relativeToURL_(
+      NSString? path, bool isDir, NSURL? baseURL) {
+    final _ret = _lib._objc_msgSend_27(
+        _id,
+        _lib._sel_initFileURLWithPath_isDirectory_relativeToURL_1,
+        path?._id ?? ffi.nullptr,
+        isDir,
+        baseURL?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL initFileURLWithPath_relativeToURL_(NSString? path, NSURL? baseURL) {
+    final _ret = _lib._objc_msgSend_28(
+        _id,
+        _lib._sel_initFileURLWithPath_relativeToURL_1,
+        path?._id ?? ffi.nullptr,
+        baseURL?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL initFileURLWithPath_isDirectory_(NSString? path, bool isDir) {
+    final _ret = _lib._objc_msgSend_29(
+        _id,
+        _lib._sel_initFileURLWithPath_isDirectory_1,
+        path?._id ?? ffi.nullptr,
+        isDir);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL initFileURLWithPath_(NSString? path) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initFileURLWithPath_1, path?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURL fileURLWithPath_isDirectory_relativeToURL_(
+      AVFAudio _lib, NSString? path, bool isDir, NSURL? baseURL) {
+    final _ret = _lib._objc_msgSend_31(
+        _lib._class_NSURL1,
+        _lib._sel_fileURLWithPath_isDirectory_relativeToURL_1,
+        path?._id ?? ffi.nullptr,
+        isDir,
+        baseURL?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURL fileURLWithPath_relativeToURL_(
+      AVFAudio _lib, NSString? path, NSURL? baseURL) {
+    final _ret = _lib._objc_msgSend_32(
+        _lib._class_NSURL1,
+        _lib._sel_fileURLWithPath_relativeToURL_1,
+        path?._id ?? ffi.nullptr,
+        baseURL?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURL fileURLWithPath_isDirectory_(
+      AVFAudio _lib, NSString? path, bool isDir) {
+    final _ret = _lib._objc_msgSend_33(
+        _lib._class_NSURL1,
+        _lib._sel_fileURLWithPath_isDirectory_1,
+        path?._id ?? ffi.nullptr,
+        isDir);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURL fileURLWithPath_(AVFAudio _lib, NSString? path) {
+    final _ret = _lib._objc_msgSend_34(_lib._class_NSURL1,
+        _lib._sel_fileURLWithPath_1, path?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL initFileURLWithFileSystemRepresentation_isDirectory_relativeToURL_(
+      ffi.Pointer<ffi.Char> path, bool isDir, NSURL? baseURL) {
+    final _ret = _lib._objc_msgSend_35(
+        _id,
+        _lib._sel_initFileURLWithFileSystemRepresentation_isDirectory_relativeToURL_1,
+        path,
+        isDir,
+        baseURL?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURL fileURLWithFileSystemRepresentation_isDirectory_relativeToURL_(
+      AVFAudio _lib, ffi.Pointer<ffi.Char> path, bool isDir, NSURL? baseURL) {
+    final _ret = _lib._objc_msgSend_36(
+        _lib._class_NSURL1,
+        _lib._sel_fileURLWithFileSystemRepresentation_isDirectory_relativeToURL_1,
+        path,
+        isDir,
+        baseURL?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL initWithString_(NSString? URLString) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initWithString_1, URLString?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL initWithString_relativeToURL_(NSString? URLString, NSURL? baseURL) {
+    final _ret = _lib._objc_msgSend_28(
+        _id,
+        _lib._sel_initWithString_relativeToURL_1,
+        URLString?._id ?? ffi.nullptr,
+        baseURL?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURL URLWithString_(AVFAudio _lib, NSString? URLString) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSURL1,
+        _lib._sel_URLWithString_1, URLString?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURL URLWithString_relativeToURL_(
+      AVFAudio _lib, NSString? URLString, NSURL? baseURL) {
+    final _ret = _lib._objc_msgSend_28(
+        _lib._class_NSURL1,
+        _lib._sel_URLWithString_relativeToURL_1,
+        URLString?._id ?? ffi.nullptr,
+        baseURL?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL initWithDataRepresentation_relativeToURL_(
+      NSData? data, NSURL? baseURL) {
+    final _ret = _lib._objc_msgSend_37(
+        _id,
+        _lib._sel_initWithDataRepresentation_relativeToURL_1,
+        data?._id ?? ffi.nullptr,
+        baseURL?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURL URLWithDataRepresentation_relativeToURL_(
+      AVFAudio _lib, NSData? data, NSURL? baseURL) {
+    final _ret = _lib._objc_msgSend_38(
+        _lib._class_NSURL1,
+        _lib._sel_URLWithDataRepresentation_relativeToURL_1,
+        data?._id ?? ffi.nullptr,
+        baseURL?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL initAbsoluteURLWithDataRepresentation_relativeToURL_(
+      NSData? data, NSURL? baseURL) {
+    final _ret = _lib._objc_msgSend_37(
+        _id,
+        _lib._sel_initAbsoluteURLWithDataRepresentation_relativeToURL_1,
+        data?._id ?? ffi.nullptr,
+        baseURL?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURL absoluteURLWithDataRepresentation_relativeToURL_(
+      AVFAudio _lib, NSData? data, NSURL? baseURL) {
+    final _ret = _lib._objc_msgSend_38(
+        _lib._class_NSURL1,
+        _lib._sel_absoluteURLWithDataRepresentation_relativeToURL_1,
+        data?._id ?? ffi.nullptr,
+        baseURL?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData? get dataRepresentation {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_dataRepresentation1);
+    return _ret.address == 0
+        ? null
+        : NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get absoluteString {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_absoluteString1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get relativeString {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_relativeString1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get baseURL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_baseURL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get absoluteURL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_absoluteURL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get scheme {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_scheme1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get resourceSpecifier {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_resourceSpecifier1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get host {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_host1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber? get port {
+    final _ret = _lib._objc_msgSend_192(_id, _lib._sel_port1);
+    return _ret.address == 0
+        ? null
+        : NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get user {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_user1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get password {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_password1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get path {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_path1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get fragment {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_fragment1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get parameterString {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_parameterString1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get query {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_query1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get relativePath {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_relativePath1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool get hasDirectoryPath {
+    return _lib._objc_msgSend_12(_id, _lib._sel_hasDirectoryPath1);
+  }
+
+  bool getFileSystemRepresentation_maxLength_(
+      ffi.Pointer<ffi.Char> buffer, int maxBufferLength) {
+    return _lib._objc_msgSend_218(
+        _id,
+        _lib._sel_getFileSystemRepresentation_maxLength_1,
+        buffer,
+        maxBufferLength);
+  }
+
+  ffi.Pointer<ffi.Char> get fileSystemRepresentation {
+    return _lib._objc_msgSend_13(_id, _lib._sel_fileSystemRepresentation1);
+  }
+
+  bool get fileURL {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isFileURL1);
+  }
+
+  NSURL? get standardizedURL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_standardizedURL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool checkResourceIsReachableAndReturnError_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_219(
+        _id, _lib._sel_checkResourceIsReachableAndReturnError_1, error);
+  }
+
+  bool isFileReferenceURL() {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isFileReferenceURL1);
+  }
+
+  NSURL fileReferenceURL() {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_fileReferenceURL1);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get filePathURL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_filePathURL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool getResourceValue_forKey_error_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> value,
+      NSURLResourceKey key,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_220(
+        _id, _lib._sel_getResourceValue_forKey_error_1, value, key, error);
+  }
+
+  bool getPromisedItemResourceValue_forKey_error_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> value,
+      NSURLResourceKey key,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_220(
+        _id,
+        _lib._sel_getPromisedItemResourceValue_forKey_error_1,
+        value,
+        key,
+        error);
+  }
+
+  NSDictionary promisedItemResourceValuesForKeys_error_(
+      NSArray? keys, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_221(
+        _id,
+        _lib._sel_promisedItemResourceValuesForKeys_error_1,
+        keys?._id ?? ffi.nullptr,
+        error);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool checkPromisedItemIsReachableAndReturnError_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_219(
+        _id, _lib._sel_checkPromisedItemIsReachableAndReturnError_1, error);
+  }
+
+  static NSURL fileURLWithPathComponents_(AVFAudio _lib, NSArray? components) {
+    final _ret = _lib._objc_msgSend_222(_lib._class_NSURL1,
+        _lib._sel_fileURLWithPathComponents_1, components?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get pathComponents {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_pathComponents1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get lastPathComponent {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_lastPathComponent1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get pathExtension {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_pathExtension1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL URLByAppendingPathComponent_(NSString? pathComponent) {
+    final _ret = _lib._objc_msgSend_34(
+        _id,
+        _lib._sel_URLByAppendingPathComponent_1,
+        pathComponent?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL URLByAppendingPathComponent_isDirectory_(
+      NSString? pathComponent, bool isDirectory) {
+    final _ret = _lib._objc_msgSend_33(
+        _id,
+        _lib._sel_URLByAppendingPathComponent_isDirectory_1,
+        pathComponent?._id ?? ffi.nullptr,
+        isDirectory);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get URLByDeletingLastPathComponent {
+    final _ret =
+        _lib._objc_msgSend_40(_id, _lib._sel_URLByDeletingLastPathComponent1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL URLByAppendingPathExtension_(NSString? pathExtension) {
+    final _ret = _lib._objc_msgSend_34(
+        _id,
+        _lib._sel_URLByAppendingPathExtension_1,
+        pathExtension?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get URLByDeletingPathExtension {
+    final _ret =
+        _lib._objc_msgSend_40(_id, _lib._sel_URLByDeletingPathExtension1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get URLByStandardizingPath {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_URLByStandardizingPath1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get URLByResolvingSymlinksInPath {
+    final _ret =
+        _lib._objc_msgSend_40(_id, _lib._sel_URLByResolvingSymlinksInPath1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData resourceDataUsingCache_(bool shouldUseCache) {
+    final _ret = _lib._objc_msgSend_223(
+        _id, _lib._sel_resourceDataUsingCache_1, shouldUseCache);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  void loadResourceDataNotifyingClient_usingCache_(
+      NSObject client, bool shouldUseCache) {
+    return _lib._objc_msgSend_224(
+        _id,
+        _lib._sel_loadResourceDataNotifyingClient_usingCache_1,
+        client._id,
+        shouldUseCache);
+  }
+
+  NSObject propertyForKey_(NSString? propertyKey) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_propertyForKey_1, propertyKey?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool setResourceData_(NSData? data) {
+    return _lib._objc_msgSend_23(
+        _id, _lib._sel_setResourceData_1, data?._id ?? ffi.nullptr);
+  }
+
+  bool setProperty_forKey_(NSObject property, NSString? propertyKey) {
+    return _lib._objc_msgSend_225(_id, _lib._sel_setProperty_forKey_1,
+        property._id, propertyKey?._id ?? ffi.nullptr);
+  }
+
+  NSURLHandle URLHandleUsingCache_(bool shouldUseCache) {
+    final _ret = _lib._objc_msgSend_232(
+        _id, _lib._sel_URLHandleUsingCache_1, shouldUseCache);
+    return NSURLHandle._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURL new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSURL1, _lib._sel_new1);
+    return NSURL._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSURL alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSURL1, _lib._sel_alloc1);
+    return NSURL._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURL1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURL1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURL1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURL1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURL1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURL1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURL1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSURL1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURL1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSNumber extends NSValue {
+  NSNumber._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSNumber] that points to the same underlying object as [other].
+  static NSNumber castFrom<T extends _ObjCWrapper>(T other) {
+    return NSNumber._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSNumber] that wraps the given raw object pointer.
+  static NSNumber castFromPointer(AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSNumber._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSNumber].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSNumber1);
+  }
+
+  @override
+  NSNumber initWithCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber initWithChar_(int value) {
+    final _ret = _lib._objc_msgSend_196(_id, _lib._sel_initWithChar_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber initWithUnsignedChar_(int value) {
+    final _ret =
+        _lib._objc_msgSend_197(_id, _lib._sel_initWithUnsignedChar_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber initWithShort_(int value) {
+    final _ret = _lib._objc_msgSend_198(_id, _lib._sel_initWithShort_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber initWithUnsignedShort_(int value) {
+    final _ret =
+        _lib._objc_msgSend_199(_id, _lib._sel_initWithUnsignedShort_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber initWithInt_(int value) {
+    final _ret = _lib._objc_msgSend_200(_id, _lib._sel_initWithInt_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber initWithUnsignedInt_(int value) {
+    final _ret =
+        _lib._objc_msgSend_201(_id, _lib._sel_initWithUnsignedInt_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber initWithLong_(int value) {
+    final _ret = _lib._objc_msgSend_202(_id, _lib._sel_initWithLong_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber initWithUnsignedLong_(int value) {
+    final _ret =
+        _lib._objc_msgSend_203(_id, _lib._sel_initWithUnsignedLong_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber initWithLongLong_(int value) {
+    final _ret =
+        _lib._objc_msgSend_204(_id, _lib._sel_initWithLongLong_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber initWithUnsignedLongLong_(int value) {
+    final _ret = _lib._objc_msgSend_205(
+        _id, _lib._sel_initWithUnsignedLongLong_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber initWithFloat_(double value) {
+    final _ret = _lib._objc_msgSend_206(_id, _lib._sel_initWithFloat_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber initWithDouble_(double value) {
+    final _ret = _lib._objc_msgSend_207(_id, _lib._sel_initWithDouble_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber initWithBool_(bool value) {
+    final _ret = _lib._objc_msgSend_208(_id, _lib._sel_initWithBool_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber initWithInteger_(int value) {
+    final _ret =
+        _lib._objc_msgSend_202(_id, _lib._sel_initWithInteger_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber initWithUnsignedInteger_(int value) {
+    final _ret =
+        _lib._objc_msgSend_203(_id, _lib._sel_initWithUnsignedInteger_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get charValue {
+    return _lib._objc_msgSend_209(_id, _lib._sel_charValue1);
+  }
+
+  int get unsignedCharValue {
+    return _lib._objc_msgSend_210(_id, _lib._sel_unsignedCharValue1);
+  }
+
+  int get shortValue {
+    return _lib._objc_msgSend_211(_id, _lib._sel_shortValue1);
+  }
+
+  int get unsignedShortValue {
+    return _lib._objc_msgSend_212(_id, _lib._sel_unsignedShortValue1);
+  }
+
+  int get intValue {
+    return _lib._objc_msgSend_213(_id, _lib._sel_intValue1);
+  }
+
+  int get unsignedIntValue {
+    return _lib._objc_msgSend_191(_id, _lib._sel_unsignedIntValue1);
+  }
+
+  int get longValue {
+    return _lib._objc_msgSend_78(_id, _lib._sel_longValue1);
+  }
+
+  int get unsignedLongValue {
+    return _lib._objc_msgSend_10(_id, _lib._sel_unsignedLongValue1);
+  }
+
+  int get longLongValue {
+    return _lib._objc_msgSend_214(_id, _lib._sel_longLongValue1);
+  }
+
+  int get unsignedLongLongValue {
+    return _lib._objc_msgSend_148(_id, _lib._sel_unsignedLongLongValue1);
+  }
+
+  double get floatValue {
+    return _lib._objc_msgSend_215(_id, _lib._sel_floatValue1);
+  }
+
+  double get doubleValue {
+    return _lib._objc_msgSend_149(_id, _lib._sel_doubleValue1);
+  }
+
+  bool get boolValue {
+    return _lib._objc_msgSend_12(_id, _lib._sel_boolValue1);
+  }
+
+  int get integerValue {
+    return _lib._objc_msgSend_78(_id, _lib._sel_integerValue1);
+  }
+
+  int get unsignedIntegerValue {
+    return _lib._objc_msgSend_10(_id, _lib._sel_unsignedIntegerValue1);
+  }
+
+  NSString? get stringValue {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_stringValue1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int compare_(NSNumber? otherNumber) {
+    return _lib._objc_msgSend_216(
+        _id, _lib._sel_compare_1, otherNumber?._id ?? ffi.nullptr);
+  }
+
+  bool isEqualToNumber_(NSNumber? number) {
+    return _lib._objc_msgSend_217(
+        _id, _lib._sel_isEqualToNumber_1, number?._id ?? ffi.nullptr);
+  }
+
+  NSString descriptionWithLocale_(NSObject locale) {
+    final _ret = _lib._objc_msgSend_65(
+        _id, _lib._sel_descriptionWithLocale_1, locale._id);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNumber numberWithChar_(AVFAudio _lib, int value) {
+    final _ret = _lib._objc_msgSend_196(
+        _lib._class_NSNumber1, _lib._sel_numberWithChar_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNumber numberWithUnsignedChar_(AVFAudio _lib, int value) {
+    final _ret = _lib._objc_msgSend_197(
+        _lib._class_NSNumber1, _lib._sel_numberWithUnsignedChar_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNumber numberWithShort_(AVFAudio _lib, int value) {
+    final _ret = _lib._objc_msgSend_198(
+        _lib._class_NSNumber1, _lib._sel_numberWithShort_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNumber numberWithUnsignedShort_(AVFAudio _lib, int value) {
+    final _ret = _lib._objc_msgSend_199(
+        _lib._class_NSNumber1, _lib._sel_numberWithUnsignedShort_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNumber numberWithInt_(AVFAudio _lib, int value) {
+    final _ret = _lib._objc_msgSend_200(
+        _lib._class_NSNumber1, _lib._sel_numberWithInt_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNumber numberWithUnsignedInt_(AVFAudio _lib, int value) {
+    final _ret = _lib._objc_msgSend_201(
+        _lib._class_NSNumber1, _lib._sel_numberWithUnsignedInt_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNumber numberWithLong_(AVFAudio _lib, int value) {
+    final _ret = _lib._objc_msgSend_202(
+        _lib._class_NSNumber1, _lib._sel_numberWithLong_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNumber numberWithUnsignedLong_(AVFAudio _lib, int value) {
+    final _ret = _lib._objc_msgSend_203(
+        _lib._class_NSNumber1, _lib._sel_numberWithUnsignedLong_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNumber numberWithLongLong_(AVFAudio _lib, int value) {
+    final _ret = _lib._objc_msgSend_204(
+        _lib._class_NSNumber1, _lib._sel_numberWithLongLong_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNumber numberWithUnsignedLongLong_(AVFAudio _lib, int value) {
+    final _ret = _lib._objc_msgSend_205(
+        _lib._class_NSNumber1, _lib._sel_numberWithUnsignedLongLong_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNumber numberWithFloat_(AVFAudio _lib, double value) {
+    final _ret = _lib._objc_msgSend_206(
+        _lib._class_NSNumber1, _lib._sel_numberWithFloat_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNumber numberWithDouble_(AVFAudio _lib, double value) {
+    final _ret = _lib._objc_msgSend_207(
+        _lib._class_NSNumber1, _lib._sel_numberWithDouble_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNumber numberWithBool_(AVFAudio _lib, bool value) {
+    final _ret = _lib._objc_msgSend_208(
+        _lib._class_NSNumber1, _lib._sel_numberWithBool_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNumber numberWithInteger_(AVFAudio _lib, int value) {
+    final _ret = _lib._objc_msgSend_202(
+        _lib._class_NSNumber1, _lib._sel_numberWithInteger_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNumber numberWithUnsignedInteger_(AVFAudio _lib, int value) {
+    final _ret = _lib._objc_msgSend_203(
+        _lib._class_NSNumber1, _lib._sel_numberWithUnsignedInteger_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSValue valueWithBytes_objCType_(
+      AVFAudio _lib, ffi.Pointer<ffi.Void> value, ffi.Pointer<ffi.Char> type) {
+    final _ret = _lib._objc_msgSend_43(_lib._class_NSNumber1,
+        _lib._sel_valueWithBytes_objCType_1, value, type);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSValue value_withObjCType_(
+      AVFAudio _lib, ffi.Pointer<ffi.Void> value, ffi.Pointer<ffi.Char> type) {
+    final _ret = _lib._objc_msgSend_43(
+        _lib._class_NSNumber1, _lib._sel_value_withObjCType_1, value, type);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSValue valueWithNonretainedObject_(AVFAudio _lib, NSObject anObject) {
+    final _ret = _lib._objc_msgSend_44(_lib._class_NSNumber1,
+        _lib._sel_valueWithNonretainedObject_1, anObject._id);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSValue valueWithPointer_(
+      AVFAudio _lib, ffi.Pointer<ffi.Void> pointer) {
+    final _ret = _lib._objc_msgSend_45(
+        _lib._class_NSNumber1, _lib._sel_valueWithPointer_1, pointer);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSValue valueWithRange_(AVFAudio _lib, NSRange range) {
+    final _ret = _lib._objc_msgSend_48(
+        _lib._class_NSNumber1, _lib._sel_valueWithRange_1, range);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSValue valueWithPoint_(AVFAudio _lib, NSPoint point) {
+    final _ret = _lib._objc_msgSend_50(
+        _lib._class_NSNumber1, _lib._sel_valueWithPoint_1, point);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSValue valueWithSize_(AVFAudio _lib, NSSize size) {
+    final _ret = _lib._objc_msgSend_51(
+        _lib._class_NSNumber1, _lib._sel_valueWithSize_1, size);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSValue valueWithRect_(AVFAudio _lib, NSRect rect) {
+    final _ret = _lib._objc_msgSend_52(
+        _lib._class_NSNumber1, _lib._sel_valueWithRect_1, rect);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSValue valueWithEdgeInsets_(AVFAudio _lib, NSEdgeInsets insets) {
+    final _ret = _lib._objc_msgSend_53(
+        _lib._class_NSNumber1, _lib._sel_valueWithEdgeInsets_1, insets);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNumber new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSNumber1, _lib._sel_new1);
+    return NSNumber._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSNumber alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSNumber1, _lib._sel_alloc1);
+    return NSNumber._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSNumber1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSNumber1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSNumber1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSNumber1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSNumber1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSNumber1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSNumber1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSNumber1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSNumber1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSValue extends NSObject {
+  NSValue._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSValue] that points to the same underlying object as [other].
+  static NSValue castFrom<T extends _ObjCWrapper>(T other) {
+    return NSValue._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSValue] that wraps the given raw object pointer.
+  static NSValue castFromPointer(AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSValue._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSValue].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSValue1);
+  }
+
+  void getValue_size_(ffi.Pointer<ffi.Void> value, int size) {
+    return _lib._objc_msgSend_21(_id, _lib._sel_getValue_size_1, value, size);
+  }
+
+  ffi.Pointer<ffi.Char> get objCType {
+    return _lib._objc_msgSend_13(_id, _lib._sel_objCType1);
+  }
+
+  NSValue initWithBytes_objCType_(
+      ffi.Pointer<ffi.Void> value, ffi.Pointer<ffi.Char> type) {
+    final _ret = _lib._objc_msgSend_41(
+        _id, _lib._sel_initWithBytes_objCType_1, value, type);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSValue initWithCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSValue valueWithBytes_objCType_(
+      AVFAudio _lib, ffi.Pointer<ffi.Void> value, ffi.Pointer<ffi.Char> type) {
+    final _ret = _lib._objc_msgSend_43(
+        _lib._class_NSValue1, _lib._sel_valueWithBytes_objCType_1, value, type);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSValue value_withObjCType_(
+      AVFAudio _lib, ffi.Pointer<ffi.Void> value, ffi.Pointer<ffi.Char> type) {
+    final _ret = _lib._objc_msgSend_43(
+        _lib._class_NSValue1, _lib._sel_value_withObjCType_1, value, type);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSValue valueWithNonretainedObject_(AVFAudio _lib, NSObject anObject) {
+    final _ret = _lib._objc_msgSend_44(_lib._class_NSValue1,
+        _lib._sel_valueWithNonretainedObject_1, anObject._id);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject get nonretainedObjectValue {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_nonretainedObjectValue1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSValue valueWithPointer_(
+      AVFAudio _lib, ffi.Pointer<ffi.Void> pointer) {
+    final _ret = _lib._objc_msgSend_45(
+        _lib._class_NSValue1, _lib._sel_valueWithPointer_1, pointer);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  ffi.Pointer<ffi.Void> get pointerValue {
+    return _lib._objc_msgSend_19(_id, _lib._sel_pointerValue1);
+  }
+
+  bool isEqualToValue_(NSValue? value) {
+    return _lib._objc_msgSend_46(
+        _id, _lib._sel_isEqualToValue_1, value?._id ?? ffi.nullptr);
+  }
+
+  void getValue_(ffi.Pointer<ffi.Void> value) {
+    return _lib._objc_msgSend_47(_id, _lib._sel_getValue_1, value);
+  }
+
+  static NSValue valueWithRange_(AVFAudio _lib, NSRange range) {
+    final _ret = _lib._objc_msgSend_48(
+        _lib._class_NSValue1, _lib._sel_valueWithRange_1, range);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSRange get rangeValue {
+    return _lib._objc_msgSend_49(_id, _lib._sel_rangeValue1);
+  }
+
+  static NSValue valueWithPoint_(AVFAudio _lib, NSPoint point) {
+    final _ret = _lib._objc_msgSend_50(
+        _lib._class_NSValue1, _lib._sel_valueWithPoint_1, point);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSValue valueWithSize_(AVFAudio _lib, NSSize size) {
+    final _ret = _lib._objc_msgSend_51(
+        _lib._class_NSValue1, _lib._sel_valueWithSize_1, size);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSValue valueWithRect_(AVFAudio _lib, NSRect rect) {
+    final _ret = _lib._objc_msgSend_52(
+        _lib._class_NSValue1, _lib._sel_valueWithRect_1, rect);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSValue valueWithEdgeInsets_(AVFAudio _lib, NSEdgeInsets insets) {
+    final _ret = _lib._objc_msgSend_53(
+        _lib._class_NSValue1, _lib._sel_valueWithEdgeInsets_1, insets);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSPoint get pointValue {
+    return _lib._objc_msgSend_54(_id, _lib._sel_pointValue1);
+  }
+
+  NSSize get sizeValue {
+    return _lib._objc_msgSend_55(_id, _lib._sel_sizeValue1);
+  }
+
+  NSRect get rectValue {
+    return _lib._objc_msgSend_56(_id, _lib._sel_rectValue1);
+  }
+
+  NSEdgeInsets get edgeInsetsValue {
+    return _lib._objc_msgSend_57(_id, _lib._sel_edgeInsetsValue1);
+  }
+
+  static NSValue new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSValue1, _lib._sel_new1);
+    return NSValue._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSValue alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSValue1, _lib._sel_alloc1);
+    return NSValue._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSValue1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSValue1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSValue1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSValue1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSValue1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSValue1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSValue1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSValue1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSValue1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef NSPoint = CGPoint;
+
+class CGPoint extends ffi.Struct {
+  @CGFloat()
+  external double x;
+
+  @CGFloat()
+  external double y;
+}
+
+typedef CGFloat = ffi.Double;
+typedef NSSize = CGSize;
+
+class CGSize extends ffi.Struct {
+  @CGFloat()
+  external double width;
+
+  @CGFloat()
+  external double height;
+}
+
+typedef NSRect = CGRect;
+
+class CGRect extends ffi.Struct {
+  external CGPoint origin;
+
+  external CGSize size;
+}
+
+class NSEdgeInsets extends ffi.Struct {
+  @CGFloat()
+  external double top;
+
+  @CGFloat()
+  external double left;
+
+  @CGFloat()
+  external double bottom;
+
+  @CGFloat()
+  external double right;
+}
+
+class NSArray extends NSObject {
+  NSArray._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSArray] that points to the same underlying object as [other].
+  static NSArray castFrom<T extends _ObjCWrapper>(T other) {
+    return NSArray._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSArray] that wraps the given raw object pointer.
+  static NSArray castFromPointer(AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSArray._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSArray].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSArray1);
+  }
+
+  int get count {
+    return _lib._objc_msgSend_10(_id, _lib._sel_count1);
+  }
+
+  NSObject objectAtIndex_(int index) {
+    final _ret = _lib._objc_msgSend_60(_id, _lib._sel_objectAtIndex_1, index);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSArray init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray initWithObjects_count_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> objects, int cnt) {
+    final _ret = _lib._objc_msgSend_61(
+        _id, _lib._sel_initWithObjects_count_1, objects, cnt);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray initWithCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray arrayByAddingObject_(NSObject anObject) {
+    final _ret = _lib._objc_msgSend_62(
+        _id, _lib._sel_arrayByAddingObject_1, anObject._id);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray arrayByAddingObjectsFromArray_(NSArray? otherArray) {
+    final _ret = _lib._objc_msgSend_63(
+        _id,
+        _lib._sel_arrayByAddingObjectsFromArray_1,
+        otherArray?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString componentsJoinedByString_(NSString? separator) {
+    final _ret = _lib._objc_msgSend_64(_id,
+        _lib._sel_componentsJoinedByString_1, separator?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool containsObject_(NSObject anObject) {
+    return _lib._objc_msgSend_0(_id, _lib._sel_containsObject_1, anObject._id);
+  }
+
+  NSString? get description {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_description1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString descriptionWithLocale_(NSObject locale) {
+    final _ret = _lib._objc_msgSend_65(
+        _id, _lib._sel_descriptionWithLocale_1, locale._id);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString descriptionWithLocale_indent_(NSObject locale, int level) {
+    final _ret = _lib._objc_msgSend_66(
+        _id, _lib._sel_descriptionWithLocale_indent_1, locale._id, level);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject firstObjectCommonWithArray_(NSArray? otherArray) {
+    final _ret = _lib._objc_msgSend_67(_id,
+        _lib._sel_firstObjectCommonWithArray_1, otherArray?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void getObjects_range_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> objects, NSRange range) {
+    return _lib._objc_msgSend_68(
+        _id, _lib._sel_getObjects_range_1, objects, range);
+  }
+
+  int indexOfObject_(NSObject anObject) {
+    return _lib._objc_msgSend_69(_id, _lib._sel_indexOfObject_1, anObject._id);
+  }
+
+  int indexOfObject_inRange_(NSObject anObject, NSRange range) {
+    return _lib._objc_msgSend_70(
+        _id, _lib._sel_indexOfObject_inRange_1, anObject._id, range);
+  }
+
+  int indexOfObjectIdenticalTo_(NSObject anObject) {
+    return _lib._objc_msgSend_69(
+        _id, _lib._sel_indexOfObjectIdenticalTo_1, anObject._id);
+  }
+
+  int indexOfObjectIdenticalTo_inRange_(NSObject anObject, NSRange range) {
+    return _lib._objc_msgSend_70(
+        _id, _lib._sel_indexOfObjectIdenticalTo_inRange_1, anObject._id, range);
+  }
+
+  bool isEqualToArray_(NSArray? otherArray) {
+    return _lib._objc_msgSend_71(
+        _id, _lib._sel_isEqualToArray_1, otherArray?._id ?? ffi.nullptr);
+  }
+
+  NSObject get firstObject {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_firstObject1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject get lastObject {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_lastObject1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSEnumerator objectEnumerator() {
+    final _ret = _lib._objc_msgSend_72(_id, _lib._sel_objectEnumerator1);
+    return NSEnumerator._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSEnumerator reverseObjectEnumerator() {
+    final _ret = _lib._objc_msgSend_72(_id, _lib._sel_reverseObjectEnumerator1);
+    return NSEnumerator._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData? get sortedArrayHint {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_sortedArrayHint1);
+    return _ret.address == 0
+        ? null
+        : NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray sortedArrayUsingFunction_context_(
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  NSInteger Function(ffi.Pointer<ObjCObject>,
+                      ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Void>)>>
+          comparator,
+      ffi.Pointer<ffi.Void> context) {
+    final _ret = _lib._objc_msgSend_73(
+        _id, _lib._sel_sortedArrayUsingFunction_context_1, comparator, context);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray sortedArrayUsingFunction_context_hint_(
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  NSInteger Function(ffi.Pointer<ObjCObject>,
+                      ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Void>)>>
+          comparator,
+      ffi.Pointer<ffi.Void> context,
+      NSData? hint) {
+    final _ret = _lib._objc_msgSend_74(
+        _id,
+        _lib._sel_sortedArrayUsingFunction_context_hint_1,
+        comparator,
+        context,
+        hint?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray sortedArrayUsingSelector_(ffi.Pointer<ObjCSel> comparator) {
+    final _ret = _lib._objc_msgSend_75(
+        _id, _lib._sel_sortedArrayUsingSelector_1, comparator);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray subarrayWithRange_(NSRange range) {
+    final _ret =
+        _lib._objc_msgSend_76(_id, _lib._sel_subarrayWithRange_1, range);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool writeToURL_error_(
+      NSURL? url, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_81(
+        _id, _lib._sel_writeToURL_error_1, url?._id ?? ffi.nullptr, error);
+  }
+
+  void makeObjectsPerformSelector_(ffi.Pointer<ObjCSel> aSelector) {
+    return _lib._objc_msgSend_7(
+        _id, _lib._sel_makeObjectsPerformSelector_1, aSelector);
+  }
+
+  void makeObjectsPerformSelector_withObject_(
+      ffi.Pointer<ObjCSel> aSelector, NSObject argument) {
+    return _lib._objc_msgSend_82(
+        _id,
+        _lib._sel_makeObjectsPerformSelector_withObject_1,
+        aSelector,
+        argument._id);
+  }
+
+  NSArray objectsAtIndexes_(NSIndexSet? indexes) {
+    final _ret = _lib._objc_msgSend_103(
+        _id, _lib._sel_objectsAtIndexes_1, indexes?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject objectAtIndexedSubscript_(int idx) {
+    final _ret =
+        _lib._objc_msgSend_60(_id, _lib._sel_objectAtIndexedSubscript_1, idx);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void enumerateObjectsUsingBlock_(ObjCBlock3 block) {
+    return _lib._objc_msgSend_104(
+        _id, _lib._sel_enumerateObjectsUsingBlock_1, block._id);
+  }
+
+  void enumerateObjectsWithOptions_usingBlock_(int opts, ObjCBlock3 block) {
+    return _lib._objc_msgSend_105(_id,
+        _lib._sel_enumerateObjectsWithOptions_usingBlock_1, opts, block._id);
+  }
+
+  void enumerateObjectsAtIndexes_options_usingBlock_(
+      NSIndexSet? s, int opts, ObjCBlock3 block) {
+    return _lib._objc_msgSend_106(
+        _id,
+        _lib._sel_enumerateObjectsAtIndexes_options_usingBlock_1,
+        s?._id ?? ffi.nullptr,
+        opts,
+        block._id);
+  }
+
+  int indexOfObjectPassingTest_(ObjCBlock4 predicate) {
+    return _lib._objc_msgSend_107(
+        _id, _lib._sel_indexOfObjectPassingTest_1, predicate._id);
+  }
+
+  int indexOfObjectWithOptions_passingTest_(int opts, ObjCBlock4 predicate) {
+    return _lib._objc_msgSend_108(_id,
+        _lib._sel_indexOfObjectWithOptions_passingTest_1, opts, predicate._id);
+  }
+
+  int indexOfObjectAtIndexes_options_passingTest_(
+      NSIndexSet? s, int opts, ObjCBlock4 predicate) {
+    return _lib._objc_msgSend_109(
+        _id,
+        _lib._sel_indexOfObjectAtIndexes_options_passingTest_1,
+        s?._id ?? ffi.nullptr,
+        opts,
+        predicate._id);
+  }
+
+  NSIndexSet indexesOfObjectsPassingTest_(ObjCBlock4 predicate) {
+    final _ret = _lib._objc_msgSend_110(
+        _id, _lib._sel_indexesOfObjectsPassingTest_1, predicate._id);
+    return NSIndexSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSIndexSet indexesOfObjectsWithOptions_passingTest_(
+      int opts, ObjCBlock4 predicate) {
+    final _ret = _lib._objc_msgSend_111(
+        _id,
+        _lib._sel_indexesOfObjectsWithOptions_passingTest_1,
+        opts,
+        predicate._id);
+    return NSIndexSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSIndexSet indexesOfObjectsAtIndexes_options_passingTest_(
+      NSIndexSet? s, int opts, ObjCBlock4 predicate) {
+    final _ret = _lib._objc_msgSend_112(
+        _id,
+        _lib._sel_indexesOfObjectsAtIndexes_options_passingTest_1,
+        s?._id ?? ffi.nullptr,
+        opts,
+        predicate._id);
+    return NSIndexSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray sortedArrayUsingComparator_(NSComparator cmptr) {
+    final _ret = _lib._objc_msgSend_113(
+        _id, _lib._sel_sortedArrayUsingComparator_1, cmptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray sortedArrayWithOptions_usingComparator_(
+      int opts, NSComparator cmptr) {
+    final _ret = _lib._objc_msgSend_114(
+        _id, _lib._sel_sortedArrayWithOptions_usingComparator_1, opts, cmptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  int indexOfObject_inSortedRange_options_usingComparator_(
+      NSObject obj, NSRange r, int opts, NSComparator cmp) {
+    return _lib._objc_msgSend_115(
+        _id,
+        _lib._sel_indexOfObject_inSortedRange_options_usingComparator_1,
+        obj._id,
+        r,
+        opts,
+        cmp);
+  }
+
+  static NSArray array(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSArray1, _lib._sel_array1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray arrayWithObject_(AVFAudio _lib, NSObject anObject) {
+    final _ret = _lib._objc_msgSend_16(
+        _lib._class_NSArray1, _lib._sel_arrayWithObject_1, anObject._id);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray arrayWithObjects_count_(
+      AVFAudio _lib, ffi.Pointer<ffi.Pointer<ObjCObject>> objects, int cnt) {
+    final _ret = _lib._objc_msgSend_61(
+        _lib._class_NSArray1, _lib._sel_arrayWithObjects_count_1, objects, cnt);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray arrayWithObjects_(AVFAudio _lib, NSObject firstObj) {
+    final _ret = _lib._objc_msgSend_16(
+        _lib._class_NSArray1, _lib._sel_arrayWithObjects_1, firstObj._id);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray arrayWithArray_(AVFAudio _lib, NSArray? array) {
+    final _ret = _lib._objc_msgSend_67(_lib._class_NSArray1,
+        _lib._sel_arrayWithArray_1, array?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray initWithObjects_(NSObject firstObj) {
+    final _ret =
+        _lib._objc_msgSend_16(_id, _lib._sel_initWithObjects_1, firstObj._id);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray initWithArray_(NSArray? array) {
+    final _ret = _lib._objc_msgSend_67(
+        _id, _lib._sel_initWithArray_1, array?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray initWithArray_copyItems_(NSArray? array, bool flag) {
+    final _ret = _lib._objc_msgSend_116(_id,
+        _lib._sel_initWithArray_copyItems_1, array?._id ?? ffi.nullptr, flag);
+    return NSArray._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSArray initWithContentsOfURL_error_(
+      NSURL? url, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_117(
+        _id,
+        _lib._sel_initWithContentsOfURL_error_1,
+        url?._id ?? ffi.nullptr,
+        error);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray arrayWithContentsOfURL_error_(
+      AVFAudio _lib, NSURL? url, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_117(
+        _lib._class_NSArray1,
+        _lib._sel_arrayWithContentsOfURL_error_1,
+        url?._id ?? ffi.nullptr,
+        error);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  void getObjects_(ffi.Pointer<ffi.Pointer<ObjCObject>> objects) {
+    return _lib._objc_msgSend_118(_id, _lib._sel_getObjects_1, objects);
+  }
+
+  static NSArray arrayWithContentsOfFile_(AVFAudio _lib, NSString? path) {
+    final _ret = _lib._objc_msgSend_119(_lib._class_NSArray1,
+        _lib._sel_arrayWithContentsOfFile_1, path?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray arrayWithContentsOfURL_(AVFAudio _lib, NSURL? url) {
+    final _ret = _lib._objc_msgSend_120(_lib._class_NSArray1,
+        _lib._sel_arrayWithContentsOfURL_1, url?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray initWithContentsOfFile_(NSString? path) {
+    final _ret = _lib._objc_msgSend_119(
+        _id, _lib._sel_initWithContentsOfFile_1, path?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray initWithContentsOfURL_(NSURL? url) {
+    final _ret = _lib._objc_msgSend_120(
+        _id, _lib._sel_initWithContentsOfURL_1, url?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool writeToFile_atomically_(NSString? path, bool useAuxiliaryFile) {
+    return _lib._objc_msgSend_25(_id, _lib._sel_writeToFile_atomically_1,
+        path?._id ?? ffi.nullptr, useAuxiliaryFile);
+  }
+
+  bool writeToURL_atomically_(NSURL? url, bool atomically) {
+    return _lib._objc_msgSend_121(_id, _lib._sel_writeToURL_atomically_1,
+        url?._id ?? ffi.nullptr, atomically);
+  }
+
+  NSArray pathsMatchingExtensions_(NSArray? filterTypes) {
+    final _ret = _lib._objc_msgSend_63(_id, _lib._sel_pathsMatchingExtensions_1,
+        filterTypes?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSObject valueForKey_(NSString? key) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_valueForKey_1, key?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  void setValue_forKey_(NSObject value, NSString? key) {
+    return _lib._objc_msgSend_122(
+        _id, _lib._sel_setValue_forKey_1, value._id, key?._id ?? ffi.nullptr);
+  }
+
+  void addObserver_toObjectsAtIndexes_forKeyPath_options_context_(
+      NSObject? observer,
+      NSIndexSet? indexes,
+      NSString? keyPath,
+      int options,
+      ffi.Pointer<ffi.Void> context) {
+    return _lib._objc_msgSend_123(
+        _id,
+        _lib._sel_addObserver_toObjectsAtIndexes_forKeyPath_options_context_1,
+        observer?._id ?? ffi.nullptr,
+        indexes?._id ?? ffi.nullptr,
+        keyPath?._id ?? ffi.nullptr,
+        options,
+        context);
+  }
+
+  void removeObserver_fromObjectsAtIndexes_forKeyPath_context_(
+      NSObject? observer,
+      NSIndexSet? indexes,
+      NSString? keyPath,
+      ffi.Pointer<ffi.Void> context) {
+    return _lib._objc_msgSend_124(
+        _id,
+        _lib._sel_removeObserver_fromObjectsAtIndexes_forKeyPath_context_1,
+        observer?._id ?? ffi.nullptr,
+        indexes?._id ?? ffi.nullptr,
+        keyPath?._id ?? ffi.nullptr,
+        context);
+  }
+
+  void removeObserver_fromObjectsAtIndexes_forKeyPath_(
+      NSObject? observer, NSIndexSet? indexes, NSString? keyPath) {
+    return _lib._objc_msgSend_125(
+        _id,
+        _lib._sel_removeObserver_fromObjectsAtIndexes_forKeyPath_1,
+        observer?._id ?? ffi.nullptr,
+        indexes?._id ?? ffi.nullptr,
+        keyPath?._id ?? ffi.nullptr);
+  }
+
+  @override
+  void addObserver_forKeyPath_options_context_(NSObject? observer,
+      NSString? keyPath, int options, ffi.Pointer<ffi.Void> context) {
+    return _lib._objc_msgSend_126(
+        _id,
+        _lib._sel_addObserver_forKeyPath_options_context_1,
+        observer?._id ?? ffi.nullptr,
+        keyPath?._id ?? ffi.nullptr,
+        options,
+        context);
+  }
+
+  @override
+  void removeObserver_forKeyPath_context_(
+      NSObject? observer, NSString? keyPath, ffi.Pointer<ffi.Void> context) {
+    return _lib._objc_msgSend_127(
+        _id,
+        _lib._sel_removeObserver_forKeyPath_context_1,
+        observer?._id ?? ffi.nullptr,
+        keyPath?._id ?? ffi.nullptr,
+        context);
+  }
+
+  @override
+  void removeObserver_forKeyPath_(NSObject? observer, NSString? keyPath) {
+    return _lib._objc_msgSend_128(_id, _lib._sel_removeObserver_forKeyPath_1,
+        observer?._id ?? ffi.nullptr, keyPath?._id ?? ffi.nullptr);
+  }
+
+  NSArray sortedArrayUsingDescriptors_(NSArray? sortDescriptors) {
+    final _ret = _lib._objc_msgSend_63(
+        _id,
+        _lib._sel_sortedArrayUsingDescriptors_1,
+        sortDescriptors?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray filteredArrayUsingPredicate_(NSPredicate? predicate) {
+    final _ret = _lib._objc_msgSend_195(_id,
+        _lib._sel_filteredArrayUsingPredicate_1, predicate?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSArray1, _lib._sel_new1);
+    return NSArray._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSArray alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSArray1, _lib._sel_alloc1);
+    return NSArray._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSArray1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSArray1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSArray1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSArray1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSArray1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSArray1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSArray1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSArray1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSArray1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef NSInteger = ffi.Long;
+
+class NSError extends NSObject {
+  NSError._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSError] that points to the same underlying object as [other].
+  static NSError castFrom<T extends _ObjCWrapper>(T other) {
+    return NSError._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSError] that wraps the given raw object pointer.
+  static NSError castFromPointer(AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSError._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSError].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSError1);
+  }
+
+  NSError initWithDomain_code_userInfo_(NSErrorDomain domain, int code) {
+    final _ret = _lib._objc_msgSend_77(
+        _id, _lib._sel_initWithDomain_code_userInfo_1, domain, code);
+    return NSError._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSError errorWithDomain_code_userInfo_(
+      AVFAudio _lib, NSErrorDomain domain, int code) {
+    final _ret = _lib._objc_msgSend_77(_lib._class_NSError1,
+        _lib._sel_errorWithDomain_code_userInfo_1, domain, code);
+    return NSError._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSErrorDomain get domain {
+    return _lib._objc_msgSend_20(_id, _lib._sel_domain1);
+  }
+
+  int get code {
+    return _lib._objc_msgSend_78(_id, _lib._sel_code1);
+  }
+
+  static NSError new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSError1, _lib._sel_new1);
+    return NSError._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSError alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSError1, _lib._sel_alloc1);
+    return NSError._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSError1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSError1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSError1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSError1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSError1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSError1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSError1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSError1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSError1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef NSErrorDomain = ffi.Pointer<ObjCObject>;
+
+class NSIndexSet extends NSObject {
+  NSIndexSet._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSIndexSet] that points to the same underlying object as [other].
+  static NSIndexSet castFrom<T extends _ObjCWrapper>(T other) {
+    return NSIndexSet._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSIndexSet] that wraps the given raw object pointer.
+  static NSIndexSet castFromPointer(AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSIndexSet._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSIndexSet].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSIndexSet1);
+  }
+
+  static NSIndexSet indexSet(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSIndexSet1, _lib._sel_indexSet1);
+    return NSIndexSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSIndexSet indexSetWithIndex_(AVFAudio _lib, int value) {
+    final _ret = _lib._objc_msgSend_60(
+        _lib._class_NSIndexSet1, _lib._sel_indexSetWithIndex_1, value);
+    return NSIndexSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSIndexSet indexSetWithIndexesInRange_(AVFAudio _lib, NSRange range) {
+    final _ret = _lib._objc_msgSend_83(
+        _lib._class_NSIndexSet1, _lib._sel_indexSetWithIndexesInRange_1, range);
+    return NSIndexSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSIndexSet initWithIndexesInRange_(NSRange range) {
+    final _ret =
+        _lib._objc_msgSend_83(_id, _lib._sel_initWithIndexesInRange_1, range);
+    return NSIndexSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSIndexSet initWithIndexSet_(NSIndexSet? indexSet) {
+    final _ret = _lib._objc_msgSend_84(
+        _id, _lib._sel_initWithIndexSet_1, indexSet?._id ?? ffi.nullptr);
+    return NSIndexSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSIndexSet initWithIndex_(int value) {
+    final _ret = _lib._objc_msgSend_60(_id, _lib._sel_initWithIndex_1, value);
+    return NSIndexSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool isEqualToIndexSet_(NSIndexSet? indexSet) {
+    return _lib._objc_msgSend_85(
+        _id, _lib._sel_isEqualToIndexSet_1, indexSet?._id ?? ffi.nullptr);
+  }
+
+  int get count {
+    return _lib._objc_msgSend_10(_id, _lib._sel_count1);
+  }
+
+  int get firstIndex {
+    return _lib._objc_msgSend_10(_id, _lib._sel_firstIndex1);
+  }
+
+  int get lastIndex {
+    return _lib._objc_msgSend_10(_id, _lib._sel_lastIndex1);
+  }
+
+  int indexGreaterThanIndex_(int value) {
+    return _lib._objc_msgSend_86(_id, _lib._sel_indexGreaterThanIndex_1, value);
+  }
+
+  int indexLessThanIndex_(int value) {
+    return _lib._objc_msgSend_86(_id, _lib._sel_indexLessThanIndex_1, value);
+  }
+
+  int indexGreaterThanOrEqualToIndex_(int value) {
+    return _lib._objc_msgSend_86(
+        _id, _lib._sel_indexGreaterThanOrEqualToIndex_1, value);
+  }
+
+  int indexLessThanOrEqualToIndex_(int value) {
+    return _lib._objc_msgSend_86(
+        _id, _lib._sel_indexLessThanOrEqualToIndex_1, value);
+  }
+
+  int getIndexes_maxCount_inIndexRange_(ffi.Pointer<NSUInteger> indexBuffer,
+      int bufferSize, NSRangePointer range) {
+    return _lib._objc_msgSend_87(
+        _id,
+        _lib._sel_getIndexes_maxCount_inIndexRange_1,
+        indexBuffer,
+        bufferSize,
+        range);
+  }
+
+  int countOfIndexesInRange_(NSRange range) {
+    return _lib._objc_msgSend_88(_id, _lib._sel_countOfIndexesInRange_1, range);
+  }
+
+  bool containsIndex_(int value) {
+    return _lib._objc_msgSend_89(_id, _lib._sel_containsIndex_1, value);
+  }
+
+  bool containsIndexesInRange_(NSRange range) {
+    return _lib._objc_msgSend_90(
+        _id, _lib._sel_containsIndexesInRange_1, range);
+  }
+
+  bool containsIndexes_(NSIndexSet? indexSet) {
+    return _lib._objc_msgSend_85(
+        _id, _lib._sel_containsIndexes_1, indexSet?._id ?? ffi.nullptr);
+  }
+
+  bool intersectsIndexesInRange_(NSRange range) {
+    return _lib._objc_msgSend_90(
+        _id, _lib._sel_intersectsIndexesInRange_1, range);
+  }
+
+  void enumerateIndexesUsingBlock_(ObjCBlock block) {
+    return _lib._objc_msgSend_91(
+        _id, _lib._sel_enumerateIndexesUsingBlock_1, block._id);
+  }
+
+  void enumerateIndexesWithOptions_usingBlock_(int opts, ObjCBlock block) {
+    return _lib._objc_msgSend_92(_id,
+        _lib._sel_enumerateIndexesWithOptions_usingBlock_1, opts, block._id);
+  }
+
+  void enumerateIndexesInRange_options_usingBlock_(
+      NSRange range, int opts, ObjCBlock block) {
+    return _lib._objc_msgSend_93(
+        _id,
+        _lib._sel_enumerateIndexesInRange_options_usingBlock_1,
+        range,
+        opts,
+        block._id);
+  }
+
+  int indexPassingTest_(ObjCBlock1 predicate) {
+    return _lib._objc_msgSend_94(
+        _id, _lib._sel_indexPassingTest_1, predicate._id);
+  }
+
+  int indexWithOptions_passingTest_(int opts, ObjCBlock1 predicate) {
+    return _lib._objc_msgSend_95(
+        _id, _lib._sel_indexWithOptions_passingTest_1, opts, predicate._id);
+  }
+
+  int indexInRange_options_passingTest_(
+      NSRange range, int opts, ObjCBlock1 predicate) {
+    return _lib._objc_msgSend_96(
+        _id,
+        _lib._sel_indexInRange_options_passingTest_1,
+        range,
+        opts,
+        predicate._id);
+  }
+
+  NSIndexSet indexesPassingTest_(ObjCBlock1 predicate) {
+    final _ret = _lib._objc_msgSend_97(
+        _id, _lib._sel_indexesPassingTest_1, predicate._id);
+    return NSIndexSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSIndexSet indexesWithOptions_passingTest_(int opts, ObjCBlock1 predicate) {
+    final _ret = _lib._objc_msgSend_98(
+        _id, _lib._sel_indexesWithOptions_passingTest_1, opts, predicate._id);
+    return NSIndexSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSIndexSet indexesInRange_options_passingTest_(
+      NSRange range, int opts, ObjCBlock1 predicate) {
+    final _ret = _lib._objc_msgSend_99(
+        _id,
+        _lib._sel_indexesInRange_options_passingTest_1,
+        range,
+        opts,
+        predicate._id);
+    return NSIndexSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  void enumerateRangesUsingBlock_(ObjCBlock2 block) {
+    return _lib._objc_msgSend_100(
+        _id, _lib._sel_enumerateRangesUsingBlock_1, block._id);
+  }
+
+  void enumerateRangesWithOptions_usingBlock_(int opts, ObjCBlock2 block) {
+    return _lib._objc_msgSend_101(_id,
+        _lib._sel_enumerateRangesWithOptions_usingBlock_1, opts, block._id);
+  }
+
+  void enumerateRangesInRange_options_usingBlock_(
+      NSRange range, int opts, ObjCBlock2 block) {
+    return _lib._objc_msgSend_102(
+        _id,
+        _lib._sel_enumerateRangesInRange_options_usingBlock_1,
+        range,
+        opts,
+        block._id);
+  }
+
+  static NSIndexSet new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSIndexSet1, _lib._sel_new1);
+    return NSIndexSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSIndexSet alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSIndexSet1, _lib._sel_alloc1);
+    return NSIndexSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSIndexSet1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSIndexSet1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSIndexSet1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSIndexSet1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSIndexSet1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSIndexSet1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSIndexSet1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSIndexSet1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSIndexSet1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef NSRangePointer = ffi.Pointer<NSRange>;
+
+class _ObjCBlockBase implements ffi.Finalizable {
+  final ffi.Pointer<_ObjCBlock> _id;
+  final AVFAudio _lib;
+  bool _pendingRelease;
+
+  _ObjCBlockBase._(this._id, this._lib,
+      {bool retain = false, bool release = false})
+      : _pendingRelease = release {
+    if (retain) {
+      _lib._Block_copy(_id.cast());
+    }
+    if (release) {
+      _lib._objc_releaseFinalizer11.attach(this, _id.cast(), detach: this);
+    }
+  }
+
+  /// Releases the reference to the underlying ObjC block held by this wrapper.
+  /// Throws a StateError if this wrapper doesn't currently hold a reference.
+  void release() {
+    if (_pendingRelease) {
+      _pendingRelease = false;
+      _lib._Block_release(_id.cast());
+      _lib._objc_releaseFinalizer11.detach(this);
+    } else {
+      throw StateError(
+          'Released an ObjC block that was unowned or already released.');
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    return other is _ObjCBlockBase && _id == other._id;
+  }
+
+  @override
+  int get hashCode => _id.hashCode;
+}
+
+void _ObjCBlock_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block, int arg0, ffi.Pointer<ffi.Bool> arg1) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(NSUInteger arg0, ffi.Pointer<ffi.Bool> arg1)>>()
+      .asFunction<
+          void Function(int arg0, ffi.Pointer<ffi.Bool> arg1)>()(arg0, arg1);
+}
+
+final _ObjCBlock_closureRegistry = <int, Function>{};
+int _ObjCBlock_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock_registerClosure(Function fn) {
+  final id = ++_ObjCBlock_closureRegistryIndex;
+  _ObjCBlock_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block, int arg0, ffi.Pointer<ffi.Bool> arg1) {
+  return _ObjCBlock_closureRegistry[block.ref.target.address]!(arg0, arg1);
+}
+
+class ObjCBlock extends _ObjCBlockBase {
+  ObjCBlock._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(
+                      NSUInteger arg0, ffi.Pointer<ffi.Bool> arg1)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                NSUInteger arg0, ffi.Pointer<ffi.Bool> arg1)>(
+                        _ObjCBlock_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock.fromFunction(
+      AVFAudio lib, void Function(int arg0, ffi.Pointer<ffi.Bool> arg1) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                NSUInteger arg0, ffi.Pointer<ffi.Bool> arg1)>(
+                        _ObjCBlock_closureTrampoline)
+                    .cast(),
+                _ObjCBlock_registerClosure(fn)),
+            lib);
+  void call(int arg0, ffi.Pointer<ffi.Bool> arg1) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                    NSUInteger arg0, ffi.Pointer<ffi.Bool> arg1)>>()
+        .asFunction<
+            void Function(ffi.Pointer<_ObjCBlock> block, int arg0,
+                ffi.Pointer<ffi.Bool> arg1)>()(_id, arg0, arg1);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class _ObjCBlockDesc extends ffi.Struct {
+  @ffi.UnsignedLong()
+  external int reserved;
+
+  @ffi.UnsignedLong()
+  external int size;
+
+  external ffi.Pointer<ffi.Void> copy_helper;
+
+  external ffi.Pointer<ffi.Void> dispose_helper;
+
+  external ffi.Pointer<ffi.Char> signature;
+}
+
+class _ObjCBlock extends ffi.Struct {
+  external ffi.Pointer<ffi.Void> isa;
+
+  @ffi.Int()
+  external int flags;
+
+  @ffi.Int()
+  external int reserved;
+
+  external ffi.Pointer<ffi.Void> invoke;
+
+  external ffi.Pointer<_ObjCBlockDesc> descriptor;
+
+  external ffi.Pointer<ffi.Void> target;
+}
+
+abstract class NSEnumerationOptions {
+  static const int NSEnumerationConcurrent = 1;
+  static const int NSEnumerationReverse = 2;
+}
+
+bool _ObjCBlock1_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block, int arg0, ffi.Pointer<ffi.Bool> arg1) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Bool Function(NSUInteger arg0, ffi.Pointer<ffi.Bool> arg1)>>()
+      .asFunction<
+          bool Function(int arg0, ffi.Pointer<ffi.Bool> arg1)>()(arg0, arg1);
+}
+
+final _ObjCBlock1_closureRegistry = <int, Function>{};
+int _ObjCBlock1_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock1_registerClosure(Function fn) {
+  final id = ++_ObjCBlock1_closureRegistryIndex;
+  _ObjCBlock1_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+bool _ObjCBlock1_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block, int arg0, ffi.Pointer<ffi.Bool> arg1) {
+  return _ObjCBlock1_closureRegistry[block.ref.target.address]!(arg0, arg1);
+}
+
+class ObjCBlock1 extends _ObjCBlockBase {
+  ObjCBlock1._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock1.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Bool Function(
+                      NSUInteger arg0, ffi.Pointer<ffi.Bool> arg1)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Bool Function(ffi.Pointer<_ObjCBlock> block,
+                                NSUInteger arg0, ffi.Pointer<ffi.Bool> arg1)>(
+                        _ObjCBlock1_fnPtrTrampoline, false)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock1.fromFunction(
+      AVFAudio lib, bool Function(int arg0, ffi.Pointer<ffi.Bool> arg1) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Bool Function(ffi.Pointer<_ObjCBlock> block,
+                                NSUInteger arg0, ffi.Pointer<ffi.Bool> arg1)>(
+                        _ObjCBlock1_closureTrampoline, false)
+                    .cast(),
+                _ObjCBlock1_registerClosure(fn)),
+            lib);
+  bool call(int arg0, ffi.Pointer<ffi.Bool> arg1) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Bool Function(ffi.Pointer<_ObjCBlock> block,
+                    NSUInteger arg0, ffi.Pointer<ffi.Bool> arg1)>>()
+        .asFunction<
+            bool Function(ffi.Pointer<_ObjCBlock> block, int arg0,
+                ffi.Pointer<ffi.Bool> arg1)>()(_id, arg0, arg1);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+void _ObjCBlock2_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block, NSRange arg0, ffi.Pointer<ffi.Bool> arg1) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(NSRange arg0, ffi.Pointer<ffi.Bool> arg1)>>()
+      .asFunction<
+          void Function(
+              NSRange arg0, ffi.Pointer<ffi.Bool> arg1)>()(arg0, arg1);
+}
+
+final _ObjCBlock2_closureRegistry = <int, Function>{};
+int _ObjCBlock2_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock2_registerClosure(Function fn) {
+  final id = ++_ObjCBlock2_closureRegistryIndex;
+  _ObjCBlock2_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock2_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block, NSRange arg0, ffi.Pointer<ffi.Bool> arg1) {
+  return _ObjCBlock2_closureRegistry[block.ref.target.address]!(arg0, arg1);
+}
+
+class ObjCBlock2 extends _ObjCBlockBase {
+  ObjCBlock2._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock2.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(NSRange arg0, ffi.Pointer<ffi.Bool> arg1)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                NSRange arg0, ffi.Pointer<ffi.Bool> arg1)>(
+                        _ObjCBlock2_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock2.fromFunction(
+      AVFAudio lib, void Function(NSRange arg0, ffi.Pointer<ffi.Bool> arg1) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                NSRange arg0, ffi.Pointer<ffi.Bool> arg1)>(
+                        _ObjCBlock2_closureTrampoline)
+                    .cast(),
+                _ObjCBlock2_registerClosure(fn)),
+            lib);
+  void call(NSRange arg0, ffi.Pointer<ffi.Bool> arg1) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(ffi.Pointer<_ObjCBlock> block, NSRange arg0,
+                    ffi.Pointer<ffi.Bool> arg1)>>()
+        .asFunction<
+            void Function(ffi.Pointer<_ObjCBlock> block, NSRange arg0,
+                ffi.Pointer<ffi.Bool> arg1)>()(_id, arg0, arg1);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+void _ObjCBlock3_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, int arg1, ffi.Pointer<ffi.Bool> arg2) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(ffi.Pointer<ObjCObject> arg0, NSUInteger arg1,
+                  ffi.Pointer<ffi.Bool> arg2)>>()
+      .asFunction<
+          void Function(ffi.Pointer<ObjCObject> arg0, int arg1,
+              ffi.Pointer<ffi.Bool> arg2)>()(arg0, arg1, arg2);
+}
+
+final _ObjCBlock3_closureRegistry = <int, Function>{};
+int _ObjCBlock3_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock3_registerClosure(Function fn) {
+  final id = ++_ObjCBlock3_closureRegistryIndex;
+  _ObjCBlock3_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock3_closureTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, int arg1, ffi.Pointer<ffi.Bool> arg2) {
+  return _ObjCBlock3_closureRegistry[block.ref.target.address]!(
+      arg0, arg1, arg2);
+}
+
+class ObjCBlock3 extends _ObjCBlockBase {
+  ObjCBlock3._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock3.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0,
+                      NSUInteger arg1, ffi.Pointer<ffi.Bool> arg2)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                NSUInteger arg1,
+                                ffi.Pointer<ffi.Bool> arg2)>(
+                        _ObjCBlock3_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock3.fromFunction(
+      AVFAudio lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, int arg1,
+              ffi.Pointer<ffi.Bool> arg2)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                NSUInteger arg1,
+                                ffi.Pointer<ffi.Bool> arg2)>(
+                        _ObjCBlock3_closureTrampoline)
+                    .cast(),
+                _ObjCBlock3_registerClosure(fn)),
+            lib);
+  void call(
+      ffi.Pointer<ObjCObject> arg0, int arg1, ffi.Pointer<ffi.Bool> arg2) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    NSUInteger arg1,
+                    ffi.Pointer<ffi.Bool> arg2)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                int arg1,
+                ffi.Pointer<ffi.Bool> arg2)>()(_id, arg0, arg1, arg2);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+bool _ObjCBlock4_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, int arg1, ffi.Pointer<ffi.Bool> arg2) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Bool Function(ffi.Pointer<ObjCObject> arg0, NSUInteger arg1,
+                  ffi.Pointer<ffi.Bool> arg2)>>()
+      .asFunction<
+          bool Function(ffi.Pointer<ObjCObject> arg0, int arg1,
+              ffi.Pointer<ffi.Bool> arg2)>()(arg0, arg1, arg2);
+}
+
+final _ObjCBlock4_closureRegistry = <int, Function>{};
+int _ObjCBlock4_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock4_registerClosure(Function fn) {
+  final id = ++_ObjCBlock4_closureRegistryIndex;
+  _ObjCBlock4_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+bool _ObjCBlock4_closureTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, int arg1, ffi.Pointer<ffi.Bool> arg2) {
+  return _ObjCBlock4_closureRegistry[block.ref.target.address]!(
+      arg0, arg1, arg2);
+}
+
+class ObjCBlock4 extends _ObjCBlockBase {
+  ObjCBlock4._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock4.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Bool Function(ffi.Pointer<ObjCObject> arg0,
+                      NSUInteger arg1, ffi.Pointer<ffi.Bool> arg2)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Bool Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                NSUInteger arg1,
+                                ffi.Pointer<ffi.Bool> arg2)>(
+                        _ObjCBlock4_fnPtrTrampoline, false)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock4.fromFunction(
+      AVFAudio lib,
+      bool Function(ffi.Pointer<ObjCObject> arg0, int arg1,
+              ffi.Pointer<ffi.Bool> arg2)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Bool Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                NSUInteger arg1,
+                                ffi.Pointer<ffi.Bool> arg2)>(
+                        _ObjCBlock4_closureTrampoline, false)
+                    .cast(),
+                _ObjCBlock4_registerClosure(fn)),
+            lib);
+  bool call(
+      ffi.Pointer<ObjCObject> arg0, int arg1, ffi.Pointer<ffi.Bool> arg2) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Bool Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    NSUInteger arg1,
+                    ffi.Pointer<ffi.Bool> arg2)>>()
+        .asFunction<
+            bool Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                int arg1,
+                ffi.Pointer<ffi.Bool> arg2)>()(_id, arg0, arg1, arg2);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+typedef NSComparator = ffi.Pointer<_ObjCBlock>;
+int _ObjCBlock5_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Int32 Function(ffi.Pointer<ObjCObject> arg0,
+                  ffi.Pointer<ObjCObject> arg1)>>()
+      .asFunction<
+          int Function(ffi.Pointer<ObjCObject> arg0,
+              ffi.Pointer<ObjCObject> arg1)>()(arg0, arg1);
+}
+
+final _ObjCBlock5_closureRegistry = <int, Function>{};
+int _ObjCBlock5_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock5_registerClosure(Function fn) {
+  final id = ++_ObjCBlock5_closureRegistryIndex;
+  _ObjCBlock5_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+int _ObjCBlock5_closureTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1) {
+  return _ObjCBlock5_closureRegistry[block.ref.target.address]!(arg0, arg1);
+}
+
+class ObjCBlock5 extends _ObjCBlockBase {
+  ObjCBlock5._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock5.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Int32 Function(ffi.Pointer<ObjCObject> arg0,
+                      ffi.Pointer<ObjCObject> arg1)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Int32 Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1)>(
+                        _ObjCBlock5_fnPtrTrampoline, 0)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock5.fromFunction(
+      AVFAudio lib,
+      int Function(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Int32 Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1)>(
+                        _ObjCBlock5_closureTrampoline, 0)
+                    .cast(),
+                _ObjCBlock5_registerClosure(fn)),
+            lib);
+  int call(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Int32 Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    ffi.Pointer<ObjCObject> arg1)>>()
+        .asFunction<
+            int Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                ffi.Pointer<ObjCObject> arg1)>()(_id, arg0, arg1);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+abstract class NSComparisonResult {
+  static const int NSOrderedAscending = -1;
+  static const int NSOrderedSame = 0;
+  static const int NSOrderedDescending = 1;
+}
+
+abstract class NSSortOptions {
+  static const int NSSortConcurrent = 1;
+  static const int NSSortStable = 16;
+}
+
+abstract class NSBinarySearchingOptions {
+  static const int NSBinarySearchingFirstEqual = 256;
+  static const int NSBinarySearchingLastEqual = 512;
+  static const int NSBinarySearchingInsertionIndex = 1024;
+}
+
+abstract class NSKeyValueObservingOptions {
+  static const int NSKeyValueObservingOptionNew = 1;
+  static const int NSKeyValueObservingOptionOld = 2;
+  static const int NSKeyValueObservingOptionInitial = 4;
+  static const int NSKeyValueObservingOptionPrior = 8;
+}
+
+class NSPredicate extends NSObject {
+  NSPredicate._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSPredicate] that points to the same underlying object as [other].
+  static NSPredicate castFrom<T extends _ObjCWrapper>(T other) {
+    return NSPredicate._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSPredicate] that wraps the given raw object pointer.
+  static NSPredicate castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSPredicate._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSPredicate].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSPredicate1);
+  }
+
+  static NSPredicate predicateWithFormat_argumentArray_(
+      AVFAudio _lib, NSString? predicateFormat, NSArray? arguments) {
+    final _ret = _lib._objc_msgSend_129(
+        _lib._class_NSPredicate1,
+        _lib._sel_predicateWithFormat_argumentArray_1,
+        predicateFormat?._id ?? ffi.nullptr,
+        arguments?._id ?? ffi.nullptr);
+    return NSPredicate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSPredicate predicateWithFormat_(
+      AVFAudio _lib, NSString? predicateFormat) {
+    final _ret = _lib._objc_msgSend_130(_lib._class_NSPredicate1,
+        _lib._sel_predicateWithFormat_1, predicateFormat?._id ?? ffi.nullptr);
+    return NSPredicate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSPredicate predicateWithFormat_arguments_(AVFAudio _lib,
+      NSString? predicateFormat, ffi.Pointer<__va_list_tag> argList) {
+    final _ret = _lib._objc_msgSend_131(
+        _lib._class_NSPredicate1,
+        _lib._sel_predicateWithFormat_arguments_1,
+        predicateFormat?._id ?? ffi.nullptr,
+        argList);
+    return NSPredicate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSPredicate predicateFromMetadataQueryString_(
+      AVFAudio _lib, NSString? queryString) {
+    final _ret = _lib._objc_msgSend_130(
+        _lib._class_NSPredicate1,
+        _lib._sel_predicateFromMetadataQueryString_1,
+        queryString?._id ?? ffi.nullptr);
+    return NSPredicate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSPredicate predicateWithValue_(AVFAudio _lib, bool value) {
+    final _ret = _lib._objc_msgSend_132(
+        _lib._class_NSPredicate1, _lib._sel_predicateWithValue_1, value);
+    return NSPredicate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSPredicate predicateWithBlock_(AVFAudio _lib, ObjCBlock6 block) {
+    final _ret = _lib._objc_msgSend_193(
+        _lib._class_NSPredicate1, _lib._sel_predicateWithBlock_1, block._id);
+    return NSPredicate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get predicateFormat {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_predicateFormat1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSPredicate predicateWithSubstitutionVariables_(NSDictionary? variables) {
+    final _ret = _lib._objc_msgSend_143(
+        _id,
+        _lib._sel_predicateWithSubstitutionVariables_1,
+        variables?._id ?? ffi.nullptr);
+    return NSPredicate._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool evaluateWithObject_(NSObject object) {
+    return _lib._objc_msgSend_0(
+        _id, _lib._sel_evaluateWithObject_1, object._id);
+  }
+
+  bool evaluateWithObject_substitutionVariables_(
+      NSObject object, NSDictionary? bindings) {
+    return _lib._objc_msgSend_194(
+        _id,
+        _lib._sel_evaluateWithObject_substitutionVariables_1,
+        object._id,
+        bindings?._id ?? ffi.nullptr);
+  }
+
+  void allowEvaluation() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_allowEvaluation1);
+  }
+
+  static NSPredicate new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSPredicate1, _lib._sel_new1);
+    return NSPredicate._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSPredicate alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSPredicate1, _lib._sel_alloc1);
+    return NSPredicate._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSPredicate1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSPredicate1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSPredicate1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSPredicate1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSPredicate1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSPredicate1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSPredicate1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSPredicate1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSPredicate1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class __va_list_tag extends ffi.Struct {
+  @ffi.UnsignedInt()
+  external int gp_offset;
+
+  @ffi.UnsignedInt()
+  external int fp_offset;
+
+  external ffi.Pointer<ffi.Void> overflow_arg_area;
+
+  external ffi.Pointer<ffi.Void> reg_save_area;
+}
+
+bool _ObjCBlock6_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Bool Function(ffi.Pointer<ObjCObject> arg0,
+                  ffi.Pointer<ObjCObject> arg1)>>()
+      .asFunction<
+          bool Function(ffi.Pointer<ObjCObject> arg0,
+              ffi.Pointer<ObjCObject> arg1)>()(arg0, arg1);
+}
+
+final _ObjCBlock6_closureRegistry = <int, Function>{};
+int _ObjCBlock6_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock6_registerClosure(Function fn) {
+  final id = ++_ObjCBlock6_closureRegistryIndex;
+  _ObjCBlock6_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+bool _ObjCBlock6_closureTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1) {
+  return _ObjCBlock6_closureRegistry[block.ref.target.address]!(arg0, arg1);
+}
+
+class ObjCBlock6 extends _ObjCBlockBase {
+  ObjCBlock6._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock6.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Bool Function(ffi.Pointer<ObjCObject> arg0,
+                      ffi.Pointer<ObjCObject> arg1)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Bool Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1)>(
+                        _ObjCBlock6_fnPtrTrampoline, false)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock6.fromFunction(
+      AVFAudio lib,
+      bool Function(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Bool Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1)>(
+                        _ObjCBlock6_closureTrampoline, false)
+                    .cast(),
+                _ObjCBlock6_registerClosure(fn)),
+            lib);
+  bool call(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Bool Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    ffi.Pointer<ObjCObject> arg1)>>()
+        .asFunction<
+            bool Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                ffi.Pointer<ObjCObject> arg1)>()(_id, arg0, arg1);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class NSDictionary extends NSObject {
+  NSDictionary._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSDictionary] that points to the same underlying object as [other].
+  static NSDictionary castFrom<T extends _ObjCWrapper>(T other) {
+    return NSDictionary._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSDictionary] that wraps the given raw object pointer.
+  static NSDictionary castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSDictionary._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSDictionary].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSDictionary1);
+  }
+
+  int get count {
+    return _lib._objc_msgSend_10(_id, _lib._sel_count1);
+  }
+
+  NSObject objectForKey_(NSObject aKey) {
+    final _ret = _lib._objc_msgSend_16(_id, _lib._sel_objectForKey_1, aKey._id);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSEnumerator keyEnumerator() {
+    final _ret = _lib._objc_msgSend_72(_id, _lib._sel_keyEnumerator1);
+    return NSEnumerator._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSDictionary init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary initWithObjects_forKeys_count_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> objects,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> keys,
+      int cnt) {
+    final _ret = _lib._objc_msgSend_133(
+        _id, _lib._sel_initWithObjects_forKeys_count_1, objects, keys, cnt);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary initWithCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get allKeys {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_allKeys1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray allKeysForObject_(NSObject anObject) {
+    final _ret =
+        _lib._objc_msgSend_62(_id, _lib._sel_allKeysForObject_1, anObject._id);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get allValues {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_allValues1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get description {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_description1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get descriptionInStringsFileFormat {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_descriptionInStringsFileFormat1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString descriptionWithLocale_(NSObject locale) {
+    final _ret = _lib._objc_msgSend_65(
+        _id, _lib._sel_descriptionWithLocale_1, locale._id);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString descriptionWithLocale_indent_(NSObject locale, int level) {
+    final _ret = _lib._objc_msgSend_66(
+        _id, _lib._sel_descriptionWithLocale_indent_1, locale._id, level);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool isEqualToDictionary_(NSDictionary? otherDictionary) {
+    return _lib._objc_msgSend_134(_id, _lib._sel_isEqualToDictionary_1,
+        otherDictionary?._id ?? ffi.nullptr);
+  }
+
+  NSEnumerator objectEnumerator() {
+    final _ret = _lib._objc_msgSend_72(_id, _lib._sel_objectEnumerator1);
+    return NSEnumerator._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray objectsForKeys_notFoundMarker_(NSArray? keys, NSObject marker) {
+    final _ret = _lib._objc_msgSend_135(
+        _id,
+        _lib._sel_objectsForKeys_notFoundMarker_1,
+        keys?._id ?? ffi.nullptr,
+        marker._id);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool writeToURL_error_(
+      NSURL? url, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_81(
+        _id, _lib._sel_writeToURL_error_1, url?._id ?? ffi.nullptr, error);
+  }
+
+  NSArray keysSortedByValueUsingSelector_(ffi.Pointer<ObjCSel> comparator) {
+    final _ret = _lib._objc_msgSend_75(
+        _id, _lib._sel_keysSortedByValueUsingSelector_1, comparator);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  void getObjects_andKeys_count_(ffi.Pointer<ffi.Pointer<ObjCObject>> objects,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> keys, int count) {
+    return _lib._objc_msgSend_136(
+        _id, _lib._sel_getObjects_andKeys_count_1, objects, keys, count);
+  }
+
+  NSObject objectForKeyedSubscript_(NSObject key) {
+    final _ret = _lib._objc_msgSend_16(
+        _id, _lib._sel_objectForKeyedSubscript_1, key._id);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void enumerateKeysAndObjectsUsingBlock_(ObjCBlock7 block) {
+    return _lib._objc_msgSend_137(
+        _id, _lib._sel_enumerateKeysAndObjectsUsingBlock_1, block._id);
+  }
+
+  void enumerateKeysAndObjectsWithOptions_usingBlock_(
+      int opts, ObjCBlock7 block) {
+    return _lib._objc_msgSend_138(
+        _id,
+        _lib._sel_enumerateKeysAndObjectsWithOptions_usingBlock_1,
+        opts,
+        block._id);
+  }
+
+  NSArray keysSortedByValueUsingComparator_(NSComparator cmptr) {
+    final _ret = _lib._objc_msgSend_113(
+        _id, _lib._sel_keysSortedByValueUsingComparator_1, cmptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray keysSortedByValueWithOptions_usingComparator_(
+      int opts, NSComparator cmptr) {
+    final _ret = _lib._objc_msgSend_114(_id,
+        _lib._sel_keysSortedByValueWithOptions_usingComparator_1, opts, cmptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  void getObjects_andKeys_(ffi.Pointer<ffi.Pointer<ObjCObject>> objects,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> keys) {
+    return _lib._objc_msgSend_139(
+        _id, _lib._sel_getObjects_andKeys_1, objects, keys);
+  }
+
+  static NSDictionary dictionaryWithContentsOfFile_(
+      AVFAudio _lib, NSString? path) {
+    final _ret = _lib._objc_msgSend_140(_lib._class_NSDictionary1,
+        _lib._sel_dictionaryWithContentsOfFile_1, path?._id ?? ffi.nullptr);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDictionary dictionaryWithContentsOfURL_(AVFAudio _lib, NSURL? url) {
+    final _ret = _lib._objc_msgSend_141(_lib._class_NSDictionary1,
+        _lib._sel_dictionaryWithContentsOfURL_1, url?._id ?? ffi.nullptr);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary initWithContentsOfFile_(NSString? path) {
+    final _ret = _lib._objc_msgSend_140(
+        _id, _lib._sel_initWithContentsOfFile_1, path?._id ?? ffi.nullptr);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary initWithContentsOfURL_(NSURL? url) {
+    final _ret = _lib._objc_msgSend_141(
+        _id, _lib._sel_initWithContentsOfURL_1, url?._id ?? ffi.nullptr);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool writeToFile_atomically_(NSString? path, bool useAuxiliaryFile) {
+    return _lib._objc_msgSend_25(_id, _lib._sel_writeToFile_atomically_1,
+        path?._id ?? ffi.nullptr, useAuxiliaryFile);
+  }
+
+  bool writeToURL_atomically_(NSURL? url, bool atomically) {
+    return _lib._objc_msgSend_121(_id, _lib._sel_writeToURL_atomically_1,
+        url?._id ?? ffi.nullptr, atomically);
+  }
+
+  static NSDictionary dictionary(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSDictionary1, _lib._sel_dictionary1);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDictionary dictionaryWithObject_forKey_(
+      AVFAudio _lib, NSObject object, NSObject key) {
+    final _ret = _lib._objc_msgSend_142(_lib._class_NSDictionary1,
+        _lib._sel_dictionaryWithObject_forKey_1, object._id, key._id);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDictionary dictionaryWithObjects_forKeys_count_(
+      AVFAudio _lib,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> objects,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> keys,
+      int cnt) {
+    final _ret = _lib._objc_msgSend_133(_lib._class_NSDictionary1,
+        _lib._sel_dictionaryWithObjects_forKeys_count_1, objects, keys, cnt);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDictionary dictionaryWithObjectsAndKeys_(
+      AVFAudio _lib, NSObject firstObject) {
+    final _ret = _lib._objc_msgSend_16(_lib._class_NSDictionary1,
+        _lib._sel_dictionaryWithObjectsAndKeys_1, firstObject._id);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDictionary dictionaryWithDictionary_(
+      AVFAudio _lib, NSDictionary? dict) {
+    final _ret = _lib._objc_msgSend_143(_lib._class_NSDictionary1,
+        _lib._sel_dictionaryWithDictionary_1, dict?._id ?? ffi.nullptr);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDictionary dictionaryWithObjects_forKeys_(
+      AVFAudio _lib, NSArray? objects, NSArray? keys) {
+    final _ret = _lib._objc_msgSend_144(
+        _lib._class_NSDictionary1,
+        _lib._sel_dictionaryWithObjects_forKeys_1,
+        objects?._id ?? ffi.nullptr,
+        keys?._id ?? ffi.nullptr);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary initWithObjectsAndKeys_(NSObject firstObject) {
+    final _ret = _lib._objc_msgSend_16(
+        _id, _lib._sel_initWithObjectsAndKeys_1, firstObject._id);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary initWithDictionary_(NSDictionary? otherDictionary) {
+    final _ret = _lib._objc_msgSend_143(_id, _lib._sel_initWithDictionary_1,
+        otherDictionary?._id ?? ffi.nullptr);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary initWithDictionary_copyItems_(
+      NSDictionary? otherDictionary, bool flag) {
+    final _ret = _lib._objc_msgSend_145(
+        _id,
+        _lib._sel_initWithDictionary_copyItems_1,
+        otherDictionary?._id ?? ffi.nullptr,
+        flag);
+    return NSDictionary._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSDictionary initWithObjects_forKeys_(NSArray? objects, NSArray? keys) {
+    final _ret = _lib._objc_msgSend_144(
+        _id,
+        _lib._sel_initWithObjects_forKeys_1,
+        objects?._id ?? ffi.nullptr,
+        keys?._id ?? ffi.nullptr);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary initWithContentsOfURL_error_(
+      NSURL? url, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_146(
+        _id,
+        _lib._sel_initWithContentsOfURL_error_1,
+        url?._id ?? ffi.nullptr,
+        error);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDictionary dictionaryWithContentsOfURL_error_(
+      AVFAudio _lib, NSURL? url, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_146(
+        _lib._class_NSDictionary1,
+        _lib._sel_dictionaryWithContentsOfURL_error_1,
+        url?._id ?? ffi.nullptr,
+        error);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject sharedKeySetForKeys_(AVFAudio _lib, NSArray? keys) {
+    final _ret = _lib._objc_msgSend_67(_lib._class_NSDictionary1,
+        _lib._sel_sharedKeySetForKeys_1, keys?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  int countByEnumeratingWithState_objects_count_(
+      ffi.Pointer<NSFastEnumerationState> state,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> buffer,
+      int len) {
+    return _lib._objc_msgSend_147(
+        _id,
+        _lib._sel_countByEnumeratingWithState_objects_count_1,
+        state,
+        buffer,
+        len);
+  }
+
+  int fileSize() {
+    return _lib._objc_msgSend_148(_id, _lib._sel_fileSize1);
+  }
+
+  NSDate fileModificationDate() {
+    final _ret = _lib._objc_msgSend_156(_id, _lib._sel_fileModificationDate1);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString fileType() {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_fileType1);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int filePosixPermissions() {
+    return _lib._objc_msgSend_10(_id, _lib._sel_filePosixPermissions1);
+  }
+
+  NSString fileOwnerAccountName() {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_fileOwnerAccountName1);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString fileGroupOwnerAccountName() {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_fileGroupOwnerAccountName1);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int fileSystemNumber() {
+    return _lib._objc_msgSend_78(_id, _lib._sel_fileSystemNumber1);
+  }
+
+  int fileSystemFileNumber() {
+    return _lib._objc_msgSend_10(_id, _lib._sel_fileSystemFileNumber1);
+  }
+
+  bool fileExtensionHidden() {
+    return _lib._objc_msgSend_12(_id, _lib._sel_fileExtensionHidden1);
+  }
+
+  int fileHFSCreatorCode() {
+    return _lib._objc_msgSend_191(_id, _lib._sel_fileHFSCreatorCode1);
+  }
+
+  int fileHFSTypeCode() {
+    return _lib._objc_msgSend_191(_id, _lib._sel_fileHFSTypeCode1);
+  }
+
+  bool fileIsImmutable() {
+    return _lib._objc_msgSend_12(_id, _lib._sel_fileIsImmutable1);
+  }
+
+  bool fileIsAppendOnly() {
+    return _lib._objc_msgSend_12(_id, _lib._sel_fileIsAppendOnly1);
+  }
+
+  NSDate fileCreationDate() {
+    final _ret = _lib._objc_msgSend_156(_id, _lib._sel_fileCreationDate1);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber fileOwnerAccountID() {
+    final _ret = _lib._objc_msgSend_192(_id, _lib._sel_fileOwnerAccountID1);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber fileGroupOwnerAccountID() {
+    final _ret =
+        _lib._objc_msgSend_192(_id, _lib._sel_fileGroupOwnerAccountID1);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSObject valueForKey_(NSString? key) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_valueForKey_1, key?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDictionary new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSDictionary1, _lib._sel_new1);
+    return NSDictionary._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSDictionary alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSDictionary1, _lib._sel_alloc1);
+    return NSDictionary._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSDictionary1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSDictionary1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSDictionary1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSDictionary1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSDictionary1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSDictionary1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSDictionary1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSDictionary1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSDictionary1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+void _ObjCBlock7_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0,
+    ffi.Pointer<ObjCObject> arg1,
+    ffi.Pointer<ffi.Bool> arg2) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(ffi.Pointer<ObjCObject> arg0,
+                  ffi.Pointer<ObjCObject> arg1, ffi.Pointer<ffi.Bool> arg2)>>()
+      .asFunction<
+          void Function(
+              ffi.Pointer<ObjCObject> arg0,
+              ffi.Pointer<ObjCObject> arg1,
+              ffi.Pointer<ffi.Bool> arg2)>()(arg0, arg1, arg2);
+}
+
+final _ObjCBlock7_closureRegistry = <int, Function>{};
+int _ObjCBlock7_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock7_registerClosure(Function fn) {
+  final id = ++_ObjCBlock7_closureRegistryIndex;
+  _ObjCBlock7_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock7_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0,
+    ffi.Pointer<ObjCObject> arg1,
+    ffi.Pointer<ffi.Bool> arg2) {
+  return _ObjCBlock7_closureRegistry[block.ref.target.address]!(
+      arg0, arg1, arg2);
+}
+
+class ObjCBlock7 extends _ObjCBlockBase {
+  ObjCBlock7._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock7.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(
+                      ffi.Pointer<ObjCObject> arg0,
+                      ffi.Pointer<ObjCObject> arg1,
+                      ffi.Pointer<ffi.Bool> arg2)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1,
+                                ffi.Pointer<ffi.Bool> arg2)>(
+                        _ObjCBlock7_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock7.fromFunction(
+      AVFAudio lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1,
+              ffi.Pointer<ffi.Bool> arg2)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1,
+                                ffi.Pointer<ffi.Bool> arg2)>(
+                        _ObjCBlock7_closureTrampoline)
+                    .cast(),
+                _ObjCBlock7_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1,
+      ffi.Pointer<ffi.Bool> arg2) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    ffi.Pointer<ObjCObject> arg1,
+                    ffi.Pointer<ffi.Bool> arg2)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                ffi.Pointer<ObjCObject> arg1,
+                ffi.Pointer<ffi.Bool> arg2)>()(_id, arg0, arg1, arg2);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class NSFastEnumerationState extends ffi.Struct {
+  @ffi.UnsignedLong()
+  external int state;
+
+  external ffi.Pointer<ffi.Pointer<ObjCObject>> itemsPtr;
+
+  external ffi.Pointer<ffi.UnsignedLong> mutationsPtr;
+
+  @ffi.Array.multi([5])
+  external ffi.Array<ffi.UnsignedLong> extra;
+}
+
+class NSDate extends NSObject {
+  NSDate._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSDate] that points to the same underlying object as [other].
+  static NSDate castFrom<T extends _ObjCWrapper>(T other) {
+    return NSDate._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSDate] that wraps the given raw object pointer.
+  static NSDate castFromPointer(AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSDate._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSDate].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSDate1);
+  }
+
+  double get timeIntervalSinceReferenceDate {
+    return _lib._objc_msgSend_149(
+        _id, _lib._sel_timeIntervalSinceReferenceDate1);
+  }
+
+  @override
+  NSDate init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate initWithTimeIntervalSinceReferenceDate_(double ti) {
+    final _ret = _lib._objc_msgSend_150(
+        _id, _lib._sel_initWithTimeIntervalSinceReferenceDate_1, ti);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate initWithCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  double timeIntervalSinceDate_(NSDate? anotherDate) {
+    return _lib._objc_msgSend_151(_id, _lib._sel_timeIntervalSinceDate_1,
+        anotherDate?._id ?? ffi.nullptr);
+  }
+
+  double get timeIntervalSinceNow {
+    return _lib._objc_msgSend_149(_id, _lib._sel_timeIntervalSinceNow1);
+  }
+
+  double get timeIntervalSince1970 {
+    return _lib._objc_msgSend_149(_id, _lib._sel_timeIntervalSince19701);
+  }
+
+  NSObject addTimeInterval_(double seconds) {
+    final _ret =
+        _lib._objc_msgSend_150(_id, _lib._sel_addTimeInterval_1, seconds);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate dateByAddingTimeInterval_(double ti) {
+    final _ret =
+        _lib._objc_msgSend_150(_id, _lib._sel_dateByAddingTimeInterval_1, ti);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate earlierDate_(NSDate? anotherDate) {
+    final _ret = _lib._objc_msgSend_152(
+        _id, _lib._sel_earlierDate_1, anotherDate?._id ?? ffi.nullptr);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate laterDate_(NSDate? anotherDate) {
+    final _ret = _lib._objc_msgSend_152(
+        _id, _lib._sel_laterDate_1, anotherDate?._id ?? ffi.nullptr);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  int compare_(NSDate? other) {
+    return _lib._objc_msgSend_153(
+        _id, _lib._sel_compare_1, other?._id ?? ffi.nullptr);
+  }
+
+  bool isEqualToDate_(NSDate? otherDate) {
+    return _lib._objc_msgSend_154(
+        _id, _lib._sel_isEqualToDate_1, otherDate?._id ?? ffi.nullptr);
+  }
+
+  NSString? get description {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_description1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString descriptionWithLocale_(NSObject locale) {
+    final _ret = _lib._objc_msgSend_65(
+        _id, _lib._sel_descriptionWithLocale_1, locale._id);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDate date(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSDate1, _lib._sel_date1);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDate dateWithTimeIntervalSinceNow_(AVFAudio _lib, double secs) {
+    final _ret = _lib._objc_msgSend_150(
+        _lib._class_NSDate1, _lib._sel_dateWithTimeIntervalSinceNow_1, secs);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDate dateWithTimeIntervalSinceReferenceDate_(
+      AVFAudio _lib, double ti) {
+    final _ret = _lib._objc_msgSend_150(_lib._class_NSDate1,
+        _lib._sel_dateWithTimeIntervalSinceReferenceDate_1, ti);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDate dateWithTimeIntervalSince1970_(AVFAudio _lib, double secs) {
+    final _ret = _lib._objc_msgSend_150(
+        _lib._class_NSDate1, _lib._sel_dateWithTimeIntervalSince1970_1, secs);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDate dateWithTimeInterval_sinceDate_(
+      AVFAudio _lib, double secsToBeAdded, NSDate? date) {
+    final _ret = _lib._objc_msgSend_155(
+        _lib._class_NSDate1,
+        _lib._sel_dateWithTimeInterval_sinceDate_1,
+        secsToBeAdded,
+        date?._id ?? ffi.nullptr);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDate? getDistantFuture(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_156(_lib._class_NSDate1, _lib._sel_distantFuture1);
+    return _ret.address == 0
+        ? null
+        : NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDate? getDistantPast(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_156(_lib._class_NSDate1, _lib._sel_distantPast1);
+    return _ret.address == 0
+        ? null
+        : NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDate? getNow(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_156(_lib._class_NSDate1, _lib._sel_now1);
+    return _ret.address == 0
+        ? null
+        : NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate initWithTimeIntervalSinceNow_(double secs) {
+    final _ret = _lib._objc_msgSend_150(
+        _id, _lib._sel_initWithTimeIntervalSinceNow_1, secs);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate initWithTimeIntervalSince1970_(double secs) {
+    final _ret = _lib._objc_msgSend_150(
+        _id, _lib._sel_initWithTimeIntervalSince1970_1, secs);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate initWithTimeInterval_sinceDate_(double secsToBeAdded, NSDate? date) {
+    final _ret = _lib._objc_msgSend_155(
+        _id,
+        _lib._sel_initWithTimeInterval_sinceDate_1,
+        secsToBeAdded,
+        date?._id ?? ffi.nullptr);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject dateWithNaturalLanguageString_locale_(
+      AVFAudio _lib, NSString? string, NSObject locale) {
+    final _ret = _lib._objc_msgSend_157(
+        _lib._class_NSDate1,
+        _lib._sel_dateWithNaturalLanguageString_locale_1,
+        string?._id ?? ffi.nullptr,
+        locale._id);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject dateWithNaturalLanguageString_(
+      AVFAudio _lib, NSString? string) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSDate1,
+        _lib._sel_dateWithNaturalLanguageString_1, string?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject dateWithString_(AVFAudio _lib, NSString? aString) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSDate1,
+        _lib._sel_dateWithString_1, aString?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSCalendarDate dateWithCalendarFormat_timeZone_(
+      NSString? format, NSTimeZone? aTimeZone) {
+    final _ret = _lib._objc_msgSend_189(
+        _id,
+        _lib._sel_dateWithCalendarFormat_timeZone_1,
+        format?._id ?? ffi.nullptr,
+        aTimeZone?._id ?? ffi.nullptr);
+    return NSCalendarDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString descriptionWithCalendarFormat_timeZone_locale_(
+      NSString? format, NSTimeZone? aTimeZone, NSObject locale) {
+    final _ret = _lib._objc_msgSend_190(
+        _id,
+        _lib._sel_descriptionWithCalendarFormat_timeZone_locale_1,
+        format?._id ?? ffi.nullptr,
+        aTimeZone?._id ?? ffi.nullptr,
+        locale._id);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject initWithString_(NSString? description) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initWithString_1, description?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDate new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSDate1, _lib._sel_new1);
+    return NSDate._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSDate alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSDate1, _lib._sel_alloc1);
+    return NSDate._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSDate1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSDate1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSDate1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSDate1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSDate1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSDate1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSDate1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSDate1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSDate1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef NSTimeInterval = ffi.Double;
+
+class NSCalendarDate extends NSDate {
+  NSCalendarDate._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSCalendarDate] that points to the same underlying object as [other].
+  static NSCalendarDate castFrom<T extends _ObjCWrapper>(T other) {
+    return NSCalendarDate._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSCalendarDate] that wraps the given raw object pointer.
+  static NSCalendarDate castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSCalendarDate._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSCalendarDate].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSCalendarDate1);
+  }
+
+  static NSObject calendarDate(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSCalendarDate1, _lib._sel_calendarDate1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject dateWithString_calendarFormat_locale_(
+      AVFAudio _lib, NSString? description, NSString? format, NSObject locale) {
+    final _ret = _lib._objc_msgSend_158(
+        _lib._class_NSCalendarDate1,
+        _lib._sel_dateWithString_calendarFormat_locale_1,
+        description?._id ?? ffi.nullptr,
+        format?._id ?? ffi.nullptr,
+        locale._id);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject dateWithString_calendarFormat_(
+      AVFAudio _lib, NSString? description, NSString? format) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSCalendarDate1,
+        _lib._sel_dateWithString_calendarFormat_1,
+        description?._id ?? ffi.nullptr,
+        format?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject dateWithYear_month_day_hour_minute_second_timeZone_(
+      AVFAudio _lib,
+      int year,
+      int month,
+      int day,
+      int hour,
+      int minute,
+      int second,
+      NSTimeZone? aTimeZone) {
+    final _ret = _lib._objc_msgSend_184(
+        _lib._class_NSCalendarDate1,
+        _lib._sel_dateWithYear_month_day_hour_minute_second_timeZone_1,
+        year,
+        month,
+        day,
+        hour,
+        minute,
+        second,
+        aTimeZone?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSCalendarDate dateByAddingYears_months_days_hours_minutes_seconds_(
+      int year, int month, int day, int hour, int minute, int second) {
+    final _ret = _lib._objc_msgSend_185(
+        _id,
+        _lib._sel_dateByAddingYears_months_days_hours_minutes_seconds_1,
+        year,
+        month,
+        day,
+        hour,
+        minute,
+        second);
+    return NSCalendarDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  int dayOfCommonEra() {
+    return _lib._objc_msgSend_78(_id, _lib._sel_dayOfCommonEra1);
+  }
+
+  int dayOfMonth() {
+    return _lib._objc_msgSend_78(_id, _lib._sel_dayOfMonth1);
+  }
+
+  int dayOfWeek() {
+    return _lib._objc_msgSend_78(_id, _lib._sel_dayOfWeek1);
+  }
+
+  int dayOfYear() {
+    return _lib._objc_msgSend_78(_id, _lib._sel_dayOfYear1);
+  }
+
+  int hourOfDay() {
+    return _lib._objc_msgSend_78(_id, _lib._sel_hourOfDay1);
+  }
+
+  int minuteOfHour() {
+    return _lib._objc_msgSend_78(_id, _lib._sel_minuteOfHour1);
+  }
+
+  int monthOfYear() {
+    return _lib._objc_msgSend_78(_id, _lib._sel_monthOfYear1);
+  }
+
+  int secondOfMinute() {
+    return _lib._objc_msgSend_78(_id, _lib._sel_secondOfMinute1);
+  }
+
+  int yearOfCommonEra() {
+    return _lib._objc_msgSend_78(_id, _lib._sel_yearOfCommonEra1);
+  }
+
+  NSString calendarFormat() {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_calendarFormat1);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString descriptionWithCalendarFormat_locale_(
+      NSString? format, NSObject locale) {
+    final _ret = _lib._objc_msgSend_167(
+        _id,
+        _lib._sel_descriptionWithCalendarFormat_locale_1,
+        format?._id ?? ffi.nullptr,
+        locale._id);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString descriptionWithCalendarFormat_(NSString? format) {
+    final _ret = _lib._objc_msgSend_64(_id,
+        _lib._sel_descriptionWithCalendarFormat_1, format?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSString descriptionWithLocale_(NSObject locale) {
+    final _ret = _lib._objc_msgSend_65(
+        _id, _lib._sel_descriptionWithLocale_1, locale._id);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSTimeZone timeZone() {
+    final _ret = _lib._objc_msgSend_162(_id, _lib._sel_timeZone1);
+    return NSTimeZone._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject initWithString_calendarFormat_locale_(
+      NSString? description, NSString? format, NSObject locale) {
+    final _ret = _lib._objc_msgSend_158(
+        _id,
+        _lib._sel_initWithString_calendarFormat_locale_1,
+        description?._id ?? ffi.nullptr,
+        format?._id ?? ffi.nullptr,
+        locale._id);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject initWithString_calendarFormat_(
+      NSString? description, NSString? format) {
+    final _ret = _lib._objc_msgSend_159(
+        _id,
+        _lib._sel_initWithString_calendarFormat_1,
+        description?._id ?? ffi.nullptr,
+        format?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSObject initWithString_(NSString? description) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initWithString_1, description?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject initWithYear_month_day_hour_minute_second_timeZone_(
+      int year,
+      int month,
+      int day,
+      int hour,
+      int minute,
+      int second,
+      NSTimeZone? aTimeZone) {
+    final _ret = _lib._objc_msgSend_184(
+        _id,
+        _lib._sel_initWithYear_month_day_hour_minute_second_timeZone_1,
+        year,
+        month,
+        day,
+        hour,
+        minute,
+        second,
+        aTimeZone?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void setCalendarFormat_(NSString? format) {
+    return _lib._objc_msgSend_186(
+        _id, _lib._sel_setCalendarFormat_1, format?._id ?? ffi.nullptr);
+  }
+
+  void setTimeZone_(NSTimeZone? aTimeZone) {
+    return _lib._objc_msgSend_187(
+        _id, _lib._sel_setTimeZone_1, aTimeZone?._id ?? ffi.nullptr);
+  }
+
+  void years_months_days_hours_minutes_seconds_sinceDate_(
+      ffi.Pointer<NSInteger> yp,
+      ffi.Pointer<NSInteger> mop,
+      ffi.Pointer<NSInteger> dp,
+      ffi.Pointer<NSInteger> hp,
+      ffi.Pointer<NSInteger> mip,
+      ffi.Pointer<NSInteger> sp,
+      NSCalendarDate? date) {
+    return _lib._objc_msgSend_188(
+        _id,
+        _lib._sel_years_months_days_hours_minutes_seconds_sinceDate_1,
+        yp,
+        mop,
+        dp,
+        hp,
+        mip,
+        sp,
+        date?._id ?? ffi.nullptr);
+  }
+
+  static NSDate? getDistantFuture(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_156(
+        _lib._class_NSCalendarDate1, _lib._sel_distantFuture1);
+    return _ret.address == 0
+        ? null
+        : NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDate? getDistantPast(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_156(
+        _lib._class_NSCalendarDate1, _lib._sel_distantPast1);
+    return _ret.address == 0
+        ? null
+        : NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCalendarDate date(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSCalendarDate1, _lib._sel_date1);
+    return NSCalendarDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCalendarDate dateWithTimeIntervalSinceNow_(
+      AVFAudio _lib, double secs) {
+    final _ret = _lib._objc_msgSend_150(_lib._class_NSCalendarDate1,
+        _lib._sel_dateWithTimeIntervalSinceNow_1, secs);
+    return NSCalendarDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCalendarDate dateWithTimeIntervalSinceReferenceDate_(
+      AVFAudio _lib, double ti) {
+    final _ret = _lib._objc_msgSend_150(_lib._class_NSCalendarDate1,
+        _lib._sel_dateWithTimeIntervalSinceReferenceDate_1, ti);
+    return NSCalendarDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCalendarDate dateWithTimeIntervalSince1970_(
+      AVFAudio _lib, double secs) {
+    final _ret = _lib._objc_msgSend_150(_lib._class_NSCalendarDate1,
+        _lib._sel_dateWithTimeIntervalSince1970_1, secs);
+    return NSCalendarDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCalendarDate dateWithTimeInterval_sinceDate_(
+      AVFAudio _lib, double secsToBeAdded, NSDate? date) {
+    final _ret = _lib._objc_msgSend_155(
+        _lib._class_NSCalendarDate1,
+        _lib._sel_dateWithTimeInterval_sinceDate_1,
+        secsToBeAdded,
+        date?._id ?? ffi.nullptr);
+    return NSCalendarDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDate? getNow(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_156(_lib._class_NSCalendarDate1, _lib._sel_now1);
+    return _ret.address == 0
+        ? null
+        : NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject dateWithNaturalLanguageString_locale_(
+      AVFAudio _lib, NSString? string, NSObject locale) {
+    final _ret = _lib._objc_msgSend_157(
+        _lib._class_NSCalendarDate1,
+        _lib._sel_dateWithNaturalLanguageString_locale_1,
+        string?._id ?? ffi.nullptr,
+        locale._id);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject dateWithNaturalLanguageString_(
+      AVFAudio _lib, NSString? string) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSCalendarDate1,
+        _lib._sel_dateWithNaturalLanguageString_1, string?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject dateWithString_(AVFAudio _lib, NSString? aString) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSCalendarDate1,
+        _lib._sel_dateWithString_1, aString?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCalendarDate new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSCalendarDate1, _lib._sel_new1);
+    return NSCalendarDate._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSCalendarDate alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSCalendarDate1, _lib._sel_alloc1);
+    return NSCalendarDate._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSCalendarDate1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSCalendarDate1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSCalendarDate1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSCalendarDate1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSCalendarDate1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSCalendarDate1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSCalendarDate1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSCalendarDate1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSCalendarDate1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSTimeZone extends NSObject {
+  NSTimeZone._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSTimeZone] that points to the same underlying object as [other].
+  static NSTimeZone castFrom<T extends _ObjCWrapper>(T other) {
+    return NSTimeZone._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSTimeZone] that wraps the given raw object pointer.
+  static NSTimeZone castFromPointer(AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSTimeZone._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSTimeZone].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSTimeZone1);
+  }
+
+  NSString? get name {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_name1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData? get data {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_data1);
+    return _ret.address == 0
+        ? null
+        : NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  int secondsFromGMTForDate_(NSDate? aDate) {
+    return _lib._objc_msgSend_160(
+        _id, _lib._sel_secondsFromGMTForDate_1, aDate?._id ?? ffi.nullptr);
+  }
+
+  NSString abbreviationForDate_(NSDate? aDate) {
+    final _ret = _lib._objc_msgSend_161(
+        _id, _lib._sel_abbreviationForDate_1, aDate?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool isDaylightSavingTimeForDate_(NSDate? aDate) {
+    return _lib._objc_msgSend_154(_id, _lib._sel_isDaylightSavingTimeForDate_1,
+        aDate?._id ?? ffi.nullptr);
+  }
+
+  double daylightSavingTimeOffsetForDate_(NSDate? aDate) {
+    return _lib._objc_msgSend_151(_id,
+        _lib._sel_daylightSavingTimeOffsetForDate_1, aDate?._id ?? ffi.nullptr);
+  }
+
+  NSDate nextDaylightSavingTimeTransitionAfterDate_(NSDate? aDate) {
+    final _ret = _lib._objc_msgSend_152(
+        _id,
+        _lib._sel_nextDaylightSavingTimeTransitionAfterDate_1,
+        aDate?._id ?? ffi.nullptr);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTimeZone? getSystemTimeZone(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_162(
+        _lib._class_NSTimeZone1, _lib._sel_systemTimeZone1);
+    return _ret.address == 0
+        ? null
+        : NSTimeZone._(_ret, _lib, retain: true, release: true);
+  }
+
+  static void resetSystemTimeZone(AVFAudio _lib) {
+    return _lib._objc_msgSend_1(
+        _lib._class_NSTimeZone1, _lib._sel_resetSystemTimeZone1);
+  }
+
+  static NSTimeZone? getDefaultTimeZone(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_162(
+        _lib._class_NSTimeZone1, _lib._sel_defaultTimeZone1);
+    return _ret.address == 0
+        ? null
+        : NSTimeZone._(_ret, _lib, retain: true, release: true);
+  }
+
+  static void setDefaultTimeZone(AVFAudio _lib, NSTimeZone? value) {
+    _lib._objc_msgSend_163(_lib._class_NSTimeZone1,
+        _lib._sel_setDefaultTimeZone_1, value?._id ?? ffi.nullptr);
+  }
+
+  static NSTimeZone? getLocalTimeZone(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_162(
+        _lib._class_NSTimeZone1, _lib._sel_localTimeZone1);
+    return _ret.address == 0
+        ? null
+        : NSTimeZone._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray? getKnownTimeZoneNames(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSTimeZone1, _lib._sel_knownTimeZoneNames1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDictionary? getAbbreviationDictionary(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_164(
+        _lib._class_NSTimeZone1, _lib._sel_abbreviationDictionary1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static void setAbbreviationDictionary(AVFAudio _lib, NSDictionary? value) {
+    _lib._objc_msgSend_165(_lib._class_NSTimeZone1,
+        _lib._sel_setAbbreviationDictionary_1, value?._id ?? ffi.nullptr);
+  }
+
+  static NSString? getTimeZoneDataVersion(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_20(
+        _lib._class_NSTimeZone1, _lib._sel_timeZoneDataVersion1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get secondsFromGMT {
+    return _lib._objc_msgSend_78(_id, _lib._sel_secondsFromGMT1);
+  }
+
+  NSString? get abbreviation {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_abbreviation1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool get daylightSavingTime {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isDaylightSavingTime1);
+  }
+
+  double get daylightSavingTimeOffset {
+    return _lib._objc_msgSend_149(_id, _lib._sel_daylightSavingTimeOffset1);
+  }
+
+  NSDate? get nextDaylightSavingTimeTransition {
+    final _ret = _lib._objc_msgSend_156(
+        _id, _lib._sel_nextDaylightSavingTimeTransition1);
+    return _ret.address == 0
+        ? null
+        : NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get description {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_description1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool isEqualToTimeZone_(NSTimeZone? aTimeZone) {
+    return _lib._objc_msgSend_166(
+        _id, _lib._sel_isEqualToTimeZone_1, aTimeZone?._id ?? ffi.nullptr);
+  }
+
+  NSString localizedName_locale_(int style, NSLocale? locale) {
+    final _ret = _lib._objc_msgSend_181(_id, _lib._sel_localizedName_locale_1,
+        style, locale?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTimeZone timeZoneWithName_(AVFAudio _lib, NSString? tzName) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSTimeZone1,
+        _lib._sel_timeZoneWithName_1, tzName?._id ?? ffi.nullptr);
+    return NSTimeZone._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTimeZone timeZoneWithName_data_(
+      AVFAudio _lib, NSString? tzName, NSData? aData) {
+    final _ret = _lib._objc_msgSend_182(
+        _lib._class_NSTimeZone1,
+        _lib._sel_timeZoneWithName_data_1,
+        tzName?._id ?? ffi.nullptr,
+        aData?._id ?? ffi.nullptr);
+    return NSTimeZone._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSTimeZone initWithName_(NSString? tzName) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initWithName_1, tzName?._id ?? ffi.nullptr);
+    return NSTimeZone._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSTimeZone initWithName_data_(NSString? tzName, NSData? aData) {
+    final _ret = _lib._objc_msgSend_182(_id, _lib._sel_initWithName_data_1,
+        tzName?._id ?? ffi.nullptr, aData?._id ?? ffi.nullptr);
+    return NSTimeZone._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTimeZone timeZoneForSecondsFromGMT_(AVFAudio _lib, int seconds) {
+    final _ret = _lib._objc_msgSend_183(_lib._class_NSTimeZone1,
+        _lib._sel_timeZoneForSecondsFromGMT_1, seconds);
+    return NSTimeZone._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTimeZone timeZoneWithAbbreviation_(
+      AVFAudio _lib, NSString? abbreviation) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSTimeZone1,
+        _lib._sel_timeZoneWithAbbreviation_1, abbreviation?._id ?? ffi.nullptr);
+    return NSTimeZone._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTimeZone new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSTimeZone1, _lib._sel_new1);
+    return NSTimeZone._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSTimeZone alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSTimeZone1, _lib._sel_alloc1);
+    return NSTimeZone._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSTimeZone1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSTimeZone1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSTimeZone1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSTimeZone1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSTimeZone1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSTimeZone1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSTimeZone1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSTimeZone1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSTimeZone1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSTimeZoneNameStyle {
+  static const int NSTimeZoneNameStyleStandard = 0;
+  static const int NSTimeZoneNameStyleShortStandard = 1;
+  static const int NSTimeZoneNameStyleDaylightSaving = 2;
+  static const int NSTimeZoneNameStyleShortDaylightSaving = 3;
+  static const int NSTimeZoneNameStyleGeneric = 4;
+  static const int NSTimeZoneNameStyleShortGeneric = 5;
+}
+
+class NSLocale extends NSObject {
+  NSLocale._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSLocale] that points to the same underlying object as [other].
+  static NSLocale castFrom<T extends _ObjCWrapper>(T other) {
+    return NSLocale._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSLocale] that wraps the given raw object pointer.
+  static NSLocale castFromPointer(AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSLocale._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSLocale].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSLocale1);
+  }
+
+  NSObject objectForKey_(NSLocaleKey key) {
+    final _ret = _lib._objc_msgSend_30(_id, _lib._sel_objectForKey_1, key);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString displayNameForKey_value_(NSLocaleKey key, NSObject value) {
+    final _ret = _lib._objc_msgSend_167(
+        _id, _lib._sel_displayNameForKey_value_1, key, value._id);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSLocale initWithLocaleIdentifier_(NSString? string) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initWithLocaleIdentifier_1, string?._id ?? ffi.nullptr);
+    return NSLocale._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSLocale initWithCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr);
+    return NSLocale._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get localeIdentifier {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_localeIdentifier1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString localizedStringForLocaleIdentifier_(NSString? localeIdentifier) {
+    final _ret = _lib._objc_msgSend_64(
+        _id,
+        _lib._sel_localizedStringForLocaleIdentifier_1,
+        localeIdentifier?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get languageCode {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_languageCode1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString localizedStringForLanguageCode_(NSString? languageCode) {
+    final _ret = _lib._objc_msgSend_64(
+        _id,
+        _lib._sel_localizedStringForLanguageCode_1,
+        languageCode?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get countryCode {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_countryCode1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString localizedStringForCountryCode_(NSString? countryCode) {
+    final _ret = _lib._objc_msgSend_64(
+        _id,
+        _lib._sel_localizedStringForCountryCode_1,
+        countryCode?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get scriptCode {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_scriptCode1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString localizedStringForScriptCode_(NSString? scriptCode) {
+    final _ret = _lib._objc_msgSend_64(
+        _id,
+        _lib._sel_localizedStringForScriptCode_1,
+        scriptCode?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get variantCode {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_variantCode1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString localizedStringForVariantCode_(NSString? variantCode) {
+    final _ret = _lib._objc_msgSend_64(
+        _id,
+        _lib._sel_localizedStringForVariantCode_1,
+        variantCode?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSCharacterSet? get exemplarCharacterSet {
+    final _ret = _lib._objc_msgSend_168(_id, _lib._sel_exemplarCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get calendarIdentifier {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_calendarIdentifier1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString localizedStringForCalendarIdentifier_(NSString? calendarIdentifier) {
+    final _ret = _lib._objc_msgSend_64(
+        _id,
+        _lib._sel_localizedStringForCalendarIdentifier_1,
+        calendarIdentifier?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get collationIdentifier {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_collationIdentifier1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString localizedStringForCollationIdentifier_(
+      NSString? collationIdentifier) {
+    final _ret = _lib._objc_msgSend_64(
+        _id,
+        _lib._sel_localizedStringForCollationIdentifier_1,
+        collationIdentifier?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool get usesMetricSystem {
+    return _lib._objc_msgSend_12(_id, _lib._sel_usesMetricSystem1);
+  }
+
+  NSString? get decimalSeparator {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_decimalSeparator1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get groupingSeparator {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_groupingSeparator1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get currencySymbol {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_currencySymbol1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get currencyCode {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_currencyCode1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString localizedStringForCurrencyCode_(NSString? currencyCode) {
+    final _ret = _lib._objc_msgSend_64(
+        _id,
+        _lib._sel_localizedStringForCurrencyCode_1,
+        currencyCode?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get collatorIdentifier {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_collatorIdentifier1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString localizedStringForCollatorIdentifier_(NSString? collatorIdentifier) {
+    final _ret = _lib._objc_msgSend_64(
+        _id,
+        _lib._sel_localizedStringForCollatorIdentifier_1,
+        collatorIdentifier?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get quotationBeginDelimiter {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_quotationBeginDelimiter1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get quotationEndDelimiter {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_quotationEndDelimiter1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get alternateQuotationBeginDelimiter {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_alternateQuotationBeginDelimiter1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get alternateQuotationEndDelimiter {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_alternateQuotationEndDelimiter1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSLocale? getAutoupdatingCurrentLocale(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_176(
+        _lib._class_NSLocale1, _lib._sel_autoupdatingCurrentLocale1);
+    return _ret.address == 0
+        ? null
+        : NSLocale._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSLocale? getCurrentLocale(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_176(_lib._class_NSLocale1, _lib._sel_currentLocale1);
+    return _ret.address == 0
+        ? null
+        : NSLocale._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSLocale? getSystemLocale(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_176(_lib._class_NSLocale1, _lib._sel_systemLocale1);
+    return _ret.address == 0
+        ? null
+        : NSLocale._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSLocale localeWithLocaleIdentifier_(AVFAudio _lib, NSString? ident) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSLocale1,
+        _lib._sel_localeWithLocaleIdentifier_1, ident?._id ?? ffi.nullptr);
+    return NSLocale._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSLocale init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSLocale._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray? getAvailableLocaleIdentifiers(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSLocale1, _lib._sel_availableLocaleIdentifiers1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray? getISOLanguageCodes(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSLocale1, _lib._sel_ISOLanguageCodes1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray? getISOCountryCodes(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSLocale1, _lib._sel_ISOCountryCodes1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray? getISOCurrencyCodes(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSLocale1, _lib._sel_ISOCurrencyCodes1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray? getCommonISOCurrencyCodes(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSLocale1, _lib._sel_commonISOCurrencyCodes1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray? getPreferredLanguages(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSLocale1, _lib._sel_preferredLanguages1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDictionary componentsFromLocaleIdentifier_(
+      AVFAudio _lib, NSString? string) {
+    final _ret = _lib._objc_msgSend_140(_lib._class_NSLocale1,
+        _lib._sel_componentsFromLocaleIdentifier_1, string?._id ?? ffi.nullptr);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString localeIdentifierFromComponents_(
+      AVFAudio _lib, NSDictionary? dict) {
+    final _ret = _lib._objc_msgSend_177(_lib._class_NSLocale1,
+        _lib._sel_localeIdentifierFromComponents_1, dict?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString canonicalLocaleIdentifierFromString_(
+      AVFAudio _lib, NSString? string) {
+    final _ret = _lib._objc_msgSend_64(
+        _lib._class_NSLocale1,
+        _lib._sel_canonicalLocaleIdentifierFromString_1,
+        string?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString canonicalLanguageIdentifierFromString_(
+      AVFAudio _lib, NSString? string) {
+    final _ret = _lib._objc_msgSend_64(
+        _lib._class_NSLocale1,
+        _lib._sel_canonicalLanguageIdentifierFromString_1,
+        string?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString localeIdentifierFromWindowsLocaleCode_(
+      AVFAudio _lib, int lcid) {
+    final _ret = _lib._objc_msgSend_178(_lib._class_NSLocale1,
+        _lib._sel_localeIdentifierFromWindowsLocaleCode_1, lcid);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static int windowsLocaleCodeFromLocaleIdentifier_(
+      AVFAudio _lib, NSString? localeIdentifier) {
+    return _lib._objc_msgSend_179(
+        _lib._class_NSLocale1,
+        _lib._sel_windowsLocaleCodeFromLocaleIdentifier_1,
+        localeIdentifier?._id ?? ffi.nullptr);
+  }
+
+  static int characterDirectionForLanguage_(
+      AVFAudio _lib, NSString? isoLangCode) {
+    return _lib._objc_msgSend_180(
+        _lib._class_NSLocale1,
+        _lib._sel_characterDirectionForLanguage_1,
+        isoLangCode?._id ?? ffi.nullptr);
+  }
+
+  static int lineDirectionForLanguage_(AVFAudio _lib, NSString? isoLangCode) {
+    return _lib._objc_msgSend_180(_lib._class_NSLocale1,
+        _lib._sel_lineDirectionForLanguage_1, isoLangCode?._id ?? ffi.nullptr);
+  }
+
+  static NSLocale new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSLocale1, _lib._sel_new1);
+    return NSLocale._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSLocale alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSLocale1, _lib._sel_alloc1);
+    return NSLocale._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSLocale1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSLocale1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSLocale1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSLocale1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSLocale1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSLocale1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSLocale1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSLocale1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSLocale1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef NSLocaleKey = ffi.Pointer<ObjCObject>;
+
+class NSCharacterSet extends NSObject {
+  NSCharacterSet._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSCharacterSet] that points to the same underlying object as [other].
+  static NSCharacterSet castFrom<T extends _ObjCWrapper>(T other) {
+    return NSCharacterSet._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSCharacterSet] that wraps the given raw object pointer.
+  static NSCharacterSet castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSCharacterSet._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSCharacterSet].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSCharacterSet1);
+  }
+
+  static NSCharacterSet? getControlCharacterSet(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_controlCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getWhitespaceCharacterSet(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_whitespaceCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getWhitespaceAndNewlineCharacterSet(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_168(_lib._class_NSCharacterSet1,
+        _lib._sel_whitespaceAndNewlineCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getDecimalDigitCharacterSet(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_decimalDigitCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getLetterCharacterSet(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_letterCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getLowercaseLetterCharacterSet(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_lowercaseLetterCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getUppercaseLetterCharacterSet(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_uppercaseLetterCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getNonBaseCharacterSet(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_nonBaseCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getAlphanumericCharacterSet(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_alphanumericCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getDecomposableCharacterSet(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_decomposableCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getIllegalCharacterSet(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_illegalCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getPunctuationCharacterSet(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_punctuationCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getCapitalizedLetterCharacterSet(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_capitalizedLetterCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getSymbolCharacterSet(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_symbolCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getNewlineCharacterSet(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_newlineCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSCharacterSet characterSetWithRange_(AVFAudio _lib, NSRange aRange) {
+    final _ret = _lib._objc_msgSend_169(
+        _lib._class_NSCharacterSet1, _lib._sel_characterSetWithRange_1, aRange);
+    return NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet characterSetWithCharactersInString_(
+      AVFAudio _lib, NSString? aString) {
+    final _ret = _lib._objc_msgSend_170(
+        _lib._class_NSCharacterSet1,
+        _lib._sel_characterSetWithCharactersInString_1,
+        aString?._id ?? ffi.nullptr);
+    return NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet characterSetWithBitmapRepresentation_(
+      AVFAudio _lib, NSData? data) {
+    final _ret = _lib._objc_msgSend_171(
+        _lib._class_NSCharacterSet1,
+        _lib._sel_characterSetWithBitmapRepresentation_1,
+        data?._id ?? ffi.nullptr);
+    return NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet characterSetWithContentsOfFile_(
+      AVFAudio _lib, NSString? fName) {
+    final _ret = _lib._objc_msgSend_170(_lib._class_NSCharacterSet1,
+        _lib._sel_characterSetWithContentsOfFile_1, fName?._id ?? ffi.nullptr);
+    return NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSCharacterSet initWithCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr);
+    return NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool characterIsMember_(int aCharacter) {
+    return _lib._objc_msgSend_172(
+        _id, _lib._sel_characterIsMember_1, aCharacter);
+  }
+
+  NSData? get bitmapRepresentation {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_bitmapRepresentation1);
+    return _ret.address == 0
+        ? null
+        : NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSCharacterSet? get invertedSet {
+    final _ret = _lib._objc_msgSend_168(_id, _lib._sel_invertedSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool longCharacterIsMember_(int theLongChar) {
+    return _lib._objc_msgSend_173(
+        _id, _lib._sel_longCharacterIsMember_1, theLongChar);
+  }
+
+  bool isSupersetOfSet_(NSCharacterSet? theOtherSet) {
+    return _lib._objc_msgSend_174(
+        _id, _lib._sel_isSupersetOfSet_1, theOtherSet?._id ?? ffi.nullptr);
+  }
+
+  bool hasMemberInPlane_(int thePlane) {
+    return _lib._objc_msgSend_175(_id, _lib._sel_hasMemberInPlane_1, thePlane);
+  }
+
+  static NSCharacterSet? getURLUserAllowedCharacterSet(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_URLUserAllowedCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getURLPasswordAllowedCharacterSet(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_URLPasswordAllowedCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getURLHostAllowedCharacterSet(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_URLHostAllowedCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getURLPathAllowedCharacterSet(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_URLPathAllowedCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getURLQueryAllowedCharacterSet(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_URLQueryAllowedCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getURLFragmentAllowedCharacterSet(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_URLFragmentAllowedCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSCharacterSet1, _lib._sel_new1);
+    return NSCharacterSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSCharacterSet alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSCharacterSet1, _lib._sel_alloc1);
+    return NSCharacterSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSCharacterSet1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSCharacterSet1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSCharacterSet1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSCharacterSet1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSCharacterSet1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSCharacterSet1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSCharacterSet1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSCharacterSet1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSCharacterSet1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef UTF32Char = UInt32;
+typedef UInt32 = ffi.UnsignedInt;
+
+abstract class NSLocaleLanguageDirection {
+  static const int NSLocaleLanguageDirectionUnknown = 0;
+  static const int NSLocaleLanguageDirectionLeftToRight = 1;
+  static const int NSLocaleLanguageDirectionRightToLeft = 2;
+  static const int NSLocaleLanguageDirectionTopToBottom = 3;
+  static const int NSLocaleLanguageDirectionBottomToTop = 4;
+}
+
+typedef OSType = FourCharCode;
+typedef FourCharCode = UInt32;
+typedef NSURLResourceKey = ffi.Pointer<ObjCObject>;
+
+class NSURLHandle extends NSObject {
+  NSURLHandle._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURLHandle] that points to the same underlying object as [other].
+  static NSURLHandle castFrom<T extends _ObjCWrapper>(T other) {
+    return NSURLHandle._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSURLHandle] that wraps the given raw object pointer.
+  static NSURLHandle castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURLHandle._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURLHandle].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSURLHandle1);
+  }
+
+  static void registerURLHandleClass_(
+      AVFAudio _lib, NSObject anURLHandleSubclass) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLHandle1,
+        _lib._sel_registerURLHandleClass_1, anURLHandleSubclass._id);
+  }
+
+  static NSObject URLHandleClassForURL_(AVFAudio _lib, NSURL? anURL) {
+    final _ret = _lib._objc_msgSend_226(_lib._class_NSURLHandle1,
+        _lib._sel_URLHandleClassForURL_1, anURL?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  int status() {
+    return _lib._objc_msgSend_227(_id, _lib._sel_status1);
+  }
+
+  NSString failureReason() {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_failureReason1);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  void addClient_(NSObject? client) {
+    return _lib._objc_msgSend_15(
+        _id, _lib._sel_addClient_1, client?._id ?? ffi.nullptr);
+  }
+
+  void removeClient_(NSObject? client) {
+    return _lib._objc_msgSend_15(
+        _id, _lib._sel_removeClient_1, client?._id ?? ffi.nullptr);
+  }
+
+  void loadInBackground() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_loadInBackground1);
+  }
+
+  void cancelLoadInBackground() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_cancelLoadInBackground1);
+  }
+
+  NSData resourceData() {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_resourceData1);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData availableResourceData() {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_availableResourceData1);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  int expectedResourceDataSize() {
+    return _lib._objc_msgSend_214(_id, _lib._sel_expectedResourceDataSize1);
+  }
+
+  void flushCachedData() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_flushCachedData1);
+  }
+
+  void backgroundLoadDidFailWithReason_(NSString? reason) {
+    return _lib._objc_msgSend_186(
+        _id,
+        _lib._sel_backgroundLoadDidFailWithReason_1,
+        reason?._id ?? ffi.nullptr);
+  }
+
+  void didLoadBytes_loadComplete_(NSData? newBytes, bool yorn) {
+    return _lib._objc_msgSend_228(_id, _lib._sel_didLoadBytes_loadComplete_1,
+        newBytes?._id ?? ffi.nullptr, yorn);
+  }
+
+  static bool canInitWithURL_(AVFAudio _lib, NSURL? anURL) {
+    return _lib._objc_msgSend_229(_lib._class_NSURLHandle1,
+        _lib._sel_canInitWithURL_1, anURL?._id ?? ffi.nullptr);
+  }
+
+  static NSURLHandle cachedHandleForURL_(AVFAudio _lib, NSURL? anURL) {
+    final _ret = _lib._objc_msgSend_230(_lib._class_NSURLHandle1,
+        _lib._sel_cachedHandleForURL_1, anURL?._id ?? ffi.nullptr);
+    return NSURLHandle._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject initWithURL_cached_(NSURL? anURL, bool willCache) {
+    final _ret = _lib._objc_msgSend_231(_id, _lib._sel_initWithURL_cached_1,
+        anURL?._id ?? ffi.nullptr, willCache);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject propertyForKey_(NSString? propertyKey) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_propertyForKey_1, propertyKey?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject propertyForKeyIfAvailable_(NSString? propertyKey) {
+    final _ret = _lib._objc_msgSend_30(_id,
+        _lib._sel_propertyForKeyIfAvailable_1, propertyKey?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool writeProperty_forKey_(NSObject propertyValue, NSString? propertyKey) {
+    return _lib._objc_msgSend_225(_id, _lib._sel_writeProperty_forKey_1,
+        propertyValue._id, propertyKey?._id ?? ffi.nullptr);
+  }
+
+  bool writeData_(NSData? data) {
+    return _lib._objc_msgSend_23(
+        _id, _lib._sel_writeData_1, data?._id ?? ffi.nullptr);
+  }
+
+  NSData loadInForeground() {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_loadInForeground1);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  void beginLoadInBackground() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_beginLoadInBackground1);
+  }
+
+  void endLoadInBackground() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_endLoadInBackground1);
+  }
+
+  static NSURLHandle new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSURLHandle1, _lib._sel_new1);
+    return NSURLHandle._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSURLHandle alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSURLHandle1, _lib._sel_alloc1);
+    return NSURLHandle._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURLHandle1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLHandle1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLHandle1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLHandle1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURLHandle1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURLHandle1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURLHandle1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSURLHandle1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLHandle1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSURLHandleStatus {
+  static const int NSURLHandleNotLoaded = 0;
+  static const int NSURLHandleLoadSucceeded = 1;
+  static const int NSURLHandleLoadInProgress = 2;
+  static const int NSURLHandleLoadFailed = 3;
+}
+
+abstract class NSDataWritingOptions {
+  static const int NSDataWritingAtomic = 1;
+  static const int NSDataWritingWithoutOverwriting = 2;
+  static const int NSDataWritingFileProtectionNone = 268435456;
+  static const int NSDataWritingFileProtectionComplete = 536870912;
+  static const int NSDataWritingFileProtectionCompleteUnlessOpen = 805306368;
+  static const int
+      NSDataWritingFileProtectionCompleteUntilFirstUserAuthentication =
+      1073741824;
+  static const int NSDataWritingFileProtectionMask = 4026531840;
+  static const int NSAtomicWrite = 1;
+}
+
+abstract class NSDataSearchOptions {
+  static const int NSDataSearchBackwards = 1;
+  static const int NSDataSearchAnchored = 2;
+}
+
+void _ObjCBlock8_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ffi.Void> arg0, NSRange arg1, ffi.Pointer<ffi.Bool> arg2) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(ffi.Pointer<ffi.Void> arg0, NSRange arg1,
+                  ffi.Pointer<ffi.Bool> arg2)>>()
+      .asFunction<
+          void Function(ffi.Pointer<ffi.Void> arg0, NSRange arg1,
+              ffi.Pointer<ffi.Bool> arg2)>()(arg0, arg1, arg2);
+}
+
+final _ObjCBlock8_closureRegistry = <int, Function>{};
+int _ObjCBlock8_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock8_registerClosure(Function fn) {
+  final id = ++_ObjCBlock8_closureRegistryIndex;
+  _ObjCBlock8_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock8_closureTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ffi.Void> arg0, NSRange arg1, ffi.Pointer<ffi.Bool> arg2) {
+  return _ObjCBlock8_closureRegistry[block.ref.target.address]!(
+      arg0, arg1, arg2);
+}
+
+class ObjCBlock8 extends _ObjCBlockBase {
+  ObjCBlock8._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock8.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ffi.Void> arg0, NSRange arg1,
+                      ffi.Pointer<ffi.Bool> arg2)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ffi.Void> arg0,
+                                NSRange arg1,
+                                ffi.Pointer<ffi.Bool> arg2)>(
+                        _ObjCBlock8_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock8.fromFunction(
+      AVFAudio lib,
+      void Function(ffi.Pointer<ffi.Void> arg0, NSRange arg1,
+              ffi.Pointer<ffi.Bool> arg2)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ffi.Void> arg0,
+                                NSRange arg1,
+                                ffi.Pointer<ffi.Bool> arg2)>(
+                        _ObjCBlock8_closureTrampoline)
+                    .cast(),
+                _ObjCBlock8_registerClosure(fn)),
+            lib);
+  void call(
+      ffi.Pointer<ffi.Void> arg0, NSRange arg1, ffi.Pointer<ffi.Bool> arg2) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ffi.Void> arg0,
+                    NSRange arg1,
+                    ffi.Pointer<ffi.Bool> arg2)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ffi.Void> arg0,
+                NSRange arg1,
+                ffi.Pointer<ffi.Bool> arg2)>()(_id, arg0, arg1, arg2);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+abstract class NSDataReadingOptions {
+  static const int NSDataReadingMappedIfSafe = 1;
+  static const int NSDataReadingUncached = 2;
+  static const int NSDataReadingMappedAlways = 8;
+  static const int NSDataReadingMapped = 1;
+  static const int NSMappedRead = 1;
+  static const int NSUncachedRead = 2;
+}
+
+void _ObjCBlock9_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ffi.Void> arg0, int arg1) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(ffi.Pointer<ffi.Void> arg0, NSUInteger arg1)>>()
+      .asFunction<
+          void Function(ffi.Pointer<ffi.Void> arg0, int arg1)>()(arg0, arg1);
+}
+
+final _ObjCBlock9_closureRegistry = <int, Function>{};
+int _ObjCBlock9_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock9_registerClosure(Function fn) {
+  final id = ++_ObjCBlock9_closureRegistryIndex;
+  _ObjCBlock9_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock9_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ffi.Void> arg0, int arg1) {
+  return _ObjCBlock9_closureRegistry[block.ref.target.address]!(arg0, arg1);
+}
+
+class ObjCBlock9 extends _ObjCBlockBase {
+  ObjCBlock9._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock9.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(
+                      ffi.Pointer<ffi.Void> arg0, NSUInteger arg1)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                        ffi.Void Function(
+                            ffi.Pointer<_ObjCBlock> block,
+                            ffi.Pointer<ffi.Void> arg0,
+                            NSUInteger arg1)>(_ObjCBlock9_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock9.fromFunction(
+      AVFAudio lib, void Function(ffi.Pointer<ffi.Void> arg0, int arg1) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                        ffi.Void Function(
+                            ffi.Pointer<_ObjCBlock> block,
+                            ffi.Pointer<ffi.Void> arg0,
+                            NSUInteger arg1)>(_ObjCBlock9_closureTrampoline)
+                    .cast(),
+                _ObjCBlock9_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ffi.Void> arg0, int arg1) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ffi.Void> arg0, NSUInteger arg1)>>()
+        .asFunction<
+            void Function(ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ffi.Void> arg0, int arg1)>()(_id, arg0, arg1);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+abstract class NSDataBase64DecodingOptions {
+  static const int NSDataBase64DecodingIgnoreUnknownCharacters = 1;
+}
+
+abstract class NSDataBase64EncodingOptions {
+  static const int NSDataBase64Encoding64CharacterLineLength = 1;
+  static const int NSDataBase64Encoding76CharacterLineLength = 2;
+  static const int NSDataBase64EncodingEndLineWithCarriageReturn = 16;
+  static const int NSDataBase64EncodingEndLineWithLineFeed = 32;
+}
+
+abstract class NSDataCompressionAlgorithm {
+  static const int NSDataCompressionAlgorithmLZFSE = 0;
+  static const int NSDataCompressionAlgorithmLZ4 = 1;
+  static const int NSDataCompressionAlgorithmLZMA = 2;
+  static const int NSDataCompressionAlgorithmZlib = 3;
+}
+
+typedef NSZone = _NSZone;
+
+abstract class NSDecodingFailurePolicy {
+  static const int NSDecodingFailurePolicyRaiseException = 0;
+  static const int NSDecodingFailurePolicySetErrorAndReturn = 1;
+}
+
+abstract class NSStringCompareOptions {
+  static const int NSCaseInsensitiveSearch = 1;
+  static const int NSLiteralSearch = 2;
+  static const int NSBackwardsSearch = 4;
+  static const int NSAnchoredSearch = 8;
+  static const int NSNumericSearch = 64;
+  static const int NSDiacriticInsensitiveSearch = 128;
+  static const int NSWidthInsensitiveSearch = 256;
+  static const int NSForcedOrderingSearch = 512;
+  static const int NSRegularExpressionSearch = 1024;
+}
+
+abstract class NSStringEnumerationOptions {
+  static const int NSStringEnumerationByLines = 0;
+  static const int NSStringEnumerationByParagraphs = 1;
+  static const int NSStringEnumerationByComposedCharacterSequences = 2;
+  static const int NSStringEnumerationByWords = 3;
+  static const int NSStringEnumerationBySentences = 4;
+  static const int NSStringEnumerationByCaretPositions = 5;
+  static const int NSStringEnumerationByDeletionClusters = 6;
+  static const int NSStringEnumerationReverse = 256;
+  static const int NSStringEnumerationSubstringNotRequired = 512;
+  static const int NSStringEnumerationLocalized = 1024;
+}
+
+void _ObjCBlock10_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0,
+    NSRange arg1,
+    NSRange arg2,
+    ffi.Pointer<ffi.Bool> arg3) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(ffi.Pointer<ObjCObject> arg0, NSRange arg1,
+                  NSRange arg2, ffi.Pointer<ffi.Bool> arg3)>>()
+      .asFunction<
+          void Function(
+              ffi.Pointer<ObjCObject> arg0,
+              NSRange arg1,
+              NSRange arg2,
+              ffi.Pointer<ffi.Bool> arg3)>()(arg0, arg1, arg2, arg3);
+}
+
+final _ObjCBlock10_closureRegistry = <int, Function>{};
+int _ObjCBlock10_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock10_registerClosure(Function fn) {
+  final id = ++_ObjCBlock10_closureRegistryIndex;
+  _ObjCBlock10_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock10_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0,
+    NSRange arg1,
+    NSRange arg2,
+    ffi.Pointer<ffi.Bool> arg3) {
+  return _ObjCBlock10_closureRegistry[block.ref.target.address]!(
+      arg0, arg1, arg2, arg3);
+}
+
+class ObjCBlock10 extends _ObjCBlockBase {
+  ObjCBlock10._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock10.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0, NSRange arg1,
+                      NSRange arg2, ffi.Pointer<ffi.Bool> arg3)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                NSRange arg1,
+                                NSRange arg2,
+                                ffi.Pointer<ffi.Bool> arg3)>(
+                        _ObjCBlock10_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock10.fromFunction(
+      AVFAudio lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, NSRange arg1, NSRange arg2,
+              ffi.Pointer<ffi.Bool> arg3)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                NSRange arg1,
+                                NSRange arg2,
+                                ffi.Pointer<ffi.Bool> arg3)>(
+                        _ObjCBlock10_closureTrampoline)
+                    .cast(),
+                _ObjCBlock10_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0, NSRange arg1, NSRange arg2,
+      ffi.Pointer<ffi.Bool> arg3) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    NSRange arg1,
+                    NSRange arg2,
+                    ffi.Pointer<ffi.Bool> arg3)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                NSRange arg1,
+                NSRange arg2,
+                ffi.Pointer<ffi.Bool> arg3)>()(_id, arg0, arg1, arg2, arg3);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+void _ObjCBlock11_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ffi.Bool> arg1) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(
+                  ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ffi.Bool> arg1)>>()
+      .asFunction<
+          void Function(ffi.Pointer<ObjCObject> arg0,
+              ffi.Pointer<ffi.Bool> arg1)>()(arg0, arg1);
+}
+
+final _ObjCBlock11_closureRegistry = <int, Function>{};
+int _ObjCBlock11_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock11_registerClosure(Function fn) {
+  final id = ++_ObjCBlock11_closureRegistryIndex;
+  _ObjCBlock11_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock11_closureTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ffi.Bool> arg1) {
+  return _ObjCBlock11_closureRegistry[block.ref.target.address]!(arg0, arg1);
+}
+
+class ObjCBlock11 extends _ObjCBlockBase {
+  ObjCBlock11._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock11.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0,
+                      ffi.Pointer<ffi.Bool> arg1)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ffi.Bool> arg1)>(
+                        _ObjCBlock11_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock11.fromFunction(
+      AVFAudio lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ffi.Bool> arg1)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ffi.Bool> arg1)>(
+                        _ObjCBlock11_closureTrampoline)
+                    .cast(),
+                _ObjCBlock11_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ffi.Bool> arg1) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    ffi.Pointer<ffi.Bool> arg1)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                ffi.Pointer<ffi.Bool> arg1)>()(_id, arg0, arg1);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+typedef NSStringEncoding = NSUInteger;
+
+abstract class NSStringEncodingConversionOptions {
+  static const int NSStringEncodingConversionAllowLossy = 1;
+  static const int NSStringEncodingConversionExternalRepresentation = 2;
+}
+
+typedef NSStringTransform = ffi.Pointer<ObjCObject>;
+void _ObjCBlock12_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<unichar> arg0, int arg1) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(ffi.Pointer<unichar> arg0, NSUInteger arg1)>>()
+      .asFunction<
+          void Function(ffi.Pointer<unichar> arg0, int arg1)>()(arg0, arg1);
+}
+
+final _ObjCBlock12_closureRegistry = <int, Function>{};
+int _ObjCBlock12_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock12_registerClosure(Function fn) {
+  final id = ++_ObjCBlock12_closureRegistryIndex;
+  _ObjCBlock12_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock12_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<unichar> arg0, int arg1) {
+  return _ObjCBlock12_closureRegistry[block.ref.target.address]!(arg0, arg1);
+}
+
+class ObjCBlock12 extends _ObjCBlockBase {
+  ObjCBlock12._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock12.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(
+                      ffi.Pointer<unichar> arg0, NSUInteger arg1)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                        ffi.Void Function(
+                            ffi.Pointer<_ObjCBlock> block,
+                            ffi.Pointer<unichar> arg0,
+                            NSUInteger arg1)>(_ObjCBlock12_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock12.fromFunction(
+      AVFAudio lib, void Function(ffi.Pointer<unichar> arg0, int arg1) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                        ffi.Void Function(
+                            ffi.Pointer<_ObjCBlock> block,
+                            ffi.Pointer<unichar> arg0,
+                            NSUInteger arg1)>(_ObjCBlock12_closureTrampoline)
+                    .cast(),
+                _ObjCBlock12_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<unichar> arg0, int arg1) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<unichar> arg0, NSUInteger arg1)>>()
+        .asFunction<
+            void Function(ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<unichar> arg0, int arg1)>()(_id, arg0, arg1);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+typedef NSLinguisticTagScheme = ffi.Pointer<ObjCObject>;
+
+abstract class NSLinguisticTaggerOptions {
+  static const int NSLinguisticTaggerOmitWords = 1;
+  static const int NSLinguisticTaggerOmitPunctuation = 2;
+  static const int NSLinguisticTaggerOmitWhitespace = 4;
+  static const int NSLinguisticTaggerOmitOther = 8;
+  static const int NSLinguisticTaggerJoinNames = 16;
+}
+
+class NSOrthography extends NSObject {
+  NSOrthography._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSOrthography] that points to the same underlying object as [other].
+  static NSOrthography castFrom<T extends _ObjCWrapper>(T other) {
+    return NSOrthography._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSOrthography] that wraps the given raw object pointer.
+  static NSOrthography castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSOrthography._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSOrthography].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSOrthography1);
+  }
+
+  NSString? get dominantScript {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_dominantScript1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary? get languageMap {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_languageMap1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSOrthography initWithDominantScript_languageMap_(
+      NSString? script, NSDictionary? map) {
+    final _ret = _lib._objc_msgSend_352(
+        _id,
+        _lib._sel_initWithDominantScript_languageMap_1,
+        script?._id ?? ffi.nullptr,
+        map?._id ?? ffi.nullptr);
+    return NSOrthography._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSOrthography initWithCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr);
+    return NSOrthography._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray languagesForScript_(NSString? script) {
+    final _ret = _lib._objc_msgSend_119(
+        _id, _lib._sel_languagesForScript_1, script?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString dominantLanguageForScript_(NSString? script) {
+    final _ret = _lib._objc_msgSend_64(
+        _id, _lib._sel_dominantLanguageForScript_1, script?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get dominantLanguage {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_dominantLanguage1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get allScripts {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_allScripts1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get allLanguages {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_allLanguages1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSOrthography defaultOrthographyForLanguage_(
+      AVFAudio _lib, NSString? language) {
+    final _ret = _lib._objc_msgSend_30(
+        _lib._class_NSOrthography1,
+        _lib._sel_defaultOrthographyForLanguage_1,
+        language?._id ?? ffi.nullptr);
+    return NSOrthography._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSOrthography orthographyWithDominantScript_languageMap_(
+      AVFAudio _lib, NSString? script, NSDictionary? map) {
+    final _ret = _lib._objc_msgSend_352(
+        _lib._class_NSOrthography1,
+        _lib._sel_orthographyWithDominantScript_languageMap_1,
+        script?._id ?? ffi.nullptr,
+        map?._id ?? ffi.nullptr);
+    return NSOrthography._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSOrthography new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSOrthography1, _lib._sel_new1);
+    return NSOrthography._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSOrthography alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSOrthography1, _lib._sel_alloc1);
+    return NSOrthography._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSOrthography1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSOrthography1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSOrthography1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSOrthography1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSOrthography1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSOrthography1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSOrthography1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSOrthography1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSOrthography1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+void _ObjCBlock13_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ffi.Bool> arg1) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(
+                  ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ffi.Bool> arg1)>>()
+      .asFunction<
+          void Function(ffi.Pointer<ObjCObject> arg0,
+              ffi.Pointer<ffi.Bool> arg1)>()(arg0, arg1);
+}
+
+final _ObjCBlock13_closureRegistry = <int, Function>{};
+int _ObjCBlock13_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock13_registerClosure(Function fn) {
+  final id = ++_ObjCBlock13_closureRegistryIndex;
+  _ObjCBlock13_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock13_closureTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ffi.Bool> arg1) {
+  return _ObjCBlock13_closureRegistry[block.ref.target.address]!(arg0, arg1);
+}
+
+class ObjCBlock13 extends _ObjCBlockBase {
+  ObjCBlock13._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock13.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0,
+                      ffi.Pointer<ffi.Bool> arg1)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ffi.Bool> arg1)>(
+                        _ObjCBlock13_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock13.fromFunction(
+      AVFAudio lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ffi.Bool> arg1)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ffi.Bool> arg1)>(
+                        _ObjCBlock13_closureTrampoline)
+                    .cast(),
+                _ObjCBlock13_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ffi.Bool> arg1) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    ffi.Pointer<ffi.Bool> arg1)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                ffi.Pointer<ffi.Bool> arg1)>()(_id, arg0, arg1);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+bool _ObjCBlock14_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ffi.Bool> arg1) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Bool Function(
+                  ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ffi.Bool> arg1)>>()
+      .asFunction<
+          bool Function(ffi.Pointer<ObjCObject> arg0,
+              ffi.Pointer<ffi.Bool> arg1)>()(arg0, arg1);
+}
+
+final _ObjCBlock14_closureRegistry = <int, Function>{};
+int _ObjCBlock14_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock14_registerClosure(Function fn) {
+  final id = ++_ObjCBlock14_closureRegistryIndex;
+  _ObjCBlock14_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+bool _ObjCBlock14_closureTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ffi.Bool> arg1) {
+  return _ObjCBlock14_closureRegistry[block.ref.target.address]!(arg0, arg1);
+}
+
+class ObjCBlock14 extends _ObjCBlockBase {
+  ObjCBlock14._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock14.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Bool Function(ffi.Pointer<ObjCObject> arg0,
+                      ffi.Pointer<ffi.Bool> arg1)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Bool Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ffi.Bool> arg1)>(
+                        _ObjCBlock14_fnPtrTrampoline, false)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock14.fromFunction(
+      AVFAudio lib,
+      bool Function(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ffi.Bool> arg1)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Bool Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ffi.Bool> arg1)>(
+                        _ObjCBlock14_closureTrampoline, false)
+                    .cast(),
+                _ObjCBlock14_registerClosure(fn)),
+            lib);
+  bool call(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ffi.Bool> arg1) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Bool Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    ffi.Pointer<ffi.Bool> arg1)>>()
+        .asFunction<
+            bool Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                ffi.Pointer<ffi.Bool> arg1)>()(_id, arg0, arg1);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class NSFileManager extends NSObject {
+  NSFileManager._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSFileManager] that points to the same underlying object as [other].
+  static NSFileManager castFrom<T extends _ObjCWrapper>(T other) {
+    return NSFileManager._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSFileManager] that wraps the given raw object pointer.
+  static NSFileManager castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSFileManager._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSFileManager].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSFileManager1);
+  }
+
+  static NSFileManager? getDefaultManager(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_382(
+        _lib._class_NSFileManager1, _lib._sel_defaultManager1);
+    return _ret.address == 0
+        ? null
+        : NSFileManager._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray mountedVolumeURLsIncludingResourceValuesForKeys_options_(
+      NSArray? propertyKeys, int options) {
+    final _ret = _lib._objc_msgSend_383(
+        _id,
+        _lib._sel_mountedVolumeURLsIncludingResourceValuesForKeys_options_1,
+        propertyKeys?._id ?? ffi.nullptr,
+        options);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  void unmountVolumeAtURL_options_completionHandler_(
+      NSURL? url, int mask, ObjCBlock15 completionHandler) {
+    return _lib._objc_msgSend_384(
+        _id,
+        _lib._sel_unmountVolumeAtURL_options_completionHandler_1,
+        url?._id ?? ffi.nullptr,
+        mask,
+        completionHandler._id);
+  }
+
+  NSArray contentsOfDirectoryAtURL_includingPropertiesForKeys_options_error_(
+      NSURL? url,
+      NSArray? keys,
+      int mask,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_385(
+        _id,
+        _lib._sel_contentsOfDirectoryAtURL_includingPropertiesForKeys_options_error_1,
+        url?._id ?? ffi.nullptr,
+        keys?._id ?? ffi.nullptr,
+        mask,
+        error);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray URLsForDirectory_inDomains_(int directory, int domainMask) {
+    final _ret = _lib._objc_msgSend_386(
+        _id, _lib._sel_URLsForDirectory_inDomains_1, directory, domainMask);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL URLForDirectory_inDomain_appropriateForURL_create_error_(
+      int directory,
+      int domain,
+      NSURL? url,
+      bool shouldCreate,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_387(
+        _id,
+        _lib._sel_URLForDirectory_inDomain_appropriateForURL_create_error_1,
+        directory,
+        domain,
+        url?._id ?? ffi.nullptr,
+        shouldCreate,
+        error);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool getRelationship_ofDirectoryAtURL_toItemAtURL_error_(
+      ffi.Pointer<ffi.Int32> outRelationship,
+      NSURL? directoryURL,
+      NSURL? otherURL,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_388(
+        _id,
+        _lib._sel_getRelationship_ofDirectoryAtURL_toItemAtURL_error_1,
+        outRelationship,
+        directoryURL?._id ?? ffi.nullptr,
+        otherURL?._id ?? ffi.nullptr,
+        error);
+  }
+
+  bool getRelationship_ofDirectory_inDomain_toItemAtURL_error_(
+      ffi.Pointer<ffi.Int32> outRelationship,
+      int directory,
+      int domainMask,
+      NSURL? url,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_389(
+        _id,
+        _lib._sel_getRelationship_ofDirectory_inDomain_toItemAtURL_error_1,
+        outRelationship,
+        directory,
+        domainMask,
+        url?._id ?? ffi.nullptr,
+        error);
+  }
+
+  bool createDirectoryAtURL_withIntermediateDirectories_attributes_error_(
+      NSURL? url,
+      bool createIntermediates,
+      NSDictionary? attributes,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_390(
+        _id,
+        _lib._sel_createDirectoryAtURL_withIntermediateDirectories_attributes_error_1,
+        url?._id ?? ffi.nullptr,
+        createIntermediates,
+        attributes?._id ?? ffi.nullptr,
+        error);
+  }
+
+  bool createSymbolicLinkAtURL_withDestinationURL_error_(
+      NSURL? url, NSURL? destURL, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_391(
+        _id,
+        _lib._sel_createSymbolicLinkAtURL_withDestinationURL_error_1,
+        url?._id ?? ffi.nullptr,
+        destURL?._id ?? ffi.nullptr,
+        error);
+  }
+
+  NSObject? get delegate {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_delegate1);
+    return _ret.address == 0
+        ? null
+        : NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  set delegate(NSObject? value) {
+    _lib._objc_msgSend_368(
+        _id, _lib._sel_setDelegate_1, value?._id ?? ffi.nullptr);
+  }
+
+  bool setAttributes_ofItemAtPath_error_(NSDictionary? attributes,
+      NSString? path, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_392(
+        _id,
+        _lib._sel_setAttributes_ofItemAtPath_error_1,
+        attributes?._id ?? ffi.nullptr,
+        path?._id ?? ffi.nullptr,
+        error);
+  }
+
+  bool createDirectoryAtPath_withIntermediateDirectories_attributes_error_(
+      NSString? path,
+      bool createIntermediates,
+      NSDictionary? attributes,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_393(
+        _id,
+        _lib._sel_createDirectoryAtPath_withIntermediateDirectories_attributes_error_1,
+        path?._id ?? ffi.nullptr,
+        createIntermediates,
+        attributes?._id ?? ffi.nullptr,
+        error);
+  }
+
+  NSArray contentsOfDirectoryAtPath_error_(
+      NSString? path, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_394(
+        _id,
+        _lib._sel_contentsOfDirectoryAtPath_error_1,
+        path?._id ?? ffi.nullptr,
+        error);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray subpathsOfDirectoryAtPath_error_(
+      NSString? path, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_394(
+        _id,
+        _lib._sel_subpathsOfDirectoryAtPath_error_1,
+        path?._id ?? ffi.nullptr,
+        error);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary attributesOfItemAtPath_error_(
+      NSString? path, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_395(
+        _id,
+        _lib._sel_attributesOfItemAtPath_error_1,
+        path?._id ?? ffi.nullptr,
+        error);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary attributesOfFileSystemForPath_error_(
+      NSString? path, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_395(
+        _id,
+        _lib._sel_attributesOfFileSystemForPath_error_1,
+        path?._id ?? ffi.nullptr,
+        error);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool createSymbolicLinkAtPath_withDestinationPath_error_(NSString? path,
+      NSString? destPath, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_396(
+        _id,
+        _lib._sel_createSymbolicLinkAtPath_withDestinationPath_error_1,
+        path?._id ?? ffi.nullptr,
+        destPath?._id ?? ffi.nullptr,
+        error);
+  }
+
+  NSString destinationOfSymbolicLinkAtPath_error_(
+      NSString? path, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_397(
+        _id,
+        _lib._sel_destinationOfSymbolicLinkAtPath_error_1,
+        path?._id ?? ffi.nullptr,
+        error);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool copyItemAtPath_toPath_error_(NSString? srcPath, NSString? dstPath,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_396(_id, _lib._sel_copyItemAtPath_toPath_error_1,
+        srcPath?._id ?? ffi.nullptr, dstPath?._id ?? ffi.nullptr, error);
+  }
+
+  bool moveItemAtPath_toPath_error_(NSString? srcPath, NSString? dstPath,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_396(_id, _lib._sel_moveItemAtPath_toPath_error_1,
+        srcPath?._id ?? ffi.nullptr, dstPath?._id ?? ffi.nullptr, error);
+  }
+
+  bool linkItemAtPath_toPath_error_(NSString? srcPath, NSString? dstPath,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_396(_id, _lib._sel_linkItemAtPath_toPath_error_1,
+        srcPath?._id ?? ffi.nullptr, dstPath?._id ?? ffi.nullptr, error);
+  }
+
+  bool removeItemAtPath_error_(
+      NSString? path, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_398(_id, _lib._sel_removeItemAtPath_error_1,
+        path?._id ?? ffi.nullptr, error);
+  }
+
+  bool copyItemAtURL_toURL_error_(NSURL? srcURL, NSURL? dstURL,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_391(_id, _lib._sel_copyItemAtURL_toURL_error_1,
+        srcURL?._id ?? ffi.nullptr, dstURL?._id ?? ffi.nullptr, error);
+  }
+
+  bool moveItemAtURL_toURL_error_(NSURL? srcURL, NSURL? dstURL,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_391(_id, _lib._sel_moveItemAtURL_toURL_error_1,
+        srcURL?._id ?? ffi.nullptr, dstURL?._id ?? ffi.nullptr, error);
+  }
+
+  bool linkItemAtURL_toURL_error_(NSURL? srcURL, NSURL? dstURL,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_391(_id, _lib._sel_linkItemAtURL_toURL_error_1,
+        srcURL?._id ?? ffi.nullptr, dstURL?._id ?? ffi.nullptr, error);
+  }
+
+  bool removeItemAtURL_error_(
+      NSURL? URL, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_81(
+        _id, _lib._sel_removeItemAtURL_error_1, URL?._id ?? ffi.nullptr, error);
+  }
+
+  bool trashItemAtURL_resultingItemURL_error_(
+      NSURL? url,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outResultingURL,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_399(
+        _id,
+        _lib._sel_trashItemAtURL_resultingItemURL_error_1,
+        url?._id ?? ffi.nullptr,
+        outResultingURL,
+        error);
+  }
+
+  NSDictionary fileAttributesAtPath_traverseLink_(NSString? path, bool yorn) {
+    final _ret = _lib._objc_msgSend_400(
+        _id,
+        _lib._sel_fileAttributesAtPath_traverseLink_1,
+        path?._id ?? ffi.nullptr,
+        yorn);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool changeFileAttributes_atPath_(NSDictionary? attributes, NSString? path) {
+    return _lib._objc_msgSend_401(_id, _lib._sel_changeFileAttributes_atPath_1,
+        attributes?._id ?? ffi.nullptr, path?._id ?? ffi.nullptr);
+  }
+
+  NSArray directoryContentsAtPath_(NSString? path) {
+    final _ret = _lib._objc_msgSend_119(
+        _id, _lib._sel_directoryContentsAtPath_1, path?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary fileSystemAttributesAtPath_(NSString? path) {
+    final _ret = _lib._objc_msgSend_140(
+        _id, _lib._sel_fileSystemAttributesAtPath_1, path?._id ?? ffi.nullptr);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString pathContentOfSymbolicLinkAtPath_(NSString? path) {
+    final _ret = _lib._objc_msgSend_64(_id,
+        _lib._sel_pathContentOfSymbolicLinkAtPath_1, path?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool createSymbolicLinkAtPath_pathContent_(
+      NSString? path, NSString? otherpath) {
+    return _lib._objc_msgSend_402(
+        _id,
+        _lib._sel_createSymbolicLinkAtPath_pathContent_1,
+        path?._id ?? ffi.nullptr,
+        otherpath?._id ?? ffi.nullptr);
+  }
+
+  bool createDirectoryAtPath_attributes_(
+      NSString? path, NSDictionary? attributes) {
+    return _lib._objc_msgSend_403(
+        _id,
+        _lib._sel_createDirectoryAtPath_attributes_1,
+        path?._id ?? ffi.nullptr,
+        attributes?._id ?? ffi.nullptr);
+  }
+
+  bool linkPath_toPath_handler_(
+      NSString? src, NSString? dest, NSObject handler) {
+    return _lib._objc_msgSend_404(_id, _lib._sel_linkPath_toPath_handler_1,
+        src?._id ?? ffi.nullptr, dest?._id ?? ffi.nullptr, handler._id);
+  }
+
+  bool copyPath_toPath_handler_(
+      NSString? src, NSString? dest, NSObject handler) {
+    return _lib._objc_msgSend_404(_id, _lib._sel_copyPath_toPath_handler_1,
+        src?._id ?? ffi.nullptr, dest?._id ?? ffi.nullptr, handler._id);
+  }
+
+  bool movePath_toPath_handler_(
+      NSString? src, NSString? dest, NSObject handler) {
+    return _lib._objc_msgSend_404(_id, _lib._sel_movePath_toPath_handler_1,
+        src?._id ?? ffi.nullptr, dest?._id ?? ffi.nullptr, handler._id);
+  }
+
+  bool removeFileAtPath_handler_(NSString? path, NSObject handler) {
+    return _lib._objc_msgSend_405(_id, _lib._sel_removeFileAtPath_handler_1,
+        path?._id ?? ffi.nullptr, handler._id);
+  }
+
+  NSString? get currentDirectoryPath {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_currentDirectoryPath1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool changeCurrentDirectoryPath_(NSString? path) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_changeCurrentDirectoryPath_1, path?._id ?? ffi.nullptr);
+  }
+
+  bool fileExistsAtPath_(NSString? path) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_fileExistsAtPath_1, path?._id ?? ffi.nullptr);
+  }
+
+  bool fileExistsAtPath_isDirectory_(
+      NSString? path, ffi.Pointer<ffi.Bool> isDirectory) {
+    return _lib._objc_msgSend_406(_id, _lib._sel_fileExistsAtPath_isDirectory_1,
+        path?._id ?? ffi.nullptr, isDirectory);
+  }
+
+  bool isReadableFileAtPath_(NSString? path) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_isReadableFileAtPath_1, path?._id ?? ffi.nullptr);
+  }
+
+  bool isWritableFileAtPath_(NSString? path) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_isWritableFileAtPath_1, path?._id ?? ffi.nullptr);
+  }
+
+  bool isExecutableFileAtPath_(NSString? path) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_isExecutableFileAtPath_1, path?._id ?? ffi.nullptr);
+  }
+
+  bool isDeletableFileAtPath_(NSString? path) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_isDeletableFileAtPath_1, path?._id ?? ffi.nullptr);
+  }
+
+  bool contentsEqualAtPath_andPath_(NSString? path1, NSString? path2) {
+    return _lib._objc_msgSend_402(_id, _lib._sel_contentsEqualAtPath_andPath_1,
+        path1?._id ?? ffi.nullptr, path2?._id ?? ffi.nullptr);
+  }
+
+  NSString displayNameAtPath_(NSString? path) {
+    final _ret = _lib._objc_msgSend_64(
+        _id, _lib._sel_displayNameAtPath_1, path?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray componentsToDisplayForPath_(NSString? path) {
+    final _ret = _lib._objc_msgSend_119(
+        _id, _lib._sel_componentsToDisplayForPath_1, path?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get homeDirectoryForCurrentUser {
+    final _ret =
+        _lib._objc_msgSend_40(_id, _lib._sel_homeDirectoryForCurrentUser1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get temporaryDirectory {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_temporaryDirectory1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL homeDirectoryForUser_(NSString? userName) {
+    final _ret = _lib._objc_msgSend_34(
+        _id, _lib._sel_homeDirectoryForUser_1, userName?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSFileManager new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSFileManager1, _lib._sel_new1);
+    return NSFileManager._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSFileManager alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSFileManager1, _lib._sel_alloc1);
+    return NSFileManager._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSFileManager1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSFileManager1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSFileManager1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSFileManager1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSFileManager1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSFileManager1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSFileManager1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSFileManager1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSFileManager1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSVolumeEnumerationOptions {
+  static const int NSVolumeEnumerationSkipHiddenVolumes = 2;
+  static const int NSVolumeEnumerationProduceFileReferenceURLs = 4;
+}
+
+abstract class NSFileManagerUnmountOptions {
+  static const int NSFileManagerUnmountAllPartitionsAndEjectDisk = 1;
+  static const int NSFileManagerUnmountWithoutUI = 2;
+}
+
+void _ObjCBlock15_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ObjCObject> arg0) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ObjCObject> arg0)>>()
+      .asFunction<void Function(ffi.Pointer<ObjCObject> arg0)>()(arg0);
+}
+
+final _ObjCBlock15_closureRegistry = <int, Function>{};
+int _ObjCBlock15_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock15_registerClosure(Function fn) {
+  final id = ++_ObjCBlock15_closureRegistryIndex;
+  _ObjCBlock15_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock15_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ObjCObject> arg0) {
+  return _ObjCBlock15_closureRegistry[block.ref.target.address]!(arg0);
+}
+
+class ObjCBlock15 extends _ObjCBlockBase {
+  ObjCBlock15._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock15.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0)>(
+                        _ObjCBlock15_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock15.fromFunction(
+      AVFAudio lib, void Function(ffi.Pointer<ObjCObject> arg0) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0)>(
+                        _ObjCBlock15_closureTrampoline)
+                    .cast(),
+                _ObjCBlock15_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0)>>()
+        .asFunction<
+            void Function(ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0)>()(_id, arg0);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+abstract class NSDirectoryEnumerationOptions {
+  static const int NSDirectoryEnumerationSkipsSubdirectoryDescendants = 1;
+  static const int NSDirectoryEnumerationSkipsPackageDescendants = 2;
+  static const int NSDirectoryEnumerationSkipsHiddenFiles = 4;
+  static const int NSDirectoryEnumerationIncludesDirectoriesPostOrder = 8;
+  static const int NSDirectoryEnumerationProducesRelativePathURLs = 16;
+}
+
+abstract class NSSearchPathDirectory {
+  static const int NSApplicationDirectory = 1;
+  static const int NSDemoApplicationDirectory = 2;
+  static const int NSDeveloperApplicationDirectory = 3;
+  static const int NSAdminApplicationDirectory = 4;
+  static const int NSLibraryDirectory = 5;
+  static const int NSDeveloperDirectory = 6;
+  static const int NSUserDirectory = 7;
+  static const int NSDocumentationDirectory = 8;
+  static const int NSDocumentDirectory = 9;
+  static const int NSCoreServiceDirectory = 10;
+  static const int NSAutosavedInformationDirectory = 11;
+  static const int NSDesktopDirectory = 12;
+  static const int NSCachesDirectory = 13;
+  static const int NSApplicationSupportDirectory = 14;
+  static const int NSDownloadsDirectory = 15;
+  static const int NSInputMethodsDirectory = 16;
+  static const int NSMoviesDirectory = 17;
+  static const int NSMusicDirectory = 18;
+  static const int NSPicturesDirectory = 19;
+  static const int NSPrinterDescriptionDirectory = 20;
+  static const int NSSharedPublicDirectory = 21;
+  static const int NSPreferencePanesDirectory = 22;
+  static const int NSApplicationScriptsDirectory = 23;
+  static const int NSItemReplacementDirectory = 99;
+  static const int NSAllApplicationsDirectory = 100;
+  static const int NSAllLibrariesDirectory = 101;
+  static const int NSTrashDirectory = 102;
+}
+
+abstract class NSSearchPathDomainMask {
+  static const int NSUserDomainMask = 1;
+  static const int NSLocalDomainMask = 2;
+  static const int NSNetworkDomainMask = 4;
+  static const int NSSystemDomainMask = 8;
+  static const int NSAllDomainsMask = 65535;
+}
+
+abstract class NSURLRelationship {
+  static const int NSURLRelationshipContains = 0;
+  static const int NSURLRelationshipSame = 1;
+  static const int NSURLRelationshipOther = 2;
+}
+
+class NSMutableArray extends NSArray {
+  NSMutableArray._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSMutableArray] that points to the same underlying object as [other].
+  static NSMutableArray castFrom<T extends _ObjCWrapper>(T other) {
+    return NSMutableArray._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSMutableArray] that wraps the given raw object pointer.
+  static NSMutableArray castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSMutableArray._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSMutableArray].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSMutableArray1);
+  }
+
+  void addObject_(NSObject anObject) {
+    return _lib._objc_msgSend_15(_id, _lib._sel_addObject_1, anObject._id);
+  }
+
+  void insertObject_atIndex_(NSObject anObject, int index) {
+    return _lib._objc_msgSend_409(
+        _id, _lib._sel_insertObject_atIndex_1, anObject._id, index);
+  }
+
+  void removeLastObject() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_removeLastObject1);
+  }
+
+  void removeObjectAtIndex_(int index) {
+    return _lib._objc_msgSend_410(_id, _lib._sel_removeObjectAtIndex_1, index);
+  }
+
+  void replaceObjectAtIndex_withObject_(int index, NSObject anObject) {
+    return _lib._objc_msgSend_411(
+        _id, _lib._sel_replaceObjectAtIndex_withObject_1, index, anObject._id);
+  }
+
+  @override
+  NSMutableArray init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSMutableArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSMutableArray initWithCapacity_(int numItems) {
+    final _ret =
+        _lib._objc_msgSend_60(_id, _lib._sel_initWithCapacity_1, numItems);
+    return NSMutableArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSMutableArray initWithCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr);
+    return NSMutableArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  void addObjectsFromArray_(NSArray? otherArray) {
+    return _lib._objc_msgSend_412(
+        _id, _lib._sel_addObjectsFromArray_1, otherArray?._id ?? ffi.nullptr);
+  }
+
+  void exchangeObjectAtIndex_withObjectAtIndex_(int idx1, int idx2) {
+    return _lib._objc_msgSend_413(
+        _id, _lib._sel_exchangeObjectAtIndex_withObjectAtIndex_1, idx1, idx2);
+  }
+
+  void removeAllObjects() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_removeAllObjects1);
+  }
+
+  void removeObject_inRange_(NSObject anObject, NSRange range) {
+    return _lib._objc_msgSend_414(
+        _id, _lib._sel_removeObject_inRange_1, anObject._id, range);
+  }
+
+  void removeObject_(NSObject anObject) {
+    return _lib._objc_msgSend_15(_id, _lib._sel_removeObject_1, anObject._id);
+  }
+
+  void removeObjectIdenticalTo_inRange_(NSObject anObject, NSRange range) {
+    return _lib._objc_msgSend_414(
+        _id, _lib._sel_removeObjectIdenticalTo_inRange_1, anObject._id, range);
+  }
+
+  void removeObjectIdenticalTo_(NSObject anObject) {
+    return _lib._objc_msgSend_15(
+        _id, _lib._sel_removeObjectIdenticalTo_1, anObject._id);
+  }
+
+  void removeObjectsFromIndices_numIndices_(
+      ffi.Pointer<NSUInteger> indices, int cnt) {
+    return _lib._objc_msgSend_415(
+        _id, _lib._sel_removeObjectsFromIndices_numIndices_1, indices, cnt);
+  }
+
+  void removeObjectsInArray_(NSArray? otherArray) {
+    return _lib._objc_msgSend_412(
+        _id, _lib._sel_removeObjectsInArray_1, otherArray?._id ?? ffi.nullptr);
+  }
+
+  void removeObjectsInRange_(NSRange range) {
+    return _lib._objc_msgSend_416(_id, _lib._sel_removeObjectsInRange_1, range);
+  }
+
+  void replaceObjectsInRange_withObjectsFromArray_range_(
+      NSRange range, NSArray? otherArray, NSRange otherRange) {
+    return _lib._objc_msgSend_417(
+        _id,
+        _lib._sel_replaceObjectsInRange_withObjectsFromArray_range_1,
+        range,
+        otherArray?._id ?? ffi.nullptr,
+        otherRange);
+  }
+
+  void replaceObjectsInRange_withObjectsFromArray_(
+      NSRange range, NSArray? otherArray) {
+    return _lib._objc_msgSend_418(
+        _id,
+        _lib._sel_replaceObjectsInRange_withObjectsFromArray_1,
+        range,
+        otherArray?._id ?? ffi.nullptr);
+  }
+
+  void setArray_(NSArray? otherArray) {
+    return _lib._objc_msgSend_412(
+        _id, _lib._sel_setArray_1, otherArray?._id ?? ffi.nullptr);
+  }
+
+  void sortUsingFunction_context_(
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  NSInteger Function(ffi.Pointer<ObjCObject>,
+                      ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Void>)>>
+          compare,
+      ffi.Pointer<ffi.Void> context) {
+    return _lib._objc_msgSend_419(
+        _id, _lib._sel_sortUsingFunction_context_1, compare, context);
+  }
+
+  void sortUsingSelector_(ffi.Pointer<ObjCSel> comparator) {
+    return _lib._objc_msgSend_7(_id, _lib._sel_sortUsingSelector_1, comparator);
+  }
+
+  void insertObjects_atIndexes_(NSArray? objects, NSIndexSet? indexes) {
+    return _lib._objc_msgSend_420(_id, _lib._sel_insertObjects_atIndexes_1,
+        objects?._id ?? ffi.nullptr, indexes?._id ?? ffi.nullptr);
+  }
+
+  void removeObjectsAtIndexes_(NSIndexSet? indexes) {
+    return _lib._objc_msgSend_421(
+        _id, _lib._sel_removeObjectsAtIndexes_1, indexes?._id ?? ffi.nullptr);
+  }
+
+  void replaceObjectsAtIndexes_withObjects_(
+      NSIndexSet? indexes, NSArray? objects) {
+    return _lib._objc_msgSend_422(
+        _id,
+        _lib._sel_replaceObjectsAtIndexes_withObjects_1,
+        indexes?._id ?? ffi.nullptr,
+        objects?._id ?? ffi.nullptr);
+  }
+
+  void setObject_atIndexedSubscript_(NSObject obj, int idx) {
+    return _lib._objc_msgSend_409(
+        _id, _lib._sel_setObject_atIndexedSubscript_1, obj._id, idx);
+  }
+
+  void sortUsingComparator_(NSComparator cmptr) {
+    return _lib._objc_msgSend_423(_id, _lib._sel_sortUsingComparator_1, cmptr);
+  }
+
+  void sortWithOptions_usingComparator_(int opts, NSComparator cmptr) {
+    return _lib._objc_msgSend_424(
+        _id, _lib._sel_sortWithOptions_usingComparator_1, opts, cmptr);
+  }
+
+  static NSMutableArray arrayWithCapacity_(AVFAudio _lib, int numItems) {
+    final _ret = _lib._objc_msgSend_60(
+        _lib._class_NSMutableArray1, _lib._sel_arrayWithCapacity_1, numItems);
+    return NSMutableArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableArray arrayWithContentsOfFile_(
+      AVFAudio _lib, NSString? path) {
+    final _ret = _lib._objc_msgSend_425(_lib._class_NSMutableArray1,
+        _lib._sel_arrayWithContentsOfFile_1, path?._id ?? ffi.nullptr);
+    return NSMutableArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableArray arrayWithContentsOfURL_(AVFAudio _lib, NSURL? url) {
+    final _ret = _lib._objc_msgSend_426(_lib._class_NSMutableArray1,
+        _lib._sel_arrayWithContentsOfURL_1, url?._id ?? ffi.nullptr);
+    return NSMutableArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSMutableArray initWithContentsOfFile_(NSString? path) {
+    final _ret = _lib._objc_msgSend_425(
+        _id, _lib._sel_initWithContentsOfFile_1, path?._id ?? ffi.nullptr);
+    return NSMutableArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSMutableArray initWithContentsOfURL_(NSURL? url) {
+    final _ret = _lib._objc_msgSend_426(
+        _id, _lib._sel_initWithContentsOfURL_1, url?._id ?? ffi.nullptr);
+    return NSMutableArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  void applyDifference_() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_applyDifference_1);
+  }
+
+  void sortUsingDescriptors_(NSArray? sortDescriptors) {
+    return _lib._objc_msgSend_412(_id, _lib._sel_sortUsingDescriptors_1,
+        sortDescriptors?._id ?? ffi.nullptr);
+  }
+
+  void filterUsingPredicate_(NSPredicate? predicate) {
+    return _lib._objc_msgSend_427(
+        _id, _lib._sel_filterUsingPredicate_1, predicate?._id ?? ffi.nullptr);
+  }
+
+  static NSMutableArray array(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMutableArray1, _lib._sel_array1);
+    return NSMutableArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableArray arrayWithObject_(AVFAudio _lib, NSObject anObject) {
+    final _ret = _lib._objc_msgSend_16(
+        _lib._class_NSMutableArray1, _lib._sel_arrayWithObject_1, anObject._id);
+    return NSMutableArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableArray arrayWithObjects_count_(
+      AVFAudio _lib, ffi.Pointer<ffi.Pointer<ObjCObject>> objects, int cnt) {
+    final _ret = _lib._objc_msgSend_61(_lib._class_NSMutableArray1,
+        _lib._sel_arrayWithObjects_count_1, objects, cnt);
+    return NSMutableArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableArray arrayWithObjects_(AVFAudio _lib, NSObject firstObj) {
+    final _ret = _lib._objc_msgSend_16(_lib._class_NSMutableArray1,
+        _lib._sel_arrayWithObjects_1, firstObj._id);
+    return NSMutableArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableArray arrayWithArray_(AVFAudio _lib, NSArray? array) {
+    final _ret = _lib._objc_msgSend_67(_lib._class_NSMutableArray1,
+        _lib._sel_arrayWithArray_1, array?._id ?? ffi.nullptr);
+    return NSMutableArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray arrayWithContentsOfURL_error_(
+      AVFAudio _lib, NSURL? url, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_117(
+        _lib._class_NSMutableArray1,
+        _lib._sel_arrayWithContentsOfURL_error_1,
+        url?._id ?? ffi.nullptr,
+        error);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableArray new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMutableArray1, _lib._sel_new1);
+    return NSMutableArray._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSMutableArray alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMutableArray1, _lib._sel_alloc1);
+    return NSMutableArray._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSMutableArray1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSMutableArray1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSMutableArray1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSMutableArray1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSMutableArray1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSMutableArray1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSMutableArray1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSMutableArray1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSMutableArray1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSMutableOrderedSet extends NSOrderedSet {
+  NSMutableOrderedSet._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSMutableOrderedSet] that points to the same underlying object as [other].
+  static NSMutableOrderedSet castFrom<T extends _ObjCWrapper>(T other) {
+    return NSMutableOrderedSet._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSMutableOrderedSet] that wraps the given raw object pointer.
+  static NSMutableOrderedSet castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSMutableOrderedSet._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSMutableOrderedSet].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSMutableOrderedSet1);
+  }
+
+  void insertObject_atIndex_(NSObject object, int idx) {
+    return _lib._objc_msgSend_409(
+        _id, _lib._sel_insertObject_atIndex_1, object._id, idx);
+  }
+
+  void removeObjectAtIndex_(int idx) {
+    return _lib._objc_msgSend_410(_id, _lib._sel_removeObjectAtIndex_1, idx);
+  }
+
+  void replaceObjectAtIndex_withObject_(int idx, NSObject object) {
+    return _lib._objc_msgSend_411(
+        _id, _lib._sel_replaceObjectAtIndex_withObject_1, idx, object._id);
+  }
+
+  @override
+  NSMutableOrderedSet initWithCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr);
+    return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSMutableOrderedSet init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSMutableOrderedSet initWithCapacity_(int numItems) {
+    final _ret =
+        _lib._objc_msgSend_60(_id, _lib._sel_initWithCapacity_1, numItems);
+    return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  void addObject_(NSObject object) {
+    return _lib._objc_msgSend_15(_id, _lib._sel_addObject_1, object._id);
+  }
+
+  void addObjects_count_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> objects, int count) {
+    return _lib._objc_msgSend_435(
+        _id, _lib._sel_addObjects_count_1, objects, count);
+  }
+
+  void addObjectsFromArray_(NSArray? array) {
+    return _lib._objc_msgSend_412(
+        _id, _lib._sel_addObjectsFromArray_1, array?._id ?? ffi.nullptr);
+  }
+
+  void exchangeObjectAtIndex_withObjectAtIndex_(int idx1, int idx2) {
+    return _lib._objc_msgSend_413(
+        _id, _lib._sel_exchangeObjectAtIndex_withObjectAtIndex_1, idx1, idx2);
+  }
+
+  void moveObjectsAtIndexes_toIndex_(NSIndexSet? indexes, int idx) {
+    return _lib._objc_msgSend_436(_id, _lib._sel_moveObjectsAtIndexes_toIndex_1,
+        indexes?._id ?? ffi.nullptr, idx);
+  }
+
+  void insertObjects_atIndexes_(NSArray? objects, NSIndexSet? indexes) {
+    return _lib._objc_msgSend_420(_id, _lib._sel_insertObjects_atIndexes_1,
+        objects?._id ?? ffi.nullptr, indexes?._id ?? ffi.nullptr);
+  }
+
+  void setObject_atIndex_(NSObject obj, int idx) {
+    return _lib._objc_msgSend_409(
+        _id, _lib._sel_setObject_atIndex_1, obj._id, idx);
+  }
+
+  void setObject_atIndexedSubscript_(NSObject obj, int idx) {
+    return _lib._objc_msgSend_409(
+        _id, _lib._sel_setObject_atIndexedSubscript_1, obj._id, idx);
+  }
+
+  void replaceObjectsInRange_withObjects_count_(
+      NSRange range, ffi.Pointer<ffi.Pointer<ObjCObject>> objects, int count) {
+    return _lib._objc_msgSend_437(
+        _id,
+        _lib._sel_replaceObjectsInRange_withObjects_count_1,
+        range,
+        objects,
+        count);
+  }
+
+  void replaceObjectsAtIndexes_withObjects_(
+      NSIndexSet? indexes, NSArray? objects) {
+    return _lib._objc_msgSend_422(
+        _id,
+        _lib._sel_replaceObjectsAtIndexes_withObjects_1,
+        indexes?._id ?? ffi.nullptr,
+        objects?._id ?? ffi.nullptr);
+  }
+
+  void removeObjectsInRange_(NSRange range) {
+    return _lib._objc_msgSend_416(_id, _lib._sel_removeObjectsInRange_1, range);
+  }
+
+  void removeObjectsAtIndexes_(NSIndexSet? indexes) {
+    return _lib._objc_msgSend_421(
+        _id, _lib._sel_removeObjectsAtIndexes_1, indexes?._id ?? ffi.nullptr);
+  }
+
+  void removeAllObjects() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_removeAllObjects1);
+  }
+
+  void removeObject_(NSObject object) {
+    return _lib._objc_msgSend_15(_id, _lib._sel_removeObject_1, object._id);
+  }
+
+  void removeObjectsInArray_(NSArray? array) {
+    return _lib._objc_msgSend_412(
+        _id, _lib._sel_removeObjectsInArray_1, array?._id ?? ffi.nullptr);
+  }
+
+  void intersectOrderedSet_(NSOrderedSet? other) {
+    return _lib._objc_msgSend_438(
+        _id, _lib._sel_intersectOrderedSet_1, other?._id ?? ffi.nullptr);
+  }
+
+  void minusOrderedSet_(NSOrderedSet? other) {
+    return _lib._objc_msgSend_438(
+        _id, _lib._sel_minusOrderedSet_1, other?._id ?? ffi.nullptr);
+  }
+
+  void unionOrderedSet_(NSOrderedSet? other) {
+    return _lib._objc_msgSend_438(
+        _id, _lib._sel_unionOrderedSet_1, other?._id ?? ffi.nullptr);
+  }
+
+  void intersectSet_(NSSet? other) {
+    return _lib._objc_msgSend_439(
+        _id, _lib._sel_intersectSet_1, other?._id ?? ffi.nullptr);
+  }
+
+  void minusSet_(NSSet? other) {
+    return _lib._objc_msgSend_439(
+        _id, _lib._sel_minusSet_1, other?._id ?? ffi.nullptr);
+  }
+
+  void unionSet_(NSSet? other) {
+    return _lib._objc_msgSend_439(
+        _id, _lib._sel_unionSet_1, other?._id ?? ffi.nullptr);
+  }
+
+  void sortUsingComparator_(NSComparator cmptr) {
+    return _lib._objc_msgSend_423(_id, _lib._sel_sortUsingComparator_1, cmptr);
+  }
+
+  void sortWithOptions_usingComparator_(int opts, NSComparator cmptr) {
+    return _lib._objc_msgSend_424(
+        _id, _lib._sel_sortWithOptions_usingComparator_1, opts, cmptr);
+  }
+
+  void sortRange_options_usingComparator_(
+      NSRange range, int opts, NSComparator cmptr) {
+    return _lib._objc_msgSend_440(
+        _id, _lib._sel_sortRange_options_usingComparator_1, range, opts, cmptr);
+  }
+
+  static NSMutableOrderedSet orderedSetWithCapacity_(
+      AVFAudio _lib, int numItems) {
+    final _ret = _lib._objc_msgSend_60(_lib._class_NSMutableOrderedSet1,
+        _lib._sel_orderedSetWithCapacity_1, numItems);
+    return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  void applyDifference_() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_applyDifference_1);
+  }
+
+  void sortUsingDescriptors_(NSArray? sortDescriptors) {
+    return _lib._objc_msgSend_412(_id, _lib._sel_sortUsingDescriptors_1,
+        sortDescriptors?._id ?? ffi.nullptr);
+  }
+
+  void filterUsingPredicate_(NSPredicate? p) {
+    return _lib._objc_msgSend_427(
+        _id, _lib._sel_filterUsingPredicate_1, p?._id ?? ffi.nullptr);
+  }
+
+  static NSMutableOrderedSet orderedSet(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSMutableOrderedSet1, _lib._sel_orderedSet1);
+    return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableOrderedSet orderedSetWithObject_(
+      AVFAudio _lib, NSObject object) {
+    final _ret = _lib._objc_msgSend_16(_lib._class_NSMutableOrderedSet1,
+        _lib._sel_orderedSetWithObject_1, object._id);
+    return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableOrderedSet orderedSetWithObjects_count_(
+      AVFAudio _lib, ffi.Pointer<ffi.Pointer<ObjCObject>> objects, int cnt) {
+    final _ret = _lib._objc_msgSend_61(_lib._class_NSMutableOrderedSet1,
+        _lib._sel_orderedSetWithObjects_count_1, objects, cnt);
+    return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableOrderedSet orderedSetWithObjects_(
+      AVFAudio _lib, NSObject firstObj) {
+    final _ret = _lib._objc_msgSend_16(_lib._class_NSMutableOrderedSet1,
+        _lib._sel_orderedSetWithObjects_1, firstObj._id);
+    return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableOrderedSet orderedSetWithOrderedSet_(
+      AVFAudio _lib, NSOrderedSet? set) {
+    final _ret = _lib._objc_msgSend_430(_lib._class_NSMutableOrderedSet1,
+        _lib._sel_orderedSetWithOrderedSet_1, set?._id ?? ffi.nullptr);
+    return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableOrderedSet orderedSetWithOrderedSet_range_copyItems_(
+      AVFAudio _lib, NSOrderedSet? set, NSRange range, bool flag) {
+    final _ret = _lib._objc_msgSend_431(
+        _lib._class_NSMutableOrderedSet1,
+        _lib._sel_orderedSetWithOrderedSet_range_copyItems_1,
+        set?._id ?? ffi.nullptr,
+        range,
+        flag);
+    return NSMutableOrderedSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSMutableOrderedSet orderedSetWithArray_(
+      AVFAudio _lib, NSArray? array) {
+    final _ret = _lib._objc_msgSend_67(_lib._class_NSMutableOrderedSet1,
+        _lib._sel_orderedSetWithArray_1, array?._id ?? ffi.nullptr);
+    return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableOrderedSet orderedSetWithArray_range_copyItems_(
+      AVFAudio _lib, NSArray? array, NSRange range, bool flag) {
+    final _ret = _lib._objc_msgSend_432(
+        _lib._class_NSMutableOrderedSet1,
+        _lib._sel_orderedSetWithArray_range_copyItems_1,
+        array?._id ?? ffi.nullptr,
+        range,
+        flag);
+    return NSMutableOrderedSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSMutableOrderedSet orderedSetWithSet_(AVFAudio _lib, NSSet? set) {
+    final _ret = _lib._objc_msgSend_363(_lib._class_NSMutableOrderedSet1,
+        _lib._sel_orderedSetWithSet_1, set?._id ?? ffi.nullptr);
+    return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableOrderedSet orderedSetWithSet_copyItems_(
+      AVFAudio _lib, NSSet? set, bool flag) {
+    final _ret = _lib._objc_msgSend_364(_lib._class_NSMutableOrderedSet1,
+        _lib._sel_orderedSetWithSet_copyItems_1, set?._id ?? ffi.nullptr, flag);
+    return NSMutableOrderedSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSMutableOrderedSet new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMutableOrderedSet1, _lib._sel_new1);
+    return NSMutableOrderedSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSMutableOrderedSet alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSMutableOrderedSet1, _lib._sel_alloc1);
+    return NSMutableOrderedSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSMutableOrderedSet1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSMutableOrderedSet1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSMutableOrderedSet1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSMutableOrderedSet1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSMutableOrderedSet1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSMutableOrderedSet1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSMutableOrderedSet1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSMutableOrderedSet1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSMutableOrderedSet1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSOrderedSet extends NSObject {
+  NSOrderedSet._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSOrderedSet] that points to the same underlying object as [other].
+  static NSOrderedSet castFrom<T extends _ObjCWrapper>(T other) {
+    return NSOrderedSet._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSOrderedSet] that wraps the given raw object pointer.
+  static NSOrderedSet castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSOrderedSet._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSOrderedSet].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSOrderedSet1);
+  }
+
+  int get count {
+    return _lib._objc_msgSend_10(_id, _lib._sel_count1);
+  }
+
+  NSObject objectAtIndex_(int idx) {
+    final _ret = _lib._objc_msgSend_60(_id, _lib._sel_objectAtIndex_1, idx);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  int indexOfObject_(NSObject object) {
+    return _lib._objc_msgSend_69(_id, _lib._sel_indexOfObject_1, object._id);
+  }
+
+  @override
+  NSOrderedSet init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSOrderedSet initWithObjects_count_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> objects, int cnt) {
+    final _ret = _lib._objc_msgSend_61(
+        _id, _lib._sel_initWithObjects_count_1, objects, cnt);
+    return NSOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSOrderedSet initWithCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr);
+    return NSOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  void getObjects_range_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> objects, NSRange range) {
+    return _lib._objc_msgSend_68(
+        _id, _lib._sel_getObjects_range_1, objects, range);
+  }
+
+  NSArray objectsAtIndexes_(NSIndexSet? indexes) {
+    final _ret = _lib._objc_msgSend_103(
+        _id, _lib._sel_objectsAtIndexes_1, indexes?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject get firstObject {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_firstObject1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject get lastObject {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_lastObject1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool isEqualToOrderedSet_(NSOrderedSet? other) {
+    return _lib._objc_msgSend_428(
+        _id, _lib._sel_isEqualToOrderedSet_1, other?._id ?? ffi.nullptr);
+  }
+
+  bool containsObject_(NSObject object) {
+    return _lib._objc_msgSend_0(_id, _lib._sel_containsObject_1, object._id);
+  }
+
+  bool intersectsOrderedSet_(NSOrderedSet? other) {
+    return _lib._objc_msgSend_428(
+        _id, _lib._sel_intersectsOrderedSet_1, other?._id ?? ffi.nullptr);
+  }
+
+  bool intersectsSet_(NSSet? set) {
+    return _lib._objc_msgSend_355(
+        _id, _lib._sel_intersectsSet_1, set?._id ?? ffi.nullptr);
+  }
+
+  bool isSubsetOfOrderedSet_(NSOrderedSet? other) {
+    return _lib._objc_msgSend_428(
+        _id, _lib._sel_isSubsetOfOrderedSet_1, other?._id ?? ffi.nullptr);
+  }
+
+  bool isSubsetOfSet_(NSSet? set) {
+    return _lib._objc_msgSend_355(
+        _id, _lib._sel_isSubsetOfSet_1, set?._id ?? ffi.nullptr);
+  }
+
+  NSObject objectAtIndexedSubscript_(int idx) {
+    final _ret =
+        _lib._objc_msgSend_60(_id, _lib._sel_objectAtIndexedSubscript_1, idx);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSEnumerator objectEnumerator() {
+    final _ret = _lib._objc_msgSend_72(_id, _lib._sel_objectEnumerator1);
+    return NSEnumerator._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSEnumerator reverseObjectEnumerator() {
+    final _ret = _lib._objc_msgSend_72(_id, _lib._sel_reverseObjectEnumerator1);
+    return NSEnumerator._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSOrderedSet? get reversedOrderedSet {
+    final _ret = _lib._objc_msgSend_429(_id, _lib._sel_reversedOrderedSet1);
+    return _ret.address == 0
+        ? null
+        : NSOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get array {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_array1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSSet? get set1 {
+    final _ret = _lib._objc_msgSend_280(_id, _lib._sel_set1);
+    return _ret.address == 0
+        ? null
+        : NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  void enumerateObjectsUsingBlock_(ObjCBlock3 block) {
+    return _lib._objc_msgSend_104(
+        _id, _lib._sel_enumerateObjectsUsingBlock_1, block._id);
+  }
+
+  void enumerateObjectsWithOptions_usingBlock_(int opts, ObjCBlock3 block) {
+    return _lib._objc_msgSend_105(_id,
+        _lib._sel_enumerateObjectsWithOptions_usingBlock_1, opts, block._id);
+  }
+
+  void enumerateObjectsAtIndexes_options_usingBlock_(
+      NSIndexSet? s, int opts, ObjCBlock3 block) {
+    return _lib._objc_msgSend_106(
+        _id,
+        _lib._sel_enumerateObjectsAtIndexes_options_usingBlock_1,
+        s?._id ?? ffi.nullptr,
+        opts,
+        block._id);
+  }
+
+  int indexOfObjectPassingTest_(ObjCBlock4 predicate) {
+    return _lib._objc_msgSend_107(
+        _id, _lib._sel_indexOfObjectPassingTest_1, predicate._id);
+  }
+
+  int indexOfObjectWithOptions_passingTest_(int opts, ObjCBlock4 predicate) {
+    return _lib._objc_msgSend_108(_id,
+        _lib._sel_indexOfObjectWithOptions_passingTest_1, opts, predicate._id);
+  }
+
+  int indexOfObjectAtIndexes_options_passingTest_(
+      NSIndexSet? s, int opts, ObjCBlock4 predicate) {
+    return _lib._objc_msgSend_109(
+        _id,
+        _lib._sel_indexOfObjectAtIndexes_options_passingTest_1,
+        s?._id ?? ffi.nullptr,
+        opts,
+        predicate._id);
+  }
+
+  NSIndexSet indexesOfObjectsPassingTest_(ObjCBlock4 predicate) {
+    final _ret = _lib._objc_msgSend_110(
+        _id, _lib._sel_indexesOfObjectsPassingTest_1, predicate._id);
+    return NSIndexSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSIndexSet indexesOfObjectsWithOptions_passingTest_(
+      int opts, ObjCBlock4 predicate) {
+    final _ret = _lib._objc_msgSend_111(
+        _id,
+        _lib._sel_indexesOfObjectsWithOptions_passingTest_1,
+        opts,
+        predicate._id);
+    return NSIndexSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSIndexSet indexesOfObjectsAtIndexes_options_passingTest_(
+      NSIndexSet? s, int opts, ObjCBlock4 predicate) {
+    final _ret = _lib._objc_msgSend_112(
+        _id,
+        _lib._sel_indexesOfObjectsAtIndexes_options_passingTest_1,
+        s?._id ?? ffi.nullptr,
+        opts,
+        predicate._id);
+    return NSIndexSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  int indexOfObject_inSortedRange_options_usingComparator_(
+      NSObject object, NSRange range, int opts, NSComparator cmp) {
+    return _lib._objc_msgSend_115(
+        _id,
+        _lib._sel_indexOfObject_inSortedRange_options_usingComparator_1,
+        object._id,
+        range,
+        opts,
+        cmp);
+  }
+
+  NSArray sortedArrayUsingComparator_(NSComparator cmptr) {
+    final _ret = _lib._objc_msgSend_113(
+        _id, _lib._sel_sortedArrayUsingComparator_1, cmptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray sortedArrayWithOptions_usingComparator_(
+      int opts, NSComparator cmptr) {
+    final _ret = _lib._objc_msgSend_114(
+        _id, _lib._sel_sortedArrayWithOptions_usingComparator_1, opts, cmptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get description {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_description1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString descriptionWithLocale_(NSObject locale) {
+    final _ret = _lib._objc_msgSend_65(
+        _id, _lib._sel_descriptionWithLocale_1, locale._id);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString descriptionWithLocale_indent_(NSObject locale, int level) {
+    final _ret = _lib._objc_msgSend_66(
+        _id, _lib._sel_descriptionWithLocale_indent_1, locale._id, level);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSOrderedSet orderedSet(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSOrderedSet1, _lib._sel_orderedSet1);
+    return NSOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSOrderedSet orderedSetWithObject_(AVFAudio _lib, NSObject object) {
+    final _ret = _lib._objc_msgSend_16(_lib._class_NSOrderedSet1,
+        _lib._sel_orderedSetWithObject_1, object._id);
+    return NSOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSOrderedSet orderedSetWithObjects_count_(
+      AVFAudio _lib, ffi.Pointer<ffi.Pointer<ObjCObject>> objects, int cnt) {
+    final _ret = _lib._objc_msgSend_61(_lib._class_NSOrderedSet1,
+        _lib._sel_orderedSetWithObjects_count_1, objects, cnt);
+    return NSOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSOrderedSet orderedSetWithObjects_(AVFAudio _lib, NSObject firstObj) {
+    final _ret = _lib._objc_msgSend_16(_lib._class_NSOrderedSet1,
+        _lib._sel_orderedSetWithObjects_1, firstObj._id);
+    return NSOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSOrderedSet orderedSetWithOrderedSet_(
+      AVFAudio _lib, NSOrderedSet? set) {
+    final _ret = _lib._objc_msgSend_430(_lib._class_NSOrderedSet1,
+        _lib._sel_orderedSetWithOrderedSet_1, set?._id ?? ffi.nullptr);
+    return NSOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSOrderedSet orderedSetWithOrderedSet_range_copyItems_(
+      AVFAudio _lib, NSOrderedSet? set, NSRange range, bool flag) {
+    final _ret = _lib._objc_msgSend_431(
+        _lib._class_NSOrderedSet1,
+        _lib._sel_orderedSetWithOrderedSet_range_copyItems_1,
+        set?._id ?? ffi.nullptr,
+        range,
+        flag);
+    return NSOrderedSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSOrderedSet orderedSetWithArray_(AVFAudio _lib, NSArray? array) {
+    final _ret = _lib._objc_msgSend_67(_lib._class_NSOrderedSet1,
+        _lib._sel_orderedSetWithArray_1, array?._id ?? ffi.nullptr);
+    return NSOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSOrderedSet orderedSetWithArray_range_copyItems_(
+      AVFAudio _lib, NSArray? array, NSRange range, bool flag) {
+    final _ret = _lib._objc_msgSend_432(
+        _lib._class_NSOrderedSet1,
+        _lib._sel_orderedSetWithArray_range_copyItems_1,
+        array?._id ?? ffi.nullptr,
+        range,
+        flag);
+    return NSOrderedSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSOrderedSet orderedSetWithSet_(AVFAudio _lib, NSSet? set) {
+    final _ret = _lib._objc_msgSend_363(_lib._class_NSOrderedSet1,
+        _lib._sel_orderedSetWithSet_1, set?._id ?? ffi.nullptr);
+    return NSOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSOrderedSet orderedSetWithSet_copyItems_(
+      AVFAudio _lib, NSSet? set, bool flag) {
+    final _ret = _lib._objc_msgSend_364(_lib._class_NSOrderedSet1,
+        _lib._sel_orderedSetWithSet_copyItems_1, set?._id ?? ffi.nullptr, flag);
+    return NSOrderedSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSOrderedSet initWithObject_(NSObject object) {
+    final _ret =
+        _lib._objc_msgSend_16(_id, _lib._sel_initWithObject_1, object._id);
+    return NSOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSOrderedSet initWithObjects_(NSObject firstObj) {
+    final _ret =
+        _lib._objc_msgSend_16(_id, _lib._sel_initWithObjects_1, firstObj._id);
+    return NSOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSOrderedSet initWithOrderedSet_(NSOrderedSet? set) {
+    final _ret = _lib._objc_msgSend_430(
+        _id, _lib._sel_initWithOrderedSet_1, set?._id ?? ffi.nullptr);
+    return NSOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSOrderedSet initWithOrderedSet_copyItems_(NSOrderedSet? set, bool flag) {
+    final _ret = _lib._objc_msgSend_433(
+        _id,
+        _lib._sel_initWithOrderedSet_copyItems_1,
+        set?._id ?? ffi.nullptr,
+        flag);
+    return NSOrderedSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSOrderedSet initWithOrderedSet_range_copyItems_(
+      NSOrderedSet? set, NSRange range, bool flag) {
+    final _ret = _lib._objc_msgSend_431(
+        _id,
+        _lib._sel_initWithOrderedSet_range_copyItems_1,
+        set?._id ?? ffi.nullptr,
+        range,
+        flag);
+    return NSOrderedSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSOrderedSet initWithArray_(NSArray? array) {
+    final _ret = _lib._objc_msgSend_67(
+        _id, _lib._sel_initWithArray_1, array?._id ?? ffi.nullptr);
+    return NSOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSOrderedSet initWithArray_copyItems_(NSArray? set, bool flag) {
+    final _ret = _lib._objc_msgSend_116(_id,
+        _lib._sel_initWithArray_copyItems_1, set?._id ?? ffi.nullptr, flag);
+    return NSOrderedSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSOrderedSet initWithArray_range_copyItems_(
+      NSArray? set, NSRange range, bool flag) {
+    final _ret = _lib._objc_msgSend_432(
+        _id,
+        _lib._sel_initWithArray_range_copyItems_1,
+        set?._id ?? ffi.nullptr,
+        range,
+        flag);
+    return NSOrderedSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSOrderedSet initWithSet_(NSSet? set) {
+    final _ret = _lib._objc_msgSend_363(
+        _id, _lib._sel_initWithSet_1, set?._id ?? ffi.nullptr);
+    return NSOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSOrderedSet initWithSet_copyItems_(NSSet? set, bool flag) {
+    final _ret = _lib._objc_msgSend_364(
+        _id, _lib._sel_initWithSet_copyItems_1, set?._id ?? ffi.nullptr, flag);
+    return NSOrderedSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  @override
+  NSObject valueForKey_(NSString? key) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_valueForKey_1, key?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  void setValue_forKey_(NSObject value, NSString? key) {
+    return _lib._objc_msgSend_122(
+        _id, _lib._sel_setValue_forKey_1, value._id, key?._id ?? ffi.nullptr);
+  }
+
+  @override
+  void addObserver_forKeyPath_options_context_(NSObject? observer,
+      NSString? keyPath, int options, ffi.Pointer<ffi.Void> context) {
+    return _lib._objc_msgSend_126(
+        _id,
+        _lib._sel_addObserver_forKeyPath_options_context_1,
+        observer?._id ?? ffi.nullptr,
+        keyPath?._id ?? ffi.nullptr,
+        options,
+        context);
+  }
+
+  @override
+  void removeObserver_forKeyPath_context_(
+      NSObject? observer, NSString? keyPath, ffi.Pointer<ffi.Void> context) {
+    return _lib._objc_msgSend_127(
+        _id,
+        _lib._sel_removeObserver_forKeyPath_context_1,
+        observer?._id ?? ffi.nullptr,
+        keyPath?._id ?? ffi.nullptr,
+        context);
+  }
+
+  @override
+  void removeObserver_forKeyPath_(NSObject? observer, NSString? keyPath) {
+    return _lib._objc_msgSend_128(_id, _lib._sel_removeObserver_forKeyPath_1,
+        observer?._id ?? ffi.nullptr, keyPath?._id ?? ffi.nullptr);
+  }
+
+  NSArray sortedArrayUsingDescriptors_(NSArray? sortDescriptors) {
+    final _ret = _lib._objc_msgSend_63(
+        _id,
+        _lib._sel_sortedArrayUsingDescriptors_1,
+        sortDescriptors?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSOrderedSet filteredOrderedSetUsingPredicate_(NSPredicate? p) {
+    final _ret = _lib._objc_msgSend_434(_id,
+        _lib._sel_filteredOrderedSetUsingPredicate_1, p?._id ?? ffi.nullptr);
+    return NSOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSOrderedSet new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSOrderedSet1, _lib._sel_new1);
+    return NSOrderedSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSOrderedSet alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSOrderedSet1, _lib._sel_alloc1);
+    return NSOrderedSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSOrderedSet1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSOrderedSet1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSOrderedSet1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSOrderedSet1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSOrderedSet1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSOrderedSet1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSOrderedSet1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSOrderedSet1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSOrderedSet1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSMutableSet extends NSSet {
+  NSMutableSet._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSMutableSet] that points to the same underlying object as [other].
+  static NSMutableSet castFrom<T extends _ObjCWrapper>(T other) {
+    return NSMutableSet._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSMutableSet] that wraps the given raw object pointer.
+  static NSMutableSet castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSMutableSet._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSMutableSet].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSMutableSet1);
+  }
+
+  void addObject_(NSObject object) {
+    return _lib._objc_msgSend_15(_id, _lib._sel_addObject_1, object._id);
+  }
+
+  void removeObject_(NSObject object) {
+    return _lib._objc_msgSend_15(_id, _lib._sel_removeObject_1, object._id);
+  }
+
+  @override
+  NSMutableSet initWithCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr);
+    return NSMutableSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSMutableSet init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSMutableSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSMutableSet initWithCapacity_(int numItems) {
+    final _ret =
+        _lib._objc_msgSend_60(_id, _lib._sel_initWithCapacity_1, numItems);
+    return NSMutableSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  void addObjectsFromArray_(NSArray? array) {
+    return _lib._objc_msgSend_412(
+        _id, _lib._sel_addObjectsFromArray_1, array?._id ?? ffi.nullptr);
+  }
+
+  void intersectSet_(NSSet? otherSet) {
+    return _lib._objc_msgSend_439(
+        _id, _lib._sel_intersectSet_1, otherSet?._id ?? ffi.nullptr);
+  }
+
+  void minusSet_(NSSet? otherSet) {
+    return _lib._objc_msgSend_439(
+        _id, _lib._sel_minusSet_1, otherSet?._id ?? ffi.nullptr);
+  }
+
+  void removeAllObjects() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_removeAllObjects1);
+  }
+
+  void unionSet_(NSSet? otherSet) {
+    return _lib._objc_msgSend_439(
+        _id, _lib._sel_unionSet_1, otherSet?._id ?? ffi.nullptr);
+  }
+
+  void setSet_(NSSet? otherSet) {
+    return _lib._objc_msgSend_439(
+        _id, _lib._sel_setSet_1, otherSet?._id ?? ffi.nullptr);
+  }
+
+  static NSMutableSet setWithCapacity_(AVFAudio _lib, int numItems) {
+    final _ret = _lib._objc_msgSend_60(
+        _lib._class_NSMutableSet1, _lib._sel_setWithCapacity_1, numItems);
+    return NSMutableSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  void filterUsingPredicate_(NSPredicate? predicate) {
+    return _lib._objc_msgSend_427(
+        _id, _lib._sel_filterUsingPredicate_1, predicate?._id ?? ffi.nullptr);
+  }
+
+  static NSMutableSet set1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMutableSet1, _lib._sel_set1);
+    return NSMutableSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableSet setWithObject_(AVFAudio _lib, NSObject object) {
+    final _ret = _lib._objc_msgSend_16(
+        _lib._class_NSMutableSet1, _lib._sel_setWithObject_1, object._id);
+    return NSMutableSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableSet setWithObjects_count_(
+      AVFAudio _lib, ffi.Pointer<ffi.Pointer<ObjCObject>> objects, int cnt) {
+    final _ret = _lib._objc_msgSend_61(_lib._class_NSMutableSet1,
+        _lib._sel_setWithObjects_count_1, objects, cnt);
+    return NSMutableSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableSet setWithObjects_(AVFAudio _lib, NSObject firstObj) {
+    final _ret = _lib._objc_msgSend_16(
+        _lib._class_NSMutableSet1, _lib._sel_setWithObjects_1, firstObj._id);
+    return NSMutableSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableSet setWithSet_(AVFAudio _lib, NSSet? set) {
+    final _ret = _lib._objc_msgSend_363(_lib._class_NSMutableSet1,
+        _lib._sel_setWithSet_1, set?._id ?? ffi.nullptr);
+    return NSMutableSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableSet setWithArray_(AVFAudio _lib, NSArray? array) {
+    final _ret = _lib._objc_msgSend_67(_lib._class_NSMutableSet1,
+        _lib._sel_setWithArray_1, array?._id ?? ffi.nullptr);
+    return NSMutableSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableSet new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMutableSet1, _lib._sel_new1);
+    return NSMutableSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSMutableSet alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMutableSet1, _lib._sel_alloc1);
+    return NSMutableSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSMutableSet1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSMutableSet1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSMutableSet1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSMutableSet1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSMutableSet1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSMutableSet1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSMutableSet1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSMutableSet1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSMutableSet1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSKeyValueChange {
+  static const int NSKeyValueChangeSetting = 1;
+  static const int NSKeyValueChangeInsertion = 2;
+  static const int NSKeyValueChangeRemoval = 3;
+  static const int NSKeyValueChangeReplacement = 4;
+}
+
+abstract class NSKeyValueSetMutationKind {
+  static const int NSKeyValueUnionSetMutation = 1;
+  static const int NSKeyValueMinusSetMutation = 2;
+  static const int NSKeyValueIntersectSetMutation = 3;
+  static const int NSKeyValueSetSetMutation = 4;
+}
+
+class NSKeyedArchiver extends NSCoder {
+  NSKeyedArchiver._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSKeyedArchiver] that points to the same underlying object as [other].
+  static NSKeyedArchiver castFrom<T extends _ObjCWrapper>(T other) {
+    return NSKeyedArchiver._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSKeyedArchiver] that wraps the given raw object pointer.
+  static NSKeyedArchiver castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSKeyedArchiver._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSKeyedArchiver].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSKeyedArchiver1);
+  }
+
+  NSKeyedArchiver initRequiringSecureCoding_(bool requiresSecureCoding) {
+    final _ret = _lib._objc_msgSend_449(
+        _id, _lib._sel_initRequiringSecureCoding_1, requiresSecureCoding);
+    return NSKeyedArchiver._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSData archivedDataWithRootObject_requiringSecureCoding_error_(
+      AVFAudio _lib,
+      NSObject object,
+      bool requiresSecureCoding,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_450(
+        _lib._class_NSKeyedArchiver1,
+        _lib._sel_archivedDataWithRootObject_requiringSecureCoding_error_1,
+        object._id,
+        requiresSecureCoding,
+        error);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSKeyedArchiver init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSKeyedArchiver._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSKeyedArchiver initForWritingWithMutableData_(NSMutableData? data) {
+    final _ret = _lib._objc_msgSend_455(_id,
+        _lib._sel_initForWritingWithMutableData_1, data?._id ?? ffi.nullptr);
+    return NSKeyedArchiver._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSData archivedDataWithRootObject_(
+      AVFAudio _lib, NSObject rootObject) {
+    final _ret = _lib._objc_msgSend_456(_lib._class_NSKeyedArchiver1,
+        _lib._sel_archivedDataWithRootObject_1, rootObject._id);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool archiveRootObject_toFile_(
+      AVFAudio _lib, NSObject rootObject, NSString? path) {
+    return _lib._objc_msgSend_225(
+        _lib._class_NSKeyedArchiver1,
+        _lib._sel_archiveRootObject_toFile_1,
+        rootObject._id,
+        path?._id ?? ffi.nullptr);
+  }
+
+  NSObject? get delegate {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_delegate1);
+    return _ret.address == 0
+        ? null
+        : NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  set delegate(NSObject? value) {
+    _lib._objc_msgSend_368(
+        _id, _lib._sel_setDelegate_1, value?._id ?? ffi.nullptr);
+  }
+
+  int get outputFormat {
+    return _lib._objc_msgSend_457(_id, _lib._sel_outputFormat1);
+  }
+
+  set outputFormat(int value) {
+    _lib._objc_msgSend_458(_id, _lib._sel_setOutputFormat_1, value);
+  }
+
+  NSData? get encodedData {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_encodedData1);
+    return _ret.address == 0
+        ? null
+        : NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  void finishEncoding() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_finishEncoding1);
+  }
+
+  static void setClassName_forClass_(
+      AVFAudio _lib, NSString? codedName, NSObject cls) {
+    return _lib._objc_msgSend_459(
+        _lib._class_NSKeyedArchiver1,
+        _lib._sel_setClassName_forClass_1,
+        codedName?._id ?? ffi.nullptr,
+        cls._id);
+  }
+
+  static NSString classNameForClass_(AVFAudio _lib, NSObject cls) {
+    final _ret = _lib._objc_msgSend_65(
+        _lib._class_NSKeyedArchiver1, _lib._sel_classNameForClass_1, cls._id);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  void encodeObject_forKey_(NSObject object, NSString? key) {
+    return _lib._objc_msgSend_122(_id, _lib._sel_encodeObject_forKey_1,
+        object._id, key?._id ?? ffi.nullptr);
+  }
+
+  @override
+  void encodeConditionalObject_forKey_(NSObject object, NSString? key) {
+    return _lib._objc_msgSend_122(
+        _id,
+        _lib._sel_encodeConditionalObject_forKey_1,
+        object._id,
+        key?._id ?? ffi.nullptr);
+  }
+
+  @override
+  void encodeBool_forKey_(bool value, NSString? key) {
+    return _lib._objc_msgSend_257(
+        _id, _lib._sel_encodeBool_forKey_1, value, key?._id ?? ffi.nullptr);
+  }
+
+  @override
+  void encodeInt_forKey_(int value, NSString? key) {
+    return _lib._objc_msgSend_258(
+        _id, _lib._sel_encodeInt_forKey_1, value, key?._id ?? ffi.nullptr);
+  }
+
+  @override
+  void encodeInt32_forKey_(int value, NSString? key) {
+    return _lib._objc_msgSend_259(
+        _id, _lib._sel_encodeInt32_forKey_1, value, key?._id ?? ffi.nullptr);
+  }
+
+  @override
+  void encodeInt64_forKey_(int value, NSString? key) {
+    return _lib._objc_msgSend_260(
+        _id, _lib._sel_encodeInt64_forKey_1, value, key?._id ?? ffi.nullptr);
+  }
+
+  @override
+  void encodeFloat_forKey_(double value, NSString? key) {
+    return _lib._objc_msgSend_261(
+        _id, _lib._sel_encodeFloat_forKey_1, value, key?._id ?? ffi.nullptr);
+  }
+
+  @override
+  void encodeDouble_forKey_(double value, NSString? key) {
+    return _lib._objc_msgSend_262(
+        _id, _lib._sel_encodeDouble_forKey_1, value, key?._id ?? ffi.nullptr);
+  }
+
+  @override
+  void encodeBytes_length_forKey_(
+      ffi.Pointer<ffi.Uint8> bytes, int length, NSString? key) {
+    return _lib._objc_msgSend_263(_id, _lib._sel_encodeBytes_length_forKey_1,
+        bytes, length, key?._id ?? ffi.nullptr);
+  }
+
+  @override
+  bool get requiresSecureCoding {
+    return _lib._objc_msgSend_12(_id, _lib._sel_requiresSecureCoding1);
+  }
+
+  set requiresSecureCoding(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setRequiresSecureCoding_1, value);
+  }
+
+  static NSKeyedArchiver new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSKeyedArchiver1, _lib._sel_new1);
+    return NSKeyedArchiver._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSKeyedArchiver alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSKeyedArchiver1, _lib._sel_alloc1);
+    return NSKeyedArchiver._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSKeyedArchiver1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSKeyedArchiver1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSKeyedArchiver1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSKeyedArchiver1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSKeyedArchiver1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSKeyedArchiver1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSKeyedArchiver1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSKeyedArchiver1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSKeyedArchiver1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSMutableData extends NSData {
+  NSMutableData._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSMutableData] that points to the same underlying object as [other].
+  static NSMutableData castFrom<T extends _ObjCWrapper>(T other) {
+    return NSMutableData._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSMutableData] that wraps the given raw object pointer.
+  static NSMutableData castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSMutableData._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSMutableData].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSMutableData1);
+  }
+
+  ffi.Pointer<ffi.Void> get mutableBytes {
+    return _lib._objc_msgSend_19(_id, _lib._sel_mutableBytes1);
+  }
+
+  @override
+  int get length {
+    return _lib._objc_msgSend_10(_id, _lib._sel_length1);
+  }
+
+  set length(int value) {
+    _lib._objc_msgSend_451(_id, _lib._sel_setLength_1, value);
+  }
+
+  void appendBytes_length_(ffi.Pointer<ffi.Void> bytes, int length) {
+    return _lib._objc_msgSend_21(
+        _id, _lib._sel_appendBytes_length_1, bytes, length);
+  }
+
+  void appendData_(NSData? other) {
+    return _lib._objc_msgSend_248(
+        _id, _lib._sel_appendData_1, other?._id ?? ffi.nullptr);
+  }
+
+  void increaseLengthBy_(int extraLength) {
+    return _lib._objc_msgSend_410(
+        _id, _lib._sel_increaseLengthBy_1, extraLength);
+  }
+
+  void replaceBytesInRange_withBytes_(
+      NSRange range, ffi.Pointer<ffi.Void> bytes) {
+    return _lib._objc_msgSend_452(
+        _id, _lib._sel_replaceBytesInRange_withBytes_1, range, bytes);
+  }
+
+  void resetBytesInRange_(NSRange range) {
+    return _lib._objc_msgSend_416(_id, _lib._sel_resetBytesInRange_1, range);
+  }
+
+  void setData_(NSData? data) {
+    return _lib._objc_msgSend_248(
+        _id, _lib._sel_setData_1, data?._id ?? ffi.nullptr);
+  }
+
+  void replaceBytesInRange_withBytes_length_(NSRange range,
+      ffi.Pointer<ffi.Void> replacementBytes, int replacementLength) {
+    return _lib._objc_msgSend_453(
+        _id,
+        _lib._sel_replaceBytesInRange_withBytes_length_1,
+        range,
+        replacementBytes,
+        replacementLength);
+  }
+
+  static NSMutableData dataWithCapacity_(AVFAudio _lib, int aNumItems) {
+    final _ret = _lib._objc_msgSend_60(
+        _lib._class_NSMutableData1, _lib._sel_dataWithCapacity_1, aNumItems);
+    return NSMutableData._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableData dataWithLength_(AVFAudio _lib, int length) {
+    final _ret = _lib._objc_msgSend_60(
+        _lib._class_NSMutableData1, _lib._sel_dataWithLength_1, length);
+    return NSMutableData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSMutableData initWithCapacity_(int capacity) {
+    final _ret =
+        _lib._objc_msgSend_60(_id, _lib._sel_initWithCapacity_1, capacity);
+    return NSMutableData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSMutableData initWithLength_(int length) {
+    final _ret = _lib._objc_msgSend_60(_id, _lib._sel_initWithLength_1, length);
+    return NSMutableData._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool decompressUsingAlgorithm_error_(
+      int algorithm, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_454(
+        _id, _lib._sel_decompressUsingAlgorithm_error_1, algorithm, error);
+  }
+
+  bool compressUsingAlgorithm_error_(
+      int algorithm, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_454(
+        _id, _lib._sel_compressUsingAlgorithm_error_1, algorithm, error);
+  }
+
+  static NSMutableData data(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMutableData1, _lib._sel_data1);
+    return NSMutableData._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableData dataWithBytes_length_(
+      AVFAudio _lib, ffi.Pointer<ffi.Void> bytes, int length) {
+    final _ret = _lib._objc_msgSend_237(_lib._class_NSMutableData1,
+        _lib._sel_dataWithBytes_length_1, bytes, length);
+    return NSMutableData._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableData dataWithBytesNoCopy_length_(
+      AVFAudio _lib, ffi.Pointer<ffi.Void> bytes, int length) {
+    final _ret = _lib._objc_msgSend_237(_lib._class_NSMutableData1,
+        _lib._sel_dataWithBytesNoCopy_length_1, bytes, length);
+    return NSMutableData._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSMutableData dataWithBytesNoCopy_length_freeWhenDone_(
+      AVFAudio _lib, ffi.Pointer<ffi.Void> bytes, int length, bool b) {
+    final _ret = _lib._objc_msgSend_238(_lib._class_NSMutableData1,
+        _lib._sel_dataWithBytesNoCopy_length_freeWhenDone_1, bytes, length, b);
+    return NSMutableData._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSMutableData dataWithContentsOfFile_options_error_(
+      AVFAudio _lib,
+      NSString? path,
+      int readOptionsMask,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> errorPtr) {
+    final _ret = _lib._objc_msgSend_239(
+        _lib._class_NSMutableData1,
+        _lib._sel_dataWithContentsOfFile_options_error_1,
+        path?._id ?? ffi.nullptr,
+        readOptionsMask,
+        errorPtr);
+    return NSMutableData._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableData dataWithContentsOfURL_options_error_(
+      AVFAudio _lib,
+      NSURL? url,
+      int readOptionsMask,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> errorPtr) {
+    final _ret = _lib._objc_msgSend_240(
+        _lib._class_NSMutableData1,
+        _lib._sel_dataWithContentsOfURL_options_error_1,
+        url?._id ?? ffi.nullptr,
+        readOptionsMask,
+        errorPtr);
+    return NSMutableData._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableData dataWithContentsOfFile_(AVFAudio _lib, NSString? path) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSMutableData1,
+        _lib._sel_dataWithContentsOfFile_1, path?._id ?? ffi.nullptr);
+    return NSMutableData._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableData dataWithContentsOfURL_(AVFAudio _lib, NSURL? url) {
+    final _ret = _lib._objc_msgSend_226(_lib._class_NSMutableData1,
+        _lib._sel_dataWithContentsOfURL_1, url?._id ?? ffi.nullptr);
+    return NSMutableData._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableData dataWithData_(AVFAudio _lib, NSData? data) {
+    final _ret = _lib._objc_msgSend_242(_lib._class_NSMutableData1,
+        _lib._sel_dataWithData_1, data?._id ?? ffi.nullptr);
+    return NSMutableData._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject dataWithContentsOfMappedFile_(AVFAudio _lib, NSString? path) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSMutableData1,
+        _lib._sel_dataWithContentsOfMappedFile_1, path?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableData new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMutableData1, _lib._sel_new1);
+    return NSMutableData._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSMutableData alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMutableData1, _lib._sel_alloc1);
+    return NSMutableData._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSMutableData1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSMutableData1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSMutableData1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSMutableData1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSMutableData1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSMutableData1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSMutableData1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSMutableData1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSMutableData1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSPropertyListFormat {
+  static const int NSPropertyListOpenStepFormat = 1;
+  static const int NSPropertyListXMLFormat_v1_0 = 100;
+  static const int NSPropertyListBinaryFormat_v1_0 = 200;
+}
+
+class NSThread extends NSObject {
+  NSThread._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSThread] that points to the same underlying object as [other].
+  static NSThread castFrom<T extends _ObjCWrapper>(T other) {
+    return NSThread._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSThread] that wraps the given raw object pointer.
+  static NSThread castFromPointer(AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSThread._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSThread].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSThread1);
+  }
+
+  static NSThread? getCurrentThread(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_464(_lib._class_NSThread1, _lib._sel_currentThread1);
+    return _ret.address == 0
+        ? null
+        : NSThread._(_ret, _lib, retain: true, release: true);
+  }
+
+  static void detachNewThreadWithBlock_(AVFAudio _lib, ObjCBlock16 block) {
+    return _lib._objc_msgSend_465(
+        _lib._class_NSThread1, _lib._sel_detachNewThreadWithBlock_1, block._id);
+  }
+
+  static void detachNewThreadSelector_toTarget_withObject_(AVFAudio _lib,
+      ffi.Pointer<ObjCSel> selector, NSObject target, NSObject argument) {
+    return _lib._objc_msgSend_466(
+        _lib._class_NSThread1,
+        _lib._sel_detachNewThreadSelector_toTarget_withObject_1,
+        selector,
+        target._id,
+        argument._id);
+  }
+
+  static bool isMultiThreaded(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSThread1, _lib._sel_isMultiThreaded1);
+  }
+
+  NSMutableDictionary? get threadDictionary {
+    final _ret = _lib._objc_msgSend_471(_id, _lib._sel_threadDictionary1);
+    return _ret.address == 0
+        ? null
+        : NSMutableDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static void sleepUntilDate_(AVFAudio _lib, NSDate? date) {
+    return _lib._objc_msgSend_472(_lib._class_NSThread1,
+        _lib._sel_sleepUntilDate_1, date?._id ?? ffi.nullptr);
+  }
+
+  static void sleepForTimeInterval_(AVFAudio _lib, double ti) {
+    return _lib._objc_msgSend_473(
+        _lib._class_NSThread1, _lib._sel_sleepForTimeInterval_1, ti);
+  }
+
+  static void exit(AVFAudio _lib) {
+    return _lib._objc_msgSend_1(_lib._class_NSThread1, _lib._sel_exit1);
+  }
+
+  double get threadPriority {
+    return _lib._objc_msgSend_149(_id, _lib._sel_threadPriority1);
+  }
+
+  set threadPriority(double value) {
+    _lib._objc_msgSend_474(_id, _lib._sel_setThreadPriority_1, value);
+  }
+
+  int get qualityOfService {
+    return _lib._objc_msgSend_475(_id, _lib._sel_qualityOfService1);
+  }
+
+  set qualityOfService(int value) {
+    _lib._objc_msgSend_476(_id, _lib._sel_setQualityOfService_1, value);
+  }
+
+  static NSArray? getCallStackReturnAddresses(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSThread1, _lib._sel_callStackReturnAddresses1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray? getCallStackSymbols(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSThread1, _lib._sel_callStackSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get name {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_name1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set name(NSString? value) {
+    _lib._objc_msgSend_477(_id, _lib._sel_setName_1, value?._id ?? ffi.nullptr);
+  }
+
+  int get stackSize {
+    return _lib._objc_msgSend_10(_id, _lib._sel_stackSize1);
+  }
+
+  set stackSize(int value) {
+    _lib._objc_msgSend_451(_id, _lib._sel_setStackSize_1, value);
+  }
+
+  bool get isMainThread {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isMainThread1);
+  }
+
+  static NSThread? getMainThread(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_464(_lib._class_NSThread1, _lib._sel_mainThread1);
+    return _ret.address == 0
+        ? null
+        : NSThread._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSThread init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSThread._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSThread initWithTarget_selector_object_(
+      NSObject target, ffi.Pointer<ObjCSel> selector, NSObject argument) {
+    final _ret = _lib._objc_msgSend_478(
+        _id,
+        _lib._sel_initWithTarget_selector_object_1,
+        target._id,
+        selector,
+        argument._id);
+    return NSThread._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSThread initWithBlock_(ObjCBlock16 block) {
+    final _ret =
+        _lib._objc_msgSend_479(_id, _lib._sel_initWithBlock_1, block._id);
+    return NSThread._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool get executing {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isExecuting1);
+  }
+
+  bool get finished {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isFinished1);
+  }
+
+  bool get cancelled {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isCancelled1);
+  }
+
+  void cancel() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_cancel1);
+  }
+
+  void start() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_start1);
+  }
+
+  void main() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_main1);
+  }
+
+  static NSThread new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSThread1, _lib._sel_new1);
+    return NSThread._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSThread alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSThread1, _lib._sel_alloc1);
+    return NSThread._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSThread1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSThread1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSThread1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSThread1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSThread1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSThread1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSThread1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSThread1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSThread1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+void _ObjCBlock16_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block) {
+  return block.ref.target
+      .cast<ffi.NativeFunction<ffi.Void Function()>>()
+      .asFunction<void Function()>()();
+}
+
+final _ObjCBlock16_closureRegistry = <int, Function>{};
+int _ObjCBlock16_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock16_registerClosure(Function fn) {
+  final id = ++_ObjCBlock16_closureRegistryIndex;
+  _ObjCBlock16_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock16_closureTrampoline(ffi.Pointer<_ObjCBlock> block) {
+  return _ObjCBlock16_closureRegistry[block.ref.target.address]!();
+}
+
+class ObjCBlock16 extends _ObjCBlockBase {
+  ObjCBlock16._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock16.fromFunctionPointer(
+      AVFAudio lib, ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>> ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block)>(
+                        _ObjCBlock16_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock16.fromFunction(AVFAudio lib, void Function() fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block)>(
+                        _ObjCBlock16_closureTrampoline)
+                    .cast(),
+                _ObjCBlock16_registerClosure(fn)),
+            lib);
+  void call() {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(ffi.Pointer<_ObjCBlock> block)>>()
+        .asFunction<void Function(ffi.Pointer<_ObjCBlock> block)>()(_id);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class NSMutableDictionary extends NSDictionary {
+  NSMutableDictionary._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSMutableDictionary] that points to the same underlying object as [other].
+  static NSMutableDictionary castFrom<T extends _ObjCWrapper>(T other) {
+    return NSMutableDictionary._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSMutableDictionary] that wraps the given raw object pointer.
+  static NSMutableDictionary castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSMutableDictionary._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSMutableDictionary].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSMutableDictionary1);
+  }
+
+  void removeObjectForKey_(NSObject aKey) {
+    return _lib._objc_msgSend_15(_id, _lib._sel_removeObjectForKey_1, aKey._id);
+  }
+
+  void setObject_forKey_(NSObject anObject, NSObject aKey) {
+    return _lib._objc_msgSend_467(
+        _id, _lib._sel_setObject_forKey_1, anObject._id, aKey._id);
+  }
+
+  @override
+  NSMutableDictionary init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSMutableDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSMutableDictionary initWithCapacity_(int numItems) {
+    final _ret =
+        _lib._objc_msgSend_60(_id, _lib._sel_initWithCapacity_1, numItems);
+    return NSMutableDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSMutableDictionary initWithCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr);
+    return NSMutableDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  void addEntriesFromDictionary_(NSDictionary? otherDictionary) {
+    return _lib._objc_msgSend_444(_id, _lib._sel_addEntriesFromDictionary_1,
+        otherDictionary?._id ?? ffi.nullptr);
+  }
+
+  void removeAllObjects() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_removeAllObjects1);
+  }
+
+  void removeObjectsForKeys_(NSArray? keyArray) {
+    return _lib._objc_msgSend_412(
+        _id, _lib._sel_removeObjectsForKeys_1, keyArray?._id ?? ffi.nullptr);
+  }
+
+  void setDictionary_(NSDictionary? otherDictionary) {
+    return _lib._objc_msgSend_444(
+        _id, _lib._sel_setDictionary_1, otherDictionary?._id ?? ffi.nullptr);
+  }
+
+  void setObject_forKeyedSubscript_(NSObject obj, NSObject key) {
+    return _lib._objc_msgSend_467(
+        _id, _lib._sel_setObject_forKeyedSubscript_1, obj._id, key._id);
+  }
+
+  static NSMutableDictionary dictionaryWithCapacity_(
+      AVFAudio _lib, int numItems) {
+    final _ret = _lib._objc_msgSend_60(_lib._class_NSMutableDictionary1,
+        _lib._sel_dictionaryWithCapacity_1, numItems);
+    return NSMutableDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableDictionary dictionaryWithContentsOfFile_(
+      AVFAudio _lib, NSString? path) {
+    final _ret = _lib._objc_msgSend_468(_lib._class_NSMutableDictionary1,
+        _lib._sel_dictionaryWithContentsOfFile_1, path?._id ?? ffi.nullptr);
+    return NSMutableDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableDictionary dictionaryWithContentsOfURL_(
+      AVFAudio _lib, NSURL? url) {
+    final _ret = _lib._objc_msgSend_469(_lib._class_NSMutableDictionary1,
+        _lib._sel_dictionaryWithContentsOfURL_1, url?._id ?? ffi.nullptr);
+    return NSMutableDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSMutableDictionary initWithContentsOfFile_(NSString? path) {
+    final _ret = _lib._objc_msgSend_468(
+        _id, _lib._sel_initWithContentsOfFile_1, path?._id ?? ffi.nullptr);
+    return NSMutableDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSMutableDictionary initWithContentsOfURL_(NSURL? url) {
+    final _ret = _lib._objc_msgSend_469(
+        _id, _lib._sel_initWithContentsOfURL_1, url?._id ?? ffi.nullptr);
+    return NSMutableDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableDictionary dictionaryWithSharedKeySet_(
+      AVFAudio _lib, NSObject keyset) {
+    final _ret = _lib._objc_msgSend_470(_lib._class_NSMutableDictionary1,
+        _lib._sel_dictionaryWithSharedKeySet_1, keyset._id);
+    return NSMutableDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  void setValue_forKey_(NSObject value, NSString? key) {
+    return _lib._objc_msgSend_122(
+        _id, _lib._sel_setValue_forKey_1, value._id, key?._id ?? ffi.nullptr);
+  }
+
+  static NSMutableDictionary dictionary(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSMutableDictionary1, _lib._sel_dictionary1);
+    return NSMutableDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableDictionary dictionaryWithObject_forKey_(
+      AVFAudio _lib, NSObject object, NSObject key) {
+    final _ret = _lib._objc_msgSend_142(_lib._class_NSMutableDictionary1,
+        _lib._sel_dictionaryWithObject_forKey_1, object._id, key._id);
+    return NSMutableDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableDictionary dictionaryWithObjects_forKeys_count_(
+      AVFAudio _lib,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> objects,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> keys,
+      int cnt) {
+    final _ret = _lib._objc_msgSend_133(_lib._class_NSMutableDictionary1,
+        _lib._sel_dictionaryWithObjects_forKeys_count_1, objects, keys, cnt);
+    return NSMutableDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableDictionary dictionaryWithObjectsAndKeys_(
+      AVFAudio _lib, NSObject firstObject) {
+    final _ret = _lib._objc_msgSend_16(_lib._class_NSMutableDictionary1,
+        _lib._sel_dictionaryWithObjectsAndKeys_1, firstObject._id);
+    return NSMutableDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableDictionary dictionaryWithDictionary_(
+      AVFAudio _lib, NSDictionary? dict) {
+    final _ret = _lib._objc_msgSend_143(_lib._class_NSMutableDictionary1,
+        _lib._sel_dictionaryWithDictionary_1, dict?._id ?? ffi.nullptr);
+    return NSMutableDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableDictionary dictionaryWithObjects_forKeys_(
+      AVFAudio _lib, NSArray? objects, NSArray? keys) {
+    final _ret = _lib._objc_msgSend_144(
+        _lib._class_NSMutableDictionary1,
+        _lib._sel_dictionaryWithObjects_forKeys_1,
+        objects?._id ?? ffi.nullptr,
+        keys?._id ?? ffi.nullptr);
+    return NSMutableDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDictionary dictionaryWithContentsOfURL_error_(
+      AVFAudio _lib, NSURL? url, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_146(
+        _lib._class_NSMutableDictionary1,
+        _lib._sel_dictionaryWithContentsOfURL_error_1,
+        url?._id ?? ffi.nullptr,
+        error);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject sharedKeySetForKeys_(AVFAudio _lib, NSArray? keys) {
+    final _ret = _lib._objc_msgSend_67(_lib._class_NSMutableDictionary1,
+        _lib._sel_sharedKeySetForKeys_1, keys?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableDictionary new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMutableDictionary1, _lib._sel_new1);
+    return NSMutableDictionary._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSMutableDictionary alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSMutableDictionary1, _lib._sel_alloc1);
+    return NSMutableDictionary._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSMutableDictionary1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSMutableDictionary1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSMutableDictionary1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSMutableDictionary1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSMutableDictionary1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSMutableDictionary1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSMutableDictionary1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSMutableDictionary1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSMutableDictionary1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSQualityOfService {
+  static const int NSQualityOfServiceUserInteractive = 33;
+  static const int NSQualityOfServiceUserInitiated = 25;
+  static const int NSQualityOfServiceUtility = 17;
+  static const int NSQualityOfServiceBackground = 9;
+  static const int NSQualityOfServiceDefault = -1;
+}
+
+class NSArchiver extends NSCoder {
+  NSArchiver._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSArchiver] that points to the same underlying object as [other].
+  static NSArchiver castFrom<T extends _ObjCWrapper>(T other) {
+    return NSArchiver._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSArchiver] that wraps the given raw object pointer.
+  static NSArchiver castFromPointer(AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSArchiver._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSArchiver].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSArchiver1);
+  }
+
+  NSArchiver initForWritingWithMutableData_(NSMutableData? mdata) {
+    final _ret = _lib._objc_msgSend_455(_id,
+        _lib._sel_initForWritingWithMutableData_1, mdata?._id ?? ffi.nullptr);
+    return NSArchiver._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSMutableData? get archiverData {
+    final _ret = _lib._objc_msgSend_482(_id, _lib._sel_archiverData1);
+    return _ret.address == 0
+        ? null
+        : NSMutableData._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  void encodeRootObject_(NSObject rootObject) {
+    return _lib._objc_msgSend_15(
+        _id, _lib._sel_encodeRootObject_1, rootObject._id);
+  }
+
+  @override
+  void encodeConditionalObject_(NSObject object) {
+    return _lib._objc_msgSend_15(
+        _id, _lib._sel_encodeConditionalObject_1, object._id);
+  }
+
+  static NSData archivedDataWithRootObject_(
+      AVFAudio _lib, NSObject rootObject) {
+    final _ret = _lib._objc_msgSend_456(_lib._class_NSArchiver1,
+        _lib._sel_archivedDataWithRootObject_1, rootObject._id);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool archiveRootObject_toFile_(
+      AVFAudio _lib, NSObject rootObject, NSString? path) {
+    return _lib._objc_msgSend_225(
+        _lib._class_NSArchiver1,
+        _lib._sel_archiveRootObject_toFile_1,
+        rootObject._id,
+        path?._id ?? ffi.nullptr);
+  }
+
+  void encodeClassName_intoClassName_(
+      NSString? trueName, NSString? inArchiveName) {
+    return _lib._objc_msgSend_483(
+        _id,
+        _lib._sel_encodeClassName_intoClassName_1,
+        trueName?._id ?? ffi.nullptr,
+        inArchiveName?._id ?? ffi.nullptr);
+  }
+
+  NSString classNameEncodedForTrueClassName_(NSString? trueName) {
+    final _ret = _lib._objc_msgSend_64(
+        _id,
+        _lib._sel_classNameEncodedForTrueClassName_1,
+        trueName?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  void replaceObject_withObject_(NSObject object, NSObject newObject) {
+    return _lib._objc_msgSend_467(
+        _id, _lib._sel_replaceObject_withObject_1, object._id, newObject._id);
+  }
+
+  static NSArchiver new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSArchiver1, _lib._sel_new1);
+    return NSArchiver._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSArchiver alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSArchiver1, _lib._sel_alloc1);
+    return NSArchiver._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSArchiver1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSArchiver1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSArchiver1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSArchiver1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSArchiver1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSArchiver1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSArchiver1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSArchiver1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSArchiver1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSPortCoder extends NSCoder {
+  NSPortCoder._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSPortCoder] that points to the same underlying object as [other].
+  static NSPortCoder castFrom<T extends _ObjCWrapper>(T other) {
+    return NSPortCoder._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSPortCoder] that wraps the given raw object pointer.
+  static NSPortCoder castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSPortCoder._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSPortCoder].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSPortCoder1);
+  }
+
+  bool isBycopy() {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isBycopy1);
+  }
+
+  bool isByref() {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isByref1);
+  }
+
+  void encodePortObject_(NSPort? aport) {
+    return _lib._objc_msgSend_520(
+        _id, _lib._sel_encodePortObject_1, aport?._id ?? ffi.nullptr);
+  }
+
+  NSPort decodePortObject() {
+    final _ret = _lib._objc_msgSend_485(_id, _lib._sel_decodePortObject1);
+    return NSPort._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSConnection connection() {
+    final _ret = _lib._objc_msgSend_504(_id, _lib._sel_connection1);
+    return NSConnection._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject portCoderWithReceivePort_sendPort_components_(
+      AVFAudio _lib, NSPort? rcvPort, NSPort? sndPort, NSArray? comps) {
+    final _ret = _lib._objc_msgSend_521(
+        _lib._class_NSPortCoder1,
+        _lib._sel_portCoderWithReceivePort_sendPort_components_1,
+        rcvPort?._id ?? ffi.nullptr,
+        sndPort?._id ?? ffi.nullptr,
+        comps?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject initWithReceivePort_sendPort_components_(
+      NSPort? rcvPort, NSPort? sndPort, NSArray? comps) {
+    final _ret = _lib._objc_msgSend_521(
+        _id,
+        _lib._sel_initWithReceivePort_sendPort_components_1,
+        rcvPort?._id ?? ffi.nullptr,
+        sndPort?._id ?? ffi.nullptr,
+        comps?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void dispatch() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_dispatch1);
+  }
+
+  static NSPortCoder new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSPortCoder1, _lib._sel_new1);
+    return NSPortCoder._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSPortCoder alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSPortCoder1, _lib._sel_alloc1);
+    return NSPortCoder._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSPortCoder1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSPortCoder1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSPortCoder1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSPortCoder1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSPortCoder1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSPortCoder1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSPortCoder1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSPortCoder1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSPortCoder1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSPort extends NSObject {
+  NSPort._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSPort] that points to the same underlying object as [other].
+  static NSPort castFrom<T extends _ObjCWrapper>(T other) {
+    return NSPort._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSPort] that wraps the given raw object pointer.
+  static NSPort castFromPointer(AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSPort._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSPort].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSPort1);
+  }
+
+  static NSPort port(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_485(_lib._class_NSPort1, _lib._sel_port1);
+    return NSPort._(_ret, _lib, retain: true, release: true);
+  }
+
+  void invalidate() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_invalidate1);
+  }
+
+  bool get valid {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isValid1);
+  }
+
+  void setDelegate_(NSObject? anObject) {
+    return _lib._objc_msgSend_15(
+        _id, _lib._sel_setDelegate_1, anObject?._id ?? ffi.nullptr);
+  }
+
+  NSObject delegate() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_delegate1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void scheduleInRunLoop_forMode_(NSRunLoop? runLoop, NSRunLoopMode mode) {
+    return _lib._objc_msgSend_501(_id, _lib._sel_scheduleInRunLoop_forMode_1,
+        runLoop?._id ?? ffi.nullptr, mode);
+  }
+
+  void removeFromRunLoop_forMode_(NSRunLoop? runLoop, NSRunLoopMode mode) {
+    return _lib._objc_msgSend_501(_id, _lib._sel_removeFromRunLoop_forMode_1,
+        runLoop?._id ?? ffi.nullptr, mode);
+  }
+
+  int get reservedSpaceLength {
+    return _lib._objc_msgSend_10(_id, _lib._sel_reservedSpaceLength1);
+  }
+
+  bool sendBeforeDate_components_from_reserved_(
+      NSDate? limitDate,
+      NSMutableArray? components,
+      NSPort? receivePort,
+      int headerSpaceReserved) {
+    return _lib._objc_msgSend_502(
+        _id,
+        _lib._sel_sendBeforeDate_components_from_reserved_1,
+        limitDate?._id ?? ffi.nullptr,
+        components?._id ?? ffi.nullptr,
+        receivePort?._id ?? ffi.nullptr,
+        headerSpaceReserved);
+  }
+
+  bool sendBeforeDate_msgid_components_from_reserved_(
+      NSDate? limitDate,
+      int msgID,
+      NSMutableArray? components,
+      NSPort? receivePort,
+      int headerSpaceReserved) {
+    return _lib._objc_msgSend_503(
+        _id,
+        _lib._sel_sendBeforeDate_msgid_components_from_reserved_1,
+        limitDate?._id ?? ffi.nullptr,
+        msgID,
+        components?._id ?? ffi.nullptr,
+        receivePort?._id ?? ffi.nullptr,
+        headerSpaceReserved);
+  }
+
+  void addConnection_toRunLoop_forMode_(
+      NSConnection? conn, NSRunLoop? runLoop, NSRunLoopMode mode) {
+    return _lib._objc_msgSend_519(
+        _id,
+        _lib._sel_addConnection_toRunLoop_forMode_1,
+        conn?._id ?? ffi.nullptr,
+        runLoop?._id ?? ffi.nullptr,
+        mode);
+  }
+
+  void removeConnection_fromRunLoop_forMode_(
+      NSConnection? conn, NSRunLoop? runLoop, NSRunLoopMode mode) {
+    return _lib._objc_msgSend_519(
+        _id,
+        _lib._sel_removeConnection_fromRunLoop_forMode_1,
+        conn?._id ?? ffi.nullptr,
+        runLoop?._id ?? ffi.nullptr,
+        mode);
+  }
+
+  static NSPort new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSPort1, _lib._sel_new1);
+    return NSPort._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSPort alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSPort1, _lib._sel_alloc1);
+    return NSPort._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSPort1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSPort1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSPort1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSPort1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSPort1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSPort1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSPort1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSPort1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSPort1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSRunLoop extends NSObject {
+  NSRunLoop._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSRunLoop] that points to the same underlying object as [other].
+  static NSRunLoop castFrom<T extends _ObjCWrapper>(T other) {
+    return NSRunLoop._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSRunLoop] that wraps the given raw object pointer.
+  static NSRunLoop castFromPointer(AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSRunLoop._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSRunLoop].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSRunLoop1);
+  }
+
+  static NSRunLoop? getCurrentRunLoop(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_486(
+        _lib._class_NSRunLoop1, _lib._sel_currentRunLoop1);
+    return _ret.address == 0
+        ? null
+        : NSRunLoop._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSRunLoop? getMainRunLoop(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_486(_lib._class_NSRunLoop1, _lib._sel_mainRunLoop1);
+    return _ret.address == 0
+        ? null
+        : NSRunLoop._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSRunLoopMode get currentMode {
+    return _lib._objc_msgSend_20(_id, _lib._sel_currentMode1);
+  }
+
+  CFRunLoopRef getCFRunLoop() {
+    return _lib._objc_msgSend_487(_id, _lib._sel_getCFRunLoop1);
+  }
+
+  void addTimer_forMode_(NSTimer? timer, NSRunLoopMode mode) {
+    return _lib._objc_msgSend_494(
+        _id, _lib._sel_addTimer_forMode_1, timer?._id ?? ffi.nullptr, mode);
+  }
+
+  void addPort_forMode_(NSPort? aPort, NSRunLoopMode mode) {
+    return _lib._objc_msgSend_495(
+        _id, _lib._sel_addPort_forMode_1, aPort?._id ?? ffi.nullptr, mode);
+  }
+
+  void removePort_forMode_(NSPort? aPort, NSRunLoopMode mode) {
+    return _lib._objc_msgSend_495(
+        _id, _lib._sel_removePort_forMode_1, aPort?._id ?? ffi.nullptr, mode);
+  }
+
+  NSDate limitDateForMode_(NSRunLoopMode mode) {
+    final _ret =
+        _lib._objc_msgSend_496(_id, _lib._sel_limitDateForMode_1, mode);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  void acceptInputForMode_beforeDate_(NSRunLoopMode mode, NSDate? limitDate) {
+    return _lib._objc_msgSend_497(
+        _id,
+        _lib._sel_acceptInputForMode_beforeDate_1,
+        mode,
+        limitDate?._id ?? ffi.nullptr);
+  }
+
+  void run() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_run1);
+  }
+
+  void runUntilDate_(NSDate? limitDate) {
+    return _lib._objc_msgSend_472(
+        _id, _lib._sel_runUntilDate_1, limitDate?._id ?? ffi.nullptr);
+  }
+
+  bool runMode_beforeDate_(NSRunLoopMode mode, NSDate? limitDate) {
+    return _lib._objc_msgSend_498(_id, _lib._sel_runMode_beforeDate_1, mode,
+        limitDate?._id ?? ffi.nullptr);
+  }
+
+  void configureAsServer() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_configureAsServer1);
+  }
+
+  void performInModes_block_(NSArray? modes, ObjCBlock16 block) {
+    return _lib._objc_msgSend_499(_id, _lib._sel_performInModes_block_1,
+        modes?._id ?? ffi.nullptr, block._id);
+  }
+
+  void performBlock_(ObjCBlock16 block) {
+    return _lib._objc_msgSend_465(_id, _lib._sel_performBlock_1, block._id);
+  }
+
+  void performSelector_target_argument_order_modes_(
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject target,
+      NSObject arg,
+      int order,
+      NSArray? modes) {
+    return _lib._objc_msgSend_500(
+        _id,
+        _lib._sel_performSelector_target_argument_order_modes_1,
+        aSelector,
+        target._id,
+        arg._id,
+        order,
+        modes?._id ?? ffi.nullptr);
+  }
+
+  void cancelPerformSelector_target_argument_(
+      ffi.Pointer<ObjCSel> aSelector, NSObject target, NSObject arg) {
+    return _lib._objc_msgSend_466(
+        _id,
+        _lib._sel_cancelPerformSelector_target_argument_1,
+        aSelector,
+        target._id,
+        arg._id);
+  }
+
+  void cancelPerformSelectorsWithTarget_(NSObject target) {
+    return _lib._objc_msgSend_15(
+        _id, _lib._sel_cancelPerformSelectorsWithTarget_1, target._id);
+  }
+
+  static NSRunLoop new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSRunLoop1, _lib._sel_new1);
+    return NSRunLoop._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSRunLoop alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSRunLoop1, _lib._sel_alloc1);
+    return NSRunLoop._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSRunLoop1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSRunLoop1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSRunLoop1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSRunLoop1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSRunLoop1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSRunLoop1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSRunLoop1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSRunLoop1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSRunLoop1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef NSRunLoopMode = ffi.Pointer<ObjCObject>;
+typedef CFRunLoopRef = ffi.Pointer<__CFRunLoop>;
+
+class __CFRunLoop extends ffi.Opaque {}
+
+class NSTimer extends NSObject {
+  NSTimer._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSTimer] that points to the same underlying object as [other].
+  static NSTimer castFrom<T extends _ObjCWrapper>(T other) {
+    return NSTimer._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSTimer] that wraps the given raw object pointer.
+  static NSTimer castFromPointer(AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSTimer._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSTimer].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSTimer1);
+  }
+
+  static NSTimer timerWithTimeInterval_invocation_repeats_(
+      AVFAudio _lib, double ti, NSInvocation? invocation, bool yesOrNo) {
+    final _ret = _lib._objc_msgSend_488(
+        _lib._class_NSTimer1,
+        _lib._sel_timerWithTimeInterval_invocation_repeats_1,
+        ti,
+        invocation?._id ?? ffi.nullptr,
+        yesOrNo);
+    return NSTimer._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTimer scheduledTimerWithTimeInterval_invocation_repeats_(
+      AVFAudio _lib, double ti, NSInvocation? invocation, bool yesOrNo) {
+    final _ret = _lib._objc_msgSend_488(
+        _lib._class_NSTimer1,
+        _lib._sel_scheduledTimerWithTimeInterval_invocation_repeats_1,
+        ti,
+        invocation?._id ?? ffi.nullptr,
+        yesOrNo);
+    return NSTimer._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTimer timerWithTimeInterval_target_selector_userInfo_repeats_(
+      AVFAudio _lib,
+      double ti,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject userInfo,
+      bool yesOrNo) {
+    final _ret = _lib._objc_msgSend_489(
+        _lib._class_NSTimer1,
+        _lib._sel_timerWithTimeInterval_target_selector_userInfo_repeats_1,
+        ti,
+        aTarget._id,
+        aSelector,
+        userInfo._id,
+        yesOrNo);
+    return NSTimer._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTimer
+      scheduledTimerWithTimeInterval_target_selector_userInfo_repeats_(
+          AVFAudio _lib,
+          double ti,
+          NSObject aTarget,
+          ffi.Pointer<ObjCSel> aSelector,
+          NSObject userInfo,
+          bool yesOrNo) {
+    final _ret = _lib._objc_msgSend_489(
+        _lib._class_NSTimer1,
+        _lib._sel_scheduledTimerWithTimeInterval_target_selector_userInfo_repeats_1,
+        ti,
+        aTarget._id,
+        aSelector,
+        userInfo._id,
+        yesOrNo);
+    return NSTimer._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTimer timerWithTimeInterval_repeats_block_(
+      AVFAudio _lib, double interval, bool repeats, ObjCBlock17 block) {
+    final _ret = _lib._objc_msgSend_490(
+        _lib._class_NSTimer1,
+        _lib._sel_timerWithTimeInterval_repeats_block_1,
+        interval,
+        repeats,
+        block._id);
+    return NSTimer._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTimer scheduledTimerWithTimeInterval_repeats_block_(
+      AVFAudio _lib, double interval, bool repeats, ObjCBlock17 block) {
+    final _ret = _lib._objc_msgSend_490(
+        _lib._class_NSTimer1,
+        _lib._sel_scheduledTimerWithTimeInterval_repeats_block_1,
+        interval,
+        repeats,
+        block._id);
+    return NSTimer._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSTimer initWithFireDate_interval_repeats_block_(
+      NSDate? date, double interval, bool repeats, ObjCBlock17 block) {
+    final _ret = _lib._objc_msgSend_491(
+        _id,
+        _lib._sel_initWithFireDate_interval_repeats_block_1,
+        date?._id ?? ffi.nullptr,
+        interval,
+        repeats,
+        block._id);
+    return NSTimer._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSTimer initWithFireDate_interval_target_selector_userInfo_repeats_(
+      NSDate? date,
+      double ti,
+      NSObject t,
+      ffi.Pointer<ObjCSel> s,
+      NSObject ui,
+      bool rep) {
+    final _ret = _lib._objc_msgSend_492(
+        _id,
+        _lib._sel_initWithFireDate_interval_target_selector_userInfo_repeats_1,
+        date?._id ?? ffi.nullptr,
+        ti,
+        t._id,
+        s,
+        ui._id,
+        rep);
+    return NSTimer._(_ret, _lib, retain: true, release: true);
+  }
+
+  void fire() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_fire1);
+  }
+
+  NSDate? get fireDate {
+    final _ret = _lib._objc_msgSend_156(_id, _lib._sel_fireDate1);
+    return _ret.address == 0
+        ? null
+        : NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  set fireDate(NSDate? value) {
+    _lib._objc_msgSend_493(
+        _id, _lib._sel_setFireDate_1, value?._id ?? ffi.nullptr);
+  }
+
+  double get timeInterval {
+    return _lib._objc_msgSend_149(_id, _lib._sel_timeInterval1);
+  }
+
+  double get tolerance {
+    return _lib._objc_msgSend_149(_id, _lib._sel_tolerance1);
+  }
+
+  set tolerance(double value) {
+    _lib._objc_msgSend_474(_id, _lib._sel_setTolerance_1, value);
+  }
+
+  void invalidate() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_invalidate1);
+  }
+
+  bool get valid {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isValid1);
+  }
+
+  NSObject get userInfo {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_userInfo1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTimer new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSTimer1, _lib._sel_new1);
+    return NSTimer._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSTimer alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSTimer1, _lib._sel_alloc1);
+    return NSTimer._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSTimer1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSTimer1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSTimer1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSTimer1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSTimer1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSTimer1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSTimer1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSTimer1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSTimer1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+void _ObjCBlock17_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ObjCObject> arg0) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ObjCObject> arg0)>>()
+      .asFunction<void Function(ffi.Pointer<ObjCObject> arg0)>()(arg0);
+}
+
+final _ObjCBlock17_closureRegistry = <int, Function>{};
+int _ObjCBlock17_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock17_registerClosure(Function fn) {
+  final id = ++_ObjCBlock17_closureRegistryIndex;
+  _ObjCBlock17_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock17_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ObjCObject> arg0) {
+  return _ObjCBlock17_closureRegistry[block.ref.target.address]!(arg0);
+}
+
+class ObjCBlock17 extends _ObjCBlockBase {
+  ObjCBlock17._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock17.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0)>(
+                        _ObjCBlock17_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock17.fromFunction(
+      AVFAudio lib, void Function(ffi.Pointer<ObjCObject> arg0) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0)>(
+                        _ObjCBlock17_closureTrampoline)
+                    .cast(),
+                _ObjCBlock17_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0)>>()
+        .asFunction<
+            void Function(ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0)>()(_id, arg0);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class NSConnection extends NSObject {
+  NSConnection._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSConnection] that points to the same underlying object as [other].
+  static NSConnection castFrom<T extends _ObjCWrapper>(T other) {
+    return NSConnection._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSConnection] that wraps the given raw object pointer.
+  static NSConnection castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSConnection._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSConnection].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSConnection1);
+  }
+
+  NSDictionary? get statistics {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_statistics1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray allConnections(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSConnection1, _lib._sel_allConnections1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSConnection defaultConnection(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_504(
+        _lib._class_NSConnection1, _lib._sel_defaultConnection1);
+    return NSConnection._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSConnection connectionWithRegisteredName_host_(
+      AVFAudio _lib, NSString? name, NSString? hostName) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSConnection1,
+        _lib._sel_connectionWithRegisteredName_host_1,
+        name?._id ?? ffi.nullptr,
+        hostName?._id ?? ffi.nullptr);
+    return NSConnection._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSConnection connectionWithRegisteredName_host_usingNameServer_(
+      AVFAudio _lib,
+      NSString? name,
+      NSString? hostName,
+      NSPortNameServer? server) {
+    final _ret = _lib._objc_msgSend_509(
+        _lib._class_NSConnection1,
+        _lib._sel_connectionWithRegisteredName_host_usingNameServer_1,
+        name?._id ?? ffi.nullptr,
+        hostName?._id ?? ffi.nullptr,
+        server?._id ?? ffi.nullptr);
+    return NSConnection._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDistantObject rootProxyForConnectionWithRegisteredName_host_(
+      AVFAudio _lib, NSString? name, NSString? hostName) {
+    final _ret = _lib._objc_msgSend_512(
+        _lib._class_NSConnection1,
+        _lib._sel_rootProxyForConnectionWithRegisteredName_host_1,
+        name?._id ?? ffi.nullptr,
+        hostName?._id ?? ffi.nullptr);
+    return NSDistantObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDistantObject
+      rootProxyForConnectionWithRegisteredName_host_usingNameServer_(
+          AVFAudio _lib,
+          NSString? name,
+          NSString? hostName,
+          NSPortNameServer? server) {
+    final _ret = _lib._objc_msgSend_513(
+        _lib._class_NSConnection1,
+        _lib._sel_rootProxyForConnectionWithRegisteredName_host_usingNameServer_1,
+        name?._id ?? ffi.nullptr,
+        hostName?._id ?? ffi.nullptr,
+        server?._id ?? ffi.nullptr);
+    return NSDistantObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSConnection serviceConnectionWithName_rootObject_usingNameServer_(
+      AVFAudio _lib, NSString? name, NSObject root, NSPortNameServer? server) {
+    final _ret = _lib._objc_msgSend_514(
+        _lib._class_NSConnection1,
+        _lib._sel_serviceConnectionWithName_rootObject_usingNameServer_1,
+        name?._id ?? ffi.nullptr,
+        root._id,
+        server?._id ?? ffi.nullptr);
+    return NSConnection._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSConnection serviceConnectionWithName_rootObject_(
+      AVFAudio _lib, NSString? name, NSObject root) {
+    final _ret = _lib._objc_msgSend_157(
+        _lib._class_NSConnection1,
+        _lib._sel_serviceConnectionWithName_rootObject_1,
+        name?._id ?? ffi.nullptr,
+        root._id);
+    return NSConnection._(_ret, _lib, retain: true, release: true);
+  }
+
+  double get requestTimeout {
+    return _lib._objc_msgSend_149(_id, _lib._sel_requestTimeout1);
+  }
+
+  set requestTimeout(double value) {
+    _lib._objc_msgSend_474(_id, _lib._sel_setRequestTimeout_1, value);
+  }
+
+  double get replyTimeout {
+    return _lib._objc_msgSend_149(_id, _lib._sel_replyTimeout1);
+  }
+
+  set replyTimeout(double value) {
+    _lib._objc_msgSend_474(_id, _lib._sel_setReplyTimeout_1, value);
+  }
+
+  NSObject get rootObject {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_rootObject1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  set rootObject(NSObject value) {
+    _lib._objc_msgSend_368(_id, _lib._sel_setRootObject_1, value._id);
+  }
+
+  NSObject? get delegate {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_delegate1);
+    return _ret.address == 0
+        ? null
+        : NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  set delegate(NSObject? value) {
+    _lib._objc_msgSend_368(
+        _id, _lib._sel_setDelegate_1, value?._id ?? ffi.nullptr);
+  }
+
+  bool get independentConversationQueueing {
+    return _lib._objc_msgSend_12(
+        _id, _lib._sel_independentConversationQueueing1);
+  }
+
+  set independentConversationQueueing(bool value) {
+    _lib._objc_msgSend_460(
+        _id, _lib._sel_setIndependentConversationQueueing_1, value);
+  }
+
+  bool get valid {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isValid1);
+  }
+
+  NSDistantObject? get rootProxy {
+    final _ret = _lib._objc_msgSend_515(_id, _lib._sel_rootProxy1);
+    return _ret.address == 0
+        ? null
+        : NSDistantObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void invalidate() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_invalidate1);
+  }
+
+  void addRequestMode_(NSString? rmode) {
+    return _lib._objc_msgSend_186(
+        _id, _lib._sel_addRequestMode_1, rmode?._id ?? ffi.nullptr);
+  }
+
+  void removeRequestMode_(NSString? rmode) {
+    return _lib._objc_msgSend_186(
+        _id, _lib._sel_removeRequestMode_1, rmode?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get requestModes {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_requestModes1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool registerName_(NSString? name) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_registerName_1, name?._id ?? ffi.nullptr);
+  }
+
+  bool registerName_withNameServer_(NSString? name, NSPortNameServer? server) {
+    return _lib._objc_msgSend_516(_id, _lib._sel_registerName_withNameServer_1,
+        name?._id ?? ffi.nullptr, server?._id ?? ffi.nullptr);
+  }
+
+  static NSConnection connectionWithReceivePort_sendPort_(
+      AVFAudio _lib, NSPort? receivePort, NSPort? sendPort) {
+    final _ret = _lib._objc_msgSend_517(
+        _lib._class_NSConnection1,
+        _lib._sel_connectionWithReceivePort_sendPort_1,
+        receivePort?._id ?? ffi.nullptr,
+        sendPort?._id ?? ffi.nullptr);
+    return NSConnection._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject currentConversation(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSConnection1, _lib._sel_currentConversation1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSConnection initWithReceivePort_sendPort_(
+      NSPort? receivePort, NSPort? sendPort) {
+    final _ret = _lib._objc_msgSend_517(
+        _id,
+        _lib._sel_initWithReceivePort_sendPort_1,
+        receivePort?._id ?? ffi.nullptr,
+        sendPort?._id ?? ffi.nullptr);
+    return NSConnection._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSPort? get sendPort {
+    final _ret = _lib._objc_msgSend_485(_id, _lib._sel_sendPort1);
+    return _ret.address == 0
+        ? null
+        : NSPort._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSPort? get receivePort {
+    final _ret = _lib._objc_msgSend_485(_id, _lib._sel_receivePort1);
+    return _ret.address == 0
+        ? null
+        : NSPort._(_ret, _lib, retain: true, release: true);
+  }
+
+  void enableMultipleThreads() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_enableMultipleThreads1);
+  }
+
+  bool get multipleThreadsEnabled {
+    return _lib._objc_msgSend_12(_id, _lib._sel_multipleThreadsEnabled1);
+  }
+
+  void addRunLoop_(NSRunLoop? runloop) {
+    return _lib._objc_msgSend_518(
+        _id, _lib._sel_addRunLoop_1, runloop?._id ?? ffi.nullptr);
+  }
+
+  void removeRunLoop_(NSRunLoop? runloop) {
+    return _lib._objc_msgSend_518(
+        _id, _lib._sel_removeRunLoop_1, runloop?._id ?? ffi.nullptr);
+  }
+
+  void runInNewThread() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_runInNewThread1);
+  }
+
+  NSArray? get remoteObjects {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_remoteObjects1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get localObjects {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_localObjects1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  void dispatchWithComponents_(NSArray? components) {
+    return _lib._objc_msgSend_412(_id, _lib._sel_dispatchWithComponents_1,
+        components?._id ?? ffi.nullptr);
+  }
+
+  static NSConnection new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSConnection1, _lib._sel_new1);
+    return NSConnection._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSConnection alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSConnection1, _lib._sel_alloc1);
+    return NSConnection._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSConnection1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSConnection1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSConnection1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSConnection1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSConnection1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSConnection1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSConnection1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSConnection1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSConnection1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSPortNameServer extends NSObject {
+  NSPortNameServer._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSPortNameServer] that points to the same underlying object as [other].
+  static NSPortNameServer castFrom<T extends _ObjCWrapper>(T other) {
+    return NSPortNameServer._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSPortNameServer] that wraps the given raw object pointer.
+  static NSPortNameServer castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSPortNameServer._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSPortNameServer].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSPortNameServer1);
+  }
+
+  static NSPortNameServer systemDefaultPortNameServer(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_505(
+        _lib._class_NSPortNameServer1, _lib._sel_systemDefaultPortNameServer1);
+    return NSPortNameServer._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSPort portForName_(NSString? name) {
+    final _ret = _lib._objc_msgSend_506(
+        _id, _lib._sel_portForName_1, name?._id ?? ffi.nullptr);
+    return NSPort._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSPort portForName_host_(NSString? name, NSString? host) {
+    final _ret = _lib._objc_msgSend_507(_id, _lib._sel_portForName_host_1,
+        name?._id ?? ffi.nullptr, host?._id ?? ffi.nullptr);
+    return NSPort._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool registerPort_name_(NSPort? port, NSString? name) {
+    return _lib._objc_msgSend_508(_id, _lib._sel_registerPort_name_1,
+        port?._id ?? ffi.nullptr, name?._id ?? ffi.nullptr);
+  }
+
+  bool removePortForName_(NSString? name) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_removePortForName_1, name?._id ?? ffi.nullptr);
+  }
+
+  static NSPortNameServer new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSPortNameServer1, _lib._sel_new1);
+    return NSPortNameServer._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSPortNameServer alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSPortNameServer1, _lib._sel_alloc1);
+    return NSPortNameServer._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSPortNameServer1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSPortNameServer1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSPortNameServer1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSPortNameServer1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSPortNameServer1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSPortNameServer1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSPortNameServer1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSPortNameServer1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSPortNameServer1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSDistantObject extends NSProxy {
+  NSDistantObject._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSDistantObject] that points to the same underlying object as [other].
+  static NSDistantObject castFrom<T extends _ObjCWrapper>(T other) {
+    return NSDistantObject._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSDistantObject] that wraps the given raw object pointer.
+  static NSDistantObject castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSDistantObject._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSDistantObject].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSDistantObject1);
+  }
+
+  static NSObject proxyWithTarget_connection_(
+      AVFAudio _lib, NSObject target, NSConnection? connection) {
+    final _ret = _lib._objc_msgSend_510(
+        _lib._class_NSDistantObject1,
+        _lib._sel_proxyWithTarget_connection_1,
+        target._id,
+        connection?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDistantObject initWithTarget_connection_(
+      NSObject target, NSConnection? connection) {
+    final _ret = _lib._objc_msgSend_510(
+        _id,
+        _lib._sel_initWithTarget_connection_1,
+        target._id,
+        connection?._id ?? ffi.nullptr);
+    return NSDistantObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject proxyWithLocal_connection_(
+      AVFAudio _lib, NSObject target, NSConnection? connection) {
+    final _ret = _lib._objc_msgSend_510(
+        _lib._class_NSDistantObject1,
+        _lib._sel_proxyWithLocal_connection_1,
+        target._id,
+        connection?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDistantObject initWithLocal_connection_(
+      NSObject target, NSConnection? connection) {
+    final _ret = _lib._objc_msgSend_510(
+        _id,
+        _lib._sel_initWithLocal_connection_1,
+        target._id,
+        connection?._id ?? ffi.nullptr);
+    return NSDistantObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDistantObject initWithCoder_(NSCoder? inCoder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, inCoder?._id ?? ffi.nullptr);
+    return NSDistantObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void setProtocolForProxy_(Protocol? proto) {
+    return _lib._objc_msgSend_511(
+        _id, _lib._sel_setProtocolForProxy_1, proto?._id ?? ffi.nullptr);
+  }
+
+  NSConnection? get connectionForProxy {
+    final _ret = _lib._objc_msgSend_504(_id, _lib._sel_connectionForProxy1);
+    return _ret.address == 0
+        ? null
+        : NSConnection._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSDistantObject1, _lib._sel_alloc1);
+    return NSObject._(_ret, _lib, retain: false, release: true);
+  }
+
+  static bool respondsToSelector_(
+      AVFAudio _lib, ffi.Pointer<ObjCSel> aSelector) {
+    return _lib._objc_msgSend_4(_lib._class_NSDistantObject1,
+        _lib._sel_respondsToSelector_1, aSelector);
+  }
+}
+
+class NSProxy extends _ObjCWrapper {
+  NSProxy._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSProxy] that points to the same underlying object as [other].
+  static NSProxy castFrom<T extends _ObjCWrapper>(T other) {
+    return NSProxy._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSProxy] that wraps the given raw object pointer.
+  static NSProxy castFromPointer(AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSProxy._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSProxy].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSProxy1);
+  }
+
+  static NSObject alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSProxy1, _lib._sel_alloc1);
+    return NSObject._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSObject allocWithZone_(AVFAudio _lib, ffi.Pointer<NSZone> zone) {
+    final _ret = _lib._objc_msgSend_3(
+        _lib._class_NSProxy1, _lib._sel_allocWithZone_1, zone);
+    return NSObject._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSObject class1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSProxy1, _lib._sel_class1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void forwardInvocation_(NSInvocation? invocation) {
+    return _lib._objc_msgSend_372(
+        _id, _lib._sel_forwardInvocation_1, invocation?._id ?? ffi.nullptr);
+  }
+
+  NSMethodSignature methodSignatureForSelector_(ffi.Pointer<ObjCSel> sel) {
+    final _ret = _lib._objc_msgSend_373(
+        _id, _lib._sel_methodSignatureForSelector_1, sel);
+    return NSMethodSignature._(_ret, _lib, retain: true, release: true);
+  }
+
+  void dealloc() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_dealloc1);
+  }
+
+  void finalize() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_finalize1);
+  }
+
+  NSString? get description {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_description1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get debugDescription {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_debugDescription1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool respondsToSelector_(
+      AVFAudio _lib, ffi.Pointer<ObjCSel> aSelector) {
+    return _lib._objc_msgSend_4(
+        _lib._class_NSProxy1, _lib._sel_respondsToSelector_1, aSelector);
+  }
+
+  bool allowsWeakReference() {
+    return _lib._objc_msgSend_12(_id, _lib._sel_allowsWeakReference1);
+  }
+
+  bool retainWeakReference() {
+    return _lib._objc_msgSend_12(_id, _lib._sel_retainWeakReference1);
+  }
+}
+
+class NSClassDescription extends NSObject {
+  NSClassDescription._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSClassDescription] that points to the same underlying object as [other].
+  static NSClassDescription castFrom<T extends _ObjCWrapper>(T other) {
+    return NSClassDescription._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSClassDescription] that wraps the given raw object pointer.
+  static NSClassDescription castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSClassDescription._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSClassDescription].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSClassDescription1);
+  }
+
+  static void registerClassDescription_forClass_(
+      AVFAudio _lib, NSClassDescription? description, NSObject aClass) {
+    return _lib._objc_msgSend_523(
+        _lib._class_NSClassDescription1,
+        _lib._sel_registerClassDescription_forClass_1,
+        description?._id ?? ffi.nullptr,
+        aClass._id);
+  }
+
+  static void invalidateClassDescriptionCache(AVFAudio _lib) {
+    return _lib._objc_msgSend_1(_lib._class_NSClassDescription1,
+        _lib._sel_invalidateClassDescriptionCache1);
+  }
+
+  static NSClassDescription classDescriptionForClass_(
+      AVFAudio _lib, NSObject aClass) {
+    final _ret = _lib._objc_msgSend_524(_lib._class_NSClassDescription1,
+        _lib._sel_classDescriptionForClass_1, aClass._id);
+    return NSClassDescription._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSArray? get attributeKeys {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_attributeKeys1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSArray? get toOneRelationshipKeys {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_toOneRelationshipKeys1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSArray? get toManyRelationshipKeys {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_toManyRelationshipKeys1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSString inverseForRelationshipKey_(NSString? relationshipKey) {
+    final _ret = _lib._objc_msgSend_64(
+        _id,
+        _lib._sel_inverseForRelationshipKey_1,
+        relationshipKey?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSClassDescription new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSClassDescription1, _lib._sel_new1);
+    return NSClassDescription._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSClassDescription alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSClassDescription1, _lib._sel_alloc1);
+    return NSClassDescription._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSClassDescription1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSClassDescription1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSClassDescription1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSClassDescription1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSClassDescription1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSClassDescription1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSClassDescription1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSClassDescription1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSClassDescription1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSScriptObjectSpecifier extends NSObject {
+  NSScriptObjectSpecifier._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSScriptObjectSpecifier] that points to the same underlying object as [other].
+  static NSScriptObjectSpecifier castFrom<T extends _ObjCWrapper>(T other) {
+    return NSScriptObjectSpecifier._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSScriptObjectSpecifier] that wraps the given raw object pointer.
+  static NSScriptObjectSpecifier castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSScriptObjectSpecifier._(other, lib,
+        retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSScriptObjectSpecifier].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSScriptObjectSpecifier1);
+  }
+
+  static NSScriptObjectSpecifier objectSpecifierWithDescriptor_(
+      AVFAudio _lib, NSAppleEventDescriptor? descriptor) {
+    final _ret = _lib._objc_msgSend_548(
+        _lib._class_NSScriptObjectSpecifier1,
+        _lib._sel_objectSpecifierWithDescriptor_1,
+        descriptor?._id ?? ffi.nullptr);
+    return NSScriptObjectSpecifier._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSScriptObjectSpecifier initWithContainerSpecifier_key_(
+      NSScriptObjectSpecifier? container, NSString? property) {
+    final _ret = _lib._objc_msgSend_549(
+        _id,
+        _lib._sel_initWithContainerSpecifier_key_1,
+        container?._id ?? ffi.nullptr,
+        property?._id ?? ffi.nullptr);
+    return NSScriptObjectSpecifier._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSScriptObjectSpecifier
+      initWithContainerClassDescription_containerSpecifier_key_(
+          NSScriptClassDescription? classDesc,
+          NSScriptObjectSpecifier? container,
+          NSString? property) {
+    final _ret = _lib._objc_msgSend_566(
+        _id,
+        _lib._sel_initWithContainerClassDescription_containerSpecifier_key_1,
+        classDesc?._id ?? ffi.nullptr,
+        container?._id ?? ffi.nullptr,
+        property?._id ?? ffi.nullptr);
+    return NSScriptObjectSpecifier._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSScriptObjectSpecifier initWithCoder_(NSCoder? inCoder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, inCoder?._id ?? ffi.nullptr);
+    return NSScriptObjectSpecifier._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSScriptObjectSpecifier? get childSpecifier {
+    final _ret = _lib._objc_msgSend_556(_id, _lib._sel_childSpecifier1);
+    return _ret.address == 0
+        ? null
+        : NSScriptObjectSpecifier._(_ret, _lib, retain: true, release: true);
+  }
+
+  set childSpecifier(NSScriptObjectSpecifier? value) {
+    _lib._objc_msgSend_557(
+        _id, _lib._sel_setChildSpecifier_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSScriptObjectSpecifier? get containerSpecifier {
+    final _ret = _lib._objc_msgSend_556(_id, _lib._sel_containerSpecifier1);
+    return _ret.address == 0
+        ? null
+        : NSScriptObjectSpecifier._(_ret, _lib, retain: true, release: true);
+  }
+
+  set containerSpecifier(NSScriptObjectSpecifier? value) {
+    _lib._objc_msgSend_557(
+        _id, _lib._sel_setContainerSpecifier_1, value?._id ?? ffi.nullptr);
+  }
+
+  bool get containerIsObjectBeingTested {
+    return _lib._objc_msgSend_12(_id, _lib._sel_containerIsObjectBeingTested1);
+  }
+
+  set containerIsObjectBeingTested(bool value) {
+    _lib._objc_msgSend_460(
+        _id, _lib._sel_setContainerIsObjectBeingTested_1, value);
+  }
+
+  bool get containerIsRangeContainerObject {
+    return _lib._objc_msgSend_12(
+        _id, _lib._sel_containerIsRangeContainerObject1);
+  }
+
+  set containerIsRangeContainerObject(bool value) {
+    _lib._objc_msgSend_460(
+        _id, _lib._sel_setContainerIsRangeContainerObject_1, value);
+  }
+
+  NSString? get key {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_key1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set key(NSString? value) {
+    _lib._objc_msgSend_477(_id, _lib._sel_setKey_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSScriptClassDescription? get containerClassDescription {
+    final _ret =
+        _lib._objc_msgSend_552(_id, _lib._sel_containerClassDescription1);
+    return _ret.address == 0
+        ? null
+        : NSScriptClassDescription._(_ret, _lib, retain: true, release: true);
+  }
+
+  set containerClassDescription(NSScriptClassDescription? value) {
+    _lib._objc_msgSend_567(_id, _lib._sel_setContainerClassDescription_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  NSScriptClassDescription? get keyClassDescription {
+    final _ret = _lib._objc_msgSend_552(_id, _lib._sel_keyClassDescription1);
+    return _ret.address == 0
+        ? null
+        : NSScriptClassDescription._(_ret, _lib, retain: true, release: true);
+  }
+
+  ffi.Pointer<NSInteger> indicesOfObjectsByEvaluatingWithContainer_count_(
+      NSObject container, ffi.Pointer<NSInteger> count) {
+    return _lib._objc_msgSend_568(
+        _id,
+        _lib._sel_indicesOfObjectsByEvaluatingWithContainer_count_1,
+        container._id,
+        count);
+  }
+
+  NSObject objectsByEvaluatingWithContainers_(NSObject containers) {
+    final _ret = _lib._objc_msgSend_16(
+        _id, _lib._sel_objectsByEvaluatingWithContainers_1, containers._id);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject get objectsByEvaluatingSpecifier {
+    final _ret =
+        _lib._objc_msgSend_2(_id, _lib._sel_objectsByEvaluatingSpecifier1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get evaluationErrorNumber {
+    return _lib._objc_msgSend_78(_id, _lib._sel_evaluationErrorNumber1);
+  }
+
+  set evaluationErrorNumber(int value) {
+    _lib._objc_msgSend_558(_id, _lib._sel_setEvaluationErrorNumber_1, value);
+  }
+
+  NSScriptObjectSpecifier? get evaluationErrorSpecifier {
+    final _ret =
+        _lib._objc_msgSend_556(_id, _lib._sel_evaluationErrorSpecifier1);
+    return _ret.address == 0
+        ? null
+        : NSScriptObjectSpecifier._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSAppleEventDescriptor? get descriptor {
+    final _ret = _lib._objc_msgSend_526(_id, _lib._sel_descriptor1);
+    return _ret.address == 0
+        ? null
+        : NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSScriptObjectSpecifier new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSScriptObjectSpecifier1, _lib._sel_new1);
+    return NSScriptObjectSpecifier._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSScriptObjectSpecifier alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSScriptObjectSpecifier1, _lib._sel_alloc1);
+    return NSScriptObjectSpecifier._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSScriptObjectSpecifier1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSScriptObjectSpecifier1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSScriptObjectSpecifier1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSScriptObjectSpecifier1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSScriptObjectSpecifier1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSScriptObjectSpecifier1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSScriptObjectSpecifier1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSScriptObjectSpecifier1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSScriptObjectSpecifier1,
+        _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSAppleEventDescriptor extends NSObject {
+  NSAppleEventDescriptor._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSAppleEventDescriptor] that points to the same underlying object as [other].
+  static NSAppleEventDescriptor castFrom<T extends _ObjCWrapper>(T other) {
+    return NSAppleEventDescriptor._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSAppleEventDescriptor] that wraps the given raw object pointer.
+  static NSAppleEventDescriptor castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSAppleEventDescriptor._(other, lib,
+        retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSAppleEventDescriptor].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSAppleEventDescriptor1);
+  }
+
+  static NSAppleEventDescriptor nullDescriptor(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_526(
+        _lib._class_NSAppleEventDescriptor1, _lib._sel_nullDescriptor1);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAppleEventDescriptor descriptorWithDescriptorType_bytes_length_(
+      AVFAudio _lib,
+      int descriptorType,
+      ffi.Pointer<ffi.Void> bytes,
+      int byteCount) {
+    final _ret = _lib._objc_msgSend_527(
+        _lib._class_NSAppleEventDescriptor1,
+        _lib._sel_descriptorWithDescriptorType_bytes_length_1,
+        descriptorType,
+        bytes,
+        byteCount);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAppleEventDescriptor descriptorWithDescriptorType_data_(
+      AVFAudio _lib, int descriptorType, NSData? data) {
+    final _ret = _lib._objc_msgSend_528(
+        _lib._class_NSAppleEventDescriptor1,
+        _lib._sel_descriptorWithDescriptorType_data_1,
+        descriptorType,
+        data?._id ?? ffi.nullptr);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAppleEventDescriptor descriptorWithBoolean_(
+      AVFAudio _lib, int boolean) {
+    final _ret = _lib._objc_msgSend_529(_lib._class_NSAppleEventDescriptor1,
+        _lib._sel_descriptorWithBoolean_1, boolean);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAppleEventDescriptor descriptorWithEnumCode_(
+      AVFAudio _lib, int enumerator) {
+    final _ret = _lib._objc_msgSend_530(_lib._class_NSAppleEventDescriptor1,
+        _lib._sel_descriptorWithEnumCode_1, enumerator);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAppleEventDescriptor descriptorWithInt32_(
+      AVFAudio _lib, int signedInt) {
+    final _ret = _lib._objc_msgSend_531(_lib._class_NSAppleEventDescriptor1,
+        _lib._sel_descriptorWithInt32_1, signedInt);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAppleEventDescriptor descriptorWithDouble_(
+      AVFAudio _lib, double doubleValue) {
+    final _ret = _lib._objc_msgSend_532(_lib._class_NSAppleEventDescriptor1,
+        _lib._sel_descriptorWithDouble_1, doubleValue);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAppleEventDescriptor descriptorWithTypeCode_(
+      AVFAudio _lib, int typeCode) {
+    final _ret = _lib._objc_msgSend_530(_lib._class_NSAppleEventDescriptor1,
+        _lib._sel_descriptorWithTypeCode_1, typeCode);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAppleEventDescriptor descriptorWithString_(
+      AVFAudio _lib, NSString? string) {
+    final _ret = _lib._objc_msgSend_533(_lib._class_NSAppleEventDescriptor1,
+        _lib._sel_descriptorWithString_1, string?._id ?? ffi.nullptr);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAppleEventDescriptor descriptorWithDate_(
+      AVFAudio _lib, NSDate? date) {
+    final _ret = _lib._objc_msgSend_534(_lib._class_NSAppleEventDescriptor1,
+        _lib._sel_descriptorWithDate_1, date?._id ?? ffi.nullptr);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAppleEventDescriptor descriptorWithFileURL_(
+      AVFAudio _lib, NSURL? fileURL) {
+    final _ret = _lib._objc_msgSend_535(_lib._class_NSAppleEventDescriptor1,
+        _lib._sel_descriptorWithFileURL_1, fileURL?._id ?? ffi.nullptr);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAppleEventDescriptor
+      appleEventWithEventClass_eventID_targetDescriptor_returnID_transactionID_(
+          AVFAudio _lib,
+          int eventClass,
+          int eventID,
+          NSAppleEventDescriptor? targetDescriptor,
+          int returnID,
+          int transactionID) {
+    final _ret = _lib._objc_msgSend_536(
+        _lib._class_NSAppleEventDescriptor1,
+        _lib._sel_appleEventWithEventClass_eventID_targetDescriptor_returnID_transactionID_1,
+        eventClass,
+        eventID,
+        targetDescriptor?._id ?? ffi.nullptr,
+        returnID,
+        transactionID);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAppleEventDescriptor listDescriptor(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_526(
+        _lib._class_NSAppleEventDescriptor1, _lib._sel_listDescriptor1);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAppleEventDescriptor recordDescriptor(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_526(
+        _lib._class_NSAppleEventDescriptor1, _lib._sel_recordDescriptor1);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAppleEventDescriptor currentProcessDescriptor(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_526(_lib._class_NSAppleEventDescriptor1,
+        _lib._sel_currentProcessDescriptor1);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAppleEventDescriptor descriptorWithProcessIdentifier_(
+      AVFAudio _lib, int processIdentifier) {
+    final _ret = _lib._objc_msgSend_531(_lib._class_NSAppleEventDescriptor1,
+        _lib._sel_descriptorWithProcessIdentifier_1, processIdentifier);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAppleEventDescriptor descriptorWithBundleIdentifier_(
+      AVFAudio _lib, NSString? bundleIdentifier) {
+    final _ret = _lib._objc_msgSend_533(
+        _lib._class_NSAppleEventDescriptor1,
+        _lib._sel_descriptorWithBundleIdentifier_1,
+        bundleIdentifier?._id ?? ffi.nullptr);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAppleEventDescriptor descriptorWithApplicationURL_(
+      AVFAudio _lib, NSURL? applicationURL) {
+    final _ret = _lib._objc_msgSend_535(
+        _lib._class_NSAppleEventDescriptor1,
+        _lib._sel_descriptorWithApplicationURL_1,
+        applicationURL?._id ?? ffi.nullptr);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSAppleEventDescriptor initWithAEDescNoCopy_(ffi.Pointer<AEDesc> aeDesc) {
+    final _ret =
+        _lib._objc_msgSend_537(_id, _lib._sel_initWithAEDescNoCopy_1, aeDesc);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSAppleEventDescriptor initWithDescriptorType_bytes_length_(
+      int descriptorType, ffi.Pointer<ffi.Void> bytes, int byteCount) {
+    final _ret = _lib._objc_msgSend_538(
+        _id,
+        _lib._sel_initWithDescriptorType_bytes_length_1,
+        descriptorType,
+        bytes,
+        byteCount);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSAppleEventDescriptor initWithDescriptorType_data_(
+      int descriptorType, NSData? data) {
+    final _ret = _lib._objc_msgSend_539(
+        _id,
+        _lib._sel_initWithDescriptorType_data_1,
+        descriptorType,
+        data?._id ?? ffi.nullptr);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSAppleEventDescriptor
+      initWithEventClass_eventID_targetDescriptor_returnID_transactionID_(
+          int eventClass,
+          int eventID,
+          NSAppleEventDescriptor? targetDescriptor,
+          int returnID,
+          int transactionID) {
+    final _ret = _lib._objc_msgSend_540(
+        _id,
+        _lib._sel_initWithEventClass_eventID_targetDescriptor_returnID_transactionID_1,
+        eventClass,
+        eventID,
+        targetDescriptor?._id ?? ffi.nullptr,
+        returnID,
+        transactionID);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSAppleEventDescriptor initListDescriptor() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_initListDescriptor1);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSAppleEventDescriptor initRecordDescriptor() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_initRecordDescriptor1);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  ffi.Pointer<AEDesc> get aeDesc {
+    return _lib._objc_msgSend_541(_id, _lib._sel_aeDesc1);
+  }
+
+  int get descriptorType {
+    return _lib._objc_msgSend_191(_id, _lib._sel_descriptorType1);
+  }
+
+  NSData? get data {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_data1);
+    return _ret.address == 0
+        ? null
+        : NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get booleanValue {
+    return _lib._objc_msgSend_210(_id, _lib._sel_booleanValue1);
+  }
+
+  int get enumCodeValue {
+    return _lib._objc_msgSend_191(_id, _lib._sel_enumCodeValue1);
+  }
+
+  int get int32Value {
+    return _lib._objc_msgSend_213(_id, _lib._sel_int32Value1);
+  }
+
+  double get doubleValue {
+    return _lib._objc_msgSend_149(_id, _lib._sel_doubleValue1);
+  }
+
+  int get typeCodeValue {
+    return _lib._objc_msgSend_191(_id, _lib._sel_typeCodeValue1);
+  }
+
+  NSString? get stringValue {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_stringValue1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate? get dateValue {
+    final _ret = _lib._objc_msgSend_156(_id, _lib._sel_dateValue1);
+    return _ret.address == 0
+        ? null
+        : NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get fileURLValue {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_fileURLValue1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get eventClass {
+    return _lib._objc_msgSend_191(_id, _lib._sel_eventClass1);
+  }
+
+  int get eventID {
+    return _lib._objc_msgSend_191(_id, _lib._sel_eventID1);
+  }
+
+  int get returnID {
+    return _lib._objc_msgSend_211(_id, _lib._sel_returnID1);
+  }
+
+  int get transactionID {
+    return _lib._objc_msgSend_213(_id, _lib._sel_transactionID1);
+  }
+
+  void setParamDescriptor_forKeyword_(
+      NSAppleEventDescriptor? descriptor, int keyword) {
+    return _lib._objc_msgSend_542(
+        _id,
+        _lib._sel_setParamDescriptor_forKeyword_1,
+        descriptor?._id ?? ffi.nullptr,
+        keyword);
+  }
+
+  NSAppleEventDescriptor paramDescriptorForKeyword_(int keyword) {
+    final _ret = _lib._objc_msgSend_530(
+        _id, _lib._sel_paramDescriptorForKeyword_1, keyword);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  void removeParamDescriptorWithKeyword_(int keyword) {
+    return _lib._objc_msgSend_543(
+        _id, _lib._sel_removeParamDescriptorWithKeyword_1, keyword);
+  }
+
+  void setAttributeDescriptor_forKeyword_(
+      NSAppleEventDescriptor? descriptor, int keyword) {
+    return _lib._objc_msgSend_542(
+        _id,
+        _lib._sel_setAttributeDescriptor_forKeyword_1,
+        descriptor?._id ?? ffi.nullptr,
+        keyword);
+  }
+
+  NSAppleEventDescriptor attributeDescriptorForKeyword_(int keyword) {
+    final _ret = _lib._objc_msgSend_530(
+        _id, _lib._sel_attributeDescriptorForKeyword_1, keyword);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSAppleEventDescriptor sendEventWithOptions_timeout_error_(int sendOptions,
+      double timeoutInSeconds, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_544(
+        _id,
+        _lib._sel_sendEventWithOptions_timeout_error_1,
+        sendOptions,
+        timeoutInSeconds,
+        error);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool get isRecordDescriptor {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isRecordDescriptor1);
+  }
+
+  int get numberOfItems {
+    return _lib._objc_msgSend_78(_id, _lib._sel_numberOfItems1);
+  }
+
+  void insertDescriptor_atIndex_(
+      NSAppleEventDescriptor? descriptor, int index) {
+    return _lib._objc_msgSend_545(_id, _lib._sel_insertDescriptor_atIndex_1,
+        descriptor?._id ?? ffi.nullptr, index);
+  }
+
+  NSAppleEventDescriptor descriptorAtIndex_(int index) {
+    final _ret =
+        _lib._objc_msgSend_546(_id, _lib._sel_descriptorAtIndex_1, index);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  void removeDescriptorAtIndex_(int index) {
+    return _lib._objc_msgSend_374(
+        _id, _lib._sel_removeDescriptorAtIndex_1, index);
+  }
+
+  void setDescriptor_forKeyword_(
+      NSAppleEventDescriptor? descriptor, int keyword) {
+    return _lib._objc_msgSend_542(_id, _lib._sel_setDescriptor_forKeyword_1,
+        descriptor?._id ?? ffi.nullptr, keyword);
+  }
+
+  NSAppleEventDescriptor descriptorForKeyword_(int keyword) {
+    final _ret =
+        _lib._objc_msgSend_530(_id, _lib._sel_descriptorForKeyword_1, keyword);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  void removeDescriptorWithKeyword_(int keyword) {
+    return _lib._objc_msgSend_543(
+        _id, _lib._sel_removeDescriptorWithKeyword_1, keyword);
+  }
+
+  int keywordForDescriptorAtIndex_(int index) {
+    return _lib._objc_msgSend_547(
+        _id, _lib._sel_keywordForDescriptorAtIndex_1, index);
+  }
+
+  NSAppleEventDescriptor coerceToDescriptorType_(int descriptorType) {
+    final _ret = _lib._objc_msgSend_530(
+        _id, _lib._sel_coerceToDescriptorType_1, descriptorType);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAppleEventDescriptor new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSAppleEventDescriptor1, _lib._sel_new1);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSAppleEventDescriptor alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSAppleEventDescriptor1, _lib._sel_alloc1);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSAppleEventDescriptor1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSAppleEventDescriptor1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSAppleEventDescriptor1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSAppleEventDescriptor1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSAppleEventDescriptor1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSAppleEventDescriptor1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSAppleEventDescriptor1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSAppleEventDescriptor1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSAppleEventDescriptor1,
+        _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef DescType = ResType;
+typedef ResType = FourCharCode;
+typedef Boolean = ffi.UnsignedChar;
+typedef SInt32 = ffi.Int;
+typedef AEEventClass = FourCharCode;
+typedef AEEventID = FourCharCode;
+typedef AEReturnID = SInt16;
+typedef SInt16 = ffi.Short;
+typedef AETransactionID = SInt32;
+typedef pid_t = __darwin_pid_t;
+typedef __darwin_pid_t = __int32_t;
+typedef __int32_t = ffi.Int;
+
+@ffi.Packed(2)
+class AEDesc extends ffi.Struct {
+  @DescType()
+  external int descriptorType;
+
+  external AEDataStorage dataHandle;
+}
+
+typedef AEDataStorage = ffi.Pointer<AEDataStorageType>;
+typedef AEDataStorageType = ffi.Pointer<OpaqueAEDataStorageType>;
+
+class OpaqueAEDataStorageType extends ffi.Opaque {}
+
+typedef AEKeyword = FourCharCode;
+
+abstract class NSAppleEventSendOptions {
+  static const int NSAppleEventSendNoReply = 1;
+  static const int NSAppleEventSendQueueReply = 2;
+  static const int NSAppleEventSendWaitForReply = 3;
+  static const int NSAppleEventSendNeverInteract = 16;
+  static const int NSAppleEventSendCanInteract = 32;
+  static const int NSAppleEventSendAlwaysInteract = 48;
+  static const int NSAppleEventSendCanSwitchLayer = 64;
+  static const int NSAppleEventSendDontRecord = 4096;
+  static const int NSAppleEventSendDontExecute = 8192;
+  static const int NSAppleEventSendDontAnnotate = 65536;
+  static const int NSAppleEventSendDefaultOptions = 35;
+}
+
+class NSScriptClassDescription extends NSClassDescription {
+  NSScriptClassDescription._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSScriptClassDescription] that points to the same underlying object as [other].
+  static NSScriptClassDescription castFrom<T extends _ObjCWrapper>(T other) {
+    return NSScriptClassDescription._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSScriptClassDescription] that wraps the given raw object pointer.
+  static NSScriptClassDescription castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSScriptClassDescription._(other, lib,
+        retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSScriptClassDescription].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSScriptClassDescription1);
+  }
+
+  static NSScriptClassDescription classDescriptionForClass_(
+      AVFAudio _lib, NSObject aClass) {
+    final _ret = _lib._objc_msgSend_550(_lib._class_NSScriptClassDescription1,
+        _lib._sel_classDescriptionForClass_1, aClass._id);
+    return NSScriptClassDescription._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSScriptClassDescription initWithSuiteName_className_dictionary_(
+      NSString? suiteName,
+      NSString? className,
+      NSDictionary? classDeclaration) {
+    final _ret = _lib._objc_msgSend_551(
+        _id,
+        _lib._sel_initWithSuiteName_className_dictionary_1,
+        suiteName?._id ?? ffi.nullptr,
+        className?._id ?? ffi.nullptr,
+        classDeclaration?._id ?? ffi.nullptr);
+    return NSScriptClassDescription._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get suiteName {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_suiteName1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get className {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_className1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get implementationClassName {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_implementationClassName1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSScriptClassDescription? get superclassDescription {
+    final _ret = _lib._objc_msgSend_552(_id, _lib._sel_superclassDescription1);
+    return _ret.address == 0
+        ? null
+        : NSScriptClassDescription._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get appleEventCode {
+    return _lib._objc_msgSend_191(_id, _lib._sel_appleEventCode1);
+  }
+
+  bool matchesAppleEventCode_(int appleEventCode) {
+    return _lib._objc_msgSend_173(
+        _id, _lib._sel_matchesAppleEventCode_1, appleEventCode);
+  }
+
+  bool supportsCommand_(NSScriptCommandDescription? commandDescription) {
+    return _lib._objc_msgSend_562(_id, _lib._sel_supportsCommand_1,
+        commandDescription?._id ?? ffi.nullptr);
+  }
+
+  ffi.Pointer<ObjCSel> selectorForCommand_(
+      NSScriptCommandDescription? commandDescription) {
+    return _lib._objc_msgSend_563(_id, _lib._sel_selectorForCommand_1,
+        commandDescription?._id ?? ffi.nullptr);
+  }
+
+  NSString typeForKey_(NSString? key) {
+    final _ret = _lib._objc_msgSend_64(
+        _id, _lib._sel_typeForKey_1, key?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSScriptClassDescription classDescriptionForKey_(NSString? key) {
+    final _ret = _lib._objc_msgSend_564(
+        _id, _lib._sel_classDescriptionForKey_1, key?._id ?? ffi.nullptr);
+    return NSScriptClassDescription._(_ret, _lib, retain: true, release: true);
+  }
+
+  int appleEventCodeForKey_(NSString? key) {
+    return _lib._objc_msgSend_553(
+        _id, _lib._sel_appleEventCodeForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  NSString keyWithAppleEventCode_(int appleEventCode) {
+    final _ret = _lib._objc_msgSend_565(
+        _id, _lib._sel_keyWithAppleEventCode_1, appleEventCode);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get defaultSubcontainerAttributeKey {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_defaultSubcontainerAttributeKey1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool isLocationRequiredToCreateForKey_(NSString? toManyRelationshipKey) {
+    return _lib._objc_msgSend_59(
+        _id,
+        _lib._sel_isLocationRequiredToCreateForKey_1,
+        toManyRelationshipKey?._id ?? ffi.nullptr);
+  }
+
+  bool hasPropertyForKey_(NSString? key) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_hasPropertyForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  bool hasOrderedToManyRelationshipForKey_(NSString? key) {
+    return _lib._objc_msgSend_59(
+        _id,
+        _lib._sel_hasOrderedToManyRelationshipForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  bool hasReadablePropertyForKey_(NSString? key) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_hasReadablePropertyForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  bool hasWritablePropertyForKey_(NSString? key) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_hasWritablePropertyForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  bool isReadOnlyKey_(NSString? key) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_isReadOnlyKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  static void registerClassDescription_forClass_(
+      AVFAudio _lib, NSClassDescription? description, NSObject aClass) {
+    return _lib._objc_msgSend_523(
+        _lib._class_NSScriptClassDescription1,
+        _lib._sel_registerClassDescription_forClass_1,
+        description?._id ?? ffi.nullptr,
+        aClass._id);
+  }
+
+  static void invalidateClassDescriptionCache(AVFAudio _lib) {
+    return _lib._objc_msgSend_1(_lib._class_NSScriptClassDescription1,
+        _lib._sel_invalidateClassDescriptionCache1);
+  }
+
+  static NSScriptClassDescription new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSScriptClassDescription1, _lib._sel_new1);
+    return NSScriptClassDescription._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSScriptClassDescription alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSScriptClassDescription1, _lib._sel_alloc1);
+    return NSScriptClassDescription._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSScriptClassDescription1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSScriptClassDescription1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSScriptClassDescription1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSScriptClassDescription1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSScriptClassDescription1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSScriptClassDescription1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSScriptClassDescription1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSScriptClassDescription1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSScriptClassDescription1,
+        _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSScriptCommandDescription extends NSObject {
+  NSScriptCommandDescription._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSScriptCommandDescription] that points to the same underlying object as [other].
+  static NSScriptCommandDescription castFrom<T extends _ObjCWrapper>(T other) {
+    return NSScriptCommandDescription._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSScriptCommandDescription] that wraps the given raw object pointer.
+  static NSScriptCommandDescription castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSScriptCommandDescription._(other, lib,
+        retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSScriptCommandDescription].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSScriptCommandDescription1);
+  }
+
+  @override
+  NSObject init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSScriptCommandDescription initWithSuiteName_commandName_dictionary_(
+      NSString? suiteName,
+      NSString? commandName,
+      NSDictionary? commandDeclaration) {
+    final _ret = _lib._objc_msgSend_551(
+        _id,
+        _lib._sel_initWithSuiteName_commandName_dictionary_1,
+        suiteName?._id ?? ffi.nullptr,
+        commandName?._id ?? ffi.nullptr,
+        commandDeclaration?._id ?? ffi.nullptr);
+    return NSScriptCommandDescription._(_ret, _lib,
+        retain: true, release: true);
+  }
+
+  NSScriptCommandDescription initWithCoder_(NSCoder? inCoder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, inCoder?._id ?? ffi.nullptr);
+    return NSScriptCommandDescription._(_ret, _lib,
+        retain: true, release: true);
+  }
+
+  NSString? get suiteName {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_suiteName1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get commandName {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_commandName1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get appleEventClassCode {
+    return _lib._objc_msgSend_191(_id, _lib._sel_appleEventClassCode1);
+  }
+
+  int get appleEventCode {
+    return _lib._objc_msgSend_191(_id, _lib._sel_appleEventCode1);
+  }
+
+  NSString? get commandClassName {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_commandClassName1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get returnType {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_returnType1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get appleEventCodeForReturnType {
+    return _lib._objc_msgSend_191(_id, _lib._sel_appleEventCodeForReturnType1);
+  }
+
+  NSArray? get argumentNames {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_argumentNames1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString typeForArgumentWithName_(NSString? argumentName) {
+    final _ret = _lib._objc_msgSend_64(_id, _lib._sel_typeForArgumentWithName_1,
+        argumentName?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int appleEventCodeForArgumentWithName_(NSString? argumentName) {
+    return _lib._objc_msgSend_553(
+        _id,
+        _lib._sel_appleEventCodeForArgumentWithName_1,
+        argumentName?._id ?? ffi.nullptr);
+  }
+
+  bool isOptionalArgumentWithName_(NSString? argumentName) {
+    return _lib._objc_msgSend_59(_id, _lib._sel_isOptionalArgumentWithName_1,
+        argumentName?._id ?? ffi.nullptr);
+  }
+
+  NSScriptCommand createCommandInstance() {
+    final _ret = _lib._objc_msgSend_560(_id, _lib._sel_createCommandInstance1);
+    return NSScriptCommand._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSScriptCommand createCommandInstanceWithZone_(ffi.Pointer<NSZone> zone) {
+    final _ret = _lib._objc_msgSend_561(
+        _id, _lib._sel_createCommandInstanceWithZone_1, zone);
+    return NSScriptCommand._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSScriptCommandDescription new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSScriptCommandDescription1, _lib._sel_new1);
+    return NSScriptCommandDescription._(_ret, _lib,
+        retain: false, release: true);
+  }
+
+  static NSScriptCommandDescription alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSScriptCommandDescription1, _lib._sel_alloc1);
+    return NSScriptCommandDescription._(_ret, _lib,
+        retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSScriptCommandDescription1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSScriptCommandDescription1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSScriptCommandDescription1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSScriptCommandDescription1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSScriptCommandDescription1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSScriptCommandDescription1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSScriptCommandDescription1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSScriptCommandDescription1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSScriptCommandDescription1,
+        _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSScriptCommand extends NSObject {
+  NSScriptCommand._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSScriptCommand] that points to the same underlying object as [other].
+  static NSScriptCommand castFrom<T extends _ObjCWrapper>(T other) {
+    return NSScriptCommand._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSScriptCommand] that wraps the given raw object pointer.
+  static NSScriptCommand castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSScriptCommand._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSScriptCommand].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSScriptCommand1);
+  }
+
+  NSScriptCommand initWithCommandDescription_(
+      NSScriptCommandDescription? commandDef) {
+    final _ret = _lib._objc_msgSend_554(_id,
+        _lib._sel_initWithCommandDescription_1, commandDef?._id ?? ffi.nullptr);
+    return NSScriptCommand._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSScriptCommand initWithCoder_(NSCoder? inCoder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, inCoder?._id ?? ffi.nullptr);
+    return NSScriptCommand._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSScriptCommandDescription? get commandDescription {
+    final _ret = _lib._objc_msgSend_555(_id, _lib._sel_commandDescription1);
+    return _ret.address == 0
+        ? null
+        : NSScriptCommandDescription._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject get directParameter {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_directParameter1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  set directParameter(NSObject value) {
+    _lib._objc_msgSend_368(_id, _lib._sel_setDirectParameter_1, value._id);
+  }
+
+  NSScriptObjectSpecifier? get receiversSpecifier {
+    final _ret = _lib._objc_msgSend_556(_id, _lib._sel_receiversSpecifier1);
+    return _ret.address == 0
+        ? null
+        : NSScriptObjectSpecifier._(_ret, _lib, retain: true, release: true);
+  }
+
+  set receiversSpecifier(NSScriptObjectSpecifier? value) {
+    _lib._objc_msgSend_557(
+        _id, _lib._sel_setReceiversSpecifier_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSObject get evaluatedReceivers {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_evaluatedReceivers1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary? get arguments {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_arguments1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  set arguments(NSDictionary? value) {
+    _lib._objc_msgSend_165(
+        _id, _lib._sel_setArguments_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSDictionary? get evaluatedArguments {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_evaluatedArguments1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool get wellFormed {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isWellFormed1);
+  }
+
+  NSObject performDefaultImplementation() {
+    final _ret =
+        _lib._objc_msgSend_2(_id, _lib._sel_performDefaultImplementation1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject executeCommand() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_executeCommand1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get scriptErrorNumber {
+    return _lib._objc_msgSend_78(_id, _lib._sel_scriptErrorNumber1);
+  }
+
+  set scriptErrorNumber(int value) {
+    _lib._objc_msgSend_558(_id, _lib._sel_setScriptErrorNumber_1, value);
+  }
+
+  NSAppleEventDescriptor? get scriptErrorOffendingObjectDescriptor {
+    final _ret = _lib._objc_msgSend_526(
+        _id, _lib._sel_scriptErrorOffendingObjectDescriptor1);
+    return _ret.address == 0
+        ? null
+        : NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  set scriptErrorOffendingObjectDescriptor(NSAppleEventDescriptor? value) {
+    _lib._objc_msgSend_559(
+        _id,
+        _lib._sel_setScriptErrorOffendingObjectDescriptor_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  NSAppleEventDescriptor? get scriptErrorExpectedTypeDescriptor {
+    final _ret = _lib._objc_msgSend_526(
+        _id, _lib._sel_scriptErrorExpectedTypeDescriptor1);
+    return _ret.address == 0
+        ? null
+        : NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  set scriptErrorExpectedTypeDescriptor(NSAppleEventDescriptor? value) {
+    _lib._objc_msgSend_559(
+        _id,
+        _lib._sel_setScriptErrorExpectedTypeDescriptor_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get scriptErrorString {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_scriptErrorString1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set scriptErrorString(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setScriptErrorString_1, value?._id ?? ffi.nullptr);
+  }
+
+  static NSScriptCommand currentCommand(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_560(
+        _lib._class_NSScriptCommand1, _lib._sel_currentCommand1);
+    return NSScriptCommand._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSAppleEventDescriptor? get appleEvent {
+    final _ret = _lib._objc_msgSend_526(_id, _lib._sel_appleEvent1);
+    return _ret.address == 0
+        ? null
+        : NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  void suspendExecution() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_suspendExecution1);
+  }
+
+  void resumeExecutionWithResult_(NSObject result) {
+    return _lib._objc_msgSend_15(
+        _id, _lib._sel_resumeExecutionWithResult_1, result._id);
+  }
+
+  static NSScriptCommand new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSScriptCommand1, _lib._sel_new1);
+    return NSScriptCommand._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSScriptCommand alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSScriptCommand1, _lib._sel_alloc1);
+    return NSScriptCommand._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSScriptCommand1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSScriptCommand1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSScriptCommand1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSScriptCommand1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSScriptCommand1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSScriptCommand1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSScriptCommand1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSScriptCommand1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSScriptCommand1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSItemProvider extends NSObject {
+  NSItemProvider._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSItemProvider] that points to the same underlying object as [other].
+  static NSItemProvider castFrom<T extends _ObjCWrapper>(T other) {
+    return NSItemProvider._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSItemProvider] that wraps the given raw object pointer.
+  static NSItemProvider castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSItemProvider._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSItemProvider].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSItemProvider1);
+  }
+
+  @override
+  NSItemProvider init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSItemProvider._(_ret, _lib, retain: true, release: true);
+  }
+
+  void registerDataRepresentationForTypeIdentifier_visibility_loadHandler_(
+      NSString? typeIdentifier, int visibility, ObjCBlock18 loadHandler) {
+    return _lib._objc_msgSend_588(
+        _id,
+        _lib._sel_registerDataRepresentationForTypeIdentifier_visibility_loadHandler_1,
+        typeIdentifier?._id ?? ffi.nullptr,
+        visibility,
+        loadHandler._id);
+  }
+
+  void
+      registerFileRepresentationForTypeIdentifier_fileOptions_visibility_loadHandler_(
+          NSString? typeIdentifier,
+          int fileOptions,
+          int visibility,
+          ObjCBlock20 loadHandler) {
+    return _lib._objc_msgSend_589(
+        _id,
+        _lib._sel_registerFileRepresentationForTypeIdentifier_fileOptions_visibility_loadHandler_1,
+        typeIdentifier?._id ?? ffi.nullptr,
+        fileOptions,
+        visibility,
+        loadHandler._id);
+  }
+
+  NSArray? get registeredTypeIdentifiers {
+    final _ret =
+        _lib._objc_msgSend_80(_id, _lib._sel_registeredTypeIdentifiers1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray registeredTypeIdentifiersWithFileOptions_(int fileOptions) {
+    final _ret = _lib._objc_msgSend_590(
+        _id, _lib._sel_registeredTypeIdentifiersWithFileOptions_1, fileOptions);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool hasItemConformingToTypeIdentifier_(NSString? typeIdentifier) {
+    return _lib._objc_msgSend_59(
+        _id,
+        _lib._sel_hasItemConformingToTypeIdentifier_1,
+        typeIdentifier?._id ?? ffi.nullptr);
+  }
+
+  bool hasRepresentationConformingToTypeIdentifier_fileOptions_(
+      NSString? typeIdentifier, int fileOptions) {
+    return _lib._objc_msgSend_591(
+        _id,
+        _lib._sel_hasRepresentationConformingToTypeIdentifier_fileOptions_1,
+        typeIdentifier?._id ?? ffi.nullptr,
+        fileOptions);
+  }
+
+  NSProgress loadDataRepresentationForTypeIdentifier_completionHandler_(
+      NSString? typeIdentifier, ObjCBlock19 completionHandler) {
+    final _ret = _lib._objc_msgSend_592(
+        _id,
+        _lib._sel_loadDataRepresentationForTypeIdentifier_completionHandler_1,
+        typeIdentifier?._id ?? ffi.nullptr,
+        completionHandler._id);
+    return NSProgress._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSProgress loadFileRepresentationForTypeIdentifier_completionHandler_(
+      NSString? typeIdentifier, ObjCBlock22 completionHandler) {
+    final _ret = _lib._objc_msgSend_593(
+        _id,
+        _lib._sel_loadFileRepresentationForTypeIdentifier_completionHandler_1,
+        typeIdentifier?._id ?? ffi.nullptr,
+        completionHandler._id);
+    return NSProgress._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSProgress loadInPlaceFileRepresentationForTypeIdentifier_completionHandler_(
+      NSString? typeIdentifier, ObjCBlock21 completionHandler) {
+    final _ret = _lib._objc_msgSend_594(
+        _id,
+        _lib._sel_loadInPlaceFileRepresentationForTypeIdentifier_completionHandler_1,
+        typeIdentifier?._id ?? ffi.nullptr,
+        completionHandler._id);
+    return NSProgress._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get suggestedName {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_suggestedName1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set suggestedName(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setSuggestedName_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSItemProvider initWithObject_(NSObject? object) {
+    final _ret = _lib._objc_msgSend_16(
+        _id, _lib._sel_initWithObject_1, object?._id ?? ffi.nullptr);
+    return NSItemProvider._(_ret, _lib, retain: true, release: true);
+  }
+
+  void registerObject_visibility_(NSObject? object, int visibility) {
+    return _lib._objc_msgSend_595(_id, _lib._sel_registerObject_visibility_1,
+        object?._id ?? ffi.nullptr, visibility);
+  }
+
+  void registerObjectOfClass_visibility_loadHandler_(
+      NSObject? aClass, int visibility, ObjCBlock23 loadHandler) {
+    return _lib._objc_msgSend_596(
+        _id,
+        _lib._sel_registerObjectOfClass_visibility_loadHandler_1,
+        aClass?._id ?? ffi.nullptr,
+        visibility,
+        loadHandler._id);
+  }
+
+  bool canLoadObjectOfClass_(NSObject? aClass) {
+    return _lib._objc_msgSend_0(
+        _id, _lib._sel_canLoadObjectOfClass_1, aClass?._id ?? ffi.nullptr);
+  }
+
+  NSProgress loadObjectOfClass_completionHandler_(
+      NSObject? aClass, ObjCBlock24 completionHandler) {
+    final _ret = _lib._objc_msgSend_597(
+        _id,
+        _lib._sel_loadObjectOfClass_completionHandler_1,
+        aClass?._id ?? ffi.nullptr,
+        completionHandler._id);
+    return NSProgress._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSItemProvider initWithItem_typeIdentifier_(
+      NSObject? item, NSString? typeIdentifier) {
+    final _ret = _lib._objc_msgSend_272(
+        _id,
+        _lib._sel_initWithItem_typeIdentifier_1,
+        item?._id ?? ffi.nullptr,
+        typeIdentifier?._id ?? ffi.nullptr);
+    return NSItemProvider._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSItemProvider initWithContentsOfURL_(NSURL? fileURL) {
+    final _ret = _lib._objc_msgSend_226(
+        _id, _lib._sel_initWithContentsOfURL_1, fileURL?._id ?? ffi.nullptr);
+    return NSItemProvider._(_ret, _lib, retain: true, release: true);
+  }
+
+  void registerItemForTypeIdentifier_loadHandler_(
+      NSString? typeIdentifier, NSItemProviderLoadHandler loadHandler) {
+    return _lib._objc_msgSend_598(
+        _id,
+        _lib._sel_registerItemForTypeIdentifier_loadHandler_1,
+        typeIdentifier?._id ?? ffi.nullptr,
+        loadHandler);
+  }
+
+  void loadItemForTypeIdentifier_options_completionHandler_(
+      NSString? typeIdentifier,
+      NSDictionary? options,
+      NSItemProviderCompletionHandler completionHandler) {
+    return _lib._objc_msgSend_599(
+        _id,
+        _lib._sel_loadItemForTypeIdentifier_options_completionHandler_1,
+        typeIdentifier?._id ?? ffi.nullptr,
+        options?._id ?? ffi.nullptr,
+        completionHandler);
+  }
+
+  NSItemProviderLoadHandler get previewImageHandler {
+    return _lib._objc_msgSend_600(_id, _lib._sel_previewImageHandler1);
+  }
+
+  set previewImageHandler(NSItemProviderLoadHandler value) {
+    _lib._objc_msgSend_601(_id, _lib._sel_setPreviewImageHandler_1, value);
+  }
+
+  void loadPreviewImageWithOptions_completionHandler_(NSDictionary? options,
+      NSItemProviderCompletionHandler completionHandler) {
+    return _lib._objc_msgSend_602(
+        _id,
+        _lib._sel_loadPreviewImageWithOptions_completionHandler_1,
+        options?._id ?? ffi.nullptr,
+        completionHandler);
+  }
+
+  static NSItemProvider new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSItemProvider1, _lib._sel_new1);
+    return NSItemProvider._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSItemProvider alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSItemProvider1, _lib._sel_alloc1);
+    return NSItemProvider._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSItemProvider1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSItemProvider1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSItemProvider1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSItemProvider1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSItemProvider1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSItemProvider1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSItemProvider1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSItemProvider1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSItemProvider1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSItemProviderRepresentationVisibility {
+  static const int NSItemProviderRepresentationVisibilityAll = 0;
+  static const int NSItemProviderRepresentationVisibilityTeam = 1;
+  static const int NSItemProviderRepresentationVisibilityGroup = 2;
+  static const int NSItemProviderRepresentationVisibilityOwnProcess = 3;
+}
+
+ffi.Pointer<ObjCObject> _ObjCBlock18_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<_ObjCBlock> arg0) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Pointer<ObjCObject> Function(ffi.Pointer<_ObjCBlock> arg0)>>()
+      .asFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<_ObjCBlock> arg0)>()(arg0);
+}
+
+final _ObjCBlock18_closureRegistry = <int, Function>{};
+int _ObjCBlock18_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock18_registerClosure(Function fn) {
+  final id = ++_ObjCBlock18_closureRegistryIndex;
+  _ObjCBlock18_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+ffi.Pointer<ObjCObject> _ObjCBlock18_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<_ObjCBlock> arg0) {
+  return _ObjCBlock18_closureRegistry[block.ref.target.address]!(arg0);
+}
+
+class ObjCBlock18 extends _ObjCBlockBase {
+  ObjCBlock18._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock18.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Pointer<ObjCObject> Function(
+                      ffi.Pointer<_ObjCBlock> arg0)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Pointer<ObjCObject> Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<_ObjCBlock> arg0)>(
+                        _ObjCBlock18_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock18.fromFunction(AVFAudio lib,
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<_ObjCBlock> arg0) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Pointer<ObjCObject> Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<_ObjCBlock> arg0)>(
+                        _ObjCBlock18_closureTrampoline)
+                    .cast(),
+                _ObjCBlock18_registerClosure(fn)),
+            lib);
+  ffi.Pointer<ObjCObject> call(ffi.Pointer<_ObjCBlock> arg0) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Pointer<ObjCObject> Function(ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<_ObjCBlock> arg0)>>()
+        .asFunction<
+            ffi.Pointer<ObjCObject> Function(ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<_ObjCBlock> arg0)>()(_id, arg0);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class NSProgress extends NSObject {
+  NSProgress._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSProgress] that points to the same underlying object as [other].
+  static NSProgress castFrom<T extends _ObjCWrapper>(T other) {
+    return NSProgress._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSProgress] that wraps the given raw object pointer.
+  static NSProgress castFromPointer(AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSProgress._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSProgress].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSProgress1);
+  }
+
+  static NSProgress currentProgress(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_577(
+        _lib._class_NSProgress1, _lib._sel_currentProgress1);
+    return NSProgress._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSProgress progressWithTotalUnitCount_(AVFAudio _lib, int unitCount) {
+    final _ret = _lib._objc_msgSend_578(_lib._class_NSProgress1,
+        _lib._sel_progressWithTotalUnitCount_1, unitCount);
+    return NSProgress._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSProgress discreteProgressWithTotalUnitCount_(
+      AVFAudio _lib, int unitCount) {
+    final _ret = _lib._objc_msgSend_578(_lib._class_NSProgress1,
+        _lib._sel_discreteProgressWithTotalUnitCount_1, unitCount);
+    return NSProgress._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSProgress progressWithTotalUnitCount_parent_pendingUnitCount_(
+      AVFAudio _lib,
+      int unitCount,
+      NSProgress? parent,
+      int portionOfParentTotalUnitCount) {
+    final _ret = _lib._objc_msgSend_579(
+        _lib._class_NSProgress1,
+        _lib._sel_progressWithTotalUnitCount_parent_pendingUnitCount_1,
+        unitCount,
+        parent?._id ?? ffi.nullptr,
+        portionOfParentTotalUnitCount);
+    return NSProgress._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSProgress initWithParent_userInfo_(NSProgress? parentProgressOrNil) {
+    final _ret = _lib._objc_msgSend_580(
+        _id,
+        _lib._sel_initWithParent_userInfo_1,
+        parentProgressOrNil?._id ?? ffi.nullptr);
+    return NSProgress._(_ret, _lib, retain: true, release: true);
+  }
+
+  void becomeCurrentWithPendingUnitCount_(int unitCount) {
+    return _lib._objc_msgSend_581(
+        _id, _lib._sel_becomeCurrentWithPendingUnitCount_1, unitCount);
+  }
+
+  void performAsCurrentWithPendingUnitCount_usingBlock_(
+      int unitCount, ObjCBlock16 work) {
+    return _lib._objc_msgSend_582(
+        _id,
+        _lib._sel_performAsCurrentWithPendingUnitCount_usingBlock_1,
+        unitCount,
+        work._id);
+  }
+
+  void resignCurrent() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_resignCurrent1);
+  }
+
+  void addChild_withPendingUnitCount_(NSProgress? child, int inUnitCount) {
+    return _lib._objc_msgSend_583(
+        _id,
+        _lib._sel_addChild_withPendingUnitCount_1,
+        child?._id ?? ffi.nullptr,
+        inUnitCount);
+  }
+
+  int get totalUnitCount {
+    return _lib._objc_msgSend_584(_id, _lib._sel_totalUnitCount1);
+  }
+
+  set totalUnitCount(int value) {
+    _lib._objc_msgSend_585(_id, _lib._sel_setTotalUnitCount_1, value);
+  }
+
+  int get completedUnitCount {
+    return _lib._objc_msgSend_584(_id, _lib._sel_completedUnitCount1);
+  }
+
+  set completedUnitCount(int value) {
+    _lib._objc_msgSend_585(_id, _lib._sel_setCompletedUnitCount_1, value);
+  }
+
+  NSString? get localizedDescription {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_localizedDescription1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set localizedDescription(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setLocalizedDescription_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get localizedAdditionalDescription {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_localizedAdditionalDescription1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set localizedAdditionalDescription(NSString? value) {
+    _lib._objc_msgSend_477(_id, _lib._sel_setLocalizedAdditionalDescription_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  bool get cancellable {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isCancellable1);
+  }
+
+  set cancellable(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setCancellable_1, value);
+  }
+
+  bool get pausable {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isPausable1);
+  }
+
+  set pausable(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setPausable_1, value);
+  }
+
+  bool get cancelled {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isCancelled1);
+  }
+
+  bool get paused {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isPaused1);
+  }
+
+  ObjCBlock16 get cancellationHandler {
+    final _ret = _lib._objc_msgSend_586(_id, _lib._sel_cancellationHandler1);
+    return ObjCBlock16._(_ret, _lib);
+  }
+
+  set cancellationHandler(ObjCBlock16 value) {
+    _lib._objc_msgSend_587(_id, _lib._sel_setCancellationHandler_1, value._id);
+  }
+
+  ObjCBlock16 get pausingHandler {
+    final _ret = _lib._objc_msgSend_586(_id, _lib._sel_pausingHandler1);
+    return ObjCBlock16._(_ret, _lib);
+  }
+
+  set pausingHandler(ObjCBlock16 value) {
+    _lib._objc_msgSend_587(_id, _lib._sel_setPausingHandler_1, value._id);
+  }
+
+  ObjCBlock16 get resumingHandler {
+    final _ret = _lib._objc_msgSend_586(_id, _lib._sel_resumingHandler1);
+    return ObjCBlock16._(_ret, _lib);
+  }
+
+  set resumingHandler(ObjCBlock16 value) {
+    _lib._objc_msgSend_587(_id, _lib._sel_setResumingHandler_1, value._id);
+  }
+
+  void setUserInfoObject_forKey_(
+      NSObject objectOrNil, NSProgressUserInfoKey key) {
+    return _lib._objc_msgSend_122(
+        _id, _lib._sel_setUserInfoObject_forKey_1, objectOrNil._id, key);
+  }
+
+  bool get indeterminate {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isIndeterminate1);
+  }
+
+  double get fractionCompleted {
+    return _lib._objc_msgSend_149(_id, _lib._sel_fractionCompleted1);
+  }
+
+  bool get finished {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isFinished1);
+  }
+
+  void cancel() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_cancel1);
+  }
+
+  void pause() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_pause1);
+  }
+
+  void resume() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_resume1);
+  }
+
+  static NSProgress new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSProgress1, _lib._sel_new1);
+    return NSProgress._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSProgress alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSProgress1, _lib._sel_alloc1);
+    return NSProgress._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSProgress1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSProgress1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSProgress1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSProgress1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSProgress1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSProgress1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSProgress1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSProgress1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSProgress1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef NSProgressUserInfoKey = ffi.Pointer<ObjCObject>;
+void _ObjCBlock19_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(ffi.Pointer<ObjCObject> arg0,
+                  ffi.Pointer<ObjCObject> arg1)>>()
+      .asFunction<
+          void Function(ffi.Pointer<ObjCObject> arg0,
+              ffi.Pointer<ObjCObject> arg1)>()(arg0, arg1);
+}
+
+final _ObjCBlock19_closureRegistry = <int, Function>{};
+int _ObjCBlock19_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock19_registerClosure(Function fn) {
+  final id = ++_ObjCBlock19_closureRegistryIndex;
+  _ObjCBlock19_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock19_closureTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1) {
+  return _ObjCBlock19_closureRegistry[block.ref.target.address]!(arg0, arg1);
+}
+
+class ObjCBlock19 extends _ObjCBlockBase {
+  ObjCBlock19._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock19.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0,
+                      ffi.Pointer<ObjCObject> arg1)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1)>(
+                        _ObjCBlock19_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock19.fromFunction(
+      AVFAudio lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1)>(
+                        _ObjCBlock19_closureTrampoline)
+                    .cast(),
+                _ObjCBlock19_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    ffi.Pointer<ObjCObject> arg1)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                ffi.Pointer<ObjCObject> arg1)>()(_id, arg0, arg1);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+abstract class NSItemProviderFileOptions {
+  static const int NSItemProviderFileOptionOpenInPlace = 1;
+}
+
+ffi.Pointer<ObjCObject> _ObjCBlock20_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<_ObjCBlock> arg0) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Pointer<ObjCObject> Function(ffi.Pointer<_ObjCBlock> arg0)>>()
+      .asFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<_ObjCBlock> arg0)>()(arg0);
+}
+
+final _ObjCBlock20_closureRegistry = <int, Function>{};
+int _ObjCBlock20_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock20_registerClosure(Function fn) {
+  final id = ++_ObjCBlock20_closureRegistryIndex;
+  _ObjCBlock20_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+ffi.Pointer<ObjCObject> _ObjCBlock20_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<_ObjCBlock> arg0) {
+  return _ObjCBlock20_closureRegistry[block.ref.target.address]!(arg0);
+}
+
+class ObjCBlock20 extends _ObjCBlockBase {
+  ObjCBlock20._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock20.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Pointer<ObjCObject> Function(
+                      ffi.Pointer<_ObjCBlock> arg0)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Pointer<ObjCObject> Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<_ObjCBlock> arg0)>(
+                        _ObjCBlock20_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock20.fromFunction(AVFAudio lib,
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<_ObjCBlock> arg0) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Pointer<ObjCObject> Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<_ObjCBlock> arg0)>(
+                        _ObjCBlock20_closureTrampoline)
+                    .cast(),
+                _ObjCBlock20_registerClosure(fn)),
+            lib);
+  ffi.Pointer<ObjCObject> call(ffi.Pointer<_ObjCBlock> arg0) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Pointer<ObjCObject> Function(ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<_ObjCBlock> arg0)>>()
+        .asFunction<
+            ffi.Pointer<ObjCObject> Function(ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<_ObjCBlock> arg0)>()(_id, arg0);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+void _ObjCBlock21_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, bool arg1, ffi.Pointer<ObjCObject> arg2) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(ffi.Pointer<ObjCObject> arg0, ffi.Bool arg1,
+                  ffi.Pointer<ObjCObject> arg2)>>()
+      .asFunction<
+          void Function(ffi.Pointer<ObjCObject> arg0, bool arg1,
+              ffi.Pointer<ObjCObject> arg2)>()(arg0, arg1, arg2);
+}
+
+final _ObjCBlock21_closureRegistry = <int, Function>{};
+int _ObjCBlock21_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock21_registerClosure(Function fn) {
+  final id = ++_ObjCBlock21_closureRegistryIndex;
+  _ObjCBlock21_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock21_closureTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, bool arg1, ffi.Pointer<ObjCObject> arg2) {
+  return _ObjCBlock21_closureRegistry[block.ref.target.address]!(
+      arg0, arg1, arg2);
+}
+
+class ObjCBlock21 extends _ObjCBlockBase {
+  ObjCBlock21._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock21.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0, ffi.Bool arg1,
+                      ffi.Pointer<ObjCObject> arg2)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Bool arg1,
+                                ffi.Pointer<ObjCObject> arg2)>(
+                        _ObjCBlock21_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock21.fromFunction(
+      AVFAudio lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, bool arg1,
+              ffi.Pointer<ObjCObject> arg2)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Bool arg1,
+                                ffi.Pointer<ObjCObject> arg2)>(
+                        _ObjCBlock21_closureTrampoline)
+                    .cast(),
+                _ObjCBlock21_registerClosure(fn)),
+            lib);
+  void call(
+      ffi.Pointer<ObjCObject> arg0, bool arg1, ffi.Pointer<ObjCObject> arg2) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    ffi.Bool arg1,
+                    ffi.Pointer<ObjCObject> arg2)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                bool arg1,
+                ffi.Pointer<ObjCObject> arg2)>()(_id, arg0, arg1, arg2);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+void _ObjCBlock22_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(ffi.Pointer<ObjCObject> arg0,
+                  ffi.Pointer<ObjCObject> arg1)>>()
+      .asFunction<
+          void Function(ffi.Pointer<ObjCObject> arg0,
+              ffi.Pointer<ObjCObject> arg1)>()(arg0, arg1);
+}
+
+final _ObjCBlock22_closureRegistry = <int, Function>{};
+int _ObjCBlock22_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock22_registerClosure(Function fn) {
+  final id = ++_ObjCBlock22_closureRegistryIndex;
+  _ObjCBlock22_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock22_closureTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1) {
+  return _ObjCBlock22_closureRegistry[block.ref.target.address]!(arg0, arg1);
+}
+
+class ObjCBlock22 extends _ObjCBlockBase {
+  ObjCBlock22._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock22.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0,
+                      ffi.Pointer<ObjCObject> arg1)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1)>(
+                        _ObjCBlock22_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock22.fromFunction(
+      AVFAudio lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1)>(
+                        _ObjCBlock22_closureTrampoline)
+                    .cast(),
+                _ObjCBlock22_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    ffi.Pointer<ObjCObject> arg1)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                ffi.Pointer<ObjCObject> arg1)>()(_id, arg0, arg1);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+ffi.Pointer<ObjCObject> _ObjCBlock23_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<_ObjCBlock> arg0) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Pointer<ObjCObject> Function(ffi.Pointer<_ObjCBlock> arg0)>>()
+      .asFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<_ObjCBlock> arg0)>()(arg0);
+}
+
+final _ObjCBlock23_closureRegistry = <int, Function>{};
+int _ObjCBlock23_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock23_registerClosure(Function fn) {
+  final id = ++_ObjCBlock23_closureRegistryIndex;
+  _ObjCBlock23_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+ffi.Pointer<ObjCObject> _ObjCBlock23_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<_ObjCBlock> arg0) {
+  return _ObjCBlock23_closureRegistry[block.ref.target.address]!(arg0);
+}
+
+class ObjCBlock23 extends _ObjCBlockBase {
+  ObjCBlock23._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock23.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Pointer<ObjCObject> Function(
+                      ffi.Pointer<_ObjCBlock> arg0)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Pointer<ObjCObject> Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<_ObjCBlock> arg0)>(
+                        _ObjCBlock23_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock23.fromFunction(AVFAudio lib,
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<_ObjCBlock> arg0) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Pointer<ObjCObject> Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<_ObjCBlock> arg0)>(
+                        _ObjCBlock23_closureTrampoline)
+                    .cast(),
+                _ObjCBlock23_registerClosure(fn)),
+            lib);
+  ffi.Pointer<ObjCObject> call(ffi.Pointer<_ObjCBlock> arg0) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Pointer<ObjCObject> Function(ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<_ObjCBlock> arg0)>>()
+        .asFunction<
+            ffi.Pointer<ObjCObject> Function(ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<_ObjCBlock> arg0)>()(_id, arg0);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+void _ObjCBlock24_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(ffi.Pointer<ObjCObject> arg0,
+                  ffi.Pointer<ObjCObject> arg1)>>()
+      .asFunction<
+          void Function(ffi.Pointer<ObjCObject> arg0,
+              ffi.Pointer<ObjCObject> arg1)>()(arg0, arg1);
+}
+
+final _ObjCBlock24_closureRegistry = <int, Function>{};
+int _ObjCBlock24_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock24_registerClosure(Function fn) {
+  final id = ++_ObjCBlock24_closureRegistryIndex;
+  _ObjCBlock24_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock24_closureTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1) {
+  return _ObjCBlock24_closureRegistry[block.ref.target.address]!(arg0, arg1);
+}
+
+class ObjCBlock24 extends _ObjCBlockBase {
+  ObjCBlock24._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock24.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0,
+                      ffi.Pointer<ObjCObject> arg1)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1)>(
+                        _ObjCBlock24_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock24.fromFunction(
+      AVFAudio lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1)>(
+                        _ObjCBlock24_closureTrampoline)
+                    .cast(),
+                _ObjCBlock24_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    ffi.Pointer<ObjCObject> arg1)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                ffi.Pointer<ObjCObject> arg1)>()(_id, arg0, arg1);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+typedef NSItemProviderLoadHandler = ffi.Pointer<_ObjCBlock>;
+void _ObjCBlock25_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block,
+    NSItemProviderCompletionHandler arg0,
+    ffi.Pointer<ObjCObject> arg1,
+    ffi.Pointer<ObjCObject> arg2) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(
+                  NSItemProviderCompletionHandler arg0,
+                  ffi.Pointer<ObjCObject> arg1,
+                  ffi.Pointer<ObjCObject> arg2)>>()
+      .asFunction<
+          void Function(
+              NSItemProviderCompletionHandler arg0,
+              ffi.Pointer<ObjCObject> arg1,
+              ffi.Pointer<ObjCObject> arg2)>()(arg0, arg1, arg2);
+}
+
+final _ObjCBlock25_closureRegistry = <int, Function>{};
+int _ObjCBlock25_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock25_registerClosure(Function fn) {
+  final id = ++_ObjCBlock25_closureRegistryIndex;
+  _ObjCBlock25_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock25_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block,
+    NSItemProviderCompletionHandler arg0,
+    ffi.Pointer<ObjCObject> arg1,
+    ffi.Pointer<ObjCObject> arg2) {
+  return _ObjCBlock25_closureRegistry[block.ref.target.address]!(
+      arg0, arg1, arg2);
+}
+
+class ObjCBlock25 extends _ObjCBlockBase {
+  ObjCBlock25._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock25.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(
+                      NSItemProviderCompletionHandler arg0,
+                      ffi.Pointer<ObjCObject> arg1,
+                      ffi.Pointer<ObjCObject> arg2)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                NSItemProviderCompletionHandler arg0,
+                                ffi.Pointer<ObjCObject> arg1,
+                                ffi.Pointer<ObjCObject> arg2)>(
+                        _ObjCBlock25_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock25.fromFunction(
+      AVFAudio lib,
+      void Function(NSItemProviderCompletionHandler arg0,
+              ffi.Pointer<ObjCObject> arg1, ffi.Pointer<ObjCObject> arg2)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                NSItemProviderCompletionHandler arg0,
+                                ffi.Pointer<ObjCObject> arg1,
+                                ffi.Pointer<ObjCObject> arg2)>(
+                        _ObjCBlock25_closureTrampoline)
+                    .cast(),
+                _ObjCBlock25_registerClosure(fn)),
+            lib);
+  void call(NSItemProviderCompletionHandler arg0, ffi.Pointer<ObjCObject> arg1,
+      ffi.Pointer<ObjCObject> arg2) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    NSItemProviderCompletionHandler arg0,
+                    ffi.Pointer<ObjCObject> arg1,
+                    ffi.Pointer<ObjCObject> arg2)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                NSItemProviderCompletionHandler arg0,
+                ffi.Pointer<ObjCObject> arg1,
+                ffi.Pointer<ObjCObject> arg2)>()(_id, arg0, arg1, arg2);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+typedef NSItemProviderCompletionHandler = ffi.Pointer<_ObjCBlock>;
+
+class NSMutableString extends NSString {
+  NSMutableString._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSMutableString] that points to the same underlying object as [other].
+  static NSMutableString castFrom<T extends _ObjCWrapper>(T other) {
+    return NSMutableString._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSMutableString] that wraps the given raw object pointer.
+  static NSMutableString castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSMutableString._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSMutableString].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSMutableString1);
+  }
+
+  void replaceCharactersInRange_withString_(NSRange range, NSString? aString) {
+    return _lib._objc_msgSend_603(
+        _id,
+        _lib._sel_replaceCharactersInRange_withString_1,
+        range,
+        aString?._id ?? ffi.nullptr);
+  }
+
+  void insertString_atIndex_(NSString? aString, int loc) {
+    return _lib._objc_msgSend_604(_id, _lib._sel_insertString_atIndex_1,
+        aString?._id ?? ffi.nullptr, loc);
+  }
+
+  void deleteCharactersInRange_(NSRange range) {
+    return _lib._objc_msgSend_416(
+        _id, _lib._sel_deleteCharactersInRange_1, range);
+  }
+
+  void appendString_(NSString? aString) {
+    return _lib._objc_msgSend_186(
+        _id, _lib._sel_appendString_1, aString?._id ?? ffi.nullptr);
+  }
+
+  void appendFormat_(NSString? format) {
+    return _lib._objc_msgSend_186(
+        _id, _lib._sel_appendFormat_1, format?._id ?? ffi.nullptr);
+  }
+
+  void setString_(NSString? aString) {
+    return _lib._objc_msgSend_186(
+        _id, _lib._sel_setString_1, aString?._id ?? ffi.nullptr);
+  }
+
+  int replaceOccurrencesOfString_withString_options_range_(NSString? target,
+      NSString? replacement, int options, NSRange searchRange) {
+    return _lib._objc_msgSend_605(
+        _id,
+        _lib._sel_replaceOccurrencesOfString_withString_options_range_1,
+        target?._id ?? ffi.nullptr,
+        replacement?._id ?? ffi.nullptr,
+        options,
+        searchRange);
+  }
+
+  bool applyTransform_reverse_range_updatedRange_(NSStringTransform transform,
+      bool reverse, NSRange range, NSRangePointer resultingRange) {
+    return _lib._objc_msgSend_606(
+        _id,
+        _lib._sel_applyTransform_reverse_range_updatedRange_1,
+        transform,
+        reverse,
+        range,
+        resultingRange);
+  }
+
+  NSMutableString initWithCapacity_(int capacity) {
+    final _ret =
+        _lib._objc_msgSend_607(_id, _lib._sel_initWithCapacity_1, capacity);
+    return NSMutableString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableString stringWithCapacity_(AVFAudio _lib, int capacity) {
+    final _ret = _lib._objc_msgSend_607(
+        _lib._class_NSMutableString1, _lib._sel_stringWithCapacity_1, capacity);
+    return NSMutableString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static ffi.Pointer<NSStringEncoding> getAvailableStringEncodings(
+      AVFAudio _lib) {
+    return _lib._objc_msgSend_318(
+        _lib._class_NSMutableString1, _lib._sel_availableStringEncodings1);
+  }
+
+  static NSString localizedNameOfStringEncoding_(AVFAudio _lib, int encoding) {
+    final _ret = _lib._objc_msgSend_293(_lib._class_NSMutableString1,
+        _lib._sel_localizedNameOfStringEncoding_1, encoding);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static int getDefaultCStringEncoding(AVFAudio _lib) {
+    return _lib._objc_msgSend_10(
+        _lib._class_NSMutableString1, _lib._sel_defaultCStringEncoding1);
+  }
+
+  static NSMutableString string(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMutableString1, _lib._sel_string1);
+    return NSMutableString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableString stringWithString_(AVFAudio _lib, NSString? string) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSMutableString1,
+        _lib._sel_stringWithString_1, string?._id ?? ffi.nullptr);
+    return NSMutableString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableString stringWithCharacters_length_(
+      AVFAudio _lib, ffi.Pointer<unichar> characters, int length) {
+    final _ret = _lib._objc_msgSend_331(_lib._class_NSMutableString1,
+        _lib._sel_stringWithCharacters_length_1, characters, length);
+    return NSMutableString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableString stringWithUTF8String_(
+      AVFAudio _lib, ffi.Pointer<ffi.Char> nullTerminatedCString) {
+    final _ret = _lib._objc_msgSend_332(_lib._class_NSMutableString1,
+        _lib._sel_stringWithUTF8String_1, nullTerminatedCString);
+    return NSMutableString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableString stringWithFormat_(AVFAudio _lib, NSString? format) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSMutableString1,
+        _lib._sel_stringWithFormat_1, format?._id ?? ffi.nullptr);
+    return NSMutableString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableString localizedStringWithFormat_(
+      AVFAudio _lib, NSString? format) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSMutableString1,
+        _lib._sel_localizedStringWithFormat_1, format?._id ?? ffi.nullptr);
+    return NSMutableString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableString stringWithCString_encoding_(
+      AVFAudio _lib, ffi.Pointer<ffi.Char> cString, int enc) {
+    final _ret = _lib._objc_msgSend_339(_lib._class_NSMutableString1,
+        _lib._sel_stringWithCString_encoding_1, cString, enc);
+    return NSMutableString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableString stringWithContentsOfURL_encoding_error_(AVFAudio _lib,
+      NSURL? url, int enc, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_340(
+        _lib._class_NSMutableString1,
+        _lib._sel_stringWithContentsOfURL_encoding_error_1,
+        url?._id ?? ffi.nullptr,
+        enc,
+        error);
+    return NSMutableString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableString stringWithContentsOfFile_encoding_error_(AVFAudio _lib,
+      NSString? path, int enc, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_341(
+        _lib._class_NSMutableString1,
+        _lib._sel_stringWithContentsOfFile_encoding_error_1,
+        path?._id ?? ffi.nullptr,
+        enc,
+        error);
+    return NSMutableString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableString stringWithContentsOfURL_usedEncoding_error_(
+      AVFAudio _lib,
+      NSURL? url,
+      ffi.Pointer<NSStringEncoding> enc,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_342(
+        _lib._class_NSMutableString1,
+        _lib._sel_stringWithContentsOfURL_usedEncoding_error_1,
+        url?._id ?? ffi.nullptr,
+        enc,
+        error);
+    return NSMutableString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableString stringWithContentsOfFile_usedEncoding_error_(
+      AVFAudio _lib,
+      NSString? path,
+      ffi.Pointer<NSStringEncoding> enc,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_343(
+        _lib._class_NSMutableString1,
+        _lib._sel_stringWithContentsOfFile_usedEncoding_error_1,
+        path?._id ?? ffi.nullptr,
+        enc,
+        error);
+    return NSMutableString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static int
+      stringEncodingForData_encodingOptions_convertedString_usedLossyConversion_(
+          AVFAudio _lib,
+          NSData? data,
+          NSDictionary? opts,
+          ffi.Pointer<ffi.Pointer<ObjCObject>> string,
+          ffi.Pointer<ffi.Bool> usedLossyConversion) {
+    return _lib._objc_msgSend_344(
+        _lib._class_NSMutableString1,
+        _lib._sel_stringEncodingForData_encodingOptions_convertedString_usedLossyConversion_1,
+        data?._id ?? ffi.nullptr,
+        opts?._id ?? ffi.nullptr,
+        string,
+        usedLossyConversion);
+  }
+
+  static NSObject stringWithContentsOfFile_(AVFAudio _lib, NSString? path) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSMutableString1,
+        _lib._sel_stringWithContentsOfFile_1, path?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject stringWithContentsOfURL_(AVFAudio _lib, NSURL? url) {
+    final _ret = _lib._objc_msgSend_226(_lib._class_NSMutableString1,
+        _lib._sel_stringWithContentsOfURL_1, url?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject stringWithCString_length_(
+      AVFAudio _lib, ffi.Pointer<ffi.Char> bytes, int length) {
+    final _ret = _lib._objc_msgSend_339(_lib._class_NSMutableString1,
+        _lib._sel_stringWithCString_length_1, bytes, length);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject stringWithCString_(
+      AVFAudio _lib, ffi.Pointer<ffi.Char> bytes) {
+    final _ret = _lib._objc_msgSend_332(
+        _lib._class_NSMutableString1, _lib._sel_stringWithCString_1, bytes);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString pathWithComponents_(AVFAudio _lib, NSArray? components) {
+    final _ret = _lib._objc_msgSend_350(_lib._class_NSMutableString1,
+        _lib._sel_pathWithComponents_1, components?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableString new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMutableString1, _lib._sel_new1);
+    return NSMutableString._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSMutableString alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMutableString1, _lib._sel_alloc1);
+    return NSMutableString._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSMutableString1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSMutableString1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSMutableString1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSMutableString1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSMutableString1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSMutableString1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSMutableString1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSMutableString1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSMutableString1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSNotification extends NSObject {
+  NSNotification._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSNotification] that points to the same underlying object as [other].
+  static NSNotification castFrom<T extends _ObjCWrapper>(T other) {
+    return NSNotification._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSNotification] that wraps the given raw object pointer.
+  static NSNotification castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSNotification._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSNotification].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSNotification1);
+  }
+
+  NSNotificationName get name {
+    return _lib._objc_msgSend_20(_id, _lib._sel_name1);
+  }
+
+  NSObject get object {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_object1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary? get userInfo {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_userInfo1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNotification initWithName_object_userInfo_(
+      NSNotificationName name, NSObject object, NSDictionary? userInfo) {
+    final _ret = _lib._objc_msgSend_608(
+        _id,
+        _lib._sel_initWithName_object_userInfo_1,
+        name,
+        object._id,
+        userInfo?._id ?? ffi.nullptr);
+    return NSNotification._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNotification initWithCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr);
+    return NSNotification._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNotification notificationWithName_object_(
+      AVFAudio _lib, NSNotificationName aName, NSObject anObject) {
+    final _ret = _lib._objc_msgSend_157(_lib._class_NSNotification1,
+        _lib._sel_notificationWithName_object_1, aName, anObject._id);
+    return NSNotification._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNotification notificationWithName_object_userInfo_(AVFAudio _lib,
+      NSNotificationName aName, NSObject anObject, NSDictionary? aUserInfo) {
+    final _ret = _lib._objc_msgSend_608(
+        _lib._class_NSNotification1,
+        _lib._sel_notificationWithName_object_userInfo_1,
+        aName,
+        anObject._id,
+        aUserInfo?._id ?? ffi.nullptr);
+    return NSNotification._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSNotification init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSNotification._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNotification new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSNotification1, _lib._sel_new1);
+    return NSNotification._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSNotification alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSNotification1, _lib._sel_alloc1);
+    return NSNotification._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSNotification1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSNotification1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSNotification1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSNotification1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSNotification1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSNotification1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSNotification1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSNotification1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSNotification1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef NSNotificationName = ffi.Pointer<ObjCObject>;
+
+class NSBundle extends NSObject {
+  NSBundle._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSBundle] that points to the same underlying object as [other].
+  static NSBundle castFrom<T extends _ObjCWrapper>(T other) {
+    return NSBundle._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSBundle] that wraps the given raw object pointer.
+  static NSBundle castFromPointer(AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSBundle._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSBundle].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSBundle1);
+  }
+
+  static NSBundle? getMainBundle(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_609(_lib._class_NSBundle1, _lib._sel_mainBundle1);
+    return _ret.address == 0
+        ? null
+        : NSBundle._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSBundle bundleWithPath_(AVFAudio _lib, NSString? path) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSBundle1,
+        _lib._sel_bundleWithPath_1, path?._id ?? ffi.nullptr);
+    return NSBundle._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSBundle initWithPath_(NSString? path) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initWithPath_1, path?._id ?? ffi.nullptr);
+    return NSBundle._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSBundle bundleWithURL_(AVFAudio _lib, NSURL? url) {
+    final _ret = _lib._objc_msgSend_226(_lib._class_NSBundle1,
+        _lib._sel_bundleWithURL_1, url?._id ?? ffi.nullptr);
+    return NSBundle._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSBundle initWithURL_(NSURL? url) {
+    final _ret = _lib._objc_msgSend_226(
+        _id, _lib._sel_initWithURL_1, url?._id ?? ffi.nullptr);
+    return NSBundle._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSBundle bundleForClass_(AVFAudio _lib, NSObject aClass) {
+    final _ret = _lib._objc_msgSend_610(
+        _lib._class_NSBundle1, _lib._sel_bundleForClass_1, aClass._id);
+    return NSBundle._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSBundle bundleWithIdentifier_(AVFAudio _lib, NSString? identifier) {
+    final _ret = _lib._objc_msgSend_611(_lib._class_NSBundle1,
+        _lib._sel_bundleWithIdentifier_1, identifier?._id ?? ffi.nullptr);
+    return NSBundle._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray? getAllBundles(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_80(_lib._class_NSBundle1, _lib._sel_allBundles1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray? getAllFrameworks(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_80(_lib._class_NSBundle1, _lib._sel_allFrameworks1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool load() {
+    return _lib._objc_msgSend_12(_id, _lib._sel_load1);
+  }
+
+  bool get loaded {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isLoaded1);
+  }
+
+  bool unload() {
+    return _lib._objc_msgSend_12(_id, _lib._sel_unload1);
+  }
+
+  bool preflightAndReturnError_(ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_219(
+        _id, _lib._sel_preflightAndReturnError_1, error);
+  }
+
+  bool loadAndReturnError_(ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_219(_id, _lib._sel_loadAndReturnError_1, error);
+  }
+
+  NSURL? get bundleURL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_bundleURL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get resourceURL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_resourceURL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get executableURL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_executableURL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL URLForAuxiliaryExecutable_(NSString? executableName) {
+    final _ret = _lib._objc_msgSend_34(
+        _id,
+        _lib._sel_URLForAuxiliaryExecutable_1,
+        executableName?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get privateFrameworksURL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_privateFrameworksURL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get sharedFrameworksURL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_sharedFrameworksURL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get sharedSupportURL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_sharedSupportURL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get builtInPlugInsURL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_builtInPlugInsURL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get appStoreReceiptURL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_appStoreReceiptURL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get bundlePath {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_bundlePath1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get resourcePath {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_resourcePath1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get executablePath {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_executablePath1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString pathForAuxiliaryExecutable_(NSString? executableName) {
+    final _ret = _lib._objc_msgSend_64(
+        _id,
+        _lib._sel_pathForAuxiliaryExecutable_1,
+        executableName?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get privateFrameworksPath {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_privateFrameworksPath1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get sharedFrameworksPath {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_sharedFrameworksPath1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get sharedSupportPath {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_sharedSupportPath1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get builtInPlugInsPath {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_builtInPlugInsPath1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURL URLForResource_withExtension_subdirectory_inBundleWithURL_(
+      AVFAudio _lib,
+      NSString? name,
+      NSString? ext,
+      NSString? subpath,
+      NSURL? bundleURL) {
+    final _ret = _lib._objc_msgSend_612(
+        _lib._class_NSBundle1,
+        _lib._sel_URLForResource_withExtension_subdirectory_inBundleWithURL_1,
+        name?._id ?? ffi.nullptr,
+        ext?._id ?? ffi.nullptr,
+        subpath?._id ?? ffi.nullptr,
+        bundleURL?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray URLsForResourcesWithExtension_subdirectory_inBundleWithURL_(
+      AVFAudio _lib, NSString? ext, NSString? subpath, NSURL? bundleURL) {
+    final _ret = _lib._objc_msgSend_613(
+        _lib._class_NSBundle1,
+        _lib._sel_URLsForResourcesWithExtension_subdirectory_inBundleWithURL_1,
+        ext?._id ?? ffi.nullptr,
+        subpath?._id ?? ffi.nullptr,
+        bundleURL?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL URLForResource_withExtension_(NSString? name, NSString? ext) {
+    final _ret = _lib._objc_msgSend_614(
+        _id,
+        _lib._sel_URLForResource_withExtension_1,
+        name?._id ?? ffi.nullptr,
+        ext?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL URLForResource_withExtension_subdirectory_(
+      NSString? name, NSString? ext, NSString? subpath) {
+    final _ret = _lib._objc_msgSend_615(
+        _id,
+        _lib._sel_URLForResource_withExtension_subdirectory_1,
+        name?._id ?? ffi.nullptr,
+        ext?._id ?? ffi.nullptr,
+        subpath?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL URLForResource_withExtension_subdirectory_localization_(NSString? name,
+      NSString? ext, NSString? subpath, NSString? localizationName) {
+    final _ret = _lib._objc_msgSend_616(
+        _id,
+        _lib._sel_URLForResource_withExtension_subdirectory_localization_1,
+        name?._id ?? ffi.nullptr,
+        ext?._id ?? ffi.nullptr,
+        subpath?._id ?? ffi.nullptr,
+        localizationName?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray URLsForResourcesWithExtension_subdirectory_(
+      NSString? ext, NSString? subpath) {
+    final _ret = _lib._objc_msgSend_617(
+        _id,
+        _lib._sel_URLsForResourcesWithExtension_subdirectory_1,
+        ext?._id ?? ffi.nullptr,
+        subpath?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray URLsForResourcesWithExtension_subdirectory_localization_(
+      NSString? ext, NSString? subpath, NSString? localizationName) {
+    final _ret = _lib._objc_msgSend_618(
+        _id,
+        _lib._sel_URLsForResourcesWithExtension_subdirectory_localization_1,
+        ext?._id ?? ffi.nullptr,
+        subpath?._id ?? ffi.nullptr,
+        localizationName?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString pathForResource_ofType_inDirectory_(
+      AVFAudio _lib, NSString? name, NSString? ext, NSString? bundlePath) {
+    final _ret = _lib._objc_msgSend_619(
+        _lib._class_NSBundle1,
+        _lib._sel_pathForResource_ofType_inDirectory_1,
+        name?._id ?? ffi.nullptr,
+        ext?._id ?? ffi.nullptr,
+        bundlePath?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray pathsForResourcesOfType_inDirectory_(
+      AVFAudio _lib, NSString? ext, NSString? bundlePath) {
+    final _ret = _lib._objc_msgSend_617(
+        _lib._class_NSBundle1,
+        _lib._sel_pathsForResourcesOfType_inDirectory_1,
+        ext?._id ?? ffi.nullptr,
+        bundlePath?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString pathForResource_ofType_(NSString? name, NSString? ext) {
+    final _ret = _lib._objc_msgSend_324(_id, _lib._sel_pathForResource_ofType_1,
+        name?._id ?? ffi.nullptr, ext?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString pathForResource_ofType_inDirectory_forLocalization_(NSString? name,
+      NSString? ext, NSString? subpath, NSString? localizationName) {
+    final _ret = _lib._objc_msgSend_620(
+        _id,
+        _lib._sel_pathForResource_ofType_inDirectory_forLocalization_1,
+        name?._id ?? ffi.nullptr,
+        ext?._id ?? ffi.nullptr,
+        subpath?._id ?? ffi.nullptr,
+        localizationName?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray pathsForResourcesOfType_inDirectory_forLocalization_(
+      NSString? ext, NSString? subpath, NSString? localizationName) {
+    final _ret = _lib._objc_msgSend_618(
+        _id,
+        _lib._sel_pathsForResourcesOfType_inDirectory_forLocalization_1,
+        ext?._id ?? ffi.nullptr,
+        subpath?._id ?? ffi.nullptr,
+        localizationName?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString localizedStringForKey_value_table_(
+      NSString? key, NSString? value, NSString? tableName) {
+    final _ret = _lib._objc_msgSend_619(
+        _id,
+        _lib._sel_localizedStringForKey_value_table_1,
+        key?._id ?? ffi.nullptr,
+        value?._id ?? ffi.nullptr,
+        tableName?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSAttributedString localizedAttributedStringForKey_value_table_(
+      NSString? key, NSString? value, NSString? tableName) {
+    final _ret = _lib._objc_msgSend_641(
+        _id,
+        _lib._sel_localizedAttributedStringForKey_value_table_1,
+        key?._id ?? ffi.nullptr,
+        value?._id ?? ffi.nullptr,
+        tableName?._id ?? ffi.nullptr);
+    return NSAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get bundleIdentifier {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_bundleIdentifier1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary? get infoDictionary {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_infoDictionary1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary? get localizedInfoDictionary {
+    final _ret =
+        _lib._objc_msgSend_164(_id, _lib._sel_localizedInfoDictionary1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject objectForInfoDictionaryKey_(NSString? key) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_objectForInfoDictionaryKey_1, key?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject classNamed_(NSString? className) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_classNamed_1, className?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject get principalClass {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_principalClass1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get preferredLocalizations {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_preferredLocalizations1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get localizations {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_localizations1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get developmentLocalization {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_developmentLocalization1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray preferredLocalizationsFromArray_(
+      AVFAudio _lib, NSArray? localizationsArray) {
+    final _ret = _lib._objc_msgSend_63(
+        _lib._class_NSBundle1,
+        _lib._sel_preferredLocalizationsFromArray_1,
+        localizationsArray?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray preferredLocalizationsFromArray_forPreferences_(
+      AVFAudio _lib, NSArray? localizationsArray, NSArray? preferencesArray) {
+    final _ret = _lib._objc_msgSend_642(
+        _lib._class_NSBundle1,
+        _lib._sel_preferredLocalizationsFromArray_forPreferences_1,
+        localizationsArray?._id ?? ffi.nullptr,
+        preferencesArray?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get executableArchitectures {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_executableArchitectures1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  void setPreservationPriority_forTags_(double priority, NSSet? tags) {
+    return _lib._objc_msgSend_643(
+        _id,
+        _lib._sel_setPreservationPriority_forTags_1,
+        priority,
+        tags?._id ?? ffi.nullptr);
+  }
+
+  double preservationPriorityForTag_(NSString? tag) {
+    return _lib._objc_msgSend_269(
+        _id, _lib._sel_preservationPriorityForTag_1, tag?._id ?? ffi.nullptr);
+  }
+
+  static NSBundle new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSBundle1, _lib._sel_new1);
+    return NSBundle._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSBundle alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSBundle1, _lib._sel_alloc1);
+    return NSBundle._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSBundle1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSBundle1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSBundle1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSBundle1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSBundle1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSBundle1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSBundle1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSBundle1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSBundle1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSAttributedString extends NSObject {
+  NSAttributedString._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSAttributedString] that points to the same underlying object as [other].
+  static NSAttributedString castFrom<T extends _ObjCWrapper>(T other) {
+    return NSAttributedString._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSAttributedString] that wraps the given raw object pointer.
+  static NSAttributedString castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSAttributedString._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSAttributedString].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSAttributedString1);
+  }
+
+  NSString? get string {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_string1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary attributesAtIndex_effectiveRange_(
+      int location, NSRangePointer range) {
+    final _ret = _lib._objc_msgSend_621(
+        _id, _lib._sel_attributesAtIndex_effectiveRange_1, location, range);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get length {
+    return _lib._objc_msgSend_10(_id, _lib._sel_length1);
+  }
+
+  NSObject attribute_atIndex_effectiveRange_(
+      NSAttributedStringKey attrName, int location, NSRangePointer range) {
+    final _ret = _lib._objc_msgSend_622(
+        _id,
+        _lib._sel_attribute_atIndex_effectiveRange_1,
+        attrName,
+        location,
+        range);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSAttributedString attributedSubstringFromRange_(NSRange range) {
+    final _ret = _lib._objc_msgSend_623(
+        _id, _lib._sel_attributedSubstringFromRange_1, range);
+    return NSAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary attributesAtIndex_longestEffectiveRange_inRange_(
+      int location, NSRangePointer range, NSRange rangeLimit) {
+    final _ret = _lib._objc_msgSend_624(
+        _id,
+        _lib._sel_attributesAtIndex_longestEffectiveRange_inRange_1,
+        location,
+        range,
+        rangeLimit);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject attribute_atIndex_longestEffectiveRange_inRange_(
+      NSAttributedStringKey attrName,
+      int location,
+      NSRangePointer range,
+      NSRange rangeLimit) {
+    final _ret = _lib._objc_msgSend_625(
+        _id,
+        _lib._sel_attribute_atIndex_longestEffectiveRange_inRange_1,
+        attrName,
+        location,
+        range,
+        rangeLimit);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool isEqualToAttributedString_(NSAttributedString? other) {
+    return _lib._objc_msgSend_626(
+        _id, _lib._sel_isEqualToAttributedString_1, other?._id ?? ffi.nullptr);
+  }
+
+  NSAttributedString initWithString_(NSString? str) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initWithString_1, str?._id ?? ffi.nullptr);
+    return NSAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSAttributedString initWithString_attributes_(
+      NSString? str, NSDictionary? attrs) {
+    final _ret = _lib._objc_msgSend_352(
+        _id,
+        _lib._sel_initWithString_attributes_1,
+        str?._id ?? ffi.nullptr,
+        attrs?._id ?? ffi.nullptr);
+    return NSAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSAttributedString initWithAttributedString_(NSAttributedString? attrStr) {
+    final _ret = _lib._objc_msgSend_627(
+        _id, _lib._sel_initWithAttributedString_1, attrStr?._id ?? ffi.nullptr);
+    return NSAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  void enumerateAttributesInRange_options_usingBlock_(
+      NSRange enumerationRange, int opts, ObjCBlock26 block) {
+    return _lib._objc_msgSend_628(
+        _id,
+        _lib._sel_enumerateAttributesInRange_options_usingBlock_1,
+        enumerationRange,
+        opts,
+        block._id);
+  }
+
+  void enumerateAttribute_inRange_options_usingBlock_(
+      NSAttributedStringKey attrName,
+      NSRange enumerationRange,
+      int opts,
+      ObjCBlock27 block) {
+    return _lib._objc_msgSend_629(
+        _id,
+        _lib._sel_enumerateAttribute_inRange_options_usingBlock_1,
+        attrName,
+        enumerationRange,
+        opts,
+        block._id);
+  }
+
+  NSAttributedString initWithContentsOfMarkdownFileAtURL_options_baseURL_error_(
+      NSURL? markdownFile,
+      NSAttributedStringMarkdownParsingOptions? options,
+      NSURL? baseURL,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_634(
+        _id,
+        _lib._sel_initWithContentsOfMarkdownFileAtURL_options_baseURL_error_1,
+        markdownFile?._id ?? ffi.nullptr,
+        options?._id ?? ffi.nullptr,
+        baseURL?._id ?? ffi.nullptr,
+        error);
+    return NSAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSAttributedString initWithMarkdown_options_baseURL_error_(
+      NSData? markdown,
+      NSAttributedStringMarkdownParsingOptions? options,
+      NSURL? baseURL,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_635(
+        _id,
+        _lib._sel_initWithMarkdown_options_baseURL_error_1,
+        markdown?._id ?? ffi.nullptr,
+        options?._id ?? ffi.nullptr,
+        baseURL?._id ?? ffi.nullptr,
+        error);
+    return NSAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSAttributedString initWithMarkdownString_options_baseURL_error_(
+      NSString? markdownString,
+      NSAttributedStringMarkdownParsingOptions? options,
+      NSURL? baseURL,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_636(
+        _id,
+        _lib._sel_initWithMarkdownString_options_baseURL_error_1,
+        markdownString?._id ?? ffi.nullptr,
+        options?._id ?? ffi.nullptr,
+        baseURL?._id ?? ffi.nullptr,
+        error);
+    return NSAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSAttributedString initWithFormat_options_locale_(
+      NSAttributedString? format, int options, NSLocale? locale) {
+    final _ret = _lib._objc_msgSend_637(
+        _id,
+        _lib._sel_initWithFormat_options_locale_1,
+        format?._id ?? ffi.nullptr,
+        options,
+        locale?._id ?? ffi.nullptr);
+    return NSAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSAttributedString initWithFormat_options_locale_arguments_(
+      NSAttributedString? format,
+      int options,
+      NSLocale? locale,
+      ffi.Pointer<__va_list_tag> arguments) {
+    final _ret = _lib._objc_msgSend_638(
+        _id,
+        _lib._sel_initWithFormat_options_locale_arguments_1,
+        format?._id ?? ffi.nullptr,
+        options,
+        locale?._id ?? ffi.nullptr,
+        arguments);
+    return NSAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAttributedString localizedAttributedStringWithFormat_(
+      AVFAudio _lib, NSAttributedString? format) {
+    final _ret = _lib._objc_msgSend_627(
+        _lib._class_NSAttributedString1,
+        _lib._sel_localizedAttributedStringWithFormat_1,
+        format?._id ?? ffi.nullptr);
+    return NSAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAttributedString localizedAttributedStringWithFormat_options_(
+      AVFAudio _lib, NSAttributedString? format, int options) {
+    final _ret = _lib._objc_msgSend_639(
+        _lib._class_NSAttributedString1,
+        _lib._sel_localizedAttributedStringWithFormat_options_1,
+        format?._id ?? ffi.nullptr,
+        options);
+    return NSAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSAttributedString attributedStringByInflectingString() {
+    final _ret = _lib._objc_msgSend_640(
+        _id, _lib._sel_attributedStringByInflectingString1);
+    return NSAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAttributedString new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSAttributedString1, _lib._sel_new1);
+    return NSAttributedString._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSAttributedString alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSAttributedString1, _lib._sel_alloc1);
+    return NSAttributedString._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSAttributedString1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSAttributedString1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSAttributedString1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSAttributedString1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSAttributedString1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSAttributedString1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSAttributedString1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSAttributedString1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSAttributedString1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef NSAttributedStringKey = ffi.Pointer<ObjCObject>;
+
+abstract class NSAttributedStringEnumerationOptions {
+  static const int NSAttributedStringEnumerationReverse = 2;
+  static const int
+      NSAttributedStringEnumerationLongestEffectiveRangeNotRequired = 1048576;
+}
+
+void _ObjCBlock26_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, NSRange arg1, ffi.Pointer<ffi.Bool> arg2) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(ffi.Pointer<ObjCObject> arg0, NSRange arg1,
+                  ffi.Pointer<ffi.Bool> arg2)>>()
+      .asFunction<
+          void Function(ffi.Pointer<ObjCObject> arg0, NSRange arg1,
+              ffi.Pointer<ffi.Bool> arg2)>()(arg0, arg1, arg2);
+}
+
+final _ObjCBlock26_closureRegistry = <int, Function>{};
+int _ObjCBlock26_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock26_registerClosure(Function fn) {
+  final id = ++_ObjCBlock26_closureRegistryIndex;
+  _ObjCBlock26_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock26_closureTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, NSRange arg1, ffi.Pointer<ffi.Bool> arg2) {
+  return _ObjCBlock26_closureRegistry[block.ref.target.address]!(
+      arg0, arg1, arg2);
+}
+
+class ObjCBlock26 extends _ObjCBlockBase {
+  ObjCBlock26._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock26.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0, NSRange arg1,
+                      ffi.Pointer<ffi.Bool> arg2)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                NSRange arg1,
+                                ffi.Pointer<ffi.Bool> arg2)>(
+                        _ObjCBlock26_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock26.fromFunction(
+      AVFAudio lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, NSRange arg1,
+              ffi.Pointer<ffi.Bool> arg2)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                NSRange arg1,
+                                ffi.Pointer<ffi.Bool> arg2)>(
+                        _ObjCBlock26_closureTrampoline)
+                    .cast(),
+                _ObjCBlock26_registerClosure(fn)),
+            lib);
+  void call(
+      ffi.Pointer<ObjCObject> arg0, NSRange arg1, ffi.Pointer<ffi.Bool> arg2) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    NSRange arg1,
+                    ffi.Pointer<ffi.Bool> arg2)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                NSRange arg1,
+                ffi.Pointer<ffi.Bool> arg2)>()(_id, arg0, arg1, arg2);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+void _ObjCBlock27_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, NSRange arg1, ffi.Pointer<ffi.Bool> arg2) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(ffi.Pointer<ObjCObject> arg0, NSRange arg1,
+                  ffi.Pointer<ffi.Bool> arg2)>>()
+      .asFunction<
+          void Function(ffi.Pointer<ObjCObject> arg0, NSRange arg1,
+              ffi.Pointer<ffi.Bool> arg2)>()(arg0, arg1, arg2);
+}
+
+final _ObjCBlock27_closureRegistry = <int, Function>{};
+int _ObjCBlock27_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock27_registerClosure(Function fn) {
+  final id = ++_ObjCBlock27_closureRegistryIndex;
+  _ObjCBlock27_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock27_closureTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, NSRange arg1, ffi.Pointer<ffi.Bool> arg2) {
+  return _ObjCBlock27_closureRegistry[block.ref.target.address]!(
+      arg0, arg1, arg2);
+}
+
+class ObjCBlock27 extends _ObjCBlockBase {
+  ObjCBlock27._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock27.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0, NSRange arg1,
+                      ffi.Pointer<ffi.Bool> arg2)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                NSRange arg1,
+                                ffi.Pointer<ffi.Bool> arg2)>(
+                        _ObjCBlock27_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock27.fromFunction(
+      AVFAudio lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, NSRange arg1,
+              ffi.Pointer<ffi.Bool> arg2)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                NSRange arg1,
+                                ffi.Pointer<ffi.Bool> arg2)>(
+                        _ObjCBlock27_closureTrampoline)
+                    .cast(),
+                _ObjCBlock27_registerClosure(fn)),
+            lib);
+  void call(
+      ffi.Pointer<ObjCObject> arg0, NSRange arg1, ffi.Pointer<ffi.Bool> arg2) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    NSRange arg1,
+                    ffi.Pointer<ffi.Bool> arg2)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                NSRange arg1,
+                ffi.Pointer<ffi.Bool> arg2)>()(_id, arg0, arg1, arg2);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class NSAttributedStringMarkdownParsingOptions extends NSObject {
+  NSAttributedStringMarkdownParsingOptions._(
+      ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSAttributedStringMarkdownParsingOptions] that points to the same underlying object as [other].
+  static NSAttributedStringMarkdownParsingOptions
+      castFrom<T extends _ObjCWrapper>(T other) {
+    return NSAttributedStringMarkdownParsingOptions._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSAttributedStringMarkdownParsingOptions] that wraps the given raw object pointer.
+  static NSAttributedStringMarkdownParsingOptions castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSAttributedStringMarkdownParsingOptions._(other, lib,
+        retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSAttributedStringMarkdownParsingOptions].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSAttributedStringMarkdownParsingOptions1);
+  }
+
+  @override
+  NSAttributedStringMarkdownParsingOptions init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSAttributedStringMarkdownParsingOptions._(_ret, _lib,
+        retain: true, release: true);
+  }
+
+  bool get allowsExtendedAttributes {
+    return _lib._objc_msgSend_12(_id, _lib._sel_allowsExtendedAttributes1);
+  }
+
+  set allowsExtendedAttributes(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setAllowsExtendedAttributes_1, value);
+  }
+
+  int get interpretedSyntax {
+    return _lib._objc_msgSend_630(_id, _lib._sel_interpretedSyntax1);
+  }
+
+  set interpretedSyntax(int value) {
+    _lib._objc_msgSend_631(_id, _lib._sel_setInterpretedSyntax_1, value);
+  }
+
+  int get failurePolicy {
+    return _lib._objc_msgSend_632(_id, _lib._sel_failurePolicy1);
+  }
+
+  set failurePolicy(int value) {
+    _lib._objc_msgSend_633(_id, _lib._sel_setFailurePolicy_1, value);
+  }
+
+  NSString? get languageCode {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_languageCode1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set languageCode(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setLanguageCode_1, value?._id ?? ffi.nullptr);
+  }
+
+  static NSAttributedStringMarkdownParsingOptions new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSAttributedStringMarkdownParsingOptions1, _lib._sel_new1);
+    return NSAttributedStringMarkdownParsingOptions._(_ret, _lib,
+        retain: false, release: true);
+  }
+
+  static NSAttributedStringMarkdownParsingOptions alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSAttributedStringMarkdownParsingOptions1,
+        _lib._sel_alloc1);
+    return NSAttributedStringMarkdownParsingOptions._(_ret, _lib,
+        retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSAttributedStringMarkdownParsingOptions1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(
+        _lib._class_NSAttributedStringMarkdownParsingOptions1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1,
+        aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSAttributedStringMarkdownParsingOptions1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSAttributedStringMarkdownParsingOptions1,
+        _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSAttributedStringMarkdownParsingOptions1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSAttributedStringMarkdownParsingOptions1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSAttributedStringMarkdownParsingOptions1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSAttributedStringMarkdownParsingOptions1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSAttributedStringMarkdownParsingOptions1,
+        _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSAttributedStringMarkdownInterpretedSyntax {
+  static const int NSAttributedStringMarkdownInterpretedSyntaxFull = 0;
+  static const int NSAttributedStringMarkdownInterpretedSyntaxInlineOnly = 1;
+  static const int
+      NSAttributedStringMarkdownInterpretedSyntaxInlineOnlyPreservingWhitespace =
+      2;
+}
+
+abstract class NSAttributedStringMarkdownParsingFailurePolicy {
+  static const int NSAttributedStringMarkdownParsingFailureReturnError = 0;
+  static const int
+      NSAttributedStringMarkdownParsingFailureReturnPartiallyParsedIfPossible =
+      1;
+}
+
+abstract class NSAttributedStringFormattingOptions {
+  static const int
+      NSAttributedStringFormattingInsertArgumentAttributesWithoutMerging = 1;
+  static const int NSAttributedStringFormattingApplyReplacementIndexAttribute =
+      2;
+}
+
+class NSMutableAttributedString extends NSAttributedString {
+  NSMutableAttributedString._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSMutableAttributedString] that points to the same underlying object as [other].
+  static NSMutableAttributedString castFrom<T extends _ObjCWrapper>(T other) {
+    return NSMutableAttributedString._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSMutableAttributedString] that wraps the given raw object pointer.
+  static NSMutableAttributedString castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSMutableAttributedString._(other, lib,
+        retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSMutableAttributedString].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSMutableAttributedString1);
+  }
+
+  void replaceCharactersInRange_withString_(NSRange range, NSString? str) {
+    return _lib._objc_msgSend_603(
+        _id,
+        _lib._sel_replaceCharactersInRange_withString_1,
+        range,
+        str?._id ?? ffi.nullptr);
+  }
+
+  void setAttributes_range_(NSDictionary? attrs, NSRange range) {
+    return _lib._objc_msgSend_644(
+        _id, _lib._sel_setAttributes_range_1, attrs?._id ?? ffi.nullptr, range);
+  }
+
+  NSMutableString? get mutableString {
+    final _ret = _lib._objc_msgSend_645(_id, _lib._sel_mutableString1);
+    return _ret.address == 0
+        ? null
+        : NSMutableString._(_ret, _lib, retain: true, release: true);
+  }
+
+  void addAttribute_value_range_(
+      NSAttributedStringKey name, NSObject value, NSRange range) {
+    return _lib._objc_msgSend_646(
+        _id, _lib._sel_addAttribute_value_range_1, name, value._id, range);
+  }
+
+  void addAttributes_range_(NSDictionary? attrs, NSRange range) {
+    return _lib._objc_msgSend_644(
+        _id, _lib._sel_addAttributes_range_1, attrs?._id ?? ffi.nullptr, range);
+  }
+
+  void removeAttribute_range_(NSAttributedStringKey name, NSRange range) {
+    return _lib._objc_msgSend_647(
+        _id, _lib._sel_removeAttribute_range_1, name, range);
+  }
+
+  void replaceCharactersInRange_withAttributedString_(
+      NSRange range, NSAttributedString? attrString) {
+    return _lib._objc_msgSend_648(
+        _id,
+        _lib._sel_replaceCharactersInRange_withAttributedString_1,
+        range,
+        attrString?._id ?? ffi.nullptr);
+  }
+
+  void insertAttributedString_atIndex_(
+      NSAttributedString? attrString, int loc) {
+    return _lib._objc_msgSend_649(
+        _id,
+        _lib._sel_insertAttributedString_atIndex_1,
+        attrString?._id ?? ffi.nullptr,
+        loc);
+  }
+
+  void appendAttributedString_(NSAttributedString? attrString) {
+    return _lib._objc_msgSend_650(_id, _lib._sel_appendAttributedString_1,
+        attrString?._id ?? ffi.nullptr);
+  }
+
+  void deleteCharactersInRange_(NSRange range) {
+    return _lib._objc_msgSend_416(
+        _id, _lib._sel_deleteCharactersInRange_1, range);
+  }
+
+  void setAttributedString_(NSAttributedString? attrString) {
+    return _lib._objc_msgSend_650(
+        _id, _lib._sel_setAttributedString_1, attrString?._id ?? ffi.nullptr);
+  }
+
+  void beginEditing() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_beginEditing1);
+  }
+
+  void endEditing() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_endEditing1);
+  }
+
+  void appendLocalizedFormat_(NSAttributedString? format) {
+    return _lib._objc_msgSend_650(
+        _id, _lib._sel_appendLocalizedFormat_1, format?._id ?? ffi.nullptr);
+  }
+
+  static NSMutableAttributedString localizedAttributedStringWithFormat_(
+      AVFAudio _lib, NSAttributedString? format) {
+    final _ret = _lib._objc_msgSend_627(
+        _lib._class_NSMutableAttributedString1,
+        _lib._sel_localizedAttributedStringWithFormat_1,
+        format?._id ?? ffi.nullptr);
+    return NSMutableAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableAttributedString localizedAttributedStringWithFormat_options_(
+      AVFAudio _lib, NSAttributedString? format, int options) {
+    final _ret = _lib._objc_msgSend_639(
+        _lib._class_NSMutableAttributedString1,
+        _lib._sel_localizedAttributedStringWithFormat_options_1,
+        format?._id ?? ffi.nullptr,
+        options);
+    return NSMutableAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableAttributedString new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSMutableAttributedString1, _lib._sel_new1);
+    return NSMutableAttributedString._(_ret, _lib,
+        retain: false, release: true);
+  }
+
+  static NSMutableAttributedString alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSMutableAttributedString1, _lib._sel_alloc1);
+    return NSMutableAttributedString._(_ret, _lib,
+        retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSMutableAttributedString1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSMutableAttributedString1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSMutableAttributedString1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSMutableAttributedString1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSMutableAttributedString1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSMutableAttributedString1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSMutableAttributedString1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSMutableAttributedString1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSMutableAttributedString1,
+        _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSDateFormatter extends NSFormatter {
+  NSDateFormatter._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSDateFormatter] that points to the same underlying object as [other].
+  static NSDateFormatter castFrom<T extends _ObjCWrapper>(T other) {
+    return NSDateFormatter._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSDateFormatter] that wraps the given raw object pointer.
+  static NSDateFormatter castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSDateFormatter._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSDateFormatter].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSDateFormatter1);
+  }
+
+  int get formattingContext {
+    return _lib._objc_msgSend_655(_id, _lib._sel_formattingContext1);
+  }
+
+  set formattingContext(int value) {
+    _lib._objc_msgSend_656(_id, _lib._sel_setFormattingContext_1, value);
+  }
+
+  bool getObjectValue_forString_range_error_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> obj,
+      NSString? string,
+      ffi.Pointer<NSRange> rangep,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_657(
+        _id,
+        _lib._sel_getObjectValue_forString_range_error_1,
+        obj,
+        string?._id ?? ffi.nullptr,
+        rangep,
+        error);
+  }
+
+  NSString stringFromDate_(NSDate? date) {
+    final _ret = _lib._objc_msgSend_161(
+        _id, _lib._sel_stringFromDate_1, date?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate dateFromString_(NSString? string) {
+    final _ret = _lib._objc_msgSend_496(
+        _id, _lib._sel_dateFromString_1, string?._id ?? ffi.nullptr);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString localizedStringFromDate_dateStyle_timeStyle_(
+      AVFAudio _lib, NSDate? date, int dstyle, int tstyle) {
+    final _ret = _lib._objc_msgSend_658(
+        _lib._class_NSDateFormatter1,
+        _lib._sel_localizedStringFromDate_dateStyle_timeStyle_1,
+        date?._id ?? ffi.nullptr,
+        dstyle,
+        tstyle);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString dateFormatFromTemplate_options_locale_(
+      AVFAudio _lib, NSString? tmplate, int opts, NSLocale? locale) {
+    final _ret = _lib._objc_msgSend_659(
+        _lib._class_NSDateFormatter1,
+        _lib._sel_dateFormatFromTemplate_options_locale_1,
+        tmplate?._id ?? ffi.nullptr,
+        opts,
+        locale?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static int getDefaultFormatterBehavior(AVFAudio _lib) {
+    return _lib._objc_msgSend_660(
+        _lib._class_NSDateFormatter1, _lib._sel_defaultFormatterBehavior1);
+  }
+
+  static void setDefaultFormatterBehavior(AVFAudio _lib, int value) {
+    _lib._objc_msgSend_661(_lib._class_NSDateFormatter1,
+        _lib._sel_setDefaultFormatterBehavior_1, value);
+  }
+
+  void setLocalizedDateFormatFromTemplate_(NSString? dateFormatTemplate) {
+    return _lib._objc_msgSend_186(
+        _id,
+        _lib._sel_setLocalizedDateFormatFromTemplate_1,
+        dateFormatTemplate?._id ?? ffi.nullptr);
+  }
+
+  NSString? get dateFormat {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_dateFormat1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set dateFormat(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setDateFormat_1, value?._id ?? ffi.nullptr);
+  }
+
+  int get dateStyle {
+    return _lib._objc_msgSend_662(_id, _lib._sel_dateStyle1);
+  }
+
+  set dateStyle(int value) {
+    _lib._objc_msgSend_663(_id, _lib._sel_setDateStyle_1, value);
+  }
+
+  int get timeStyle {
+    return _lib._objc_msgSend_662(_id, _lib._sel_timeStyle1);
+  }
+
+  set timeStyle(int value) {
+    _lib._objc_msgSend_663(_id, _lib._sel_setTimeStyle_1, value);
+  }
+
+  NSLocale? get locale {
+    final _ret = _lib._objc_msgSend_176(_id, _lib._sel_locale1);
+    return _ret.address == 0
+        ? null
+        : NSLocale._(_ret, _lib, retain: true, release: true);
+  }
+
+  set locale(NSLocale? value) {
+    _lib._objc_msgSend_664(
+        _id, _lib._sel_setLocale_1, value?._id ?? ffi.nullptr);
+  }
+
+  bool get generatesCalendarDates {
+    return _lib._objc_msgSend_12(_id, _lib._sel_generatesCalendarDates1);
+  }
+
+  set generatesCalendarDates(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setGeneratesCalendarDates_1, value);
+  }
+
+  int get formatterBehavior {
+    return _lib._objc_msgSend_660(_id, _lib._sel_formatterBehavior1);
+  }
+
+  set formatterBehavior(int value) {
+    _lib._objc_msgSend_661(_id, _lib._sel_setFormatterBehavior_1, value);
+  }
+
+  NSTimeZone? get timeZone {
+    final _ret = _lib._objc_msgSend_162(_id, _lib._sel_timeZone1);
+    return _ret.address == 0
+        ? null
+        : NSTimeZone._(_ret, _lib, retain: true, release: true);
+  }
+
+  set timeZone(NSTimeZone? value) {
+    _lib._objc_msgSend_163(
+        _id, _lib._sel_setTimeZone_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSCalendar? get calendar {
+    final _ret = _lib._objc_msgSend_665(_id, _lib._sel_calendar1);
+    return _ret.address == 0
+        ? null
+        : NSCalendar._(_ret, _lib, retain: true, release: true);
+  }
+
+  set calendar(NSCalendar? value) {
+    _lib._objc_msgSend_671(
+        _id, _lib._sel_setCalendar_1, value?._id ?? ffi.nullptr);
+  }
+
+  bool get lenient {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isLenient1);
+  }
+
+  set lenient(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setLenient_1, value);
+  }
+
+  NSDate? get twoDigitStartDate {
+    final _ret = _lib._objc_msgSend_156(_id, _lib._sel_twoDigitStartDate1);
+    return _ret.address == 0
+        ? null
+        : NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  set twoDigitStartDate(NSDate? value) {
+    _lib._objc_msgSend_493(
+        _id, _lib._sel_setTwoDigitStartDate_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSDate? get defaultDate {
+    final _ret = _lib._objc_msgSend_156(_id, _lib._sel_defaultDate1);
+    return _ret.address == 0
+        ? null
+        : NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  set defaultDate(NSDate? value) {
+    _lib._objc_msgSend_493(
+        _id, _lib._sel_setDefaultDate_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get eraSymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_eraSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set eraSymbols(NSArray? value) {
+    _lib._objc_msgSend_696(
+        _id, _lib._sel_setEraSymbols_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get monthSymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_monthSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set monthSymbols(NSArray? value) {
+    _lib._objc_msgSend_696(
+        _id, _lib._sel_setMonthSymbols_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get shortMonthSymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_shortMonthSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set shortMonthSymbols(NSArray? value) {
+    _lib._objc_msgSend_696(
+        _id, _lib._sel_setShortMonthSymbols_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get weekdaySymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_weekdaySymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set weekdaySymbols(NSArray? value) {
+    _lib._objc_msgSend_696(
+        _id, _lib._sel_setWeekdaySymbols_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get shortWeekdaySymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_shortWeekdaySymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set shortWeekdaySymbols(NSArray? value) {
+    _lib._objc_msgSend_696(
+        _id, _lib._sel_setShortWeekdaySymbols_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get AMSymbol {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_AMSymbol1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set AMSymbol(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setAMSymbol_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get PMSymbol {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_PMSymbol1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set PMSymbol(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setPMSymbol_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get longEraSymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_longEraSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set longEraSymbols(NSArray? value) {
+    _lib._objc_msgSend_696(
+        _id, _lib._sel_setLongEraSymbols_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get veryShortMonthSymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_veryShortMonthSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set veryShortMonthSymbols(NSArray? value) {
+    _lib._objc_msgSend_696(
+        _id, _lib._sel_setVeryShortMonthSymbols_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get standaloneMonthSymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_standaloneMonthSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set standaloneMonthSymbols(NSArray? value) {
+    _lib._objc_msgSend_696(
+        _id, _lib._sel_setStandaloneMonthSymbols_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get shortStandaloneMonthSymbols {
+    final _ret =
+        _lib._objc_msgSend_80(_id, _lib._sel_shortStandaloneMonthSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set shortStandaloneMonthSymbols(NSArray? value) {
+    _lib._objc_msgSend_696(_id, _lib._sel_setShortStandaloneMonthSymbols_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get veryShortStandaloneMonthSymbols {
+    final _ret =
+        _lib._objc_msgSend_80(_id, _lib._sel_veryShortStandaloneMonthSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set veryShortStandaloneMonthSymbols(NSArray? value) {
+    _lib._objc_msgSend_696(_id, _lib._sel_setVeryShortStandaloneMonthSymbols_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get veryShortWeekdaySymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_veryShortWeekdaySymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set veryShortWeekdaySymbols(NSArray? value) {
+    _lib._objc_msgSend_696(
+        _id, _lib._sel_setVeryShortWeekdaySymbols_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get standaloneWeekdaySymbols {
+    final _ret =
+        _lib._objc_msgSend_80(_id, _lib._sel_standaloneWeekdaySymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set standaloneWeekdaySymbols(NSArray? value) {
+    _lib._objc_msgSend_696(_id, _lib._sel_setStandaloneWeekdaySymbols_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get shortStandaloneWeekdaySymbols {
+    final _ret =
+        _lib._objc_msgSend_80(_id, _lib._sel_shortStandaloneWeekdaySymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set shortStandaloneWeekdaySymbols(NSArray? value) {
+    _lib._objc_msgSend_696(_id, _lib._sel_setShortStandaloneWeekdaySymbols_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get veryShortStandaloneWeekdaySymbols {
+    final _ret = _lib._objc_msgSend_80(
+        _id, _lib._sel_veryShortStandaloneWeekdaySymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set veryShortStandaloneWeekdaySymbols(NSArray? value) {
+    _lib._objc_msgSend_696(
+        _id,
+        _lib._sel_setVeryShortStandaloneWeekdaySymbols_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get quarterSymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_quarterSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set quarterSymbols(NSArray? value) {
+    _lib._objc_msgSend_696(
+        _id, _lib._sel_setQuarterSymbols_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get shortQuarterSymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_shortQuarterSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set shortQuarterSymbols(NSArray? value) {
+    _lib._objc_msgSend_696(
+        _id, _lib._sel_setShortQuarterSymbols_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get standaloneQuarterSymbols {
+    final _ret =
+        _lib._objc_msgSend_80(_id, _lib._sel_standaloneQuarterSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set standaloneQuarterSymbols(NSArray? value) {
+    _lib._objc_msgSend_696(_id, _lib._sel_setStandaloneQuarterSymbols_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get shortStandaloneQuarterSymbols {
+    final _ret =
+        _lib._objc_msgSend_80(_id, _lib._sel_shortStandaloneQuarterSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set shortStandaloneQuarterSymbols(NSArray? value) {
+    _lib._objc_msgSend_696(_id, _lib._sel_setShortStandaloneQuarterSymbols_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  NSDate? get gregorianStartDate {
+    final _ret = _lib._objc_msgSend_156(_id, _lib._sel_gregorianStartDate1);
+    return _ret.address == 0
+        ? null
+        : NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  set gregorianStartDate(NSDate? value) {
+    _lib._objc_msgSend_493(
+        _id, _lib._sel_setGregorianStartDate_1, value?._id ?? ffi.nullptr);
+  }
+
+  bool get doesRelativeDateFormatting {
+    return _lib._objc_msgSend_12(_id, _lib._sel_doesRelativeDateFormatting1);
+  }
+
+  set doesRelativeDateFormatting(bool value) {
+    _lib._objc_msgSend_460(
+        _id, _lib._sel_setDoesRelativeDateFormatting_1, value);
+  }
+
+  NSObject initWithDateFormat_allowNaturalLanguage_(
+      NSString? format, bool flag) {
+    final _ret = _lib._objc_msgSend_29(
+        _id,
+        _lib._sel_initWithDateFormat_allowNaturalLanguage_1,
+        format?._id ?? ffi.nullptr,
+        flag);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool allowsNaturalLanguage() {
+    return _lib._objc_msgSend_12(_id, _lib._sel_allowsNaturalLanguage1);
+  }
+
+  static NSDateFormatter new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSDateFormatter1, _lib._sel_new1);
+    return NSDateFormatter._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSDateFormatter alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSDateFormatter1, _lib._sel_alloc1);
+    return NSDateFormatter._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSDateFormatter1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSDateFormatter1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSDateFormatter1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSDateFormatter1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSDateFormatter1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSDateFormatter1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSDateFormatter1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSDateFormatter1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSDateFormatter1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSFormatter extends NSObject {
+  NSFormatter._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSFormatter] that points to the same underlying object as [other].
+  static NSFormatter castFrom<T extends _ObjCWrapper>(T other) {
+    return NSFormatter._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSFormatter] that wraps the given raw object pointer.
+  static NSFormatter castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSFormatter._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSFormatter].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSFormatter1);
+  }
+
+  NSString stringForObjectValue_(NSObject obj) {
+    final _ret =
+        _lib._objc_msgSend_65(_id, _lib._sel_stringForObjectValue_1, obj._id);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSAttributedString attributedStringForObjectValue_withDefaultAttributes_(
+      NSObject obj, NSDictionary? attrs) {
+    final _ret = _lib._objc_msgSend_651(
+        _id,
+        _lib._sel_attributedStringForObjectValue_withDefaultAttributes_1,
+        obj._id,
+        attrs?._id ?? ffi.nullptr);
+    return NSAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString editingStringForObjectValue_(NSObject obj) {
+    final _ret = _lib._objc_msgSend_65(
+        _id, _lib._sel_editingStringForObjectValue_1, obj._id);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool getObjectValue_forString_errorDescription_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> obj,
+      NSString? string,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_652(
+        _id,
+        _lib._sel_getObjectValue_forString_errorDescription_1,
+        obj,
+        string?._id ?? ffi.nullptr,
+        error);
+  }
+
+  bool isPartialStringValid_newEditingString_errorDescription_(
+      NSString? partialString,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> newString,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_653(
+        _id,
+        _lib._sel_isPartialStringValid_newEditingString_errorDescription_1,
+        partialString?._id ?? ffi.nullptr,
+        newString,
+        error);
+  }
+
+  bool
+      isPartialStringValid_proposedSelectedRange_originalString_originalSelectedRange_errorDescription_(
+          ffi.Pointer<ffi.Pointer<ObjCObject>> partialStringPtr,
+          NSRangePointer proposedSelRangePtr,
+          NSString? origString,
+          NSRange origSelRange,
+          ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_654(
+        _id,
+        _lib._sel_isPartialStringValid_proposedSelectedRange_originalString_originalSelectedRange_errorDescription_1,
+        partialStringPtr,
+        proposedSelRangePtr,
+        origString?._id ?? ffi.nullptr,
+        origSelRange,
+        error);
+  }
+
+  static NSFormatter new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSFormatter1, _lib._sel_new1);
+    return NSFormatter._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSFormatter alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSFormatter1, _lib._sel_alloc1);
+    return NSFormatter._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSFormatter1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSFormatter1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSFormatter1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSFormatter1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSFormatter1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSFormatter1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSFormatter1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSFormatter1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSFormatter1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSFormattingContext {
+  static const int NSFormattingContextUnknown = 0;
+  static const int NSFormattingContextDynamic = 1;
+  static const int NSFormattingContextStandalone = 2;
+  static const int NSFormattingContextListItem = 3;
+  static const int NSFormattingContextBeginningOfSentence = 4;
+  static const int NSFormattingContextMiddleOfSentence = 5;
+}
+
+abstract class NSDateFormatterStyle {
+  static const int NSDateFormatterNoStyle = 0;
+  static const int NSDateFormatterShortStyle = 1;
+  static const int NSDateFormatterMediumStyle = 2;
+  static const int NSDateFormatterLongStyle = 3;
+  static const int NSDateFormatterFullStyle = 4;
+}
+
+abstract class NSDateFormatterBehavior {
+  static const int NSDateFormatterBehaviorDefault = 0;
+  static const int NSDateFormatterBehavior10_0 = 1000;
+  static const int NSDateFormatterBehavior10_4 = 1040;
+}
+
+class NSCalendar extends NSObject {
+  NSCalendar._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSCalendar] that points to the same underlying object as [other].
+  static NSCalendar castFrom<T extends _ObjCWrapper>(T other) {
+    return NSCalendar._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSCalendar] that wraps the given raw object pointer.
+  static NSCalendar castFromPointer(AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSCalendar._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSCalendar].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSCalendar1);
+  }
+
+  static NSCalendar? getCurrentCalendar(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_665(
+        _lib._class_NSCalendar1, _lib._sel_currentCalendar1);
+    return _ret.address == 0
+        ? null
+        : NSCalendar._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCalendar? getAutoupdatingCurrentCalendar(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_665(
+        _lib._class_NSCalendar1, _lib._sel_autoupdatingCurrentCalendar1);
+    return _ret.address == 0
+        ? null
+        : NSCalendar._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCalendar calendarWithIdentifier_(
+      AVFAudio _lib, NSCalendarIdentifier calendarIdentifierConstant) {
+    final _ret = _lib._objc_msgSend_666(_lib._class_NSCalendar1,
+        _lib._sel_calendarWithIdentifier_1, calendarIdentifierConstant);
+    return NSCalendar._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSCalendar init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSCalendar._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject initWithCalendarIdentifier_(NSCalendarIdentifier ident) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initWithCalendarIdentifier_1, ident);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSCalendarIdentifier get calendarIdentifier {
+    return _lib._objc_msgSend_20(_id, _lib._sel_calendarIdentifier1);
+  }
+
+  NSLocale? get locale {
+    final _ret = _lib._objc_msgSend_176(_id, _lib._sel_locale1);
+    return _ret.address == 0
+        ? null
+        : NSLocale._(_ret, _lib, retain: true, release: true);
+  }
+
+  set locale(NSLocale? value) {
+    _lib._objc_msgSend_664(
+        _id, _lib._sel_setLocale_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSTimeZone? get timeZone {
+    final _ret = _lib._objc_msgSend_162(_id, _lib._sel_timeZone1);
+    return _ret.address == 0
+        ? null
+        : NSTimeZone._(_ret, _lib, retain: true, release: true);
+  }
+
+  set timeZone(NSTimeZone? value) {
+    _lib._objc_msgSend_163(
+        _id, _lib._sel_setTimeZone_1, value?._id ?? ffi.nullptr);
+  }
+
+  int get firstWeekday {
+    return _lib._objc_msgSend_10(_id, _lib._sel_firstWeekday1);
+  }
+
+  set firstWeekday(int value) {
+    _lib._objc_msgSend_451(_id, _lib._sel_setFirstWeekday_1, value);
+  }
+
+  int get minimumDaysInFirstWeek {
+    return _lib._objc_msgSend_10(_id, _lib._sel_minimumDaysInFirstWeek1);
+  }
+
+  set minimumDaysInFirstWeek(int value) {
+    _lib._objc_msgSend_451(_id, _lib._sel_setMinimumDaysInFirstWeek_1, value);
+  }
+
+  NSArray? get eraSymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_eraSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get longEraSymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_longEraSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get monthSymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_monthSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get shortMonthSymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_shortMonthSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get veryShortMonthSymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_veryShortMonthSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get standaloneMonthSymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_standaloneMonthSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get shortStandaloneMonthSymbols {
+    final _ret =
+        _lib._objc_msgSend_80(_id, _lib._sel_shortStandaloneMonthSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get veryShortStandaloneMonthSymbols {
+    final _ret =
+        _lib._objc_msgSend_80(_id, _lib._sel_veryShortStandaloneMonthSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get weekdaySymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_weekdaySymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get shortWeekdaySymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_shortWeekdaySymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get veryShortWeekdaySymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_veryShortWeekdaySymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get standaloneWeekdaySymbols {
+    final _ret =
+        _lib._objc_msgSend_80(_id, _lib._sel_standaloneWeekdaySymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get shortStandaloneWeekdaySymbols {
+    final _ret =
+        _lib._objc_msgSend_80(_id, _lib._sel_shortStandaloneWeekdaySymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get veryShortStandaloneWeekdaySymbols {
+    final _ret = _lib._objc_msgSend_80(
+        _id, _lib._sel_veryShortStandaloneWeekdaySymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get quarterSymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_quarterSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get shortQuarterSymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_shortQuarterSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get standaloneQuarterSymbols {
+    final _ret =
+        _lib._objc_msgSend_80(_id, _lib._sel_standaloneQuarterSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get shortStandaloneQuarterSymbols {
+    final _ret =
+        _lib._objc_msgSend_80(_id, _lib._sel_shortStandaloneQuarterSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get AMSymbol {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_AMSymbol1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get PMSymbol {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_PMSymbol1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSRange minimumRangeOfUnit_(int unit) {
+    return _lib._objc_msgSend_667(_id, _lib._sel_minimumRangeOfUnit_1, unit);
+  }
+
+  NSRange maximumRangeOfUnit_(int unit) {
+    return _lib._objc_msgSend_667(_id, _lib._sel_maximumRangeOfUnit_1, unit);
+  }
+
+  NSRange rangeOfUnit_inUnit_forDate_(int smaller, int larger, NSDate? date) {
+    return _lib._objc_msgSend_668(_id, _lib._sel_rangeOfUnit_inUnit_forDate_1,
+        smaller, larger, date?._id ?? ffi.nullptr);
+  }
+
+  int ordinalityOfUnit_inUnit_forDate_(int smaller, int larger, NSDate? date) {
+    return _lib._objc_msgSend_669(
+        _id,
+        _lib._sel_ordinalityOfUnit_inUnit_forDate_1,
+        smaller,
+        larger,
+        date?._id ?? ffi.nullptr);
+  }
+
+  bool rangeOfUnit_startDate_interval_forDate_(
+      int unit,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> datep,
+      ffi.Pointer<NSTimeInterval> tip,
+      NSDate? date) {
+    return _lib._objc_msgSend_670(
+        _id,
+        _lib._sel_rangeOfUnit_startDate_interval_forDate_1,
+        unit,
+        datep,
+        tip,
+        date?._id ?? ffi.nullptr);
+  }
+
+  NSDate dateFromComponents_(NSDateComponents? comps) {
+    final _ret = _lib._objc_msgSend_675(
+        _id, _lib._sel_dateFromComponents_1, comps?._id ?? ffi.nullptr);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDateComponents components_fromDate_(int unitFlags, NSDate? date) {
+    final _ret = _lib._objc_msgSend_676(_id, _lib._sel_components_fromDate_1,
+        unitFlags, date?._id ?? ffi.nullptr);
+    return NSDateComponents._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate dateByAddingComponents_toDate_options_(
+      NSDateComponents? comps, NSDate? date, int opts) {
+    final _ret = _lib._objc_msgSend_677(
+        _id,
+        _lib._sel_dateByAddingComponents_toDate_options_1,
+        comps?._id ?? ffi.nullptr,
+        date?._id ?? ffi.nullptr,
+        opts);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDateComponents components_fromDate_toDate_options_(
+      int unitFlags, NSDate? startingDate, NSDate? resultDate, int opts) {
+    final _ret = _lib._objc_msgSend_678(
+        _id,
+        _lib._sel_components_fromDate_toDate_options_1,
+        unitFlags,
+        startingDate?._id ?? ffi.nullptr,
+        resultDate?._id ?? ffi.nullptr,
+        opts);
+    return NSDateComponents._(_ret, _lib, retain: true, release: true);
+  }
+
+  void getEra_year_month_day_fromDate_(
+      ffi.Pointer<NSInteger> eraValuePointer,
+      ffi.Pointer<NSInteger> yearValuePointer,
+      ffi.Pointer<NSInteger> monthValuePointer,
+      ffi.Pointer<NSInteger> dayValuePointer,
+      NSDate? date) {
+    return _lib._objc_msgSend_679(
+        _id,
+        _lib._sel_getEra_year_month_day_fromDate_1,
+        eraValuePointer,
+        yearValuePointer,
+        monthValuePointer,
+        dayValuePointer,
+        date?._id ?? ffi.nullptr);
+  }
+
+  void getEra_yearForWeekOfYear_weekOfYear_weekday_fromDate_(
+      ffi.Pointer<NSInteger> eraValuePointer,
+      ffi.Pointer<NSInteger> yearValuePointer,
+      ffi.Pointer<NSInteger> weekValuePointer,
+      ffi.Pointer<NSInteger> weekdayValuePointer,
+      NSDate? date) {
+    return _lib._objc_msgSend_679(
+        _id,
+        _lib._sel_getEra_yearForWeekOfYear_weekOfYear_weekday_fromDate_1,
+        eraValuePointer,
+        yearValuePointer,
+        weekValuePointer,
+        weekdayValuePointer,
+        date?._id ?? ffi.nullptr);
+  }
+
+  void getHour_minute_second_nanosecond_fromDate_(
+      ffi.Pointer<NSInteger> hourValuePointer,
+      ffi.Pointer<NSInteger> minuteValuePointer,
+      ffi.Pointer<NSInteger> secondValuePointer,
+      ffi.Pointer<NSInteger> nanosecondValuePointer,
+      NSDate? date) {
+    return _lib._objc_msgSend_679(
+        _id,
+        _lib._sel_getHour_minute_second_nanosecond_fromDate_1,
+        hourValuePointer,
+        minuteValuePointer,
+        secondValuePointer,
+        nanosecondValuePointer,
+        date?._id ?? ffi.nullptr);
+  }
+
+  int component_fromDate_(int unit, NSDate? date) {
+    return _lib._objc_msgSend_680(
+        _id, _lib._sel_component_fromDate_1, unit, date?._id ?? ffi.nullptr);
+  }
+
+  NSDate dateWithEra_year_month_day_hour_minute_second_nanosecond_(
+      int eraValue,
+      int yearValue,
+      int monthValue,
+      int dayValue,
+      int hourValue,
+      int minuteValue,
+      int secondValue,
+      int nanosecondValue) {
+    final _ret = _lib._objc_msgSend_681(
+        _id,
+        _lib._sel_dateWithEra_year_month_day_hour_minute_second_nanosecond_1,
+        eraValue,
+        yearValue,
+        monthValue,
+        dayValue,
+        hourValue,
+        minuteValue,
+        secondValue,
+        nanosecondValue);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate
+      dateWithEra_yearForWeekOfYear_weekOfYear_weekday_hour_minute_second_nanosecond_(
+          int eraValue,
+          int yearValue,
+          int weekValue,
+          int weekdayValue,
+          int hourValue,
+          int minuteValue,
+          int secondValue,
+          int nanosecondValue) {
+    final _ret = _lib._objc_msgSend_681(
+        _id,
+        _lib._sel_dateWithEra_yearForWeekOfYear_weekOfYear_weekday_hour_minute_second_nanosecond_1,
+        eraValue,
+        yearValue,
+        weekValue,
+        weekdayValue,
+        hourValue,
+        minuteValue,
+        secondValue,
+        nanosecondValue);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate startOfDayForDate_(NSDate? date) {
+    final _ret = _lib._objc_msgSend_152(
+        _id, _lib._sel_startOfDayForDate_1, date?._id ?? ffi.nullptr);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDateComponents componentsInTimeZone_fromDate_(
+      NSTimeZone? timezone, NSDate? date) {
+    final _ret = _lib._objc_msgSend_682(
+        _id,
+        _lib._sel_componentsInTimeZone_fromDate_1,
+        timezone?._id ?? ffi.nullptr,
+        date?._id ?? ffi.nullptr);
+    return NSDateComponents._(_ret, _lib, retain: true, release: true);
+  }
+
+  int compareDate_toDate_toUnitGranularity_(
+      NSDate? date1, NSDate? date2, int unit) {
+    return _lib._objc_msgSend_683(
+        _id,
+        _lib._sel_compareDate_toDate_toUnitGranularity_1,
+        date1?._id ?? ffi.nullptr,
+        date2?._id ?? ffi.nullptr,
+        unit);
+  }
+
+  bool isDate_equalToDate_toUnitGranularity_(
+      NSDate? date1, NSDate? date2, int unit) {
+    return _lib._objc_msgSend_684(
+        _id,
+        _lib._sel_isDate_equalToDate_toUnitGranularity_1,
+        date1?._id ?? ffi.nullptr,
+        date2?._id ?? ffi.nullptr,
+        unit);
+  }
+
+  bool isDate_inSameDayAsDate_(NSDate? date1, NSDate? date2) {
+    return _lib._objc_msgSend_685(_id, _lib._sel_isDate_inSameDayAsDate_1,
+        date1?._id ?? ffi.nullptr, date2?._id ?? ffi.nullptr);
+  }
+
+  bool isDateInToday_(NSDate? date) {
+    return _lib._objc_msgSend_154(
+        _id, _lib._sel_isDateInToday_1, date?._id ?? ffi.nullptr);
+  }
+
+  bool isDateInYesterday_(NSDate? date) {
+    return _lib._objc_msgSend_154(
+        _id, _lib._sel_isDateInYesterday_1, date?._id ?? ffi.nullptr);
+  }
+
+  bool isDateInTomorrow_(NSDate? date) {
+    return _lib._objc_msgSend_154(
+        _id, _lib._sel_isDateInTomorrow_1, date?._id ?? ffi.nullptr);
+  }
+
+  bool isDateInWeekend_(NSDate? date) {
+    return _lib._objc_msgSend_154(
+        _id, _lib._sel_isDateInWeekend_1, date?._id ?? ffi.nullptr);
+  }
+
+  bool rangeOfWeekendStartDate_interval_containingDate_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> datep,
+      ffi.Pointer<NSTimeInterval> tip,
+      NSDate? date) {
+    return _lib._objc_msgSend_686(
+        _id,
+        _lib._sel_rangeOfWeekendStartDate_interval_containingDate_1,
+        datep,
+        tip,
+        date?._id ?? ffi.nullptr);
+  }
+
+  bool nextWeekendStartDate_interval_options_afterDate_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> datep,
+      ffi.Pointer<NSTimeInterval> tip,
+      int options,
+      NSDate? date) {
+    return _lib._objc_msgSend_687(
+        _id,
+        _lib._sel_nextWeekendStartDate_interval_options_afterDate_1,
+        datep,
+        tip,
+        options,
+        date?._id ?? ffi.nullptr);
+  }
+
+  NSDateComponents components_fromDateComponents_toDateComponents_options_(
+      int unitFlags,
+      NSDateComponents? startingDateComp,
+      NSDateComponents? resultDateComp,
+      int options) {
+    final _ret = _lib._objc_msgSend_688(
+        _id,
+        _lib._sel_components_fromDateComponents_toDateComponents_options_1,
+        unitFlags,
+        startingDateComp?._id ?? ffi.nullptr,
+        resultDateComp?._id ?? ffi.nullptr,
+        options);
+    return NSDateComponents._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate dateByAddingUnit_value_toDate_options_(
+      int unit, int value, NSDate? date, int options) {
+    final _ret = _lib._objc_msgSend_689(
+        _id,
+        _lib._sel_dateByAddingUnit_value_toDate_options_1,
+        unit,
+        value,
+        date?._id ?? ffi.nullptr,
+        options);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  void enumerateDatesStartingAfterDate_matchingComponents_options_usingBlock_(
+      NSDate? start, NSDateComponents? comps, int opts, ObjCBlock28 block) {
+    return _lib._objc_msgSend_690(
+        _id,
+        _lib._sel_enumerateDatesStartingAfterDate_matchingComponents_options_usingBlock_1,
+        start?._id ?? ffi.nullptr,
+        comps?._id ?? ffi.nullptr,
+        opts,
+        block._id);
+  }
+
+  NSDate nextDateAfterDate_matchingComponents_options_(
+      NSDate? date, NSDateComponents? comps, int options) {
+    final _ret = _lib._objc_msgSend_691(
+        _id,
+        _lib._sel_nextDateAfterDate_matchingComponents_options_1,
+        date?._id ?? ffi.nullptr,
+        comps?._id ?? ffi.nullptr,
+        options);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate nextDateAfterDate_matchingUnit_value_options_(
+      NSDate? date, int unit, int value, int options) {
+    final _ret = _lib._objc_msgSend_692(
+        _id,
+        _lib._sel_nextDateAfterDate_matchingUnit_value_options_1,
+        date?._id ?? ffi.nullptr,
+        unit,
+        value,
+        options);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate nextDateAfterDate_matchingHour_minute_second_options_(NSDate? date,
+      int hourValue, int minuteValue, int secondValue, int options) {
+    final _ret = _lib._objc_msgSend_693(
+        _id,
+        _lib._sel_nextDateAfterDate_matchingHour_minute_second_options_1,
+        date?._id ?? ffi.nullptr,
+        hourValue,
+        minuteValue,
+        secondValue,
+        options);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate dateBySettingUnit_value_ofDate_options_(
+      int unit, int v, NSDate? date, int opts) {
+    final _ret = _lib._objc_msgSend_689(
+        _id,
+        _lib._sel_dateBySettingUnit_value_ofDate_options_1,
+        unit,
+        v,
+        date?._id ?? ffi.nullptr,
+        opts);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate dateBySettingHour_minute_second_ofDate_options_(
+      int h, int m, int s, NSDate? date, int opts) {
+    final _ret = _lib._objc_msgSend_694(
+        _id,
+        _lib._sel_dateBySettingHour_minute_second_ofDate_options_1,
+        h,
+        m,
+        s,
+        date?._id ?? ffi.nullptr,
+        opts);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool date_matchesComponents_(NSDate? date, NSDateComponents? components) {
+    return _lib._objc_msgSend_695(_id, _lib._sel_date_matchesComponents_1,
+        date?._id ?? ffi.nullptr, components?._id ?? ffi.nullptr);
+  }
+
+  static NSCalendar new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSCalendar1, _lib._sel_new1);
+    return NSCalendar._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSCalendar alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSCalendar1, _lib._sel_alloc1);
+    return NSCalendar._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSCalendar1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSCalendar1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSCalendar1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSCalendar1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSCalendar1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSCalendar1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSCalendar1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSCalendar1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSCalendar1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef NSCalendarIdentifier = ffi.Pointer<ObjCObject>;
+
+abstract class NSCalendarUnit {
+  static const int NSCalendarUnitEra = 2;
+  static const int NSCalendarUnitYear = 4;
+  static const int NSCalendarUnitMonth = 8;
+  static const int NSCalendarUnitDay = 16;
+  static const int NSCalendarUnitHour = 32;
+  static const int NSCalendarUnitMinute = 64;
+  static const int NSCalendarUnitSecond = 128;
+  static const int NSCalendarUnitWeekday = 512;
+  static const int NSCalendarUnitWeekdayOrdinal = 1024;
+  static const int NSCalendarUnitQuarter = 2048;
+  static const int NSCalendarUnitWeekOfMonth = 4096;
+  static const int NSCalendarUnitWeekOfYear = 8192;
+  static const int NSCalendarUnitYearForWeekOfYear = 16384;
+  static const int NSCalendarUnitNanosecond = 32768;
+  static const int NSCalendarUnitCalendar = 1048576;
+  static const int NSCalendarUnitTimeZone = 2097152;
+  static const int NSEraCalendarUnit = 2;
+  static const int NSYearCalendarUnit = 4;
+  static const int NSMonthCalendarUnit = 8;
+  static const int NSDayCalendarUnit = 16;
+  static const int NSHourCalendarUnit = 32;
+  static const int NSMinuteCalendarUnit = 64;
+  static const int NSSecondCalendarUnit = 128;
+  static const int NSWeekCalendarUnit = 256;
+  static const int NSWeekdayCalendarUnit = 512;
+  static const int NSWeekdayOrdinalCalendarUnit = 1024;
+  static const int NSQuarterCalendarUnit = 2048;
+  static const int NSWeekOfMonthCalendarUnit = 4096;
+  static const int NSWeekOfYearCalendarUnit = 8192;
+  static const int NSYearForWeekOfYearCalendarUnit = 16384;
+  static const int NSCalendarCalendarUnit = 1048576;
+  static const int NSTimeZoneCalendarUnit = 2097152;
+}
+
+class NSDateComponents extends NSObject {
+  NSDateComponents._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSDateComponents] that points to the same underlying object as [other].
+  static NSDateComponents castFrom<T extends _ObjCWrapper>(T other) {
+    return NSDateComponents._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSDateComponents] that wraps the given raw object pointer.
+  static NSDateComponents castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSDateComponents._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSDateComponents].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSDateComponents1);
+  }
+
+  NSCalendar? get calendar {
+    final _ret = _lib._objc_msgSend_665(_id, _lib._sel_calendar1);
+    return _ret.address == 0
+        ? null
+        : NSCalendar._(_ret, _lib, retain: true, release: true);
+  }
+
+  set calendar(NSCalendar? value) {
+    _lib._objc_msgSend_671(
+        _id, _lib._sel_setCalendar_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSTimeZone? get timeZone {
+    final _ret = _lib._objc_msgSend_162(_id, _lib._sel_timeZone1);
+    return _ret.address == 0
+        ? null
+        : NSTimeZone._(_ret, _lib, retain: true, release: true);
+  }
+
+  set timeZone(NSTimeZone? value) {
+    _lib._objc_msgSend_163(
+        _id, _lib._sel_setTimeZone_1, value?._id ?? ffi.nullptr);
+  }
+
+  int get era {
+    return _lib._objc_msgSend_78(_id, _lib._sel_era1);
+  }
+
+  set era(int value) {
+    _lib._objc_msgSend_558(_id, _lib._sel_setEra_1, value);
+  }
+
+  int get year {
+    return _lib._objc_msgSend_78(_id, _lib._sel_year1);
+  }
+
+  set year(int value) {
+    _lib._objc_msgSend_558(_id, _lib._sel_setYear_1, value);
+  }
+
+  int get month {
+    return _lib._objc_msgSend_78(_id, _lib._sel_month1);
+  }
+
+  set month(int value) {
+    _lib._objc_msgSend_558(_id, _lib._sel_setMonth_1, value);
+  }
+
+  int get day {
+    return _lib._objc_msgSend_78(_id, _lib._sel_day1);
+  }
+
+  set day(int value) {
+    _lib._objc_msgSend_558(_id, _lib._sel_setDay_1, value);
+  }
+
+  int get hour {
+    return _lib._objc_msgSend_78(_id, _lib._sel_hour1);
+  }
+
+  set hour(int value) {
+    _lib._objc_msgSend_558(_id, _lib._sel_setHour_1, value);
+  }
+
+  int get minute {
+    return _lib._objc_msgSend_78(_id, _lib._sel_minute1);
+  }
+
+  set minute(int value) {
+    _lib._objc_msgSend_558(_id, _lib._sel_setMinute_1, value);
+  }
+
+  int get second {
+    return _lib._objc_msgSend_78(_id, _lib._sel_second1);
+  }
+
+  set second(int value) {
+    _lib._objc_msgSend_558(_id, _lib._sel_setSecond_1, value);
+  }
+
+  int get nanosecond {
+    return _lib._objc_msgSend_78(_id, _lib._sel_nanosecond1);
+  }
+
+  set nanosecond(int value) {
+    _lib._objc_msgSend_558(_id, _lib._sel_setNanosecond_1, value);
+  }
+
+  int get weekday {
+    return _lib._objc_msgSend_78(_id, _lib._sel_weekday1);
+  }
+
+  set weekday(int value) {
+    _lib._objc_msgSend_558(_id, _lib._sel_setWeekday_1, value);
+  }
+
+  int get weekdayOrdinal {
+    return _lib._objc_msgSend_78(_id, _lib._sel_weekdayOrdinal1);
+  }
+
+  set weekdayOrdinal(int value) {
+    _lib._objc_msgSend_558(_id, _lib._sel_setWeekdayOrdinal_1, value);
+  }
+
+  int get quarter {
+    return _lib._objc_msgSend_78(_id, _lib._sel_quarter1);
+  }
+
+  set quarter(int value) {
+    _lib._objc_msgSend_558(_id, _lib._sel_setQuarter_1, value);
+  }
+
+  int get weekOfMonth {
+    return _lib._objc_msgSend_78(_id, _lib._sel_weekOfMonth1);
+  }
+
+  set weekOfMonth(int value) {
+    _lib._objc_msgSend_558(_id, _lib._sel_setWeekOfMonth_1, value);
+  }
+
+  int get weekOfYear {
+    return _lib._objc_msgSend_78(_id, _lib._sel_weekOfYear1);
+  }
+
+  set weekOfYear(int value) {
+    _lib._objc_msgSend_558(_id, _lib._sel_setWeekOfYear_1, value);
+  }
+
+  int get yearForWeekOfYear {
+    return _lib._objc_msgSend_78(_id, _lib._sel_yearForWeekOfYear1);
+  }
+
+  set yearForWeekOfYear(int value) {
+    _lib._objc_msgSend_558(_id, _lib._sel_setYearForWeekOfYear_1, value);
+  }
+
+  bool get leapMonth {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isLeapMonth1);
+  }
+
+  set leapMonth(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setLeapMonth_1, value);
+  }
+
+  NSDate? get date {
+    final _ret = _lib._objc_msgSend_156(_id, _lib._sel_date1);
+    return _ret.address == 0
+        ? null
+        : NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  int week() {
+    return _lib._objc_msgSend_78(_id, _lib._sel_week1);
+  }
+
+  void setWeek_(int v) {
+    return _lib._objc_msgSend_374(_id, _lib._sel_setWeek_1, v);
+  }
+
+  void setValue_forComponent_(int value, int unit) {
+    return _lib._objc_msgSend_672(
+        _id, _lib._sel_setValue_forComponent_1, value, unit);
+  }
+
+  int valueForComponent_(int unit) {
+    return _lib._objc_msgSend_673(_id, _lib._sel_valueForComponent_1, unit);
+  }
+
+  bool get validDate {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isValidDate1);
+  }
+
+  bool isValidDateInCalendar_(NSCalendar? calendar) {
+    return _lib._objc_msgSend_674(
+        _id, _lib._sel_isValidDateInCalendar_1, calendar?._id ?? ffi.nullptr);
+  }
+
+  static NSDateComponents new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSDateComponents1, _lib._sel_new1);
+    return NSDateComponents._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSDateComponents alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSDateComponents1, _lib._sel_alloc1);
+    return NSDateComponents._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSDateComponents1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSDateComponents1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSDateComponents1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSDateComponents1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSDateComponents1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSDateComponents1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSDateComponents1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSDateComponents1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSDateComponents1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSCalendarOptions {
+  static const int NSCalendarWrapComponents = 1;
+  static const int NSCalendarMatchStrictly = 2;
+  static const int NSCalendarSearchBackwards = 4;
+  static const int NSCalendarMatchPreviousTimePreservingSmallerUnits = 256;
+  static const int NSCalendarMatchNextTimePreservingSmallerUnits = 512;
+  static const int NSCalendarMatchNextTime = 1024;
+  static const int NSCalendarMatchFirst = 4096;
+  static const int NSCalendarMatchLast = 8192;
+}
+
+void _ObjCBlock28_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, bool arg1, ffi.Pointer<ffi.Bool> arg2) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(ffi.Pointer<ObjCObject> arg0, ffi.Bool arg1,
+                  ffi.Pointer<ffi.Bool> arg2)>>()
+      .asFunction<
+          void Function(ffi.Pointer<ObjCObject> arg0, bool arg1,
+              ffi.Pointer<ffi.Bool> arg2)>()(arg0, arg1, arg2);
+}
+
+final _ObjCBlock28_closureRegistry = <int, Function>{};
+int _ObjCBlock28_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock28_registerClosure(Function fn) {
+  final id = ++_ObjCBlock28_closureRegistryIndex;
+  _ObjCBlock28_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock28_closureTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, bool arg1, ffi.Pointer<ffi.Bool> arg2) {
+  return _ObjCBlock28_closureRegistry[block.ref.target.address]!(
+      arg0, arg1, arg2);
+}
+
+class ObjCBlock28 extends _ObjCBlockBase {
+  ObjCBlock28._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock28.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0, ffi.Bool arg1,
+                      ffi.Pointer<ffi.Bool> arg2)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Bool arg1,
+                                ffi.Pointer<ffi.Bool> arg2)>(
+                        _ObjCBlock28_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock28.fromFunction(
+      AVFAudio lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, bool arg1,
+              ffi.Pointer<ffi.Bool> arg2)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Bool arg1,
+                                ffi.Pointer<ffi.Bool> arg2)>(
+                        _ObjCBlock28_closureTrampoline)
+                    .cast(),
+                _ObjCBlock28_registerClosure(fn)),
+            lib);
+  void call(
+      ffi.Pointer<ObjCObject> arg0, bool arg1, ffi.Pointer<ffi.Bool> arg2) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    ffi.Bool arg1,
+                    ffi.Pointer<ffi.Bool> arg2)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                bool arg1,
+                ffi.Pointer<ffi.Bool> arg2)>()(_id, arg0, arg1, arg2);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class NSNumberFormatter extends NSFormatter {
+  NSNumberFormatter._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSNumberFormatter] that points to the same underlying object as [other].
+  static NSNumberFormatter castFrom<T extends _ObjCWrapper>(T other) {
+    return NSNumberFormatter._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSNumberFormatter] that wraps the given raw object pointer.
+  static NSNumberFormatter castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSNumberFormatter._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSNumberFormatter].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSNumberFormatter1);
+  }
+
+  int get formattingContext {
+    return _lib._objc_msgSend_655(_id, _lib._sel_formattingContext1);
+  }
+
+  set formattingContext(int value) {
+    _lib._objc_msgSend_656(_id, _lib._sel_setFormattingContext_1, value);
+  }
+
+  bool getObjectValue_forString_range_error_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> obj,
+      NSString? string,
+      ffi.Pointer<NSRange> rangep,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_657(
+        _id,
+        _lib._sel_getObjectValue_forString_range_error_1,
+        obj,
+        string?._id ?? ffi.nullptr,
+        rangep,
+        error);
+  }
+
+  NSString stringFromNumber_(NSNumber? number) {
+    final _ret = _lib._objc_msgSend_697(
+        _id, _lib._sel_stringFromNumber_1, number?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber numberFromString_(NSString? string) {
+    final _ret = _lib._objc_msgSend_698(
+        _id, _lib._sel_numberFromString_1, string?._id ?? ffi.nullptr);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString localizedStringFromNumber_numberStyle_(
+      AVFAudio _lib, NSNumber? num, int nstyle) {
+    final _ret = _lib._objc_msgSend_699(
+        _lib._class_NSNumberFormatter1,
+        _lib._sel_localizedStringFromNumber_numberStyle_1,
+        num?._id ?? ffi.nullptr,
+        nstyle);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static int defaultFormatterBehavior(AVFAudio _lib) {
+    return _lib._objc_msgSend_700(
+        _lib._class_NSNumberFormatter1, _lib._sel_defaultFormatterBehavior1);
+  }
+
+  static void setDefaultFormatterBehavior_(AVFAudio _lib, int behavior) {
+    return _lib._objc_msgSend_701(_lib._class_NSNumberFormatter1,
+        _lib._sel_setDefaultFormatterBehavior_1, behavior);
+  }
+
+  int get numberStyle {
+    return _lib._objc_msgSend_702(_id, _lib._sel_numberStyle1);
+  }
+
+  set numberStyle(int value) {
+    _lib._objc_msgSend_703(_id, _lib._sel_setNumberStyle_1, value);
+  }
+
+  NSLocale? get locale {
+    final _ret = _lib._objc_msgSend_176(_id, _lib._sel_locale1);
+    return _ret.address == 0
+        ? null
+        : NSLocale._(_ret, _lib, retain: true, release: true);
+  }
+
+  set locale(NSLocale? value) {
+    _lib._objc_msgSend_664(
+        _id, _lib._sel_setLocale_1, value?._id ?? ffi.nullptr);
+  }
+
+  bool get generatesDecimalNumbers {
+    return _lib._objc_msgSend_12(_id, _lib._sel_generatesDecimalNumbers1);
+  }
+
+  set generatesDecimalNumbers(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setGeneratesDecimalNumbers_1, value);
+  }
+
+  int get formatterBehavior {
+    return _lib._objc_msgSend_700(_id, _lib._sel_formatterBehavior1);
+  }
+
+  set formatterBehavior(int value) {
+    _lib._objc_msgSend_704(_id, _lib._sel_setFormatterBehavior_1, value);
+  }
+
+  NSString? get negativeFormat {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_negativeFormat1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set negativeFormat(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setNegativeFormat_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSDictionary? get textAttributesForNegativeValues {
+    final _ret =
+        _lib._objc_msgSend_164(_id, _lib._sel_textAttributesForNegativeValues1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  set textAttributesForNegativeValues(NSDictionary? value) {
+    _lib._objc_msgSend_165(_id, _lib._sel_setTextAttributesForNegativeValues_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get positiveFormat {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_positiveFormat1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set positiveFormat(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setPositiveFormat_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSDictionary? get textAttributesForPositiveValues {
+    final _ret =
+        _lib._objc_msgSend_164(_id, _lib._sel_textAttributesForPositiveValues1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  set textAttributesForPositiveValues(NSDictionary? value) {
+    _lib._objc_msgSend_165(_id, _lib._sel_setTextAttributesForPositiveValues_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  bool get allowsFloats {
+    return _lib._objc_msgSend_12(_id, _lib._sel_allowsFloats1);
+  }
+
+  set allowsFloats(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setAllowsFloats_1, value);
+  }
+
+  NSString? get decimalSeparator {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_decimalSeparator1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set decimalSeparator(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setDecimalSeparator_1, value?._id ?? ffi.nullptr);
+  }
+
+  bool get alwaysShowsDecimalSeparator {
+    return _lib._objc_msgSend_12(_id, _lib._sel_alwaysShowsDecimalSeparator1);
+  }
+
+  set alwaysShowsDecimalSeparator(bool value) {
+    _lib._objc_msgSend_460(
+        _id, _lib._sel_setAlwaysShowsDecimalSeparator_1, value);
+  }
+
+  NSString? get currencyDecimalSeparator {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_currencyDecimalSeparator1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set currencyDecimalSeparator(NSString? value) {
+    _lib._objc_msgSend_477(_id, _lib._sel_setCurrencyDecimalSeparator_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  bool get usesGroupingSeparator {
+    return _lib._objc_msgSend_12(_id, _lib._sel_usesGroupingSeparator1);
+  }
+
+  set usesGroupingSeparator(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setUsesGroupingSeparator_1, value);
+  }
+
+  NSString? get groupingSeparator {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_groupingSeparator1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set groupingSeparator(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setGroupingSeparator_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get zeroSymbol {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_zeroSymbol1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set zeroSymbol(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setZeroSymbol_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSDictionary? get textAttributesForZero {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_textAttributesForZero1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  set textAttributesForZero(NSDictionary? value) {
+    _lib._objc_msgSend_165(
+        _id, _lib._sel_setTextAttributesForZero_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get nilSymbol {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_nilSymbol1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set nilSymbol(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setNilSymbol_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSDictionary? get textAttributesForNil {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_textAttributesForNil1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  set textAttributesForNil(NSDictionary? value) {
+    _lib._objc_msgSend_165(
+        _id, _lib._sel_setTextAttributesForNil_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get notANumberSymbol {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_notANumberSymbol1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set notANumberSymbol(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setNotANumberSymbol_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSDictionary? get textAttributesForNotANumber {
+    final _ret =
+        _lib._objc_msgSend_164(_id, _lib._sel_textAttributesForNotANumber1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  set textAttributesForNotANumber(NSDictionary? value) {
+    _lib._objc_msgSend_165(_id, _lib._sel_setTextAttributesForNotANumber_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get positiveInfinitySymbol {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_positiveInfinitySymbol1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set positiveInfinitySymbol(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setPositiveInfinitySymbol_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSDictionary? get textAttributesForPositiveInfinity {
+    final _ret = _lib._objc_msgSend_164(
+        _id, _lib._sel_textAttributesForPositiveInfinity1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  set textAttributesForPositiveInfinity(NSDictionary? value) {
+    _lib._objc_msgSend_165(
+        _id,
+        _lib._sel_setTextAttributesForPositiveInfinity_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get negativeInfinitySymbol {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_negativeInfinitySymbol1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set negativeInfinitySymbol(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setNegativeInfinitySymbol_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSDictionary? get textAttributesForNegativeInfinity {
+    final _ret = _lib._objc_msgSend_164(
+        _id, _lib._sel_textAttributesForNegativeInfinity1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  set textAttributesForNegativeInfinity(NSDictionary? value) {
+    _lib._objc_msgSend_165(
+        _id,
+        _lib._sel_setTextAttributesForNegativeInfinity_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get positivePrefix {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_positivePrefix1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set positivePrefix(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setPositivePrefix_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get positiveSuffix {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_positiveSuffix1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set positiveSuffix(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setPositiveSuffix_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get negativePrefix {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_negativePrefix1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set negativePrefix(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setNegativePrefix_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get negativeSuffix {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_negativeSuffix1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set negativeSuffix(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setNegativeSuffix_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get currencyCode {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_currencyCode1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set currencyCode(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setCurrencyCode_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get currencySymbol {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_currencySymbol1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set currencySymbol(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setCurrencySymbol_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get internationalCurrencySymbol {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_internationalCurrencySymbol1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set internationalCurrencySymbol(NSString? value) {
+    _lib._objc_msgSend_477(_id, _lib._sel_setInternationalCurrencySymbol_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get percentSymbol {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_percentSymbol1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set percentSymbol(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setPercentSymbol_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get perMillSymbol {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_perMillSymbol1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set perMillSymbol(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setPerMillSymbol_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get minusSign {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_minusSign1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set minusSign(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setMinusSign_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get plusSign {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_plusSign1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set plusSign(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setPlusSign_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get exponentSymbol {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_exponentSymbol1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set exponentSymbol(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setExponentSymbol_1, value?._id ?? ffi.nullptr);
+  }
+
+  int get groupingSize {
+    return _lib._objc_msgSend_10(_id, _lib._sel_groupingSize1);
+  }
+
+  set groupingSize(int value) {
+    _lib._objc_msgSend_451(_id, _lib._sel_setGroupingSize_1, value);
+  }
+
+  int get secondaryGroupingSize {
+    return _lib._objc_msgSend_10(_id, _lib._sel_secondaryGroupingSize1);
+  }
+
+  set secondaryGroupingSize(int value) {
+    _lib._objc_msgSend_451(_id, _lib._sel_setSecondaryGroupingSize_1, value);
+  }
+
+  NSNumber? get multiplier {
+    final _ret = _lib._objc_msgSend_192(_id, _lib._sel_multiplier1);
+    return _ret.address == 0
+        ? null
+        : NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  set multiplier(NSNumber? value) {
+    _lib._objc_msgSend_705(
+        _id, _lib._sel_setMultiplier_1, value?._id ?? ffi.nullptr);
+  }
+
+  int get formatWidth {
+    return _lib._objc_msgSend_10(_id, _lib._sel_formatWidth1);
+  }
+
+  set formatWidth(int value) {
+    _lib._objc_msgSend_451(_id, _lib._sel_setFormatWidth_1, value);
+  }
+
+  NSString? get paddingCharacter {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_paddingCharacter1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set paddingCharacter(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setPaddingCharacter_1, value?._id ?? ffi.nullptr);
+  }
+
+  int get paddingPosition {
+    return _lib._objc_msgSend_706(_id, _lib._sel_paddingPosition1);
+  }
+
+  set paddingPosition(int value) {
+    _lib._objc_msgSend_707(_id, _lib._sel_setPaddingPosition_1, value);
+  }
+
+  int get roundingMode {
+    return _lib._objc_msgSend_708(_id, _lib._sel_roundingMode1);
+  }
+
+  set roundingMode(int value) {
+    _lib._objc_msgSend_709(_id, _lib._sel_setRoundingMode_1, value);
+  }
+
+  NSNumber? get roundingIncrement {
+    final _ret = _lib._objc_msgSend_192(_id, _lib._sel_roundingIncrement1);
+    return _ret.address == 0
+        ? null
+        : NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  set roundingIncrement(NSNumber? value) {
+    _lib._objc_msgSend_705(
+        _id, _lib._sel_setRoundingIncrement_1, value?._id ?? ffi.nullptr);
+  }
+
+  int get minimumIntegerDigits {
+    return _lib._objc_msgSend_10(_id, _lib._sel_minimumIntegerDigits1);
+  }
+
+  set minimumIntegerDigits(int value) {
+    _lib._objc_msgSend_451(_id, _lib._sel_setMinimumIntegerDigits_1, value);
+  }
+
+  int get maximumIntegerDigits {
+    return _lib._objc_msgSend_10(_id, _lib._sel_maximumIntegerDigits1);
+  }
+
+  set maximumIntegerDigits(int value) {
+    _lib._objc_msgSend_451(_id, _lib._sel_setMaximumIntegerDigits_1, value);
+  }
+
+  int get minimumFractionDigits {
+    return _lib._objc_msgSend_10(_id, _lib._sel_minimumFractionDigits1);
+  }
+
+  set minimumFractionDigits(int value) {
+    _lib._objc_msgSend_451(_id, _lib._sel_setMinimumFractionDigits_1, value);
+  }
+
+  int get maximumFractionDigits {
+    return _lib._objc_msgSend_10(_id, _lib._sel_maximumFractionDigits1);
+  }
+
+  set maximumFractionDigits(int value) {
+    _lib._objc_msgSend_451(_id, _lib._sel_setMaximumFractionDigits_1, value);
+  }
+
+  NSNumber? get minimum {
+    final _ret = _lib._objc_msgSend_192(_id, _lib._sel_minimum1);
+    return _ret.address == 0
+        ? null
+        : NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  set minimum(NSNumber? value) {
+    _lib._objc_msgSend_705(
+        _id, _lib._sel_setMinimum_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSNumber? get maximum {
+    final _ret = _lib._objc_msgSend_192(_id, _lib._sel_maximum1);
+    return _ret.address == 0
+        ? null
+        : NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  set maximum(NSNumber? value) {
+    _lib._objc_msgSend_705(
+        _id, _lib._sel_setMaximum_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get currencyGroupingSeparator {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_currencyGroupingSeparator1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set currencyGroupingSeparator(NSString? value) {
+    _lib._objc_msgSend_477(_id, _lib._sel_setCurrencyGroupingSeparator_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  bool get lenient {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isLenient1);
+  }
+
+  set lenient(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setLenient_1, value);
+  }
+
+  bool get usesSignificantDigits {
+    return _lib._objc_msgSend_12(_id, _lib._sel_usesSignificantDigits1);
+  }
+
+  set usesSignificantDigits(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setUsesSignificantDigits_1, value);
+  }
+
+  int get minimumSignificantDigits {
+    return _lib._objc_msgSend_10(_id, _lib._sel_minimumSignificantDigits1);
+  }
+
+  set minimumSignificantDigits(int value) {
+    _lib._objc_msgSend_451(_id, _lib._sel_setMinimumSignificantDigits_1, value);
+  }
+
+  int get maximumSignificantDigits {
+    return _lib._objc_msgSend_10(_id, _lib._sel_maximumSignificantDigits1);
+  }
+
+  set maximumSignificantDigits(int value) {
+    _lib._objc_msgSend_451(_id, _lib._sel_setMaximumSignificantDigits_1, value);
+  }
+
+  bool get partialStringValidationEnabled {
+    return _lib._objc_msgSend_12(
+        _id, _lib._sel_isPartialStringValidationEnabled1);
+  }
+
+  set partialStringValidationEnabled(bool value) {
+    _lib._objc_msgSend_460(
+        _id, _lib._sel_setPartialStringValidationEnabled_1, value);
+  }
+
+  bool get hasThousandSeparators {
+    return _lib._objc_msgSend_12(_id, _lib._sel_hasThousandSeparators1);
+  }
+
+  set hasThousandSeparators(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setHasThousandSeparators_1, value);
+  }
+
+  NSString? get thousandSeparator {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_thousandSeparator1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set thousandSeparator(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setThousandSeparator_1, value?._id ?? ffi.nullptr);
+  }
+
+  bool get localizesFormat {
+    return _lib._objc_msgSend_12(_id, _lib._sel_localizesFormat1);
+  }
+
+  set localizesFormat(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setLocalizesFormat_1, value);
+  }
+
+  NSString? get format {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_format1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set format(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setFormat_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSAttributedString? get attributedStringForZero {
+    final _ret =
+        _lib._objc_msgSend_640(_id, _lib._sel_attributedStringForZero1);
+    return _ret.address == 0
+        ? null
+        : NSAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set attributedStringForZero(NSAttributedString? value) {
+    _lib._objc_msgSend_710(
+        _id, _lib._sel_setAttributedStringForZero_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSAttributedString? get attributedStringForNil {
+    final _ret = _lib._objc_msgSend_640(_id, _lib._sel_attributedStringForNil1);
+    return _ret.address == 0
+        ? null
+        : NSAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set attributedStringForNil(NSAttributedString? value) {
+    _lib._objc_msgSend_710(
+        _id, _lib._sel_setAttributedStringForNil_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSAttributedString? get attributedStringForNotANumber {
+    final _ret =
+        _lib._objc_msgSend_640(_id, _lib._sel_attributedStringForNotANumber1);
+    return _ret.address == 0
+        ? null
+        : NSAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set attributedStringForNotANumber(NSAttributedString? value) {
+    _lib._objc_msgSend_710(_id, _lib._sel_setAttributedStringForNotANumber_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  NSDecimalNumberHandler? get roundingBehavior {
+    final _ret = _lib._objc_msgSend_711(_id, _lib._sel_roundingBehavior1);
+    return _ret.address == 0
+        ? null
+        : NSDecimalNumberHandler._(_ret, _lib, retain: true, release: true);
+  }
+
+  set roundingBehavior(NSDecimalNumberHandler? value) {
+    _lib._objc_msgSend_713(
+        _id, _lib._sel_setRoundingBehavior_1, value?._id ?? ffi.nullptr);
+  }
+
+  static NSNumberFormatter new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSNumberFormatter1, _lib._sel_new1);
+    return NSNumberFormatter._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSNumberFormatter alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSNumberFormatter1, _lib._sel_alloc1);
+    return NSNumberFormatter._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSNumberFormatter1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSNumberFormatter1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSNumberFormatter1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSNumberFormatter1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSNumberFormatter1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSNumberFormatter1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSNumberFormatter1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSNumberFormatter1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSNumberFormatter1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSNumberFormatterStyle {
+  static const int NSNumberFormatterNoStyle = 0;
+  static const int NSNumberFormatterDecimalStyle = 1;
+  static const int NSNumberFormatterCurrencyStyle = 2;
+  static const int NSNumberFormatterPercentStyle = 3;
+  static const int NSNumberFormatterScientificStyle = 4;
+  static const int NSNumberFormatterSpellOutStyle = 5;
+  static const int NSNumberFormatterOrdinalStyle = 6;
+  static const int NSNumberFormatterCurrencyISOCodeStyle = 8;
+  static const int NSNumberFormatterCurrencyPluralStyle = 9;
+  static const int NSNumberFormatterCurrencyAccountingStyle = 10;
+}
+
+abstract class NSNumberFormatterBehavior {
+  static const int NSNumberFormatterBehaviorDefault = 0;
+  static const int NSNumberFormatterBehavior10_0 = 1000;
+  static const int NSNumberFormatterBehavior10_4 = 1040;
+}
+
+abstract class NSNumberFormatterPadPosition {
+  static const int NSNumberFormatterPadBeforePrefix = 0;
+  static const int NSNumberFormatterPadAfterPrefix = 1;
+  static const int NSNumberFormatterPadBeforeSuffix = 2;
+  static const int NSNumberFormatterPadAfterSuffix = 3;
+}
+
+abstract class NSNumberFormatterRoundingMode {
+  static const int NSNumberFormatterRoundCeiling = 0;
+  static const int NSNumberFormatterRoundFloor = 1;
+  static const int NSNumberFormatterRoundDown = 2;
+  static const int NSNumberFormatterRoundUp = 3;
+  static const int NSNumberFormatterRoundHalfEven = 4;
+  static const int NSNumberFormatterRoundHalfDown = 5;
+  static const int NSNumberFormatterRoundHalfUp = 6;
+}
+
+class NSDecimalNumberHandler extends NSObject {
+  NSDecimalNumberHandler._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSDecimalNumberHandler] that points to the same underlying object as [other].
+  static NSDecimalNumberHandler castFrom<T extends _ObjCWrapper>(T other) {
+    return NSDecimalNumberHandler._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSDecimalNumberHandler] that wraps the given raw object pointer.
+  static NSDecimalNumberHandler castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSDecimalNumberHandler._(other, lib,
+        retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSDecimalNumberHandler].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSDecimalNumberHandler1);
+  }
+
+  static NSDecimalNumberHandler? getDefaultDecimalNumberHandler(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_711(_lib._class_NSDecimalNumberHandler1,
+        _lib._sel_defaultDecimalNumberHandler1);
+    return _ret.address == 0
+        ? null
+        : NSDecimalNumberHandler._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDecimalNumberHandler
+      initWithRoundingMode_scale_raiseOnExactness_raiseOnOverflow_raiseOnUnderflow_raiseOnDivideByZero_(
+          int roundingMode,
+          int scale,
+          bool exact,
+          bool overflow,
+          bool underflow,
+          bool divideByZero) {
+    final _ret = _lib._objc_msgSend_712(
+        _id,
+        _lib._sel_initWithRoundingMode_scale_raiseOnExactness_raiseOnOverflow_raiseOnUnderflow_raiseOnDivideByZero_1,
+        roundingMode,
+        scale,
+        exact,
+        overflow,
+        underflow,
+        divideByZero);
+    return NSDecimalNumberHandler._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDecimalNumberHandler
+      decimalNumberHandlerWithRoundingMode_scale_raiseOnExactness_raiseOnOverflow_raiseOnUnderflow_raiseOnDivideByZero_(
+          AVFAudio _lib,
+          int roundingMode,
+          int scale,
+          bool exact,
+          bool overflow,
+          bool underflow,
+          bool divideByZero) {
+    final _ret = _lib._objc_msgSend_712(
+        _lib._class_NSDecimalNumberHandler1,
+        _lib._sel_decimalNumberHandlerWithRoundingMode_scale_raiseOnExactness_raiseOnOverflow_raiseOnUnderflow_raiseOnDivideByZero_1,
+        roundingMode,
+        scale,
+        exact,
+        overflow,
+        underflow,
+        divideByZero);
+    return NSDecimalNumberHandler._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDecimalNumberHandler new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSDecimalNumberHandler1, _lib._sel_new1);
+    return NSDecimalNumberHandler._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSDecimalNumberHandler alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSDecimalNumberHandler1, _lib._sel_alloc1);
+    return NSDecimalNumberHandler._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSDecimalNumberHandler1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSDecimalNumberHandler1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSDecimalNumberHandler1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSDecimalNumberHandler1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSDecimalNumberHandler1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSDecimalNumberHandler1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSDecimalNumberHandler1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSDecimalNumberHandler1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSDecimalNumberHandler1,
+        _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSRoundingMode {
+  static const int NSRoundPlain = 0;
+  static const int NSRoundDown = 1;
+  static const int NSRoundUp = 2;
+  static const int NSRoundBankers = 3;
+}
+
+class NSScanner extends NSObject {
+  NSScanner._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSScanner] that points to the same underlying object as [other].
+  static NSScanner castFrom<T extends _ObjCWrapper>(T other) {
+    return NSScanner._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSScanner] that wraps the given raw object pointer.
+  static NSScanner castFromPointer(AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSScanner._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSScanner].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSScanner1);
+  }
+
+  NSString? get string {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_string1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get scanLocation {
+    return _lib._objc_msgSend_10(_id, _lib._sel_scanLocation1);
+  }
+
+  set scanLocation(int value) {
+    _lib._objc_msgSend_451(_id, _lib._sel_setScanLocation_1, value);
+  }
+
+  NSCharacterSet? get charactersToBeSkipped {
+    final _ret = _lib._objc_msgSend_168(_id, _lib._sel_charactersToBeSkipped1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  set charactersToBeSkipped(NSCharacterSet? value) {
+    _lib._objc_msgSend_714(
+        _id, _lib._sel_setCharactersToBeSkipped_1, value?._id ?? ffi.nullptr);
+  }
+
+  bool get caseSensitive {
+    return _lib._objc_msgSend_12(_id, _lib._sel_caseSensitive1);
+  }
+
+  set caseSensitive(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setCaseSensitive_1, value);
+  }
+
+  NSObject get locale {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_locale1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  set locale(NSObject value) {
+    _lib._objc_msgSend_368(_id, _lib._sel_setLocale_1, value._id);
+  }
+
+  NSScanner initWithString_(NSString? string) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initWithString_1, string?._id ?? ffi.nullptr);
+    return NSScanner._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool scanInt_(ffi.Pointer<ffi.Int> result) {
+    return _lib._objc_msgSend_715(_id, _lib._sel_scanInt_1, result);
+  }
+
+  bool scanInteger_(ffi.Pointer<NSInteger> result) {
+    return _lib._objc_msgSend_716(_id, _lib._sel_scanInteger_1, result);
+  }
+
+  bool scanLongLong_(ffi.Pointer<ffi.LongLong> result) {
+    return _lib._objc_msgSend_717(_id, _lib._sel_scanLongLong_1, result);
+  }
+
+  bool scanUnsignedLongLong_(ffi.Pointer<ffi.UnsignedLongLong> result) {
+    return _lib._objc_msgSend_718(
+        _id, _lib._sel_scanUnsignedLongLong_1, result);
+  }
+
+  bool scanFloat_(ffi.Pointer<ffi.Float> result) {
+    return _lib._objc_msgSend_719(_id, _lib._sel_scanFloat_1, result);
+  }
+
+  bool scanDouble_(ffi.Pointer<ffi.Double> result) {
+    return _lib._objc_msgSend_720(_id, _lib._sel_scanDouble_1, result);
+  }
+
+  bool scanHexInt_(ffi.Pointer<ffi.UnsignedInt> result) {
+    return _lib._objc_msgSend_721(_id, _lib._sel_scanHexInt_1, result);
+  }
+
+  bool scanHexLongLong_(ffi.Pointer<ffi.UnsignedLongLong> result) {
+    return _lib._objc_msgSend_718(_id, _lib._sel_scanHexLongLong_1, result);
+  }
+
+  bool scanHexFloat_(ffi.Pointer<ffi.Float> result) {
+    return _lib._objc_msgSend_719(_id, _lib._sel_scanHexFloat_1, result);
+  }
+
+  bool scanHexDouble_(ffi.Pointer<ffi.Double> result) {
+    return _lib._objc_msgSend_720(_id, _lib._sel_scanHexDouble_1, result);
+  }
+
+  bool scanString_intoString_(
+      NSString? string, ffi.Pointer<ffi.Pointer<ObjCObject>> result) {
+    return _lib._objc_msgSend_722(_id, _lib._sel_scanString_intoString_1,
+        string?._id ?? ffi.nullptr, result);
+  }
+
+  bool scanCharactersFromSet_intoString_(
+      NSCharacterSet? set, ffi.Pointer<ffi.Pointer<ObjCObject>> result) {
+    return _lib._objc_msgSend_723(
+        _id,
+        _lib._sel_scanCharactersFromSet_intoString_1,
+        set?._id ?? ffi.nullptr,
+        result);
+  }
+
+  bool scanUpToString_intoString_(
+      NSString? string, ffi.Pointer<ffi.Pointer<ObjCObject>> result) {
+    return _lib._objc_msgSend_722(_id, _lib._sel_scanUpToString_intoString_1,
+        string?._id ?? ffi.nullptr, result);
+  }
+
+  bool scanUpToCharactersFromSet_intoString_(
+      NSCharacterSet? set, ffi.Pointer<ffi.Pointer<ObjCObject>> result) {
+    return _lib._objc_msgSend_723(
+        _id,
+        _lib._sel_scanUpToCharactersFromSet_intoString_1,
+        set?._id ?? ffi.nullptr,
+        result);
+  }
+
+  bool get atEnd {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isAtEnd1);
+  }
+
+  static NSScanner scannerWithString_(AVFAudio _lib, NSString? string) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSScanner1,
+        _lib._sel_scannerWithString_1, string?._id ?? ffi.nullptr);
+    return NSScanner._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject localizedScannerWithString_(AVFAudio _lib, NSString? string) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSScanner1,
+        _lib._sel_localizedScannerWithString_1, string?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool scanDecimal_(ffi.Pointer<NSDecimal> dcm) {
+    return _lib._objc_msgSend_724(_id, _lib._sel_scanDecimal_1, dcm);
+  }
+
+  static NSScanner new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSScanner1, _lib._sel_new1);
+    return NSScanner._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSScanner alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSScanner1, _lib._sel_alloc1);
+    return NSScanner._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSScanner1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSScanner1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSScanner1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSScanner1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSScanner1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSScanner1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSScanner1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSScanner1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSScanner1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSDecimal extends ffi.Opaque {}
+
+class NSException extends NSObject {
+  NSException._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSException] that points to the same underlying object as [other].
+  static NSException castFrom<T extends _ObjCWrapper>(T other) {
+    return NSException._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSException] that wraps the given raw object pointer.
+  static NSException castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSException._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSException].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSException1);
+  }
+
+  static NSException exceptionWithName_reason_userInfo_(AVFAudio _lib,
+      NSExceptionName name, NSString? reason, NSDictionary? userInfo) {
+    final _ret = _lib._objc_msgSend_725(
+        _lib._class_NSException1,
+        _lib._sel_exceptionWithName_reason_userInfo_1,
+        name,
+        reason?._id ?? ffi.nullptr,
+        userInfo?._id ?? ffi.nullptr);
+    return NSException._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSException initWithName_reason_userInfo_(
+      NSExceptionName aName, NSString? aReason, NSDictionary? aUserInfo) {
+    final _ret = _lib._objc_msgSend_551(
+        _id,
+        _lib._sel_initWithName_reason_userInfo_1,
+        aName,
+        aReason?._id ?? ffi.nullptr,
+        aUserInfo?._id ?? ffi.nullptr);
+    return NSException._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSExceptionName get name {
+    return _lib._objc_msgSend_20(_id, _lib._sel_name1);
+  }
+
+  NSString? get reason {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_reason1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary? get userInfo {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_userInfo1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get callStackReturnAddresses {
+    final _ret =
+        _lib._objc_msgSend_80(_id, _lib._sel_callStackReturnAddresses1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get callStackSymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_callStackSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  void raise() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_raise1);
+  }
+
+  static void raise_format_(
+      AVFAudio _lib, NSExceptionName name, NSString? format) {
+    return _lib._objc_msgSend_483(_lib._class_NSException1,
+        _lib._sel_raise_format_1, name, format?._id ?? ffi.nullptr);
+  }
+
+  static void raise_format_arguments_(AVFAudio _lib, NSExceptionName name,
+      NSString? format, ffi.Pointer<__va_list_tag> argList) {
+    return _lib._objc_msgSend_726(
+        _lib._class_NSException1,
+        _lib._sel_raise_format_arguments_1,
+        name,
+        format?._id ?? ffi.nullptr,
+        argList);
+  }
+
+  static NSException new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSException1, _lib._sel_new1);
+    return NSException._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSException alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSException1, _lib._sel_alloc1);
+    return NSException._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSException1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSException1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSException1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSException1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSException1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSException1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSException1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSException1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSException1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef NSExceptionName = ffi.Pointer<ObjCObject>;
+
+class NSFileHandle extends NSObject {
+  NSFileHandle._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSFileHandle] that points to the same underlying object as [other].
+  static NSFileHandle castFrom<T extends _ObjCWrapper>(T other) {
+    return NSFileHandle._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSFileHandle] that wraps the given raw object pointer.
+  static NSFileHandle castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSFileHandle._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSFileHandle].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSFileHandle1);
+  }
+
+  NSData? get availableData {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_availableData1);
+    return _ret.address == 0
+        ? null
+        : NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSFileHandle initWithFileDescriptor_closeOnDealloc_(int fd, bool closeopt) {
+    final _ret = _lib._objc_msgSend_727(
+        _id, _lib._sel_initWithFileDescriptor_closeOnDealloc_1, fd, closeopt);
+    return NSFileHandle._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSFileHandle initWithCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr);
+    return NSFileHandle._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData readDataToEndOfFileAndReturnError_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_728(
+        _id, _lib._sel_readDataToEndOfFileAndReturnError_1, error);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData readDataUpToLength_error_(
+      int length, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_729(
+        _id, _lib._sel_readDataUpToLength_error_1, length, error);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool writeData_error_(
+      NSData? data, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_730(
+        _id, _lib._sel_writeData_error_1, data?._id ?? ffi.nullptr, error);
+  }
+
+  bool getOffset_error_(ffi.Pointer<ffi.UnsignedLongLong> offsetInFile,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_731(
+        _id, _lib._sel_getOffset_error_1, offsetInFile, error);
+  }
+
+  bool seekToEndReturningOffset_error_(
+      ffi.Pointer<ffi.UnsignedLongLong> offsetInFile,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_731(
+        _id, _lib._sel_seekToEndReturningOffset_error_1, offsetInFile, error);
+  }
+
+  bool seekToOffset_error_(
+      int offset, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_732(
+        _id, _lib._sel_seekToOffset_error_1, offset, error);
+  }
+
+  bool truncateAtOffset_error_(
+      int offset, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_732(
+        _id, _lib._sel_truncateAtOffset_error_1, offset, error);
+  }
+
+  bool synchronizeAndReturnError_(ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_219(
+        _id, _lib._sel_synchronizeAndReturnError_1, error);
+  }
+
+  bool closeAndReturnError_(ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_219(_id, _lib._sel_closeAndReturnError_1, error);
+  }
+
+  static NSFileHandle? getFileHandleWithStandardInput(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_733(
+        _lib._class_NSFileHandle1, _lib._sel_fileHandleWithStandardInput1);
+    return _ret.address == 0
+        ? null
+        : NSFileHandle._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSFileHandle? getFileHandleWithStandardOutput(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_733(
+        _lib._class_NSFileHandle1, _lib._sel_fileHandleWithStandardOutput1);
+    return _ret.address == 0
+        ? null
+        : NSFileHandle._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSFileHandle? getFileHandleWithStandardError(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_733(
+        _lib._class_NSFileHandle1, _lib._sel_fileHandleWithStandardError1);
+    return _ret.address == 0
+        ? null
+        : NSFileHandle._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSFileHandle? getFileHandleWithNullDevice(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_733(
+        _lib._class_NSFileHandle1, _lib._sel_fileHandleWithNullDevice1);
+    return _ret.address == 0
+        ? null
+        : NSFileHandle._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSFileHandle fileHandleForReadingAtPath_(
+      AVFAudio _lib, NSString? path) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSFileHandle1,
+        _lib._sel_fileHandleForReadingAtPath_1, path?._id ?? ffi.nullptr);
+    return NSFileHandle._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSFileHandle fileHandleForWritingAtPath_(
+      AVFAudio _lib, NSString? path) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSFileHandle1,
+        _lib._sel_fileHandleForWritingAtPath_1, path?._id ?? ffi.nullptr);
+    return NSFileHandle._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSFileHandle fileHandleForUpdatingAtPath_(
+      AVFAudio _lib, NSString? path) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSFileHandle1,
+        _lib._sel_fileHandleForUpdatingAtPath_1, path?._id ?? ffi.nullptr);
+    return NSFileHandle._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSFileHandle fileHandleForReadingFromURL_error_(
+      AVFAudio _lib, NSURL? url, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_734(
+        _lib._class_NSFileHandle1,
+        _lib._sel_fileHandleForReadingFromURL_error_1,
+        url?._id ?? ffi.nullptr,
+        error);
+    return NSFileHandle._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSFileHandle fileHandleForWritingToURL_error_(
+      AVFAudio _lib, NSURL? url, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_734(
+        _lib._class_NSFileHandle1,
+        _lib._sel_fileHandleForWritingToURL_error_1,
+        url?._id ?? ffi.nullptr,
+        error);
+    return NSFileHandle._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSFileHandle fileHandleForUpdatingURL_error_(
+      AVFAudio _lib, NSURL? url, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_734(
+        _lib._class_NSFileHandle1,
+        _lib._sel_fileHandleForUpdatingURL_error_1,
+        url?._id ?? ffi.nullptr,
+        error);
+    return NSFileHandle._(_ret, _lib, retain: true, release: true);
+  }
+
+  void readInBackgroundAndNotifyForModes_(NSArray? modes) {
+    return _lib._objc_msgSend_412(
+        _id,
+        _lib._sel_readInBackgroundAndNotifyForModes_1,
+        modes?._id ?? ffi.nullptr);
+  }
+
+  void readInBackgroundAndNotify() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_readInBackgroundAndNotify1);
+  }
+
+  void readToEndOfFileInBackgroundAndNotifyForModes_(NSArray? modes) {
+    return _lib._objc_msgSend_412(
+        _id,
+        _lib._sel_readToEndOfFileInBackgroundAndNotifyForModes_1,
+        modes?._id ?? ffi.nullptr);
+  }
+
+  void readToEndOfFileInBackgroundAndNotify() {
+    return _lib._objc_msgSend_1(
+        _id, _lib._sel_readToEndOfFileInBackgroundAndNotify1);
+  }
+
+  void acceptConnectionInBackgroundAndNotifyForModes_(NSArray? modes) {
+    return _lib._objc_msgSend_412(
+        _id,
+        _lib._sel_acceptConnectionInBackgroundAndNotifyForModes_1,
+        modes?._id ?? ffi.nullptr);
+  }
+
+  void acceptConnectionInBackgroundAndNotify() {
+    return _lib._objc_msgSend_1(
+        _id, _lib._sel_acceptConnectionInBackgroundAndNotify1);
+  }
+
+  void waitForDataInBackgroundAndNotifyForModes_(NSArray? modes) {
+    return _lib._objc_msgSend_412(
+        _id,
+        _lib._sel_waitForDataInBackgroundAndNotifyForModes_1,
+        modes?._id ?? ffi.nullptr);
+  }
+
+  void waitForDataInBackgroundAndNotify() {
+    return _lib._objc_msgSend_1(
+        _id, _lib._sel_waitForDataInBackgroundAndNotify1);
+  }
+
+  ObjCBlock29 get readabilityHandler {
+    final _ret = _lib._objc_msgSend_735(_id, _lib._sel_readabilityHandler1);
+    return ObjCBlock29._(_ret, _lib);
+  }
+
+  set readabilityHandler(ObjCBlock29 value) {
+    _lib._objc_msgSend_736(_id, _lib._sel_setReadabilityHandler_1, value._id);
+  }
+
+  ObjCBlock29 get writeabilityHandler {
+    final _ret = _lib._objc_msgSend_735(_id, _lib._sel_writeabilityHandler1);
+    return ObjCBlock29._(_ret, _lib);
+  }
+
+  set writeabilityHandler(ObjCBlock29 value) {
+    _lib._objc_msgSend_736(_id, _lib._sel_setWriteabilityHandler_1, value._id);
+  }
+
+  NSFileHandle initWithFileDescriptor_(int fd) {
+    final _ret =
+        _lib._objc_msgSend_737(_id, _lib._sel_initWithFileDescriptor_1, fd);
+    return NSFileHandle._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get fileDescriptor {
+    return _lib._objc_msgSend_213(_id, _lib._sel_fileDescriptor1);
+  }
+
+  NSData readDataToEndOfFile() {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_readDataToEndOfFile1);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData readDataOfLength_(int length) {
+    final _ret =
+        _lib._objc_msgSend_315(_id, _lib._sel_readDataOfLength_1, length);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  void writeData_(NSData? data) {
+    return _lib._objc_msgSend_248(
+        _id, _lib._sel_writeData_1, data?._id ?? ffi.nullptr);
+  }
+
+  int get offsetInFile {
+    return _lib._objc_msgSend_148(_id, _lib._sel_offsetInFile1);
+  }
+
+  int seekToEndOfFile() {
+    return _lib._objc_msgSend_148(_id, _lib._sel_seekToEndOfFile1);
+  }
+
+  void seekToFileOffset_(int offset) {
+    return _lib._objc_msgSend_738(_id, _lib._sel_seekToFileOffset_1, offset);
+  }
+
+  void truncateFileAtOffset_(int offset) {
+    return _lib._objc_msgSend_738(
+        _id, _lib._sel_truncateFileAtOffset_1, offset);
+  }
+
+  void synchronizeFile() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_synchronizeFile1);
+  }
+
+  void closeFile() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_closeFile1);
+  }
+
+  static NSFileHandle new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSFileHandle1, _lib._sel_new1);
+    return NSFileHandle._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSFileHandle alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSFileHandle1, _lib._sel_alloc1);
+    return NSFileHandle._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSFileHandle1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSFileHandle1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSFileHandle1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSFileHandle1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSFileHandle1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSFileHandle1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSFileHandle1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSFileHandle1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSFileHandle1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+void _ObjCBlock29_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ObjCObject> arg0) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ObjCObject> arg0)>>()
+      .asFunction<void Function(ffi.Pointer<ObjCObject> arg0)>()(arg0);
+}
+
+final _ObjCBlock29_closureRegistry = <int, Function>{};
+int _ObjCBlock29_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock29_registerClosure(Function fn) {
+  final id = ++_ObjCBlock29_closureRegistryIndex;
+  _ObjCBlock29_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock29_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ObjCObject> arg0) {
+  return _ObjCBlock29_closureRegistry[block.ref.target.address]!(arg0);
+}
+
+class ObjCBlock29 extends _ObjCBlockBase {
+  ObjCBlock29._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock29.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0)>(
+                        _ObjCBlock29_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock29.fromFunction(
+      AVFAudio lib, void Function(ffi.Pointer<ObjCObject> arg0) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0)>(
+                        _ObjCBlock29_closureTrampoline)
+                    .cast(),
+                _ObjCBlock29_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0)>>()
+        .asFunction<
+            void Function(ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0)>()(_id, arg0);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class NSHTTPCookieStorage extends NSObject {
+  NSHTTPCookieStorage._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSHTTPCookieStorage] that points to the same underlying object as [other].
+  static NSHTTPCookieStorage castFrom<T extends _ObjCWrapper>(T other) {
+    return NSHTTPCookieStorage._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSHTTPCookieStorage] that wraps the given raw object pointer.
+  static NSHTTPCookieStorage castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSHTTPCookieStorage._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSHTTPCookieStorage].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSHTTPCookieStorage1);
+  }
+
+  static NSHTTPCookieStorage? getSharedHTTPCookieStorage(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_739(
+        _lib._class_NSHTTPCookieStorage1, _lib._sel_sharedHTTPCookieStorage1);
+    return _ret.address == 0
+        ? null
+        : NSHTTPCookieStorage._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSHTTPCookieStorage sharedCookieStorageForGroupContainerIdentifier_(
+      AVFAudio _lib, NSString? identifier) {
+    final _ret = _lib._objc_msgSend_740(
+        _lib._class_NSHTTPCookieStorage1,
+        _lib._sel_sharedCookieStorageForGroupContainerIdentifier_1,
+        identifier?._id ?? ffi.nullptr);
+    return NSHTTPCookieStorage._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get cookies {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_cookies1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  void setCookie_(NSHTTPCookie? cookie) {
+    return _lib._objc_msgSend_743(
+        _id, _lib._sel_setCookie_1, cookie?._id ?? ffi.nullptr);
+  }
+
+  void deleteCookie_(NSHTTPCookie? cookie) {
+    return _lib._objc_msgSend_743(
+        _id, _lib._sel_deleteCookie_1, cookie?._id ?? ffi.nullptr);
+  }
+
+  void removeCookiesSinceDate_(NSDate? date) {
+    return _lib._objc_msgSend_472(
+        _id, _lib._sel_removeCookiesSinceDate_1, date?._id ?? ffi.nullptr);
+  }
+
+  NSArray cookiesForURL_(NSURL? URL) {
+    final _ret = _lib._objc_msgSend_120(
+        _id, _lib._sel_cookiesForURL_1, URL?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  void setCookies_forURL_mainDocumentURL_(
+      NSArray? cookies, NSURL? URL, NSURL? mainDocumentURL) {
+    return _lib._objc_msgSend_744(
+        _id,
+        _lib._sel_setCookies_forURL_mainDocumentURL_1,
+        cookies?._id ?? ffi.nullptr,
+        URL?._id ?? ffi.nullptr,
+        mainDocumentURL?._id ?? ffi.nullptr);
+  }
+
+  int get cookieAcceptPolicy {
+    return _lib._objc_msgSend_745(_id, _lib._sel_cookieAcceptPolicy1);
+  }
+
+  set cookieAcceptPolicy(int value) {
+    _lib._objc_msgSend_746(_id, _lib._sel_setCookieAcceptPolicy_1, value);
+  }
+
+  NSArray sortedCookiesUsingDescriptors_(NSArray? sortOrder) {
+    final _ret = _lib._objc_msgSend_63(
+        _id,
+        _lib._sel_sortedCookiesUsingDescriptors_1,
+        sortOrder?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  void storeCookies_forTask_(NSArray? cookies, NSURLSessionTask? task) {
+    return _lib._objc_msgSend_766(_id, _lib._sel_storeCookies_forTask_1,
+        cookies?._id ?? ffi.nullptr, task?._id ?? ffi.nullptr);
+  }
+
+  void getCookiesForTask_completionHandler_(
+      NSURLSessionTask? task, ObjCBlock30 completionHandler) {
+    return _lib._objc_msgSend_767(
+        _id,
+        _lib._sel_getCookiesForTask_completionHandler_1,
+        task?._id ?? ffi.nullptr,
+        completionHandler._id);
+  }
+
+  static NSHTTPCookieStorage new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSHTTPCookieStorage1, _lib._sel_new1);
+    return NSHTTPCookieStorage._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSHTTPCookieStorage alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSHTTPCookieStorage1, _lib._sel_alloc1);
+    return NSHTTPCookieStorage._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSHTTPCookieStorage1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSHTTPCookieStorage1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSHTTPCookieStorage1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSHTTPCookieStorage1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSHTTPCookieStorage1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSHTTPCookieStorage1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSHTTPCookieStorage1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSHTTPCookieStorage1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSHTTPCookieStorage1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSHTTPCookie extends NSObject {
+  NSHTTPCookie._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSHTTPCookie] that points to the same underlying object as [other].
+  static NSHTTPCookie castFrom<T extends _ObjCWrapper>(T other) {
+    return NSHTTPCookie._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSHTTPCookie] that wraps the given raw object pointer.
+  static NSHTTPCookie castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSHTTPCookie._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSHTTPCookie].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSHTTPCookie1);
+  }
+
+  NSHTTPCookie initWithProperties_(NSDictionary? properties) {
+    final _ret = _lib._objc_msgSend_143(
+        _id, _lib._sel_initWithProperties_1, properties?._id ?? ffi.nullptr);
+    return NSHTTPCookie._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSHTTPCookie cookieWithProperties_(
+      AVFAudio _lib, NSDictionary? properties) {
+    final _ret = _lib._objc_msgSend_741(_lib._class_NSHTTPCookie1,
+        _lib._sel_cookieWithProperties_1, properties?._id ?? ffi.nullptr);
+    return NSHTTPCookie._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDictionary requestHeaderFieldsWithCookies_(
+      AVFAudio _lib, NSArray? cookies) {
+    final _ret = _lib._objc_msgSend_443(
+        _lib._class_NSHTTPCookie1,
+        _lib._sel_requestHeaderFieldsWithCookies_1,
+        cookies?._id ?? ffi.nullptr);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray cookiesWithResponseHeaderFields_forURL_(
+      AVFAudio _lib, NSDictionary? headerFields, NSURL? URL) {
+    final _ret = _lib._objc_msgSend_742(
+        _lib._class_NSHTTPCookie1,
+        _lib._sel_cookiesWithResponseHeaderFields_forURL_1,
+        headerFields?._id ?? ffi.nullptr,
+        URL?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary? get properties {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_properties1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get version {
+    return _lib._objc_msgSend_10(_id, _lib._sel_version1);
+  }
+
+  NSString? get name {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_name1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get value {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_value1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate? get expiresDate {
+    final _ret = _lib._objc_msgSend_156(_id, _lib._sel_expiresDate1);
+    return _ret.address == 0
+        ? null
+        : NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool get sessionOnly {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isSessionOnly1);
+  }
+
+  NSString? get domain {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_domain1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get path {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_path1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool get secure {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isSecure1);
+  }
+
+  bool get HTTPOnly {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isHTTPOnly1);
+  }
+
+  NSString? get comment {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_comment1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get commentURL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_commentURL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get portList {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_portList1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSHTTPCookieStringPolicy get sameSitePolicy {
+    return _lib._objc_msgSend_20(_id, _lib._sel_sameSitePolicy1);
+  }
+
+  static NSHTTPCookie new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSHTTPCookie1, _lib._sel_new1);
+    return NSHTTPCookie._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSHTTPCookie alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSHTTPCookie1, _lib._sel_alloc1);
+    return NSHTTPCookie._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSHTTPCookie1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSHTTPCookie1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSHTTPCookie1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSHTTPCookie1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSHTTPCookie1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSHTTPCookie1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSHTTPCookie1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSHTTPCookie1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSHTTPCookie1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef NSHTTPCookieStringPolicy = ffi.Pointer<ObjCObject>;
+
+abstract class NSHTTPCookieAcceptPolicy {
+  static const int NSHTTPCookieAcceptPolicyAlways = 0;
+  static const int NSHTTPCookieAcceptPolicyNever = 1;
+  static const int NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain = 2;
+}
+
+class NSURLSessionTask extends NSObject {
+  NSURLSessionTask._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURLSessionTask] that points to the same underlying object as [other].
+  static NSURLSessionTask castFrom<T extends _ObjCWrapper>(T other) {
+    return NSURLSessionTask._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSURLSessionTask] that wraps the given raw object pointer.
+  static NSURLSessionTask castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURLSessionTask._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURLSessionTask].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSURLSessionTask1);
+  }
+
+  int get taskIdentifier {
+    return _lib._objc_msgSend_10(_id, _lib._sel_taskIdentifier1);
+  }
+
+  NSURLRequest? get originalRequest {
+    final _ret = _lib._objc_msgSend_761(_id, _lib._sel_originalRequest1);
+    return _ret.address == 0
+        ? null
+        : NSURLRequest._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLRequest? get currentRequest {
+    final _ret = _lib._objc_msgSend_761(_id, _lib._sel_currentRequest1);
+    return _ret.address == 0
+        ? null
+        : NSURLRequest._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLResponse? get response {
+    final _ret = _lib._objc_msgSend_763(_id, _lib._sel_response1);
+    return _ret.address == 0
+        ? null
+        : NSURLResponse._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject? get delegate {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_delegate1);
+    return _ret.address == 0
+        ? null
+        : NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  set delegate(NSObject? value) {
+    _lib._objc_msgSend_368(
+        _id, _lib._sel_setDelegate_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSProgress? get progress {
+    final _ret = _lib._objc_msgSend_577(_id, _lib._sel_progress1);
+    return _ret.address == 0
+        ? null
+        : NSProgress._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate? get earliestBeginDate {
+    final _ret = _lib._objc_msgSend_156(_id, _lib._sel_earliestBeginDate1);
+    return _ret.address == 0
+        ? null
+        : NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  set earliestBeginDate(NSDate? value) {
+    _lib._objc_msgSend_493(
+        _id, _lib._sel_setEarliestBeginDate_1, value?._id ?? ffi.nullptr);
+  }
+
+  int get countOfBytesClientExpectsToSend {
+    return _lib._objc_msgSend_584(
+        _id, _lib._sel_countOfBytesClientExpectsToSend1);
+  }
+
+  set countOfBytesClientExpectsToSend(int value) {
+    _lib._objc_msgSend_585(
+        _id, _lib._sel_setCountOfBytesClientExpectsToSend_1, value);
+  }
+
+  int get countOfBytesClientExpectsToReceive {
+    return _lib._objc_msgSend_584(
+        _id, _lib._sel_countOfBytesClientExpectsToReceive1);
+  }
+
+  set countOfBytesClientExpectsToReceive(int value) {
+    _lib._objc_msgSend_585(
+        _id, _lib._sel_setCountOfBytesClientExpectsToReceive_1, value);
+  }
+
+  int get countOfBytesSent {
+    return _lib._objc_msgSend_584(_id, _lib._sel_countOfBytesSent1);
+  }
+
+  int get countOfBytesReceived {
+    return _lib._objc_msgSend_584(_id, _lib._sel_countOfBytesReceived1);
+  }
+
+  int get countOfBytesExpectedToSend {
+    return _lib._objc_msgSend_584(_id, _lib._sel_countOfBytesExpectedToSend1);
+  }
+
+  int get countOfBytesExpectedToReceive {
+    return _lib._objc_msgSend_584(
+        _id, _lib._sel_countOfBytesExpectedToReceive1);
+  }
+
+  NSString? get taskDescription {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_taskDescription1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set taskDescription(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setTaskDescription_1, value?._id ?? ffi.nullptr);
+  }
+
+  void cancel() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_cancel1);
+  }
+
+  int get state {
+    return _lib._objc_msgSend_764(_id, _lib._sel_state1);
+  }
+
+  NSError? get error {
+    final _ret = _lib._objc_msgSend_283(_id, _lib._sel_error1);
+    return _ret.address == 0
+        ? null
+        : NSError._(_ret, _lib, retain: true, release: true);
+  }
+
+  void suspend() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_suspend1);
+  }
+
+  void resume() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_resume1);
+  }
+
+  double get priority {
+    return _lib._objc_msgSend_215(_id, _lib._sel_priority1);
+  }
+
+  set priority(double value) {
+    _lib._objc_msgSend_765(_id, _lib._sel_setPriority_1, value);
+  }
+
+  bool get prefersIncrementalDelivery {
+    return _lib._objc_msgSend_12(_id, _lib._sel_prefersIncrementalDelivery1);
+  }
+
+  set prefersIncrementalDelivery(bool value) {
+    _lib._objc_msgSend_460(
+        _id, _lib._sel_setPrefersIncrementalDelivery_1, value);
+  }
+
+  @override
+  NSURLSessionTask init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSURLSessionTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLSessionTask new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSURLSessionTask1, _lib._sel_new1);
+    return NSURLSessionTask._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSURLSessionTask alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSURLSessionTask1, _lib._sel_alloc1);
+    return NSURLSessionTask._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURLSessionTask1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLSessionTask1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSURLSessionTask1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLSessionTask1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURLSessionTask1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURLSessionTask1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURLSessionTask1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSURLSessionTask1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLSessionTask1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSURLRequest extends NSObject {
+  NSURLRequest._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURLRequest] that points to the same underlying object as [other].
+  static NSURLRequest castFrom<T extends _ObjCWrapper>(T other) {
+    return NSURLRequest._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSURLRequest] that wraps the given raw object pointer.
+  static NSURLRequest castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURLRequest._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURLRequest].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSURLRequest1);
+  }
+
+  static NSURLRequest requestWithURL_(AVFAudio _lib, NSURL? URL) {
+    final _ret = _lib._objc_msgSend_226(_lib._class_NSURLRequest1,
+        _lib._sel_requestWithURL_1, URL?._id ?? ffi.nullptr);
+    return NSURLRequest._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool getSupportsSecureCoding(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLRequest1, _lib._sel_supportsSecureCoding1);
+  }
+
+  static NSURLRequest requestWithURL_cachePolicy_timeoutInterval_(
+      AVFAudio _lib, NSURL? URL, int cachePolicy, double timeoutInterval) {
+    final _ret = _lib._objc_msgSend_747(
+        _lib._class_NSURLRequest1,
+        _lib._sel_requestWithURL_cachePolicy_timeoutInterval_1,
+        URL?._id ?? ffi.nullptr,
+        cachePolicy,
+        timeoutInterval);
+    return NSURLRequest._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLRequest initWithURL_(NSURL? URL) {
+    final _ret = _lib._objc_msgSend_226(
+        _id, _lib._sel_initWithURL_1, URL?._id ?? ffi.nullptr);
+    return NSURLRequest._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLRequest initWithURL_cachePolicy_timeoutInterval_(
+      NSURL? URL, int cachePolicy, double timeoutInterval) {
+    final _ret = _lib._objc_msgSend_747(
+        _id,
+        _lib._sel_initWithURL_cachePolicy_timeoutInterval_1,
+        URL?._id ?? ffi.nullptr,
+        cachePolicy,
+        timeoutInterval);
+    return NSURLRequest._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get URL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_URL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get cachePolicy {
+    return _lib._objc_msgSend_748(_id, _lib._sel_cachePolicy1);
+  }
+
+  double get timeoutInterval {
+    return _lib._objc_msgSend_149(_id, _lib._sel_timeoutInterval1);
+  }
+
+  NSURL? get mainDocumentURL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_mainDocumentURL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get networkServiceType {
+    return _lib._objc_msgSend_749(_id, _lib._sel_networkServiceType1);
+  }
+
+  bool get allowsCellularAccess {
+    return _lib._objc_msgSend_12(_id, _lib._sel_allowsCellularAccess1);
+  }
+
+  bool get allowsExpensiveNetworkAccess {
+    return _lib._objc_msgSend_12(_id, _lib._sel_allowsExpensiveNetworkAccess1);
+  }
+
+  bool get allowsConstrainedNetworkAccess {
+    return _lib._objc_msgSend_12(
+        _id, _lib._sel_allowsConstrainedNetworkAccess1);
+  }
+
+  bool get assumesHTTP3Capable {
+    return _lib._objc_msgSend_12(_id, _lib._sel_assumesHTTP3Capable1);
+  }
+
+  int get attribution {
+    return _lib._objc_msgSend_750(_id, _lib._sel_attribution1);
+  }
+
+  NSString? get HTTPMethod {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_HTTPMethod1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary? get allHTTPHeaderFields {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_allHTTPHeaderFields1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString valueForHTTPHeaderField_(NSString? field) {
+    final _ret = _lib._objc_msgSend_64(
+        _id, _lib._sel_valueForHTTPHeaderField_1, field?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData? get HTTPBody {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_HTTPBody1);
+    return _ret.address == 0
+        ? null
+        : NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSInputStream? get HTTPBodyStream {
+    final _ret = _lib._objc_msgSend_760(_id, _lib._sel_HTTPBodyStream1);
+    return _ret.address == 0
+        ? null
+        : NSInputStream._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool get HTTPShouldHandleCookies {
+    return _lib._objc_msgSend_12(_id, _lib._sel_HTTPShouldHandleCookies1);
+  }
+
+  bool get HTTPShouldUsePipelining {
+    return _lib._objc_msgSend_12(_id, _lib._sel_HTTPShouldUsePipelining1);
+  }
+
+  static NSURLRequest new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSURLRequest1, _lib._sel_new1);
+    return NSURLRequest._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSURLRequest alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSURLRequest1, _lib._sel_alloc1);
+    return NSURLRequest._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURLRequest1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLRequest1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLRequest1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLRequest1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURLRequest1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURLRequest1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURLRequest1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSURLRequest1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLRequest1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSURLRequestCachePolicy {
+  static const int NSURLRequestUseProtocolCachePolicy = 0;
+  static const int NSURLRequestReloadIgnoringLocalCacheData = 1;
+  static const int NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4;
+  static const int NSURLRequestReloadIgnoringCacheData = 1;
+  static const int NSURLRequestReturnCacheDataElseLoad = 2;
+  static const int NSURLRequestReturnCacheDataDontLoad = 3;
+  static const int NSURLRequestReloadRevalidatingCacheData = 5;
+}
+
+abstract class NSURLRequestNetworkServiceType {
+  static const int NSURLNetworkServiceTypeDefault = 0;
+  static const int NSURLNetworkServiceTypeVoIP = 1;
+  static const int NSURLNetworkServiceTypeVideo = 2;
+  static const int NSURLNetworkServiceTypeBackground = 3;
+  static const int NSURLNetworkServiceTypeVoice = 4;
+  static const int NSURLNetworkServiceTypeResponsiveData = 6;
+  static const int NSURLNetworkServiceTypeAVStreaming = 8;
+  static const int NSURLNetworkServiceTypeResponsiveAV = 9;
+  static const int NSURLNetworkServiceTypeCallSignaling = 11;
+}
+
+abstract class NSURLRequestAttribution {
+  static const int NSURLRequestAttributionDeveloper = 0;
+  static const int NSURLRequestAttributionUser = 1;
+}
+
+class NSInputStream extends NSStream {
+  NSInputStream._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSInputStream] that points to the same underlying object as [other].
+  static NSInputStream castFrom<T extends _ObjCWrapper>(T other) {
+    return NSInputStream._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSInputStream] that wraps the given raw object pointer.
+  static NSInputStream castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSInputStream._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSInputStream].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSInputStream1);
+  }
+
+  int read_maxLength_(ffi.Pointer<ffi.Uint8> buffer, int len) {
+    return _lib._objc_msgSend_752(_id, _lib._sel_read_maxLength_1, buffer, len);
+  }
+
+  bool getBuffer_length_(
+      ffi.Pointer<ffi.Pointer<ffi.Uint8>> buffer, ffi.Pointer<NSUInteger> len) {
+    return _lib._objc_msgSend_759(
+        _id, _lib._sel_getBuffer_length_1, buffer, len);
+  }
+
+  bool get hasBytesAvailable {
+    return _lib._objc_msgSend_12(_id, _lib._sel_hasBytesAvailable1);
+  }
+
+  NSInputStream initWithData_(NSData? data) {
+    final _ret = _lib._objc_msgSend_242(
+        _id, _lib._sel_initWithData_1, data?._id ?? ffi.nullptr);
+    return NSInputStream._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSInputStream initWithURL_(NSURL? url) {
+    final _ret = _lib._objc_msgSend_226(
+        _id, _lib._sel_initWithURL_1, url?._id ?? ffi.nullptr);
+    return NSInputStream._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSInputStream initWithFileAtPath_(NSString? path) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initWithFileAtPath_1, path?._id ?? ffi.nullptr);
+    return NSInputStream._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSInputStream inputStreamWithData_(AVFAudio _lib, NSData? data) {
+    final _ret = _lib._objc_msgSend_242(_lib._class_NSInputStream1,
+        _lib._sel_inputStreamWithData_1, data?._id ?? ffi.nullptr);
+    return NSInputStream._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSInputStream inputStreamWithFileAtPath_(
+      AVFAudio _lib, NSString? path) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSInputStream1,
+        _lib._sel_inputStreamWithFileAtPath_1, path?._id ?? ffi.nullptr);
+    return NSInputStream._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSInputStream inputStreamWithURL_(AVFAudio _lib, NSURL? url) {
+    final _ret = _lib._objc_msgSend_226(_lib._class_NSInputStream1,
+        _lib._sel_inputStreamWithURL_1, url?._id ?? ffi.nullptr);
+    return NSInputStream._(_ret, _lib, retain: true, release: true);
+  }
+
+  static void getStreamsToHostWithName_port_inputStream_outputStream_(
+      AVFAudio _lib,
+      NSString? hostname,
+      int port,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> inputStream,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outputStream) {
+    return _lib._objc_msgSend_754(
+        _lib._class_NSInputStream1,
+        _lib._sel_getStreamsToHostWithName_port_inputStream_outputStream_1,
+        hostname?._id ?? ffi.nullptr,
+        port,
+        inputStream,
+        outputStream);
+  }
+
+  static void getStreamsToHost_port_inputStream_outputStream_(
+      AVFAudio _lib,
+      NSHost? host,
+      int port,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> inputStream,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outputStream) {
+    return _lib._objc_msgSend_757(
+        _lib._class_NSInputStream1,
+        _lib._sel_getStreamsToHost_port_inputStream_outputStream_1,
+        host?._id ?? ffi.nullptr,
+        port,
+        inputStream,
+        outputStream);
+  }
+
+  static void getBoundStreamsWithBufferSize_inputStream_outputStream_(
+      AVFAudio _lib,
+      int bufferSize,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> inputStream,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outputStream) {
+    return _lib._objc_msgSend_758(
+        _lib._class_NSInputStream1,
+        _lib._sel_getBoundStreamsWithBufferSize_inputStream_outputStream_1,
+        bufferSize,
+        inputStream,
+        outputStream);
+  }
+
+  static NSInputStream new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSInputStream1, _lib._sel_new1);
+    return NSInputStream._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSInputStream alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSInputStream1, _lib._sel_alloc1);
+    return NSInputStream._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSInputStream1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSInputStream1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSInputStream1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSInputStream1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSInputStream1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSInputStream1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSInputStream1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSInputStream1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSInputStream1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSStream extends NSObject {
+  NSStream._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSStream] that points to the same underlying object as [other].
+  static NSStream castFrom<T extends _ObjCWrapper>(T other) {
+    return NSStream._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSStream] that wraps the given raw object pointer.
+  static NSStream castFromPointer(AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSStream._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSStream].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSStream1);
+  }
+
+  void open() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_open1);
+  }
+
+  void close() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_close1);
+  }
+
+  NSObject? get delegate {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_delegate1);
+    return _ret.address == 0
+        ? null
+        : NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  set delegate(NSObject? value) {
+    _lib._objc_msgSend_368(
+        _id, _lib._sel_setDelegate_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSObject propertyForKey_(NSStreamPropertyKey key) {
+    final _ret = _lib._objc_msgSend_30(_id, _lib._sel_propertyForKey_1, key);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool setProperty_forKey_(NSObject property, NSStreamPropertyKey key) {
+    return _lib._objc_msgSend_225(
+        _id, _lib._sel_setProperty_forKey_1, property._id, key);
+  }
+
+  void scheduleInRunLoop_forMode_(NSRunLoop? aRunLoop, NSRunLoopMode mode) {
+    return _lib._objc_msgSend_501(_id, _lib._sel_scheduleInRunLoop_forMode_1,
+        aRunLoop?._id ?? ffi.nullptr, mode);
+  }
+
+  void removeFromRunLoop_forMode_(NSRunLoop? aRunLoop, NSRunLoopMode mode) {
+    return _lib._objc_msgSend_501(_id, _lib._sel_removeFromRunLoop_forMode_1,
+        aRunLoop?._id ?? ffi.nullptr, mode);
+  }
+
+  int get streamStatus {
+    return _lib._objc_msgSend_751(_id, _lib._sel_streamStatus1);
+  }
+
+  NSError? get streamError {
+    final _ret = _lib._objc_msgSend_283(_id, _lib._sel_streamError1);
+    return _ret.address == 0
+        ? null
+        : NSError._(_ret, _lib, retain: true, release: true);
+  }
+
+  static void getStreamsToHostWithName_port_inputStream_outputStream_(
+      AVFAudio _lib,
+      NSString? hostname,
+      int port,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> inputStream,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outputStream) {
+    return _lib._objc_msgSend_754(
+        _lib._class_NSStream1,
+        _lib._sel_getStreamsToHostWithName_port_inputStream_outputStream_1,
+        hostname?._id ?? ffi.nullptr,
+        port,
+        inputStream,
+        outputStream);
+  }
+
+  static void getStreamsToHost_port_inputStream_outputStream_(
+      AVFAudio _lib,
+      NSHost? host,
+      int port,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> inputStream,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outputStream) {
+    return _lib._objc_msgSend_757(
+        _lib._class_NSStream1,
+        _lib._sel_getStreamsToHost_port_inputStream_outputStream_1,
+        host?._id ?? ffi.nullptr,
+        port,
+        inputStream,
+        outputStream);
+  }
+
+  static void getBoundStreamsWithBufferSize_inputStream_outputStream_(
+      AVFAudio _lib,
+      int bufferSize,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> inputStream,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outputStream) {
+    return _lib._objc_msgSend_758(
+        _lib._class_NSStream1,
+        _lib._sel_getBoundStreamsWithBufferSize_inputStream_outputStream_1,
+        bufferSize,
+        inputStream,
+        outputStream);
+  }
+
+  static NSStream new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSStream1, _lib._sel_new1);
+    return NSStream._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSStream alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSStream1, _lib._sel_alloc1);
+    return NSStream._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSStream1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSStream1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSStream1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSStream1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSStream1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSStream1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSStream1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSStream1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSStream1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef NSStreamPropertyKey = ffi.Pointer<ObjCObject>;
+
+abstract class NSStreamStatus {
+  static const int NSStreamStatusNotOpen = 0;
+  static const int NSStreamStatusOpening = 1;
+  static const int NSStreamStatusOpen = 2;
+  static const int NSStreamStatusReading = 3;
+  static const int NSStreamStatusWriting = 4;
+  static const int NSStreamStatusAtEnd = 5;
+  static const int NSStreamStatusClosed = 6;
+  static const int NSStreamStatusError = 7;
+}
+
+class NSOutputStream extends NSStream {
+  NSOutputStream._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSOutputStream] that points to the same underlying object as [other].
+  static NSOutputStream castFrom<T extends _ObjCWrapper>(T other) {
+    return NSOutputStream._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSOutputStream] that wraps the given raw object pointer.
+  static NSOutputStream castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSOutputStream._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSOutputStream].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSOutputStream1);
+  }
+
+  int write_maxLength_(ffi.Pointer<ffi.Uint8> buffer, int len) {
+    return _lib._objc_msgSend_752(
+        _id, _lib._sel_write_maxLength_1, buffer, len);
+  }
+
+  bool get hasSpaceAvailable {
+    return _lib._objc_msgSend_12(_id, _lib._sel_hasSpaceAvailable1);
+  }
+
+  NSOutputStream initToMemory() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_initToMemory1);
+    return NSOutputStream._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSOutputStream initToBuffer_capacity_(
+      ffi.Pointer<ffi.Uint8> buffer, int capacity) {
+    final _ret = _lib._objc_msgSend_753(
+        _id, _lib._sel_initToBuffer_capacity_1, buffer, capacity);
+    return NSOutputStream._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSOutputStream initWithURL_append_(NSURL? url, bool shouldAppend) {
+    final _ret = _lib._objc_msgSend_231(_id, _lib._sel_initWithURL_append_1,
+        url?._id ?? ffi.nullptr, shouldAppend);
+    return NSOutputStream._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSOutputStream initToFileAtPath_append_(NSString? path, bool shouldAppend) {
+    final _ret = _lib._objc_msgSend_29(_id, _lib._sel_initToFileAtPath_append_1,
+        path?._id ?? ffi.nullptr, shouldAppend);
+    return NSOutputStream._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSOutputStream outputStreamToMemory(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSOutputStream1, _lib._sel_outputStreamToMemory1);
+    return NSOutputStream._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSOutputStream outputStreamToBuffer_capacity_(
+      AVFAudio _lib, ffi.Pointer<ffi.Uint8> buffer, int capacity) {
+    final _ret = _lib._objc_msgSend_753(_lib._class_NSOutputStream1,
+        _lib._sel_outputStreamToBuffer_capacity_1, buffer, capacity);
+    return NSOutputStream._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSOutputStream outputStreamToFileAtPath_append_(
+      AVFAudio _lib, NSString? path, bool shouldAppend) {
+    final _ret = _lib._objc_msgSend_29(
+        _lib._class_NSOutputStream1,
+        _lib._sel_outputStreamToFileAtPath_append_1,
+        path?._id ?? ffi.nullptr,
+        shouldAppend);
+    return NSOutputStream._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSOutputStream outputStreamWithURL_append_(
+      AVFAudio _lib, NSURL? url, bool shouldAppend) {
+    final _ret = _lib._objc_msgSend_231(
+        _lib._class_NSOutputStream1,
+        _lib._sel_outputStreamWithURL_append_1,
+        url?._id ?? ffi.nullptr,
+        shouldAppend);
+    return NSOutputStream._(_ret, _lib, retain: true, release: true);
+  }
+
+  static void getStreamsToHostWithName_port_inputStream_outputStream_(
+      AVFAudio _lib,
+      NSString? hostname,
+      int port,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> inputStream,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outputStream) {
+    return _lib._objc_msgSend_754(
+        _lib._class_NSOutputStream1,
+        _lib._sel_getStreamsToHostWithName_port_inputStream_outputStream_1,
+        hostname?._id ?? ffi.nullptr,
+        port,
+        inputStream,
+        outputStream);
+  }
+
+  static void getStreamsToHost_port_inputStream_outputStream_(
+      AVFAudio _lib,
+      NSHost? host,
+      int port,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> inputStream,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outputStream) {
+    return _lib._objc_msgSend_757(
+        _lib._class_NSOutputStream1,
+        _lib._sel_getStreamsToHost_port_inputStream_outputStream_1,
+        host?._id ?? ffi.nullptr,
+        port,
+        inputStream,
+        outputStream);
+  }
+
+  static void getBoundStreamsWithBufferSize_inputStream_outputStream_(
+      AVFAudio _lib,
+      int bufferSize,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> inputStream,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outputStream) {
+    return _lib._objc_msgSend_758(
+        _lib._class_NSOutputStream1,
+        _lib._sel_getBoundStreamsWithBufferSize_inputStream_outputStream_1,
+        bufferSize,
+        inputStream,
+        outputStream);
+  }
+
+  static NSOutputStream new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSOutputStream1, _lib._sel_new1);
+    return NSOutputStream._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSOutputStream alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSOutputStream1, _lib._sel_alloc1);
+    return NSOutputStream._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSOutputStream1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSOutputStream1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSOutputStream1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSOutputStream1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSOutputStream1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSOutputStream1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSOutputStream1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSOutputStream1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSOutputStream1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSHost extends NSObject {
+  NSHost._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSHost] that points to the same underlying object as [other].
+  static NSHost castFrom<T extends _ObjCWrapper>(T other) {
+    return NSHost._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSHost] that wraps the given raw object pointer.
+  static NSHost castFromPointer(AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSHost._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSHost].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSHost1);
+  }
+
+  static NSHost currentHost(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSHost1, _lib._sel_currentHost1);
+    return NSHost._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSHost hostWithName_(AVFAudio _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSHost1,
+        _lib._sel_hostWithName_1, name?._id ?? ffi.nullptr);
+    return NSHost._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSHost hostWithAddress_(AVFAudio _lib, NSString? address) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSHost1,
+        _lib._sel_hostWithAddress_1, address?._id ?? ffi.nullptr);
+    return NSHost._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool isEqualToHost_(NSHost? aHost) {
+    return _lib._objc_msgSend_755(
+        _id, _lib._sel_isEqualToHost_1, aHost?._id ?? ffi.nullptr);
+  }
+
+  NSString? get name {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_name1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get names {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_names1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get address {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_address1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get addresses {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_addresses1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get localizedName {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_localizedName1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static void setHostCacheEnabled_(AVFAudio _lib, bool flag) {
+    return _lib._objc_msgSend_756(
+        _lib._class_NSHost1, _lib._sel_setHostCacheEnabled_1, flag);
+  }
+
+  static bool isHostCacheEnabled(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSHost1, _lib._sel_isHostCacheEnabled1);
+  }
+
+  static void flushHostCache(AVFAudio _lib) {
+    return _lib._objc_msgSend_1(_lib._class_NSHost1, _lib._sel_flushHostCache1);
+  }
+
+  static NSHost new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSHost1, _lib._sel_new1);
+    return NSHost._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSHost alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSHost1, _lib._sel_alloc1);
+    return NSHost._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSHost1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSHost1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSHost1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSHost1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSHost1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSHost1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSHost1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSHost1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSHost1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSURLResponse extends NSObject {
+  NSURLResponse._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURLResponse] that points to the same underlying object as [other].
+  static NSURLResponse castFrom<T extends _ObjCWrapper>(T other) {
+    return NSURLResponse._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSURLResponse] that wraps the given raw object pointer.
+  static NSURLResponse castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURLResponse._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURLResponse].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSURLResponse1);
+  }
+
+  NSURLResponse initWithURL_MIMEType_expectedContentLength_textEncodingName_(
+      NSURL? URL, NSString? MIMEType, int length, NSString? name) {
+    final _ret = _lib._objc_msgSend_762(
+        _id,
+        _lib._sel_initWithURL_MIMEType_expectedContentLength_textEncodingName_1,
+        URL?._id ?? ffi.nullptr,
+        MIMEType?._id ?? ffi.nullptr,
+        length,
+        name?._id ?? ffi.nullptr);
+    return NSURLResponse._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get URL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_URL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get MIMEType {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_MIMEType1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get expectedContentLength {
+    return _lib._objc_msgSend_214(_id, _lib._sel_expectedContentLength1);
+  }
+
+  NSString? get textEncodingName {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_textEncodingName1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get suggestedFilename {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_suggestedFilename1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLResponse new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSURLResponse1, _lib._sel_new1);
+    return NSURLResponse._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSURLResponse alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSURLResponse1, _lib._sel_alloc1);
+    return NSURLResponse._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURLResponse1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLResponse1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLResponse1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLResponse1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURLResponse1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURLResponse1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURLResponse1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSURLResponse1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLResponse1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSURLSessionTaskState {
+  static const int NSURLSessionTaskStateRunning = 0;
+  static const int NSURLSessionTaskStateSuspended = 1;
+  static const int NSURLSessionTaskStateCanceling = 2;
+  static const int NSURLSessionTaskStateCompleted = 3;
+}
+
+void _ObjCBlock30_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ObjCObject> arg0) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ObjCObject> arg0)>>()
+      .asFunction<void Function(ffi.Pointer<ObjCObject> arg0)>()(arg0);
+}
+
+final _ObjCBlock30_closureRegistry = <int, Function>{};
+int _ObjCBlock30_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock30_registerClosure(Function fn) {
+  final id = ++_ObjCBlock30_closureRegistryIndex;
+  _ObjCBlock30_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock30_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ObjCObject> arg0) {
+  return _ObjCBlock30_closureRegistry[block.ref.target.address]!(arg0);
+}
+
+class ObjCBlock30 extends _ObjCBlockBase {
+  ObjCBlock30._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock30.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0)>(
+                        _ObjCBlock30_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock30.fromFunction(
+      AVFAudio lib, void Function(ffi.Pointer<ObjCObject> arg0) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0)>(
+                        _ObjCBlock30_closureTrampoline)
+                    .cast(),
+                _ObjCBlock30_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0)>>()
+        .asFunction<
+            void Function(ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0)>()(_id, arg0);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class NSIndexPath extends NSObject {
+  NSIndexPath._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSIndexPath] that points to the same underlying object as [other].
+  static NSIndexPath castFrom<T extends _ObjCWrapper>(T other) {
+    return NSIndexPath._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSIndexPath] that wraps the given raw object pointer.
+  static NSIndexPath castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSIndexPath._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSIndexPath].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSIndexPath1);
+  }
+
+  static NSIndexPath indexPathWithIndex_(AVFAudio _lib, int index) {
+    final _ret = _lib._objc_msgSend_60(
+        _lib._class_NSIndexPath1, _lib._sel_indexPathWithIndex_1, index);
+    return NSIndexPath._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSIndexPath indexPathWithIndexes_length_(
+      AVFAudio _lib, ffi.Pointer<NSUInteger> indexes, int length) {
+    final _ret = _lib._objc_msgSend_768(_lib._class_NSIndexPath1,
+        _lib._sel_indexPathWithIndexes_length_1, indexes, length);
+    return NSIndexPath._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSIndexPath initWithIndexes_length_(
+      ffi.Pointer<NSUInteger> indexes, int length) {
+    final _ret = _lib._objc_msgSend_768(
+        _id, _lib._sel_initWithIndexes_length_1, indexes, length);
+    return NSIndexPath._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSIndexPath initWithIndex_(int index) {
+    final _ret = _lib._objc_msgSend_60(_id, _lib._sel_initWithIndex_1, index);
+    return NSIndexPath._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSIndexPath indexPathByAddingIndex_(int index) {
+    final _ret =
+        _lib._objc_msgSend_769(_id, _lib._sel_indexPathByAddingIndex_1, index);
+    return NSIndexPath._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSIndexPath indexPathByRemovingLastIndex() {
+    final _ret =
+        _lib._objc_msgSend_770(_id, _lib._sel_indexPathByRemovingLastIndex1);
+    return NSIndexPath._(_ret, _lib, retain: true, release: true);
+  }
+
+  int indexAtPosition_(int position) {
+    return _lib._objc_msgSend_86(_id, _lib._sel_indexAtPosition_1, position);
+  }
+
+  int get length {
+    return _lib._objc_msgSend_10(_id, _lib._sel_length1);
+  }
+
+  void getIndexes_range_(
+      ffi.Pointer<NSUInteger> indexes, NSRange positionRange) {
+    return _lib._objc_msgSend_771(
+        _id, _lib._sel_getIndexes_range_1, indexes, positionRange);
+  }
+
+  int compare_(NSIndexPath? otherObject) {
+    return _lib._objc_msgSend_772(
+        _id, _lib._sel_compare_1, otherObject?._id ?? ffi.nullptr);
+  }
+
+  void getIndexes_(ffi.Pointer<NSUInteger> indexes) {
+    return _lib._objc_msgSend_773(_id, _lib._sel_getIndexes_1, indexes);
+  }
+
+  static NSIndexPath new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSIndexPath1, _lib._sel_new1);
+    return NSIndexPath._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSIndexPath alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSIndexPath1, _lib._sel_alloc1);
+    return NSIndexPath._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSIndexPath1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSIndexPath1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSIndexPath1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSIndexPath1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSIndexPath1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSIndexPath1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSIndexPath1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSIndexPath1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSIndexPath1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSInflectionRule extends NSObject {
+  NSInflectionRule._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSInflectionRule] that points to the same underlying object as [other].
+  static NSInflectionRule castFrom<T extends _ObjCWrapper>(T other) {
+    return NSInflectionRule._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSInflectionRule] that wraps the given raw object pointer.
+  static NSInflectionRule castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSInflectionRule._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSInflectionRule].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSInflectionRule1);
+  }
+
+  @override
+  NSObject init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSInflectionRule? getAutomaticRule(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_774(
+        _lib._class_NSInflectionRule1, _lib._sel_automaticRule1);
+    return _ret.address == 0
+        ? null
+        : NSInflectionRule._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool canInflectLanguage_(AVFAudio _lib, NSString? language) {
+    return _lib._objc_msgSend_59(_lib._class_NSInflectionRule1,
+        _lib._sel_canInflectLanguage_1, language?._id ?? ffi.nullptr);
+  }
+
+  static bool getCanInflectPreferredLocalization(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSInflectionRule1,
+        _lib._sel_canInflectPreferredLocalization1);
+  }
+
+  static NSInflectionRule new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSInflectionRule1, _lib._sel_new1);
+    return NSInflectionRule._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSInflectionRule alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSInflectionRule1, _lib._sel_alloc1);
+    return NSInflectionRule._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSInflectionRule1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSInflectionRule1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSInflectionRule1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSInflectionRule1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSInflectionRule1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSInflectionRule1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSInflectionRule1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSInflectionRule1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSInflectionRule1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSMorphology extends NSObject {
+  NSMorphology._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSMorphology] that points to the same underlying object as [other].
+  static NSMorphology castFrom<T extends _ObjCWrapper>(T other) {
+    return NSMorphology._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSMorphology] that wraps the given raw object pointer.
+  static NSMorphology castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSMorphology._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSMorphology].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSMorphology1);
+  }
+
+  int get grammaticalGender {
+    return _lib._objc_msgSend_775(_id, _lib._sel_grammaticalGender1);
+  }
+
+  set grammaticalGender(int value) {
+    _lib._objc_msgSend_776(_id, _lib._sel_setGrammaticalGender_1, value);
+  }
+
+  int get partOfSpeech {
+    return _lib._objc_msgSend_777(_id, _lib._sel_partOfSpeech1);
+  }
+
+  set partOfSpeech(int value) {
+    _lib._objc_msgSend_778(_id, _lib._sel_setPartOfSpeech_1, value);
+  }
+
+  int get number {
+    return _lib._objc_msgSend_779(_id, _lib._sel_number1);
+  }
+
+  set number(int value) {
+    _lib._objc_msgSend_780(_id, _lib._sel_setNumber_1, value);
+  }
+
+  NSMorphologyCustomPronoun customPronounForLanguage_(NSString? language) {
+    final _ret = _lib._objc_msgSend_781(_id,
+        _lib._sel_customPronounForLanguage_1, language?._id ?? ffi.nullptr);
+    return NSMorphologyCustomPronoun._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool setCustomPronoun_forLanguage_error_(NSMorphologyCustomPronoun? features,
+      NSString? language, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_782(
+        _id,
+        _lib._sel_setCustomPronoun_forLanguage_error_1,
+        features?._id ?? ffi.nullptr,
+        language?._id ?? ffi.nullptr,
+        error);
+  }
+
+  bool get unspecified {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isUnspecified1);
+  }
+
+  static NSMorphology? getUserMorphology(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_783(
+        _lib._class_NSMorphology1, _lib._sel_userMorphology1);
+    return _ret.address == 0
+        ? null
+        : NSMorphology._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMorphology new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMorphology1, _lib._sel_new1);
+    return NSMorphology._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSMorphology alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMorphology1, _lib._sel_alloc1);
+    return NSMorphology._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSMorphology1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSMorphology1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSMorphology1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSMorphology1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSMorphology1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSMorphology1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSMorphology1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSMorphology1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSMorphology1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSGrammaticalGender {
+  static const int NSGrammaticalGenderNotSet = 0;
+  static const int NSGrammaticalGenderFeminine = 1;
+  static const int NSGrammaticalGenderMasculine = 2;
+  static const int NSGrammaticalGenderNeuter = 3;
+}
+
+abstract class NSGrammaticalPartOfSpeech {
+  static const int NSGrammaticalPartOfSpeechNotSet = 0;
+  static const int NSGrammaticalPartOfSpeechDeterminer = 1;
+  static const int NSGrammaticalPartOfSpeechPronoun = 2;
+  static const int NSGrammaticalPartOfSpeechLetter = 3;
+  static const int NSGrammaticalPartOfSpeechAdverb = 4;
+  static const int NSGrammaticalPartOfSpeechParticle = 5;
+  static const int NSGrammaticalPartOfSpeechAdjective = 6;
+  static const int NSGrammaticalPartOfSpeechAdposition = 7;
+  static const int NSGrammaticalPartOfSpeechVerb = 8;
+  static const int NSGrammaticalPartOfSpeechNoun = 9;
+  static const int NSGrammaticalPartOfSpeechConjunction = 10;
+  static const int NSGrammaticalPartOfSpeechNumeral = 11;
+  static const int NSGrammaticalPartOfSpeechInterjection = 12;
+  static const int NSGrammaticalPartOfSpeechPreposition = 13;
+  static const int NSGrammaticalPartOfSpeechAbbreviation = 14;
+}
+
+abstract class NSGrammaticalNumber {
+  static const int NSGrammaticalNumberNotSet = 0;
+  static const int NSGrammaticalNumberSingular = 1;
+  static const int NSGrammaticalNumberZero = 2;
+  static const int NSGrammaticalNumberPlural = 3;
+  static const int NSGrammaticalNumberPluralTwo = 4;
+  static const int NSGrammaticalNumberPluralFew = 5;
+  static const int NSGrammaticalNumberPluralMany = 6;
+}
+
+class NSMorphologyCustomPronoun extends NSObject {
+  NSMorphologyCustomPronoun._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSMorphologyCustomPronoun] that points to the same underlying object as [other].
+  static NSMorphologyCustomPronoun castFrom<T extends _ObjCWrapper>(T other) {
+    return NSMorphologyCustomPronoun._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSMorphologyCustomPronoun] that wraps the given raw object pointer.
+  static NSMorphologyCustomPronoun castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSMorphologyCustomPronoun._(other, lib,
+        retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSMorphologyCustomPronoun].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSMorphologyCustomPronoun1);
+  }
+
+  static bool isSupportedForLanguage_(AVFAudio _lib, NSString? language) {
+    return _lib._objc_msgSend_59(_lib._class_NSMorphologyCustomPronoun1,
+        _lib._sel_isSupportedForLanguage_1, language?._id ?? ffi.nullptr);
+  }
+
+  static NSArray requiredKeysForLanguage_(AVFAudio _lib, NSString? language) {
+    final _ret = _lib._objc_msgSend_119(_lib._class_NSMorphologyCustomPronoun1,
+        _lib._sel_requiredKeysForLanguage_1, language?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get subjectForm {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_subjectForm1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set subjectForm(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setSubjectForm_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get objectForm {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_objectForm1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set objectForm(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setObjectForm_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get possessiveForm {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_possessiveForm1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set possessiveForm(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setPossessiveForm_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get possessiveAdjectiveForm {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_possessiveAdjectiveForm1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set possessiveAdjectiveForm(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setPossessiveAdjectiveForm_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get reflexiveForm {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_reflexiveForm1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set reflexiveForm(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setReflexiveForm_1, value?._id ?? ffi.nullptr);
+  }
+
+  static NSMorphologyCustomPronoun new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSMorphologyCustomPronoun1, _lib._sel_new1);
+    return NSMorphologyCustomPronoun._(_ret, _lib,
+        retain: false, release: true);
+  }
+
+  static NSMorphologyCustomPronoun alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSMorphologyCustomPronoun1, _lib._sel_alloc1);
+    return NSMorphologyCustomPronoun._(_ret, _lib,
+        retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSMorphologyCustomPronoun1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSMorphologyCustomPronoun1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSMorphologyCustomPronoun1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSMorphologyCustomPronoun1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSMorphologyCustomPronoun1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSMorphologyCustomPronoun1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSMorphologyCustomPronoun1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSMorphologyCustomPronoun1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSMorphologyCustomPronoun1,
+        _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSOperationQueue extends NSObject {
+  NSOperationQueue._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSOperationQueue] that points to the same underlying object as [other].
+  static NSOperationQueue castFrom<T extends _ObjCWrapper>(T other) {
+    return NSOperationQueue._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSOperationQueue] that wraps the given raw object pointer.
+  static NSOperationQueue castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSOperationQueue._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSOperationQueue].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSOperationQueue1);
+  }
+
+  NSProgress? get progress {
+    final _ret = _lib._objc_msgSend_577(_id, _lib._sel_progress1);
+    return _ret.address == 0
+        ? null
+        : NSProgress._(_ret, _lib, retain: true, release: true);
+  }
+
+  void addOperation_(NSOperation? op) {
+    return _lib._objc_msgSend_784(
+        _id, _lib._sel_addOperation_1, op?._id ?? ffi.nullptr);
+  }
+
+  void addOperations_waitUntilFinished_(NSArray? ops, bool wait) {
+    return _lib._objc_msgSend_787(
+        _id,
+        _lib._sel_addOperations_waitUntilFinished_1,
+        ops?._id ?? ffi.nullptr,
+        wait);
+  }
+
+  void addOperationWithBlock_(ObjCBlock16 block) {
+    return _lib._objc_msgSend_465(
+        _id, _lib._sel_addOperationWithBlock_1, block._id);
+  }
+
+  void addBarrierBlock_(ObjCBlock16 barrier) {
+    return _lib._objc_msgSend_465(
+        _id, _lib._sel_addBarrierBlock_1, barrier._id);
+  }
+
+  int get maxConcurrentOperationCount {
+    return _lib._objc_msgSend_78(_id, _lib._sel_maxConcurrentOperationCount1);
+  }
+
+  set maxConcurrentOperationCount(int value) {
+    _lib._objc_msgSend_558(
+        _id, _lib._sel_setMaxConcurrentOperationCount_1, value);
+  }
+
+  bool get suspended {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isSuspended1);
+  }
+
+  set suspended(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setSuspended_1, value);
+  }
+
+  NSString? get name {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_name1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set name(NSString? value) {
+    _lib._objc_msgSend_477(_id, _lib._sel_setName_1, value?._id ?? ffi.nullptr);
+  }
+
+  int get qualityOfService {
+    return _lib._objc_msgSend_475(_id, _lib._sel_qualityOfService1);
+  }
+
+  set qualityOfService(int value) {
+    _lib._objc_msgSend_476(_id, _lib._sel_setQualityOfService_1, value);
+  }
+
+  dispatch_queue_t get underlyingQueue {
+    return _lib._objc_msgSend_788(_id, _lib._sel_underlyingQueue1);
+  }
+
+  set underlyingQueue(dispatch_queue_t value) {
+    _lib._objc_msgSend_789(_id, _lib._sel_setUnderlyingQueue_1, value);
+  }
+
+  void cancelAllOperations() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_cancelAllOperations1);
+  }
+
+  void waitUntilAllOperationsAreFinished() {
+    return _lib._objc_msgSend_1(
+        _id, _lib._sel_waitUntilAllOperationsAreFinished1);
+  }
+
+  static NSOperationQueue? getCurrentQueue(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_790(
+        _lib._class_NSOperationQueue1, _lib._sel_currentQueue1);
+    return _ret.address == 0
+        ? null
+        : NSOperationQueue._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSOperationQueue? getMainQueue(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_790(
+        _lib._class_NSOperationQueue1, _lib._sel_mainQueue1);
+    return _ret.address == 0
+        ? null
+        : NSOperationQueue._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get operations {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_operations1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get operationCount {
+    return _lib._objc_msgSend_10(_id, _lib._sel_operationCount1);
+  }
+
+  static NSOperationQueue new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSOperationQueue1, _lib._sel_new1);
+    return NSOperationQueue._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSOperationQueue alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSOperationQueue1, _lib._sel_alloc1);
+    return NSOperationQueue._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSOperationQueue1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSOperationQueue1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSOperationQueue1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSOperationQueue1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSOperationQueue1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSOperationQueue1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSOperationQueue1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSOperationQueue1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSOperationQueue1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSOperation extends NSObject {
+  NSOperation._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSOperation] that points to the same underlying object as [other].
+  static NSOperation castFrom<T extends _ObjCWrapper>(T other) {
+    return NSOperation._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSOperation] that wraps the given raw object pointer.
+  static NSOperation castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSOperation._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSOperation].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSOperation1);
+  }
+
+  void start() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_start1);
+  }
+
+  void main() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_main1);
+  }
+
+  bool get cancelled {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isCancelled1);
+  }
+
+  void cancel() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_cancel1);
+  }
+
+  bool get executing {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isExecuting1);
+  }
+
+  bool get finished {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isFinished1);
+  }
+
+  bool get concurrent {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isConcurrent1);
+  }
+
+  bool get asynchronous {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isAsynchronous1);
+  }
+
+  bool get ready {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isReady1);
+  }
+
+  void addDependency_(NSOperation? op) {
+    return _lib._objc_msgSend_784(
+        _id, _lib._sel_addDependency_1, op?._id ?? ffi.nullptr);
+  }
+
+  void removeDependency_(NSOperation? op) {
+    return _lib._objc_msgSend_784(
+        _id, _lib._sel_removeDependency_1, op?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get dependencies {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_dependencies1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get queuePriority {
+    return _lib._objc_msgSend_785(_id, _lib._sel_queuePriority1);
+  }
+
+  set queuePriority(int value) {
+    _lib._objc_msgSend_786(_id, _lib._sel_setQueuePriority_1, value);
+  }
+
+  ObjCBlock16 get completionBlock {
+    final _ret = _lib._objc_msgSend_586(_id, _lib._sel_completionBlock1);
+    return ObjCBlock16._(_ret, _lib);
+  }
+
+  set completionBlock(ObjCBlock16 value) {
+    _lib._objc_msgSend_587(_id, _lib._sel_setCompletionBlock_1, value._id);
+  }
+
+  void waitUntilFinished() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_waitUntilFinished1);
+  }
+
+  double get threadPriority {
+    return _lib._objc_msgSend_149(_id, _lib._sel_threadPriority1);
+  }
+
+  set threadPriority(double value) {
+    _lib._objc_msgSend_474(_id, _lib._sel_setThreadPriority_1, value);
+  }
+
+  int get qualityOfService {
+    return _lib._objc_msgSend_475(_id, _lib._sel_qualityOfService1);
+  }
+
+  set qualityOfService(int value) {
+    _lib._objc_msgSend_476(_id, _lib._sel_setQualityOfService_1, value);
+  }
+
+  NSString? get name {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_name1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set name(NSString? value) {
+    _lib._objc_msgSend_477(_id, _lib._sel_setName_1, value?._id ?? ffi.nullptr);
+  }
+
+  static NSOperation new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSOperation1, _lib._sel_new1);
+    return NSOperation._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSOperation alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSOperation1, _lib._sel_alloc1);
+    return NSOperation._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSOperation1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSOperation1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSOperation1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSOperation1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSOperation1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSOperation1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSOperation1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSOperation1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSOperation1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSOperationQueuePriority {
+  static const int NSOperationQueuePriorityVeryLow = -8;
+  static const int NSOperationQueuePriorityLow = -4;
+  static const int NSOperationQueuePriorityNormal = 0;
+  static const int NSOperationQueuePriorityHigh = 4;
+  static const int NSOperationQueuePriorityVeryHigh = 8;
+}
+
+typedef dispatch_queue_t = ffi.Pointer<ObjCObject>;
+
+class NSPointerArray extends NSObject {
+  NSPointerArray._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSPointerArray] that points to the same underlying object as [other].
+  static NSPointerArray castFrom<T extends _ObjCWrapper>(T other) {
+    return NSPointerArray._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSPointerArray] that wraps the given raw object pointer.
+  static NSPointerArray castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSPointerArray._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSPointerArray].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSPointerArray1);
+  }
+
+  NSPointerArray initWithOptions_(int options) {
+    final _ret =
+        _lib._objc_msgSend_791(_id, _lib._sel_initWithOptions_1, options);
+    return NSPointerArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSPointerArray initWithPointerFunctions_(NSPointerFunctions? functions) {
+    final _ret = _lib._objc_msgSend_805(_id,
+        _lib._sel_initWithPointerFunctions_1, functions?._id ?? ffi.nullptr);
+    return NSPointerArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSPointerArray pointerArrayWithOptions_(AVFAudio _lib, int options) {
+    final _ret = _lib._objc_msgSend_806(_lib._class_NSPointerArray1,
+        _lib._sel_pointerArrayWithOptions_1, options);
+    return NSPointerArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSPointerArray pointerArrayWithPointerFunctions_(
+      AVFAudio _lib, NSPointerFunctions? functions) {
+    final _ret = _lib._objc_msgSend_807(
+        _lib._class_NSPointerArray1,
+        _lib._sel_pointerArrayWithPointerFunctions_1,
+        functions?._id ?? ffi.nullptr);
+    return NSPointerArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSPointerFunctions? get pointerFunctions {
+    final _ret = _lib._objc_msgSend_808(_id, _lib._sel_pointerFunctions1);
+    return _ret.address == 0
+        ? null
+        : NSPointerFunctions._(_ret, _lib, retain: true, release: true);
+  }
+
+  ffi.Pointer<ffi.Void> pointerAtIndex_(int index) {
+    return _lib._objc_msgSend_809(_id, _lib._sel_pointerAtIndex_1, index);
+  }
+
+  void addPointer_(ffi.Pointer<ffi.Void> pointer) {
+    return _lib._objc_msgSend_47(_id, _lib._sel_addPointer_1, pointer);
+  }
+
+  void removePointerAtIndex_(int index) {
+    return _lib._objc_msgSend_410(_id, _lib._sel_removePointerAtIndex_1, index);
+  }
+
+  void insertPointer_atIndex_(ffi.Pointer<ffi.Void> item, int index) {
+    return _lib._objc_msgSend_21(
+        _id, _lib._sel_insertPointer_atIndex_1, item, index);
+  }
+
+  void replacePointerAtIndex_withPointer_(
+      int index, ffi.Pointer<ffi.Void> item) {
+    return _lib._objc_msgSend_810(
+        _id, _lib._sel_replacePointerAtIndex_withPointer_1, index, item);
+  }
+
+  void compact() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_compact1);
+  }
+
+  int get count {
+    return _lib._objc_msgSend_10(_id, _lib._sel_count1);
+  }
+
+  set count(int value) {
+    _lib._objc_msgSend_451(_id, _lib._sel_setCount_1, value);
+  }
+
+  static NSObject pointerArrayWithStrongObjects(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSPointerArray1, _lib._sel_pointerArrayWithStrongObjects1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject pointerArrayWithWeakObjects(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSPointerArray1, _lib._sel_pointerArrayWithWeakObjects1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSPointerArray strongObjectsPointerArray(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_811(
+        _lib._class_NSPointerArray1, _lib._sel_strongObjectsPointerArray1);
+    return NSPointerArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSPointerArray weakObjectsPointerArray(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_811(
+        _lib._class_NSPointerArray1, _lib._sel_weakObjectsPointerArray1);
+    return NSPointerArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get allObjects {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_allObjects1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSPointerArray new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSPointerArray1, _lib._sel_new1);
+    return NSPointerArray._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSPointerArray alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSPointerArray1, _lib._sel_alloc1);
+    return NSPointerArray._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSPointerArray1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSPointerArray1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSPointerArray1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSPointerArray1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSPointerArray1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSPointerArray1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSPointerArray1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSPointerArray1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSPointerArray1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSPointerFunctionsOptions {
+  static const int NSPointerFunctionsStrongMemory = 0;
+  static const int NSPointerFunctionsZeroingWeakMemory = 1;
+  static const int NSPointerFunctionsOpaqueMemory = 2;
+  static const int NSPointerFunctionsMallocMemory = 3;
+  static const int NSPointerFunctionsMachVirtualMemory = 4;
+  static const int NSPointerFunctionsWeakMemory = 5;
+  static const int NSPointerFunctionsObjectPersonality = 0;
+  static const int NSPointerFunctionsOpaquePersonality = 256;
+  static const int NSPointerFunctionsObjectPointerPersonality = 512;
+  static const int NSPointerFunctionsCStringPersonality = 768;
+  static const int NSPointerFunctionsStructPersonality = 1024;
+  static const int NSPointerFunctionsIntegerPersonality = 1280;
+  static const int NSPointerFunctionsCopyIn = 65536;
+}
+
+class NSPointerFunctions extends NSObject {
+  NSPointerFunctions._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSPointerFunctions] that points to the same underlying object as [other].
+  static NSPointerFunctions castFrom<T extends _ObjCWrapper>(T other) {
+    return NSPointerFunctions._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSPointerFunctions] that wraps the given raw object pointer.
+  static NSPointerFunctions castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSPointerFunctions._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSPointerFunctions].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSPointerFunctions1);
+  }
+
+  NSPointerFunctions initWithOptions_(int options) {
+    final _ret =
+        _lib._objc_msgSend_791(_id, _lib._sel_initWithOptions_1, options);
+    return NSPointerFunctions._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSPointerFunctions pointerFunctionsWithOptions_(
+      AVFAudio _lib, int options) {
+    final _ret = _lib._objc_msgSend_792(_lib._class_NSPointerFunctions1,
+        _lib._sel_pointerFunctionsWithOptions_1, options);
+    return NSPointerFunctions._(_ret, _lib, retain: true, release: true);
+  }
+
+  ffi.Pointer<
+          ffi.NativeFunction<
+              NSUInteger Function(
+                  ffi.Pointer<ffi.Void>,
+                  ffi.Pointer<
+                      ffi.NativeFunction<
+                          NSUInteger Function(ffi.Pointer<ffi.Void>)>>)>>
+      get hashFunction {
+    return _lib._objc_msgSend_793(_id, _lib._sel_hashFunction1);
+  }
+
+  set hashFunction(
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  NSUInteger Function(
+                      ffi.Pointer<ffi.Void>,
+                      ffi.Pointer<
+                          ffi.NativeFunction<
+                              NSUInteger Function(ffi.Pointer<ffi.Void>)>>)>>
+          value) {
+    _lib._objc_msgSend_794(_id, _lib._sel_setHashFunction_1, value);
+  }
+
+  ffi.Pointer<
+          ffi.NativeFunction<
+              ffi.Bool Function(
+                  ffi.Pointer<ffi.Void>,
+                  ffi.Pointer<ffi.Void>,
+                  ffi.Pointer<
+                      ffi.NativeFunction<
+                          NSUInteger Function(ffi.Pointer<ffi.Void>)>>)>>
+      get isEqualFunction {
+    return _lib._objc_msgSend_795(_id, _lib._sel_isEqualFunction1);
+  }
+
+  set isEqualFunction(
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Bool Function(
+                      ffi.Pointer<ffi.Void>,
+                      ffi.Pointer<ffi.Void>,
+                      ffi.Pointer<
+                          ffi.NativeFunction<
+                              NSUInteger Function(ffi.Pointer<ffi.Void>)>>)>>
+          value) {
+    _lib._objc_msgSend_796(_id, _lib._sel_setIsEqualFunction_1, value);
+  }
+
+  ffi.Pointer<ffi.NativeFunction<NSUInteger Function(ffi.Pointer<ffi.Void>)>>
+      get sizeFunction {
+    return _lib._objc_msgSend_797(_id, _lib._sel_sizeFunction1);
+  }
+
+  set sizeFunction(
+      ffi.Pointer<
+              ffi.NativeFunction<NSUInteger Function(ffi.Pointer<ffi.Void>)>>
+          value) {
+    _lib._objc_msgSend_798(_id, _lib._sel_setSizeFunction_1, value);
+  }
+
+  ffi.Pointer<
+          ffi.NativeFunction<
+              ffi.Pointer<ObjCObject> Function(ffi.Pointer<ffi.Void>)>>
+      get descriptionFunction {
+    return _lib._objc_msgSend_799(_id, _lib._sel_descriptionFunction1);
+  }
+
+  set descriptionFunction(
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Pointer<ObjCObject> Function(ffi.Pointer<ffi.Void>)>>
+          value) {
+    _lib._objc_msgSend_800(_id, _lib._sel_setDescriptionFunction_1, value);
+  }
+
+  ffi.Pointer<
+          ffi.NativeFunction<
+              ffi.Void Function(
+                  ffi.Pointer<ffi.Void>,
+                  ffi.Pointer<
+                      ffi.NativeFunction<
+                          NSUInteger Function(ffi.Pointer<ffi.Void>)>>)>>
+      get relinquishFunction {
+    return _lib._objc_msgSend_801(_id, _lib._sel_relinquishFunction1);
+  }
+
+  set relinquishFunction(
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(
+                      ffi.Pointer<ffi.Void>,
+                      ffi.Pointer<
+                          ffi.NativeFunction<
+                              NSUInteger Function(ffi.Pointer<ffi.Void>)>>)>>
+          value) {
+    _lib._objc_msgSend_802(_id, _lib._sel_setRelinquishFunction_1, value);
+  }
+
+  ffi.Pointer<
+      ffi.NativeFunction<
+          ffi.Pointer<ffi.Void> Function(
+              ffi.Pointer<ffi.Void>,
+              ffi.Pointer<
+                  ffi.NativeFunction<
+                      NSUInteger Function(ffi.Pointer<ffi.Void>)>>,
+              ffi.Bool)>> get acquireFunction {
+    return _lib._objc_msgSend_803(_id, _lib._sel_acquireFunction1);
+  }
+
+  set acquireFunction(
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Pointer<ffi.Void> Function(
+                      ffi.Pointer<ffi.Void>,
+                      ffi.Pointer<
+                          ffi.NativeFunction<
+                              NSUInteger Function(ffi.Pointer<ffi.Void>)>>,
+                      ffi.Bool)>>
+          value) {
+    _lib._objc_msgSend_804(_id, _lib._sel_setAcquireFunction_1, value);
+  }
+
+  bool get usesStrongWriteBarrier {
+    return _lib._objc_msgSend_12(_id, _lib._sel_usesStrongWriteBarrier1);
+  }
+
+  set usesStrongWriteBarrier(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setUsesStrongWriteBarrier_1, value);
+  }
+
+  bool get usesWeakReadAndWriteBarriers {
+    return _lib._objc_msgSend_12(_id, _lib._sel_usesWeakReadAndWriteBarriers1);
+  }
+
+  set usesWeakReadAndWriteBarriers(bool value) {
+    _lib._objc_msgSend_460(
+        _id, _lib._sel_setUsesWeakReadAndWriteBarriers_1, value);
+  }
+
+  static NSPointerFunctions new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSPointerFunctions1, _lib._sel_new1);
+    return NSPointerFunctions._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSPointerFunctions alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSPointerFunctions1, _lib._sel_alloc1);
+    return NSPointerFunctions._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSPointerFunctions1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSPointerFunctions1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSPointerFunctions1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSPointerFunctions1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSPointerFunctions1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSPointerFunctions1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSPointerFunctions1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSPointerFunctions1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSPointerFunctions1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSProcessInfo extends NSObject {
+  NSProcessInfo._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSProcessInfo] that points to the same underlying object as [other].
+  static NSProcessInfo castFrom<T extends _ObjCWrapper>(T other) {
+    return NSProcessInfo._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSProcessInfo] that wraps the given raw object pointer.
+  static NSProcessInfo castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSProcessInfo._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSProcessInfo].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSProcessInfo1);
+  }
+
+  static NSProcessInfo? getProcessInfo(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_812(
+        _lib._class_NSProcessInfo1, _lib._sel_processInfo1);
+    return _ret.address == 0
+        ? null
+        : NSProcessInfo._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary? get environment {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_environment1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get arguments {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_arguments1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get hostName {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_hostName1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get processName {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_processName1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set processName(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setProcessName_1, value?._id ?? ffi.nullptr);
+  }
+
+  int get processIdentifier {
+    return _lib._objc_msgSend_213(_id, _lib._sel_processIdentifier1);
+  }
+
+  NSString? get globallyUniqueString {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_globallyUniqueString1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int operatingSystem() {
+    return _lib._objc_msgSend_10(_id, _lib._sel_operatingSystem1);
+  }
+
+  NSString operatingSystemName() {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_operatingSystemName1);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get operatingSystemVersionString {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_operatingSystemVersionString1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSOperatingSystemVersion get operatingSystemVersion {
+    return _lib._objc_msgSend_813(_id, _lib._sel_operatingSystemVersion1);
+  }
+
+  int get processorCount {
+    return _lib._objc_msgSend_10(_id, _lib._sel_processorCount1);
+  }
+
+  int get activeProcessorCount {
+    return _lib._objc_msgSend_10(_id, _lib._sel_activeProcessorCount1);
+  }
+
+  int get physicalMemory {
+    return _lib._objc_msgSend_148(_id, _lib._sel_physicalMemory1);
+  }
+
+  bool isOperatingSystemAtLeastVersion_(NSOperatingSystemVersion version) {
+    return _lib._objc_msgSend_814(
+        _id, _lib._sel_isOperatingSystemAtLeastVersion_1, version);
+  }
+
+  double get systemUptime {
+    return _lib._objc_msgSend_149(_id, _lib._sel_systemUptime1);
+  }
+
+  void disableSuddenTermination() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_disableSuddenTermination1);
+  }
+
+  void enableSuddenTermination() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_enableSuddenTermination1);
+  }
+
+  void disableAutomaticTermination_(NSString? reason) {
+    return _lib._objc_msgSend_186(_id, _lib._sel_disableAutomaticTermination_1,
+        reason?._id ?? ffi.nullptr);
+  }
+
+  void enableAutomaticTermination_(NSString? reason) {
+    return _lib._objc_msgSend_186(_id, _lib._sel_enableAutomaticTermination_1,
+        reason?._id ?? ffi.nullptr);
+  }
+
+  bool get automaticTerminationSupportEnabled {
+    return _lib._objc_msgSend_12(
+        _id, _lib._sel_automaticTerminationSupportEnabled1);
+  }
+
+  set automaticTerminationSupportEnabled(bool value) {
+    _lib._objc_msgSend_460(
+        _id, _lib._sel_setAutomaticTerminationSupportEnabled_1, value);
+  }
+
+  NSObject beginActivityWithOptions_reason_(int options, NSString? reason) {
+    final _ret = _lib._objc_msgSend_815(
+        _id,
+        _lib._sel_beginActivityWithOptions_reason_1,
+        options,
+        reason?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void endActivity_(NSObject? activity) {
+    return _lib._objc_msgSend_15(
+        _id, _lib._sel_endActivity_1, activity?._id ?? ffi.nullptr);
+  }
+
+  void performActivityWithOptions_reason_usingBlock_(
+      int options, NSString? reason, ObjCBlock16 block) {
+    return _lib._objc_msgSend_816(
+        _id,
+        _lib._sel_performActivityWithOptions_reason_usingBlock_1,
+        options,
+        reason?._id ?? ffi.nullptr,
+        block._id);
+  }
+
+  void performExpiringActivityWithReason_usingBlock_(
+      NSString? reason, ObjCBlock31 block) {
+    return _lib._objc_msgSend_817(
+        _id,
+        _lib._sel_performExpiringActivityWithReason_usingBlock_1,
+        reason?._id ?? ffi.nullptr,
+        block._id);
+  }
+
+  NSString? get userName {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_userName1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get fullUserName {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_fullUserName1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get thermalState {
+    return _lib._objc_msgSend_818(_id, _lib._sel_thermalState1);
+  }
+
+  bool get lowPowerModeEnabled {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isLowPowerModeEnabled1);
+  }
+
+  bool get macCatalystApp {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isMacCatalystApp1);
+  }
+
+  bool get iOSAppOnMac {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isiOSAppOnMac1);
+  }
+
+  static NSProcessInfo new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSProcessInfo1, _lib._sel_new1);
+    return NSProcessInfo._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSProcessInfo alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSProcessInfo1, _lib._sel_alloc1);
+    return NSProcessInfo._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSProcessInfo1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSProcessInfo1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSProcessInfo1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSProcessInfo1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSProcessInfo1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSProcessInfo1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSProcessInfo1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSProcessInfo1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSProcessInfo1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSOperatingSystemVersion extends ffi.Struct {
+  @NSInteger()
+  external int majorVersion;
+
+  @NSInteger()
+  external int minorVersion;
+
+  @NSInteger()
+  external int patchVersion;
+}
+
+abstract class NSActivityOptions {
+  static const int NSActivityIdleDisplaySleepDisabled = 1099511627776;
+  static const int NSActivityIdleSystemSleepDisabled = 1048576;
+  static const int NSActivitySuddenTerminationDisabled = 16384;
+  static const int NSActivityAutomaticTerminationDisabled = 32768;
+  static const int NSActivityUserInitiated = 16777215;
+  static const int NSActivityUserInitiatedAllowingIdleSystemSleep = 15728639;
+  static const int NSActivityBackground = 255;
+  static const int NSActivityLatencyCritical = 1095216660480;
+}
+
+void _ObjCBlock31_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block, bool arg0) {
+  return block.ref.target
+      .cast<ffi.NativeFunction<ffi.Void Function(ffi.Bool arg0)>>()
+      .asFunction<void Function(bool arg0)>()(arg0);
+}
+
+final _ObjCBlock31_closureRegistry = <int, Function>{};
+int _ObjCBlock31_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock31_registerClosure(Function fn) {
+  final id = ++_ObjCBlock31_closureRegistryIndex;
+  _ObjCBlock31_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock31_closureTrampoline(ffi.Pointer<_ObjCBlock> block, bool arg0) {
+  return _ObjCBlock31_closureRegistry[block.ref.target.address]!(arg0);
+}
+
+class ObjCBlock31 extends _ObjCBlockBase {
+  ObjCBlock31._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock31.fromFunctionPointer(AVFAudio lib,
+      ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Bool arg0)>> ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                        ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                            ffi.Bool arg0)>(_ObjCBlock31_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock31.fromFunction(AVFAudio lib, void Function(bool arg0) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                        ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                            ffi.Bool arg0)>(_ObjCBlock31_closureTrampoline)
+                    .cast(),
+                _ObjCBlock31_registerClosure(fn)),
+            lib);
+  void call(bool arg0) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block, ffi.Bool arg0)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block, bool arg0)>()(_id, arg0);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+abstract class NSProcessInfoThermalState {
+  static const int NSProcessInfoThermalStateNominal = 0;
+  static const int NSProcessInfoThermalStateFair = 1;
+  static const int NSProcessInfoThermalStateSerious = 2;
+  static const int NSProcessInfoThermalStateCritical = 3;
+}
+
+class NSTextCheckingResult extends NSObject {
+  NSTextCheckingResult._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSTextCheckingResult] that points to the same underlying object as [other].
+  static NSTextCheckingResult castFrom<T extends _ObjCWrapper>(T other) {
+    return NSTextCheckingResult._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSTextCheckingResult] that wraps the given raw object pointer.
+  static NSTextCheckingResult castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSTextCheckingResult._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSTextCheckingResult].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSTextCheckingResult1);
+  }
+
+  int get resultType {
+    return _lib._objc_msgSend_819(_id, _lib._sel_resultType1);
+  }
+
+  NSRange get range {
+    return _lib._objc_msgSend_49(_id, _lib._sel_range1);
+  }
+
+  NSOrthography? get orthography {
+    final _ret = _lib._objc_msgSend_820(_id, _lib._sel_orthography1);
+    return _ret.address == 0
+        ? null
+        : NSOrthography._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get grammarDetails {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_grammarDetails1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate? get date {
+    final _ret = _lib._objc_msgSend_156(_id, _lib._sel_date1);
+    return _ret.address == 0
+        ? null
+        : NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSTimeZone? get timeZone {
+    final _ret = _lib._objc_msgSend_162(_id, _lib._sel_timeZone1);
+    return _ret.address == 0
+        ? null
+        : NSTimeZone._(_ret, _lib, retain: true, release: true);
+  }
+
+  double get duration {
+    return _lib._objc_msgSend_149(_id, _lib._sel_duration1);
+  }
+
+  NSDictionary? get components {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_components1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get URL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_URL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get replacementString {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_replacementString1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get alternativeStrings {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_alternativeStrings1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSRegularExpression? get regularExpression {
+    final _ret = _lib._objc_msgSend_832(_id, _lib._sel_regularExpression1);
+    return _ret.address == 0
+        ? null
+        : NSRegularExpression._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get phoneNumber {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_phoneNumber1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get numberOfRanges {
+    return _lib._objc_msgSend_10(_id, _lib._sel_numberOfRanges1);
+  }
+
+  NSRange rangeAtIndex_(int idx) {
+    return _lib._objc_msgSend_308(_id, _lib._sel_rangeAtIndex_1, idx);
+  }
+
+  NSRange rangeWithName_(NSString? name) {
+    return _lib._objc_msgSend_301(
+        _id, _lib._sel_rangeWithName_1, name?._id ?? ffi.nullptr);
+  }
+
+  NSTextCheckingResult resultByAdjustingRangesWithOffset_(int offset) {
+    final _ret = _lib._objc_msgSend_833(
+        _id, _lib._sel_resultByAdjustingRangesWithOffset_1, offset);
+    return NSTextCheckingResult._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary? get addressComponents {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_addressComponents1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTextCheckingResult orthographyCheckingResultWithRange_orthography_(
+      AVFAudio _lib, NSRange range, NSOrthography? orthography) {
+    final _ret = _lib._objc_msgSend_834(
+        _lib._class_NSTextCheckingResult1,
+        _lib._sel_orthographyCheckingResultWithRange_orthography_1,
+        range,
+        orthography?._id ?? ffi.nullptr);
+    return NSTextCheckingResult._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTextCheckingResult spellCheckingResultWithRange_(
+      AVFAudio _lib, NSRange range) {
+    final _ret = _lib._objc_msgSend_835(_lib._class_NSTextCheckingResult1,
+        _lib._sel_spellCheckingResultWithRange_1, range);
+    return NSTextCheckingResult._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTextCheckingResult grammarCheckingResultWithRange_details_(
+      AVFAudio _lib, NSRange range, NSArray? details) {
+    final _ret = _lib._objc_msgSend_836(
+        _lib._class_NSTextCheckingResult1,
+        _lib._sel_grammarCheckingResultWithRange_details_1,
+        range,
+        details?._id ?? ffi.nullptr);
+    return NSTextCheckingResult._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTextCheckingResult dateCheckingResultWithRange_date_(
+      AVFAudio _lib, NSRange range, NSDate? date) {
+    final _ret = _lib._objc_msgSend_837(
+        _lib._class_NSTextCheckingResult1,
+        _lib._sel_dateCheckingResultWithRange_date_1,
+        range,
+        date?._id ?? ffi.nullptr);
+    return NSTextCheckingResult._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTextCheckingResult
+      dateCheckingResultWithRange_date_timeZone_duration_(AVFAudio _lib,
+          NSRange range, NSDate? date, NSTimeZone? timeZone, double duration) {
+    final _ret = _lib._objc_msgSend_838(
+        _lib._class_NSTextCheckingResult1,
+        _lib._sel_dateCheckingResultWithRange_date_timeZone_duration_1,
+        range,
+        date?._id ?? ffi.nullptr,
+        timeZone?._id ?? ffi.nullptr,
+        duration);
+    return NSTextCheckingResult._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTextCheckingResult addressCheckingResultWithRange_components_(
+      AVFAudio _lib, NSRange range, NSDictionary? components) {
+    final _ret = _lib._objc_msgSend_839(
+        _lib._class_NSTextCheckingResult1,
+        _lib._sel_addressCheckingResultWithRange_components_1,
+        range,
+        components?._id ?? ffi.nullptr);
+    return NSTextCheckingResult._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTextCheckingResult linkCheckingResultWithRange_URL_(
+      AVFAudio _lib, NSRange range, NSURL? url) {
+    final _ret = _lib._objc_msgSend_840(
+        _lib._class_NSTextCheckingResult1,
+        _lib._sel_linkCheckingResultWithRange_URL_1,
+        range,
+        url?._id ?? ffi.nullptr);
+    return NSTextCheckingResult._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTextCheckingResult quoteCheckingResultWithRange_replacementString_(
+      AVFAudio _lib, NSRange range, NSString? replacementString) {
+    final _ret = _lib._objc_msgSend_841(
+        _lib._class_NSTextCheckingResult1,
+        _lib._sel_quoteCheckingResultWithRange_replacementString_1,
+        range,
+        replacementString?._id ?? ffi.nullptr);
+    return NSTextCheckingResult._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTextCheckingResult dashCheckingResultWithRange_replacementString_(
+      AVFAudio _lib, NSRange range, NSString? replacementString) {
+    final _ret = _lib._objc_msgSend_841(
+        _lib._class_NSTextCheckingResult1,
+        _lib._sel_dashCheckingResultWithRange_replacementString_1,
+        range,
+        replacementString?._id ?? ffi.nullptr);
+    return NSTextCheckingResult._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTextCheckingResult
+      replacementCheckingResultWithRange_replacementString_(
+          AVFAudio _lib, NSRange range, NSString? replacementString) {
+    final _ret = _lib._objc_msgSend_841(
+        _lib._class_NSTextCheckingResult1,
+        _lib._sel_replacementCheckingResultWithRange_replacementString_1,
+        range,
+        replacementString?._id ?? ffi.nullptr);
+    return NSTextCheckingResult._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTextCheckingResult
+      correctionCheckingResultWithRange_replacementString_(
+          AVFAudio _lib, NSRange range, NSString? replacementString) {
+    final _ret = _lib._objc_msgSend_841(
+        _lib._class_NSTextCheckingResult1,
+        _lib._sel_correctionCheckingResultWithRange_replacementString_1,
+        range,
+        replacementString?._id ?? ffi.nullptr);
+    return NSTextCheckingResult._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTextCheckingResult
+      correctionCheckingResultWithRange_replacementString_alternativeStrings_(
+          AVFAudio _lib,
+          NSRange range,
+          NSString? replacementString,
+          NSArray? alternativeStrings) {
+    final _ret = _lib._objc_msgSend_842(
+        _lib._class_NSTextCheckingResult1,
+        _lib._sel_correctionCheckingResultWithRange_replacementString_alternativeStrings_1,
+        range,
+        replacementString?._id ?? ffi.nullptr,
+        alternativeStrings?._id ?? ffi.nullptr);
+    return NSTextCheckingResult._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTextCheckingResult
+      regularExpressionCheckingResultWithRanges_count_regularExpression_(
+          AVFAudio _lib,
+          NSRangePointer ranges,
+          int count,
+          NSRegularExpression? regularExpression) {
+    final _ret = _lib._objc_msgSend_843(
+        _lib._class_NSTextCheckingResult1,
+        _lib._sel_regularExpressionCheckingResultWithRanges_count_regularExpression_1,
+        ranges,
+        count,
+        regularExpression?._id ?? ffi.nullptr);
+    return NSTextCheckingResult._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTextCheckingResult phoneNumberCheckingResultWithRange_phoneNumber_(
+      AVFAudio _lib, NSRange range, NSString? phoneNumber) {
+    final _ret = _lib._objc_msgSend_841(
+        _lib._class_NSTextCheckingResult1,
+        _lib._sel_phoneNumberCheckingResultWithRange_phoneNumber_1,
+        range,
+        phoneNumber?._id ?? ffi.nullptr);
+    return NSTextCheckingResult._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTextCheckingResult
+      transitInformationCheckingResultWithRange_components_(
+          AVFAudio _lib, NSRange range, NSDictionary? components) {
+    final _ret = _lib._objc_msgSend_839(
+        _lib._class_NSTextCheckingResult1,
+        _lib._sel_transitInformationCheckingResultWithRange_components_1,
+        range,
+        components?._id ?? ffi.nullptr);
+    return NSTextCheckingResult._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTextCheckingResult new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSTextCheckingResult1, _lib._sel_new1);
+    return NSTextCheckingResult._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSTextCheckingResult alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSTextCheckingResult1, _lib._sel_alloc1);
+    return NSTextCheckingResult._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSTextCheckingResult1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSTextCheckingResult1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSTextCheckingResult1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSTextCheckingResult1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSTextCheckingResult1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSTextCheckingResult1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSTextCheckingResult1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSTextCheckingResult1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSTextCheckingResult1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSTextCheckingType {
+  static const int NSTextCheckingTypeOrthography = 1;
+  static const int NSTextCheckingTypeSpelling = 2;
+  static const int NSTextCheckingTypeGrammar = 4;
+  static const int NSTextCheckingTypeDate = 8;
+  static const int NSTextCheckingTypeAddress = 16;
+  static const int NSTextCheckingTypeLink = 32;
+  static const int NSTextCheckingTypeQuote = 64;
+  static const int NSTextCheckingTypeDash = 128;
+  static const int NSTextCheckingTypeReplacement = 256;
+  static const int NSTextCheckingTypeCorrection = 512;
+  static const int NSTextCheckingTypeRegularExpression = 1024;
+  static const int NSTextCheckingTypePhoneNumber = 2048;
+  static const int NSTextCheckingTypeTransitInformation = 4096;
+}
+
+class NSRegularExpression extends NSObject {
+  NSRegularExpression._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSRegularExpression] that points to the same underlying object as [other].
+  static NSRegularExpression castFrom<T extends _ObjCWrapper>(T other) {
+    return NSRegularExpression._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSRegularExpression] that wraps the given raw object pointer.
+  static NSRegularExpression castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSRegularExpression._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSRegularExpression].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSRegularExpression1);
+  }
+
+  static NSRegularExpression regularExpressionWithPattern_options_error_(
+      AVFAudio _lib,
+      NSString? pattern,
+      int options,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_821(
+        _lib._class_NSRegularExpression1,
+        _lib._sel_regularExpressionWithPattern_options_error_1,
+        pattern?._id ?? ffi.nullptr,
+        options,
+        error);
+    return NSRegularExpression._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSRegularExpression initWithPattern_options_error_(NSString? pattern,
+      int options, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_822(
+        _id,
+        _lib._sel_initWithPattern_options_error_1,
+        pattern?._id ?? ffi.nullptr,
+        options,
+        error);
+    return NSRegularExpression._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get pattern {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_pattern1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get options {
+    return _lib._objc_msgSend_823(_id, _lib._sel_options1);
+  }
+
+  int get numberOfCaptureGroups {
+    return _lib._objc_msgSend_10(_id, _lib._sel_numberOfCaptureGroups1);
+  }
+
+  static NSString escapedPatternForString_(AVFAudio _lib, NSString? string) {
+    final _ret = _lib._objc_msgSend_64(_lib._class_NSRegularExpression1,
+        _lib._sel_escapedPatternForString_1, string?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  void enumerateMatchesInString_options_range_usingBlock_(
+      NSString? string, int options, NSRange range, ObjCBlock32 block) {
+    return _lib._objc_msgSend_824(
+        _id,
+        _lib._sel_enumerateMatchesInString_options_range_usingBlock_1,
+        string?._id ?? ffi.nullptr,
+        options,
+        range,
+        block._id);
+  }
+
+  NSArray matchesInString_options_range_(
+      NSString? string, int options, NSRange range) {
+    final _ret = _lib._objc_msgSend_825(
+        _id,
+        _lib._sel_matchesInString_options_range_1,
+        string?._id ?? ffi.nullptr,
+        options,
+        range);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  int numberOfMatchesInString_options_range_(
+      NSString? string, int options, NSRange range) {
+    return _lib._objc_msgSend_826(
+        _id,
+        _lib._sel_numberOfMatchesInString_options_range_1,
+        string?._id ?? ffi.nullptr,
+        options,
+        range);
+  }
+
+  NSTextCheckingResult firstMatchInString_options_range_(
+      NSString? string, int options, NSRange range) {
+    final _ret = _lib._objc_msgSend_827(
+        _id,
+        _lib._sel_firstMatchInString_options_range_1,
+        string?._id ?? ffi.nullptr,
+        options,
+        range);
+    return NSTextCheckingResult._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSRange rangeOfFirstMatchInString_options_range_(
+      NSString? string, int options, NSRange range) {
+    return _lib._objc_msgSend_828(
+        _id,
+        _lib._sel_rangeOfFirstMatchInString_options_range_1,
+        string?._id ?? ffi.nullptr,
+        options,
+        range);
+  }
+
+  NSString stringByReplacingMatchesInString_options_range_withTemplate_(
+      NSString? string, int options, NSRange range, NSString? templ) {
+    final _ret = _lib._objc_msgSend_829(
+        _id,
+        _lib._sel_stringByReplacingMatchesInString_options_range_withTemplate_1,
+        string?._id ?? ffi.nullptr,
+        options,
+        range,
+        templ?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int replaceMatchesInString_options_range_withTemplate_(
+      NSMutableString? string, int options, NSRange range, NSString? templ) {
+    return _lib._objc_msgSend_830(
+        _id,
+        _lib._sel_replaceMatchesInString_options_range_withTemplate_1,
+        string?._id ?? ffi.nullptr,
+        options,
+        range,
+        templ?._id ?? ffi.nullptr);
+  }
+
+  NSString replacementStringForResult_inString_offset_template_(
+      NSTextCheckingResult? result,
+      NSString? string,
+      int offset,
+      NSString? templ) {
+    final _ret = _lib._objc_msgSend_831(
+        _id,
+        _lib._sel_replacementStringForResult_inString_offset_template_1,
+        result?._id ?? ffi.nullptr,
+        string?._id ?? ffi.nullptr,
+        offset,
+        templ?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString escapedTemplateForString_(AVFAudio _lib, NSString? string) {
+    final _ret = _lib._objc_msgSend_64(_lib._class_NSRegularExpression1,
+        _lib._sel_escapedTemplateForString_1, string?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSRegularExpression new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSRegularExpression1, _lib._sel_new1);
+    return NSRegularExpression._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSRegularExpression alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSRegularExpression1, _lib._sel_alloc1);
+    return NSRegularExpression._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSRegularExpression1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSRegularExpression1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSRegularExpression1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSRegularExpression1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSRegularExpression1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSRegularExpression1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSRegularExpression1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSRegularExpression1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSRegularExpression1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSRegularExpressionOptions {
+  static const int NSRegularExpressionCaseInsensitive = 1;
+  static const int NSRegularExpressionAllowCommentsAndWhitespace = 2;
+  static const int NSRegularExpressionIgnoreMetacharacters = 4;
+  static const int NSRegularExpressionDotMatchesLineSeparators = 8;
+  static const int NSRegularExpressionAnchorsMatchLines = 16;
+  static const int NSRegularExpressionUseUnixLineSeparators = 32;
+  static const int NSRegularExpressionUseUnicodeWordBoundaries = 64;
+}
+
+abstract class NSMatchingOptions {
+  static const int NSMatchingReportProgress = 1;
+  static const int NSMatchingReportCompletion = 2;
+  static const int NSMatchingAnchored = 4;
+  static const int NSMatchingWithTransparentBounds = 8;
+  static const int NSMatchingWithoutAnchoringBounds = 16;
+}
+
+void _ObjCBlock32_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, int arg1, ffi.Pointer<ffi.Bool> arg2) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(ffi.Pointer<ObjCObject> arg0, ffi.Int32 arg1,
+                  ffi.Pointer<ffi.Bool> arg2)>>()
+      .asFunction<
+          void Function(ffi.Pointer<ObjCObject> arg0, int arg1,
+              ffi.Pointer<ffi.Bool> arg2)>()(arg0, arg1, arg2);
+}
+
+final _ObjCBlock32_closureRegistry = <int, Function>{};
+int _ObjCBlock32_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock32_registerClosure(Function fn) {
+  final id = ++_ObjCBlock32_closureRegistryIndex;
+  _ObjCBlock32_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock32_closureTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, int arg1, ffi.Pointer<ffi.Bool> arg2) {
+  return _ObjCBlock32_closureRegistry[block.ref.target.address]!(
+      arg0, arg1, arg2);
+}
+
+class ObjCBlock32 extends _ObjCBlockBase {
+  ObjCBlock32._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock32.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0,
+                      ffi.Int32 arg1, ffi.Pointer<ffi.Bool> arg2)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Int32 arg1,
+                                ffi.Pointer<ffi.Bool> arg2)>(
+                        _ObjCBlock32_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock32.fromFunction(
+      AVFAudio lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, int arg1,
+              ffi.Pointer<ffi.Bool> arg2)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Int32 arg1,
+                                ffi.Pointer<ffi.Bool> arg2)>(
+                        _ObjCBlock32_closureTrampoline)
+                    .cast(),
+                _ObjCBlock32_registerClosure(fn)),
+            lib);
+  void call(
+      ffi.Pointer<ObjCObject> arg0, int arg1, ffi.Pointer<ffi.Bool> arg2) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    ffi.Int32 arg1,
+                    ffi.Pointer<ffi.Bool> arg2)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                int arg1,
+                ffi.Pointer<ffi.Bool> arg2)>()(_id, arg0, arg1, arg2);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+abstract class NSMatchingFlags {
+  static const int NSMatchingProgress = 1;
+  static const int NSMatchingCompleted = 2;
+  static const int NSMatchingHitEnd = 4;
+  static const int NSMatchingRequiredEnd = 8;
+  static const int NSMatchingInternalError = 16;
+}
+
+class NSURLCache extends NSObject {
+  NSURLCache._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURLCache] that points to the same underlying object as [other].
+  static NSURLCache castFrom<T extends _ObjCWrapper>(T other) {
+    return NSURLCache._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSURLCache] that wraps the given raw object pointer.
+  static NSURLCache castFromPointer(AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURLCache._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURLCache].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSURLCache1);
+  }
+
+  static NSURLCache? getSharedURLCache(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_844(
+        _lib._class_NSURLCache1, _lib._sel_sharedURLCache1);
+    return _ret.address == 0
+        ? null
+        : NSURLCache._(_ret, _lib, retain: true, release: true);
+  }
+
+  static void setSharedURLCache(AVFAudio _lib, NSURLCache? value) {
+    _lib._objc_msgSend_845(_lib._class_NSURLCache1,
+        _lib._sel_setSharedURLCache_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSURLCache initWithMemoryCapacity_diskCapacity_diskPath_(
+      int memoryCapacity, int diskCapacity, NSString? path) {
+    final _ret = _lib._objc_msgSend_846(
+        _id,
+        _lib._sel_initWithMemoryCapacity_diskCapacity_diskPath_1,
+        memoryCapacity,
+        diskCapacity,
+        path?._id ?? ffi.nullptr);
+    return NSURLCache._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLCache initWithMemoryCapacity_diskCapacity_directoryURL_(
+      int memoryCapacity, int diskCapacity, NSURL? directoryURL) {
+    final _ret = _lib._objc_msgSend_847(
+        _id,
+        _lib._sel_initWithMemoryCapacity_diskCapacity_directoryURL_1,
+        memoryCapacity,
+        diskCapacity,
+        directoryURL?._id ?? ffi.nullptr);
+    return NSURLCache._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSCachedURLResponse cachedResponseForRequest_(NSURLRequest? request) {
+    final _ret = _lib._objc_msgSend_851(
+        _id, _lib._sel_cachedResponseForRequest_1, request?._id ?? ffi.nullptr);
+    return NSCachedURLResponse._(_ret, _lib, retain: true, release: true);
+  }
+
+  void storeCachedResponse_forRequest_(
+      NSCachedURLResponse? cachedResponse, NSURLRequest? request) {
+    return _lib._objc_msgSend_852(
+        _id,
+        _lib._sel_storeCachedResponse_forRequest_1,
+        cachedResponse?._id ?? ffi.nullptr,
+        request?._id ?? ffi.nullptr);
+  }
+
+  void removeCachedResponseForRequest_(NSURLRequest? request) {
+    return _lib._objc_msgSend_853(
+        _id,
+        _lib._sel_removeCachedResponseForRequest_1,
+        request?._id ?? ffi.nullptr);
+  }
+
+  void removeAllCachedResponses() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_removeAllCachedResponses1);
+  }
+
+  void removeCachedResponsesSinceDate_(NSDate? date) {
+    return _lib._objc_msgSend_472(_id,
+        _lib._sel_removeCachedResponsesSinceDate_1, date?._id ?? ffi.nullptr);
+  }
+
+  int get memoryCapacity {
+    return _lib._objc_msgSend_10(_id, _lib._sel_memoryCapacity1);
+  }
+
+  set memoryCapacity(int value) {
+    _lib._objc_msgSend_451(_id, _lib._sel_setMemoryCapacity_1, value);
+  }
+
+  int get diskCapacity {
+    return _lib._objc_msgSend_10(_id, _lib._sel_diskCapacity1);
+  }
+
+  set diskCapacity(int value) {
+    _lib._objc_msgSend_451(_id, _lib._sel_setDiskCapacity_1, value);
+  }
+
+  int get currentMemoryUsage {
+    return _lib._objc_msgSend_10(_id, _lib._sel_currentMemoryUsage1);
+  }
+
+  int get currentDiskUsage {
+    return _lib._objc_msgSend_10(_id, _lib._sel_currentDiskUsage1);
+  }
+
+  void storeCachedResponse_forDataTask_(
+      NSCachedURLResponse? cachedResponse, NSURLSessionDataTask? dataTask) {
+    return _lib._objc_msgSend_854(
+        _id,
+        _lib._sel_storeCachedResponse_forDataTask_1,
+        cachedResponse?._id ?? ffi.nullptr,
+        dataTask?._id ?? ffi.nullptr);
+  }
+
+  void getCachedResponseForDataTask_completionHandler_(
+      NSURLSessionDataTask? dataTask, ObjCBlock33 completionHandler) {
+    return _lib._objc_msgSend_855(
+        _id,
+        _lib._sel_getCachedResponseForDataTask_completionHandler_1,
+        dataTask?._id ?? ffi.nullptr,
+        completionHandler._id);
+  }
+
+  void removeCachedResponseForDataTask_(NSURLSessionDataTask? dataTask) {
+    return _lib._objc_msgSend_856(
+        _id,
+        _lib._sel_removeCachedResponseForDataTask_1,
+        dataTask?._id ?? ffi.nullptr);
+  }
+
+  static NSURLCache new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSURLCache1, _lib._sel_new1);
+    return NSURLCache._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSURLCache alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSURLCache1, _lib._sel_alloc1);
+    return NSURLCache._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURLCache1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLCache1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLCache1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLCache1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURLCache1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURLCache1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURLCache1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSURLCache1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLCache1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSCachedURLResponse extends NSObject {
+  NSCachedURLResponse._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSCachedURLResponse] that points to the same underlying object as [other].
+  static NSCachedURLResponse castFrom<T extends _ObjCWrapper>(T other) {
+    return NSCachedURLResponse._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSCachedURLResponse] that wraps the given raw object pointer.
+  static NSCachedURLResponse castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSCachedURLResponse._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSCachedURLResponse].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSCachedURLResponse1);
+  }
+
+  NSCachedURLResponse initWithResponse_data_(
+      NSURLResponse? response, NSData? data) {
+    final _ret = _lib._objc_msgSend_848(_id, _lib._sel_initWithResponse_data_1,
+        response?._id ?? ffi.nullptr, data?._id ?? ffi.nullptr);
+    return NSCachedURLResponse._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSCachedURLResponse initWithResponse_data_userInfo_storagePolicy_(
+      NSURLResponse? response,
+      NSData? data,
+      NSDictionary? userInfo,
+      int storagePolicy) {
+    final _ret = _lib._objc_msgSend_849(
+        _id,
+        _lib._sel_initWithResponse_data_userInfo_storagePolicy_1,
+        response?._id ?? ffi.nullptr,
+        data?._id ?? ffi.nullptr,
+        userInfo?._id ?? ffi.nullptr,
+        storagePolicy);
+    return NSCachedURLResponse._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLResponse? get response {
+    final _ret = _lib._objc_msgSend_763(_id, _lib._sel_response1);
+    return _ret.address == 0
+        ? null
+        : NSURLResponse._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData? get data {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_data1);
+    return _ret.address == 0
+        ? null
+        : NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary? get userInfo {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_userInfo1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get storagePolicy {
+    return _lib._objc_msgSend_850(_id, _lib._sel_storagePolicy1);
+  }
+
+  static NSCachedURLResponse new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSCachedURLResponse1, _lib._sel_new1);
+    return NSCachedURLResponse._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSCachedURLResponse alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSCachedURLResponse1, _lib._sel_alloc1);
+    return NSCachedURLResponse._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSCachedURLResponse1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSCachedURLResponse1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSCachedURLResponse1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSCachedURLResponse1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSCachedURLResponse1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSCachedURLResponse1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSCachedURLResponse1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSCachedURLResponse1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSCachedURLResponse1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSURLCacheStoragePolicy {
+  static const int NSURLCacheStorageAllowed = 0;
+  static const int NSURLCacheStorageAllowedInMemoryOnly = 1;
+  static const int NSURLCacheStorageNotAllowed = 2;
+}
+
+class NSURLSessionDataTask extends NSURLSessionTask {
+  NSURLSessionDataTask._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURLSessionDataTask] that points to the same underlying object as [other].
+  static NSURLSessionDataTask castFrom<T extends _ObjCWrapper>(T other) {
+    return NSURLSessionDataTask._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSURLSessionDataTask] that wraps the given raw object pointer.
+  static NSURLSessionDataTask castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURLSessionDataTask._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURLSessionDataTask].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSURLSessionDataTask1);
+  }
+
+  @override
+  NSURLSessionDataTask init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSURLSessionDataTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLSessionDataTask new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSURLSessionDataTask1, _lib._sel_new1);
+    return NSURLSessionDataTask._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSURLSessionDataTask alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLSessionDataTask1, _lib._sel_alloc1);
+    return NSURLSessionDataTask._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURLSessionDataTask1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLSessionDataTask1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSURLSessionDataTask1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLSessionDataTask1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURLSessionDataTask1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURLSessionDataTask1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURLSessionDataTask1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSURLSessionDataTask1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLSessionDataTask1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+void _ObjCBlock33_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ObjCObject> arg0) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ObjCObject> arg0)>>()
+      .asFunction<void Function(ffi.Pointer<ObjCObject> arg0)>()(arg0);
+}
+
+final _ObjCBlock33_closureRegistry = <int, Function>{};
+int _ObjCBlock33_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock33_registerClosure(Function fn) {
+  final id = ++_ObjCBlock33_closureRegistryIndex;
+  _ObjCBlock33_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock33_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ObjCObject> arg0) {
+  return _ObjCBlock33_closureRegistry[block.ref.target.address]!(arg0);
+}
+
+class ObjCBlock33 extends _ObjCBlockBase {
+  ObjCBlock33._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock33.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0)>(
+                        _ObjCBlock33_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock33.fromFunction(
+      AVFAudio lib, void Function(ffi.Pointer<ObjCObject> arg0) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0)>(
+                        _ObjCBlock33_closureTrampoline)
+                    .cast(),
+                _ObjCBlock33_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0)>>()
+        .asFunction<
+            void Function(ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0)>()(_id, arg0);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class NSURLConnection extends NSObject {
+  NSURLConnection._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURLConnection] that points to the same underlying object as [other].
+  static NSURLConnection castFrom<T extends _ObjCWrapper>(T other) {
+    return NSURLConnection._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSURLConnection] that wraps the given raw object pointer.
+  static NSURLConnection castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURLConnection._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURLConnection].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSURLConnection1);
+  }
+
+  NSURLConnection initWithRequest_delegate_startImmediately_(
+      NSURLRequest? request, NSObject delegate, bool startImmediately) {
+    final _ret = _lib._objc_msgSend_857(
+        _id,
+        _lib._sel_initWithRequest_delegate_startImmediately_1,
+        request?._id ?? ffi.nullptr,
+        delegate._id,
+        startImmediately);
+    return NSURLConnection._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLConnection initWithRequest_delegate_(
+      NSURLRequest? request, NSObject delegate) {
+    final _ret = _lib._objc_msgSend_858(
+        _id,
+        _lib._sel_initWithRequest_delegate_1,
+        request?._id ?? ffi.nullptr,
+        delegate._id);
+    return NSURLConnection._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLConnection connectionWithRequest_delegate_(
+      AVFAudio _lib, NSURLRequest? request, NSObject delegate) {
+    final _ret = _lib._objc_msgSend_859(
+        _lib._class_NSURLConnection1,
+        _lib._sel_connectionWithRequest_delegate_1,
+        request?._id ?? ffi.nullptr,
+        delegate._id);
+    return NSURLConnection._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLRequest? get originalRequest {
+    final _ret = _lib._objc_msgSend_761(_id, _lib._sel_originalRequest1);
+    return _ret.address == 0
+        ? null
+        : NSURLRequest._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLRequest? get currentRequest {
+    final _ret = _lib._objc_msgSend_761(_id, _lib._sel_currentRequest1);
+    return _ret.address == 0
+        ? null
+        : NSURLRequest._(_ret, _lib, retain: true, release: true);
+  }
+
+  void start() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_start1);
+  }
+
+  void cancel() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_cancel1);
+  }
+
+  void scheduleInRunLoop_forMode_(NSRunLoop? aRunLoop, NSRunLoopMode mode) {
+    return _lib._objc_msgSend_501(_id, _lib._sel_scheduleInRunLoop_forMode_1,
+        aRunLoop?._id ?? ffi.nullptr, mode);
+  }
+
+  void unscheduleFromRunLoop_forMode_(NSRunLoop? aRunLoop, NSRunLoopMode mode) {
+    return _lib._objc_msgSend_501(
+        _id,
+        _lib._sel_unscheduleFromRunLoop_forMode_1,
+        aRunLoop?._id ?? ffi.nullptr,
+        mode);
+  }
+
+  void setDelegateQueue_(NSOperationQueue? queue) {
+    return _lib._objc_msgSend_860(
+        _id, _lib._sel_setDelegateQueue_1, queue?._id ?? ffi.nullptr);
+  }
+
+  static bool canHandleRequest_(AVFAudio _lib, NSURLRequest? request) {
+    return _lib._objc_msgSend_861(_lib._class_NSURLConnection1,
+        _lib._sel_canHandleRequest_1, request?._id ?? ffi.nullptr);
+  }
+
+  static NSData sendSynchronousRequest_returningResponse_error_(
+      AVFAudio _lib,
+      NSURLRequest? request,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> response,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_862(
+        _lib._class_NSURLConnection1,
+        _lib._sel_sendSynchronousRequest_returningResponse_error_1,
+        request?._id ?? ffi.nullptr,
+        response,
+        error);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  static void sendAsynchronousRequest_queue_completionHandler_(AVFAudio _lib,
+      NSURLRequest? request, NSOperationQueue? queue, ObjCBlock34 handler) {
+    return _lib._objc_msgSend_863(
+        _lib._class_NSURLConnection1,
+        _lib._sel_sendAsynchronousRequest_queue_completionHandler_1,
+        request?._id ?? ffi.nullptr,
+        queue?._id ?? ffi.nullptr,
+        handler._id);
+  }
+
+  static NSURLConnection new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSURLConnection1, _lib._sel_new1);
+    return NSURLConnection._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSURLConnection alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSURLConnection1, _lib._sel_alloc1);
+    return NSURLConnection._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURLConnection1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLConnection1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSURLConnection1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLConnection1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURLConnection1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURLConnection1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURLConnection1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSURLConnection1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLConnection1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+void _ObjCBlock34_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0,
+    ffi.Pointer<ObjCObject> arg1,
+    ffi.Pointer<ObjCObject> arg2) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(
+                  ffi.Pointer<ObjCObject> arg0,
+                  ffi.Pointer<ObjCObject> arg1,
+                  ffi.Pointer<ObjCObject> arg2)>>()
+      .asFunction<
+          void Function(
+              ffi.Pointer<ObjCObject> arg0,
+              ffi.Pointer<ObjCObject> arg1,
+              ffi.Pointer<ObjCObject> arg2)>()(arg0, arg1, arg2);
+}
+
+final _ObjCBlock34_closureRegistry = <int, Function>{};
+int _ObjCBlock34_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock34_registerClosure(Function fn) {
+  final id = ++_ObjCBlock34_closureRegistryIndex;
+  _ObjCBlock34_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock34_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0,
+    ffi.Pointer<ObjCObject> arg1,
+    ffi.Pointer<ObjCObject> arg2) {
+  return _ObjCBlock34_closureRegistry[block.ref.target.address]!(
+      arg0, arg1, arg2);
+}
+
+class ObjCBlock34 extends _ObjCBlockBase {
+  ObjCBlock34._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock34.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(
+                      ffi.Pointer<ObjCObject> arg0,
+                      ffi.Pointer<ObjCObject> arg1,
+                      ffi.Pointer<ObjCObject> arg2)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1,
+                                ffi.Pointer<ObjCObject> arg2)>(
+                        _ObjCBlock34_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock34.fromFunction(
+      AVFAudio lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1,
+              ffi.Pointer<ObjCObject> arg2)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1,
+                                ffi.Pointer<ObjCObject> arg2)>(
+                        _ObjCBlock34_closureTrampoline)
+                    .cast(),
+                _ObjCBlock34_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1,
+      ffi.Pointer<ObjCObject> arg2) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    ffi.Pointer<ObjCObject> arg1,
+                    ffi.Pointer<ObjCObject> arg2)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                ffi.Pointer<ObjCObject> arg1,
+                ffi.Pointer<ObjCObject> arg2)>()(_id, arg0, arg1, arg2);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class NSURLCredential extends NSObject {
+  NSURLCredential._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURLCredential] that points to the same underlying object as [other].
+  static NSURLCredential castFrom<T extends _ObjCWrapper>(T other) {
+    return NSURLCredential._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSURLCredential] that wraps the given raw object pointer.
+  static NSURLCredential castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURLCredential._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURLCredential].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSURLCredential1);
+  }
+
+  int get persistence {
+    return _lib._objc_msgSend_864(_id, _lib._sel_persistence1);
+  }
+
+  NSURLCredential initWithUser_password_persistence_(
+      NSString? user, NSString? password, int persistence) {
+    final _ret = _lib._objc_msgSend_865(
+        _id,
+        _lib._sel_initWithUser_password_persistence_1,
+        user?._id ?? ffi.nullptr,
+        password?._id ?? ffi.nullptr,
+        persistence);
+    return NSURLCredential._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLCredential credentialWithUser_password_persistence_(
+      AVFAudio _lib, NSString? user, NSString? password, int persistence) {
+    final _ret = _lib._objc_msgSend_866(
+        _lib._class_NSURLCredential1,
+        _lib._sel_credentialWithUser_password_persistence_1,
+        user?._id ?? ffi.nullptr,
+        password?._id ?? ffi.nullptr,
+        persistence);
+    return NSURLCredential._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get user {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_user1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get password {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_password1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool get hasPassword {
+    return _lib._objc_msgSend_12(_id, _lib._sel_hasPassword1);
+  }
+
+  NSURLCredential initWithIdentity_certificates_persistence_(
+      SecIdentityRef identity, NSArray? certArray, int persistence) {
+    final _ret = _lib._objc_msgSend_867(
+        _id,
+        _lib._sel_initWithIdentity_certificates_persistence_1,
+        identity,
+        certArray?._id ?? ffi.nullptr,
+        persistence);
+    return NSURLCredential._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLCredential credentialWithIdentity_certificates_persistence_(
+      AVFAudio _lib,
+      SecIdentityRef identity,
+      NSArray? certArray,
+      int persistence) {
+    final _ret = _lib._objc_msgSend_868(
+        _lib._class_NSURLCredential1,
+        _lib._sel_credentialWithIdentity_certificates_persistence_1,
+        identity,
+        certArray?._id ?? ffi.nullptr,
+        persistence);
+    return NSURLCredential._(_ret, _lib, retain: true, release: true);
+  }
+
+  SecIdentityRef get identity {
+    return _lib._objc_msgSend_869(_id, _lib._sel_identity1);
+  }
+
+  NSArray? get certificates {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_certificates1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLCredential initWithTrust_(SecTrustRef trust) {
+    final _ret = _lib._objc_msgSend_870(_id, _lib._sel_initWithTrust_1, trust);
+    return NSURLCredential._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLCredential credentialForTrust_(AVFAudio _lib, SecTrustRef trust) {
+    final _ret = _lib._objc_msgSend_871(
+        _lib._class_NSURLCredential1, _lib._sel_credentialForTrust_1, trust);
+    return NSURLCredential._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLCredential new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSURLCredential1, _lib._sel_new1);
+    return NSURLCredential._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSURLCredential alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSURLCredential1, _lib._sel_alloc1);
+    return NSURLCredential._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURLCredential1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLCredential1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSURLCredential1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLCredential1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURLCredential1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURLCredential1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURLCredential1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSURLCredential1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLCredential1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSURLCredentialPersistence {
+  static const int NSURLCredentialPersistenceNone = 0;
+  static const int NSURLCredentialPersistenceForSession = 1;
+  static const int NSURLCredentialPersistencePermanent = 2;
+  static const int NSURLCredentialPersistenceSynchronizable = 3;
+}
+
+typedef SecIdentityRef = ffi.Pointer<__SecIdentity>;
+
+class __SecIdentity extends ffi.Opaque {}
+
+typedef SecTrustRef = ffi.Pointer<__SecTrust>;
+
+class __SecTrust extends ffi.Opaque {}
+
+class NSURLProtectionSpace extends NSObject {
+  NSURLProtectionSpace._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURLProtectionSpace] that points to the same underlying object as [other].
+  static NSURLProtectionSpace castFrom<T extends _ObjCWrapper>(T other) {
+    return NSURLProtectionSpace._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSURLProtectionSpace] that wraps the given raw object pointer.
+  static NSURLProtectionSpace castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURLProtectionSpace._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURLProtectionSpace].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSURLProtectionSpace1);
+  }
+
+  NSURLProtectionSpace initWithHost_port_protocol_realm_authenticationMethod_(
+      NSString? host,
+      int port,
+      NSString? protocol,
+      NSString? realm,
+      NSString? authenticationMethod) {
+    final _ret = _lib._objc_msgSend_872(
+        _id,
+        _lib._sel_initWithHost_port_protocol_realm_authenticationMethod_1,
+        host?._id ?? ffi.nullptr,
+        port,
+        protocol?._id ?? ffi.nullptr,
+        realm?._id ?? ffi.nullptr,
+        authenticationMethod?._id ?? ffi.nullptr);
+    return NSURLProtectionSpace._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLProtectionSpace initWithProxyHost_port_type_realm_authenticationMethod_(
+      NSString? host,
+      int port,
+      NSString? type,
+      NSString? realm,
+      NSString? authenticationMethod) {
+    final _ret = _lib._objc_msgSend_872(
+        _id,
+        _lib._sel_initWithProxyHost_port_type_realm_authenticationMethod_1,
+        host?._id ?? ffi.nullptr,
+        port,
+        type?._id ?? ffi.nullptr,
+        realm?._id ?? ffi.nullptr,
+        authenticationMethod?._id ?? ffi.nullptr);
+    return NSURLProtectionSpace._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get realm {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_realm1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool get receivesCredentialSecurely {
+    return _lib._objc_msgSend_12(_id, _lib._sel_receivesCredentialSecurely1);
+  }
+
+  bool get isProxy {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isProxy1);
+  }
+
+  NSString? get host {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_host1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get port {
+    return _lib._objc_msgSend_78(_id, _lib._sel_port1);
+  }
+
+  NSString? get proxyType {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_proxyType1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get protocol {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_protocol1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get authenticationMethod {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_authenticationMethod1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get distinguishedNames {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_distinguishedNames1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  SecTrustRef get serverTrust {
+    return _lib._objc_msgSend_873(_id, _lib._sel_serverTrust1);
+  }
+
+  static NSURLProtectionSpace new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSURLProtectionSpace1, _lib._sel_new1);
+    return NSURLProtectionSpace._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSURLProtectionSpace alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLProtectionSpace1, _lib._sel_alloc1);
+    return NSURLProtectionSpace._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURLProtectionSpace1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLProtectionSpace1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSURLProtectionSpace1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLProtectionSpace1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURLProtectionSpace1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURLProtectionSpace1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURLProtectionSpace1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSURLProtectionSpace1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLProtectionSpace1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSURLCredentialStorage extends NSObject {
+  NSURLCredentialStorage._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURLCredentialStorage] that points to the same underlying object as [other].
+  static NSURLCredentialStorage castFrom<T extends _ObjCWrapper>(T other) {
+    return NSURLCredentialStorage._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSURLCredentialStorage] that wraps the given raw object pointer.
+  static NSURLCredentialStorage castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURLCredentialStorage._(other, lib,
+        retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURLCredentialStorage].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSURLCredentialStorage1);
+  }
+
+  static NSURLCredentialStorage? getSharedCredentialStorage(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_874(_lib._class_NSURLCredentialStorage1,
+        _lib._sel_sharedCredentialStorage1);
+    return _ret.address == 0
+        ? null
+        : NSURLCredentialStorage._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary credentialsForProtectionSpace_(NSURLProtectionSpace? space) {
+    final _ret = _lib._objc_msgSend_875(_id,
+        _lib._sel_credentialsForProtectionSpace_1, space?._id ?? ffi.nullptr);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary? get allCredentials {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_allCredentials1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  void setCredential_forProtectionSpace_(
+      NSURLCredential? credential, NSURLProtectionSpace? space) {
+    return _lib._objc_msgSend_876(
+        _id,
+        _lib._sel_setCredential_forProtectionSpace_1,
+        credential?._id ?? ffi.nullptr,
+        space?._id ?? ffi.nullptr);
+  }
+
+  void removeCredential_forProtectionSpace_(
+      NSURLCredential? credential, NSURLProtectionSpace? space) {
+    return _lib._objc_msgSend_876(
+        _id,
+        _lib._sel_removeCredential_forProtectionSpace_1,
+        credential?._id ?? ffi.nullptr,
+        space?._id ?? ffi.nullptr);
+  }
+
+  void removeCredential_forProtectionSpace_options_(NSURLCredential? credential,
+      NSURLProtectionSpace? space, NSDictionary? options) {
+    return _lib._objc_msgSend_877(
+        _id,
+        _lib._sel_removeCredential_forProtectionSpace_options_1,
+        credential?._id ?? ffi.nullptr,
+        space?._id ?? ffi.nullptr,
+        options?._id ?? ffi.nullptr);
+  }
+
+  NSURLCredential defaultCredentialForProtectionSpace_(
+      NSURLProtectionSpace? space) {
+    final _ret = _lib._objc_msgSend_878(
+        _id,
+        _lib._sel_defaultCredentialForProtectionSpace_1,
+        space?._id ?? ffi.nullptr);
+    return NSURLCredential._(_ret, _lib, retain: true, release: true);
+  }
+
+  void setDefaultCredential_forProtectionSpace_(
+      NSURLCredential? credential, NSURLProtectionSpace? space) {
+    return _lib._objc_msgSend_876(
+        _id,
+        _lib._sel_setDefaultCredential_forProtectionSpace_1,
+        credential?._id ?? ffi.nullptr,
+        space?._id ?? ffi.nullptr);
+  }
+
+  void getCredentialsForProtectionSpace_task_completionHandler_(
+      NSURLProtectionSpace? protectionSpace,
+      NSURLSessionTask? task,
+      ObjCBlock35 completionHandler) {
+    return _lib._objc_msgSend_879(
+        _id,
+        _lib._sel_getCredentialsForProtectionSpace_task_completionHandler_1,
+        protectionSpace?._id ?? ffi.nullptr,
+        task?._id ?? ffi.nullptr,
+        completionHandler._id);
+  }
+
+  void setCredential_forProtectionSpace_task_(NSURLCredential? credential,
+      NSURLProtectionSpace? protectionSpace, NSURLSessionTask? task) {
+    return _lib._objc_msgSend_880(
+        _id,
+        _lib._sel_setCredential_forProtectionSpace_task_1,
+        credential?._id ?? ffi.nullptr,
+        protectionSpace?._id ?? ffi.nullptr,
+        task?._id ?? ffi.nullptr);
+  }
+
+  void removeCredential_forProtectionSpace_options_task_(
+      NSURLCredential? credential,
+      NSURLProtectionSpace? protectionSpace,
+      NSDictionary? options,
+      NSURLSessionTask? task) {
+    return _lib._objc_msgSend_881(
+        _id,
+        _lib._sel_removeCredential_forProtectionSpace_options_task_1,
+        credential?._id ?? ffi.nullptr,
+        protectionSpace?._id ?? ffi.nullptr,
+        options?._id ?? ffi.nullptr,
+        task?._id ?? ffi.nullptr);
+  }
+
+  void getDefaultCredentialForProtectionSpace_task_completionHandler_(
+      NSURLProtectionSpace? space,
+      NSURLSessionTask? task,
+      ObjCBlock36 completionHandler) {
+    return _lib._objc_msgSend_882(
+        _id,
+        _lib._sel_getDefaultCredentialForProtectionSpace_task_completionHandler_1,
+        space?._id ?? ffi.nullptr,
+        task?._id ?? ffi.nullptr,
+        completionHandler._id);
+  }
+
+  void setDefaultCredential_forProtectionSpace_task_(
+      NSURLCredential? credential,
+      NSURLProtectionSpace? protectionSpace,
+      NSURLSessionTask? task) {
+    return _lib._objc_msgSend_880(
+        _id,
+        _lib._sel_setDefaultCredential_forProtectionSpace_task_1,
+        credential?._id ?? ffi.nullptr,
+        protectionSpace?._id ?? ffi.nullptr,
+        task?._id ?? ffi.nullptr);
+  }
+
+  static NSURLCredentialStorage new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLCredentialStorage1, _lib._sel_new1);
+    return NSURLCredentialStorage._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSURLCredentialStorage alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLCredentialStorage1, _lib._sel_alloc1);
+    return NSURLCredentialStorage._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURLCredentialStorage1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLCredentialStorage1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSURLCredentialStorage1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLCredentialStorage1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURLCredentialStorage1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURLCredentialStorage1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURLCredentialStorage1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSURLCredentialStorage1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSURLCredentialStorage1,
+        _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+void _ObjCBlock35_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ObjCObject> arg0) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ObjCObject> arg0)>>()
+      .asFunction<void Function(ffi.Pointer<ObjCObject> arg0)>()(arg0);
+}
+
+final _ObjCBlock35_closureRegistry = <int, Function>{};
+int _ObjCBlock35_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock35_registerClosure(Function fn) {
+  final id = ++_ObjCBlock35_closureRegistryIndex;
+  _ObjCBlock35_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock35_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ObjCObject> arg0) {
+  return _ObjCBlock35_closureRegistry[block.ref.target.address]!(arg0);
+}
+
+class ObjCBlock35 extends _ObjCBlockBase {
+  ObjCBlock35._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock35.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0)>(
+                        _ObjCBlock35_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock35.fromFunction(
+      AVFAudio lib, void Function(ffi.Pointer<ObjCObject> arg0) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0)>(
+                        _ObjCBlock35_closureTrampoline)
+                    .cast(),
+                _ObjCBlock35_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0)>>()
+        .asFunction<
+            void Function(ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0)>()(_id, arg0);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+void _ObjCBlock36_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ObjCObject> arg0) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ObjCObject> arg0)>>()
+      .asFunction<void Function(ffi.Pointer<ObjCObject> arg0)>()(arg0);
+}
+
+final _ObjCBlock36_closureRegistry = <int, Function>{};
+int _ObjCBlock36_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock36_registerClosure(Function fn) {
+  final id = ++_ObjCBlock36_closureRegistryIndex;
+  _ObjCBlock36_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock36_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ObjCObject> arg0) {
+  return _ObjCBlock36_closureRegistry[block.ref.target.address]!(arg0);
+}
+
+class ObjCBlock36 extends _ObjCBlockBase {
+  ObjCBlock36._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock36.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0)>(
+                        _ObjCBlock36_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock36.fromFunction(
+      AVFAudio lib, void Function(ffi.Pointer<ObjCObject> arg0) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0)>(
+                        _ObjCBlock36_closureTrampoline)
+                    .cast(),
+                _ObjCBlock36_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0)>>()
+        .asFunction<
+            void Function(ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0)>()(_id, arg0);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class NSURLProtocol extends NSObject {
+  NSURLProtocol._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURLProtocol] that points to the same underlying object as [other].
+  static NSURLProtocol castFrom<T extends _ObjCWrapper>(T other) {
+    return NSURLProtocol._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSURLProtocol] that wraps the given raw object pointer.
+  static NSURLProtocol castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURLProtocol._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURLProtocol].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSURLProtocol1);
+  }
+
+  NSURLProtocol initWithRequest_cachedResponse_client_(NSURLRequest? request,
+      NSCachedURLResponse? cachedResponse, NSObject? client) {
+    final _ret = _lib._objc_msgSend_883(
+        _id,
+        _lib._sel_initWithRequest_cachedResponse_client_1,
+        request?._id ?? ffi.nullptr,
+        cachedResponse?._id ?? ffi.nullptr,
+        client?._id ?? ffi.nullptr);
+    return NSURLProtocol._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject? get client {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_client1);
+    return _ret.address == 0
+        ? null
+        : NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLRequest? get request {
+    final _ret = _lib._objc_msgSend_761(_id, _lib._sel_request1);
+    return _ret.address == 0
+        ? null
+        : NSURLRequest._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSCachedURLResponse? get cachedResponse {
+    final _ret = _lib._objc_msgSend_884(_id, _lib._sel_cachedResponse1);
+    return _ret.address == 0
+        ? null
+        : NSCachedURLResponse._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool canInitWithRequest_(AVFAudio _lib, NSURLRequest? request) {
+    return _lib._objc_msgSend_861(_lib._class_NSURLProtocol1,
+        _lib._sel_canInitWithRequest_1, request?._id ?? ffi.nullptr);
+  }
+
+  static NSURLRequest canonicalRequestForRequest_(
+      AVFAudio _lib, NSURLRequest? request) {
+    final _ret = _lib._objc_msgSend_885(_lib._class_NSURLProtocol1,
+        _lib._sel_canonicalRequestForRequest_1, request?._id ?? ffi.nullptr);
+    return NSURLRequest._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool requestIsCacheEquivalent_toRequest_(
+      AVFAudio _lib, NSURLRequest? a, NSURLRequest? b) {
+    return _lib._objc_msgSend_886(
+        _lib._class_NSURLProtocol1,
+        _lib._sel_requestIsCacheEquivalent_toRequest_1,
+        a?._id ?? ffi.nullptr,
+        b?._id ?? ffi.nullptr);
+  }
+
+  void startLoading() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_startLoading1);
+  }
+
+  void stopLoading() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_stopLoading1);
+  }
+
+  static NSObject propertyForKey_inRequest_(
+      AVFAudio _lib, NSString? key, NSURLRequest? request) {
+    final _ret = _lib._objc_msgSend_887(
+        _lib._class_NSURLProtocol1,
+        _lib._sel_propertyForKey_inRequest_1,
+        key?._id ?? ffi.nullptr,
+        request?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static void setProperty_forKey_inRequest_(AVFAudio _lib, NSObject value,
+      NSString? key, NSMutableURLRequest? request) {
+    return _lib._objc_msgSend_894(
+        _lib._class_NSURLProtocol1,
+        _lib._sel_setProperty_forKey_inRequest_1,
+        value._id,
+        key?._id ?? ffi.nullptr,
+        request?._id ?? ffi.nullptr);
+  }
+
+  static void removePropertyForKey_inRequest_(
+      AVFAudio _lib, NSString? key, NSMutableURLRequest? request) {
+    return _lib._objc_msgSend_895(
+        _lib._class_NSURLProtocol1,
+        _lib._sel_removePropertyForKey_inRequest_1,
+        key?._id ?? ffi.nullptr,
+        request?._id ?? ffi.nullptr);
+  }
+
+  static bool registerClass_(AVFAudio _lib, NSObject protocolClass) {
+    return _lib._objc_msgSend_0(_lib._class_NSURLProtocol1,
+        _lib._sel_registerClass_1, protocolClass._id);
+  }
+
+  static void unregisterClass_(AVFAudio _lib, NSObject protocolClass) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLProtocol1,
+        _lib._sel_unregisterClass_1, protocolClass._id);
+  }
+
+  static bool canInitWithTask_(AVFAudio _lib, NSURLSessionTask? task) {
+    return _lib._objc_msgSend_896(_lib._class_NSURLProtocol1,
+        _lib._sel_canInitWithTask_1, task?._id ?? ffi.nullptr);
+  }
+
+  NSURLProtocol initWithTask_cachedResponse_client_(NSURLSessionTask? task,
+      NSCachedURLResponse? cachedResponse, NSObject? client) {
+    final _ret = _lib._objc_msgSend_897(
+        _id,
+        _lib._sel_initWithTask_cachedResponse_client_1,
+        task?._id ?? ffi.nullptr,
+        cachedResponse?._id ?? ffi.nullptr,
+        client?._id ?? ffi.nullptr);
+    return NSURLProtocol._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionTask? get task {
+    final _ret = _lib._objc_msgSend_898(_id, _lib._sel_task1);
+    return _ret.address == 0
+        ? null
+        : NSURLSessionTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLProtocol new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSURLProtocol1, _lib._sel_new1);
+    return NSURLProtocol._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSURLProtocol alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSURLProtocol1, _lib._sel_alloc1);
+    return NSURLProtocol._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURLProtocol1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLProtocol1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLProtocol1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLProtocol1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURLProtocol1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURLProtocol1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURLProtocol1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSURLProtocol1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLProtocol1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSMutableURLRequest extends NSURLRequest {
+  NSMutableURLRequest._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSMutableURLRequest] that points to the same underlying object as [other].
+  static NSMutableURLRequest castFrom<T extends _ObjCWrapper>(T other) {
+    return NSMutableURLRequest._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSMutableURLRequest] that wraps the given raw object pointer.
+  static NSMutableURLRequest castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSMutableURLRequest._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSMutableURLRequest].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSMutableURLRequest1);
+  }
+
+  @override
+  NSURL? get URL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_URL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  set URL(NSURL? value) {
+    _lib._objc_msgSend_888(_id, _lib._sel_setURL_1, value?._id ?? ffi.nullptr);
+  }
+
+  @override
+  int get cachePolicy {
+    return _lib._objc_msgSend_748(_id, _lib._sel_cachePolicy1);
+  }
+
+  set cachePolicy(int value) {
+    _lib._objc_msgSend_889(_id, _lib._sel_setCachePolicy_1, value);
+  }
+
+  @override
+  double get timeoutInterval {
+    return _lib._objc_msgSend_149(_id, _lib._sel_timeoutInterval1);
+  }
+
+  set timeoutInterval(double value) {
+    _lib._objc_msgSend_474(_id, _lib._sel_setTimeoutInterval_1, value);
+  }
+
+  @override
+  NSURL? get mainDocumentURL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_mainDocumentURL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  set mainDocumentURL(NSURL? value) {
+    _lib._objc_msgSend_888(
+        _id, _lib._sel_setMainDocumentURL_1, value?._id ?? ffi.nullptr);
+  }
+
+  @override
+  int get networkServiceType {
+    return _lib._objc_msgSend_749(_id, _lib._sel_networkServiceType1);
+  }
+
+  set networkServiceType(int value) {
+    _lib._objc_msgSend_890(_id, _lib._sel_setNetworkServiceType_1, value);
+  }
+
+  @override
+  bool get allowsCellularAccess {
+    return _lib._objc_msgSend_12(_id, _lib._sel_allowsCellularAccess1);
+  }
+
+  set allowsCellularAccess(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setAllowsCellularAccess_1, value);
+  }
+
+  @override
+  bool get allowsExpensiveNetworkAccess {
+    return _lib._objc_msgSend_12(_id, _lib._sel_allowsExpensiveNetworkAccess1);
+  }
+
+  set allowsExpensiveNetworkAccess(bool value) {
+    _lib._objc_msgSend_460(
+        _id, _lib._sel_setAllowsExpensiveNetworkAccess_1, value);
+  }
+
+  @override
+  bool get allowsConstrainedNetworkAccess {
+    return _lib._objc_msgSend_12(
+        _id, _lib._sel_allowsConstrainedNetworkAccess1);
+  }
+
+  set allowsConstrainedNetworkAccess(bool value) {
+    _lib._objc_msgSend_460(
+        _id, _lib._sel_setAllowsConstrainedNetworkAccess_1, value);
+  }
+
+  @override
+  bool get assumesHTTP3Capable {
+    return _lib._objc_msgSend_12(_id, _lib._sel_assumesHTTP3Capable1);
+  }
+
+  set assumesHTTP3Capable(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setAssumesHTTP3Capable_1, value);
+  }
+
+  @override
+  int get attribution {
+    return _lib._objc_msgSend_750(_id, _lib._sel_attribution1);
+  }
+
+  set attribution(int value) {
+    _lib._objc_msgSend_891(_id, _lib._sel_setAttribution_1, value);
+  }
+
+  @override
+  NSString? get HTTPMethod {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_HTTPMethod1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set HTTPMethod(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setHTTPMethod_1, value?._id ?? ffi.nullptr);
+  }
+
+  @override
+  NSDictionary? get allHTTPHeaderFields {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_allHTTPHeaderFields1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  set allHTTPHeaderFields(NSDictionary? value) {
+    _lib._objc_msgSend_165(
+        _id, _lib._sel_setAllHTTPHeaderFields_1, value?._id ?? ffi.nullptr);
+  }
+
+  void setValue_forHTTPHeaderField_(NSString? value, NSString? field) {
+    return _lib._objc_msgSend_483(_id, _lib._sel_setValue_forHTTPHeaderField_1,
+        value?._id ?? ffi.nullptr, field?._id ?? ffi.nullptr);
+  }
+
+  void addValue_forHTTPHeaderField_(NSString? value, NSString? field) {
+    return _lib._objc_msgSend_483(_id, _lib._sel_addValue_forHTTPHeaderField_1,
+        value?._id ?? ffi.nullptr, field?._id ?? ffi.nullptr);
+  }
+
+  @override
+  NSData? get HTTPBody {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_HTTPBody1);
+    return _ret.address == 0
+        ? null
+        : NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  set HTTPBody(NSData? value) {
+    _lib._objc_msgSend_892(
+        _id, _lib._sel_setHTTPBody_1, value?._id ?? ffi.nullptr);
+  }
+
+  @override
+  NSInputStream? get HTTPBodyStream {
+    final _ret = _lib._objc_msgSend_760(_id, _lib._sel_HTTPBodyStream1);
+    return _ret.address == 0
+        ? null
+        : NSInputStream._(_ret, _lib, retain: true, release: true);
+  }
+
+  set HTTPBodyStream(NSInputStream? value) {
+    _lib._objc_msgSend_893(
+        _id, _lib._sel_setHTTPBodyStream_1, value?._id ?? ffi.nullptr);
+  }
+
+  @override
+  bool get HTTPShouldHandleCookies {
+    return _lib._objc_msgSend_12(_id, _lib._sel_HTTPShouldHandleCookies1);
+  }
+
+  set HTTPShouldHandleCookies(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setHTTPShouldHandleCookies_1, value);
+  }
+
+  @override
+  bool get HTTPShouldUsePipelining {
+    return _lib._objc_msgSend_12(_id, _lib._sel_HTTPShouldUsePipelining1);
+  }
+
+  set HTTPShouldUsePipelining(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setHTTPShouldUsePipelining_1, value);
+  }
+
+  static NSMutableURLRequest requestWithURL_(AVFAudio _lib, NSURL? URL) {
+    final _ret = _lib._objc_msgSend_226(_lib._class_NSMutableURLRequest1,
+        _lib._sel_requestWithURL_1, URL?._id ?? ffi.nullptr);
+    return NSMutableURLRequest._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool getSupportsSecureCoding(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSMutableURLRequest1, _lib._sel_supportsSecureCoding1);
+  }
+
+  static NSMutableURLRequest requestWithURL_cachePolicy_timeoutInterval_(
+      AVFAudio _lib, NSURL? URL, int cachePolicy, double timeoutInterval) {
+    final _ret = _lib._objc_msgSend_747(
+        _lib._class_NSMutableURLRequest1,
+        _lib._sel_requestWithURL_cachePolicy_timeoutInterval_1,
+        URL?._id ?? ffi.nullptr,
+        cachePolicy,
+        timeoutInterval);
+    return NSMutableURLRequest._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableURLRequest new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMutableURLRequest1, _lib._sel_new1);
+    return NSMutableURLRequest._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSMutableURLRequest alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSMutableURLRequest1, _lib._sel_alloc1);
+    return NSMutableURLRequest._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSMutableURLRequest1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSMutableURLRequest1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSMutableURLRequest1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSMutableURLRequest1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSMutableURLRequest1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSMutableURLRequest1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSMutableURLRequest1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSMutableURLRequest1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSMutableURLRequest1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSXMLParser extends NSObject {
+  NSXMLParser._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSXMLParser] that points to the same underlying object as [other].
+  static NSXMLParser castFrom<T extends _ObjCWrapper>(T other) {
+    return NSXMLParser._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSXMLParser] that wraps the given raw object pointer.
+  static NSXMLParser castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSXMLParser._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSXMLParser].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSXMLParser1);
+  }
+
+  NSXMLParser initWithContentsOfURL_(NSURL? url) {
+    final _ret = _lib._objc_msgSend_226(
+        _id, _lib._sel_initWithContentsOfURL_1, url?._id ?? ffi.nullptr);
+    return NSXMLParser._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLParser initWithData_(NSData? data) {
+    final _ret = _lib._objc_msgSend_242(
+        _id, _lib._sel_initWithData_1, data?._id ?? ffi.nullptr);
+    return NSXMLParser._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLParser initWithStream_(NSInputStream? stream) {
+    final _ret = _lib._objc_msgSend_899(
+        _id, _lib._sel_initWithStream_1, stream?._id ?? ffi.nullptr);
+    return NSXMLParser._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject? get delegate {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_delegate1);
+    return _ret.address == 0
+        ? null
+        : NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  set delegate(NSObject? value) {
+    _lib._objc_msgSend_368(
+        _id, _lib._sel_setDelegate_1, value?._id ?? ffi.nullptr);
+  }
+
+  bool get shouldProcessNamespaces {
+    return _lib._objc_msgSend_12(_id, _lib._sel_shouldProcessNamespaces1);
+  }
+
+  set shouldProcessNamespaces(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setShouldProcessNamespaces_1, value);
+  }
+
+  bool get shouldReportNamespacePrefixes {
+    return _lib._objc_msgSend_12(_id, _lib._sel_shouldReportNamespacePrefixes1);
+  }
+
+  set shouldReportNamespacePrefixes(bool value) {
+    _lib._objc_msgSend_460(
+        _id, _lib._sel_setShouldReportNamespacePrefixes_1, value);
+  }
+
+  int get externalEntityResolvingPolicy {
+    return _lib._objc_msgSend_900(
+        _id, _lib._sel_externalEntityResolvingPolicy1);
+  }
+
+  set externalEntityResolvingPolicy(int value) {
+    _lib._objc_msgSend_901(
+        _id, _lib._sel_setExternalEntityResolvingPolicy_1, value);
+  }
+
+  NSSet? get allowedExternalEntityURLs {
+    final _ret =
+        _lib._objc_msgSend_280(_id, _lib._sel_allowedExternalEntityURLs1);
+    return _ret.address == 0
+        ? null
+        : NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  set allowedExternalEntityURLs(NSSet? value) {
+    _lib._objc_msgSend_902(_id, _lib._sel_setAllowedExternalEntityURLs_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  bool parse() {
+    return _lib._objc_msgSend_12(_id, _lib._sel_parse1);
+  }
+
+  void abortParsing() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_abortParsing1);
+  }
+
+  NSError? get parserError {
+    final _ret = _lib._objc_msgSend_283(_id, _lib._sel_parserError1);
+    return _ret.address == 0
+        ? null
+        : NSError._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool get shouldResolveExternalEntities {
+    return _lib._objc_msgSend_12(_id, _lib._sel_shouldResolveExternalEntities1);
+  }
+
+  set shouldResolveExternalEntities(bool value) {
+    _lib._objc_msgSend_460(
+        _id, _lib._sel_setShouldResolveExternalEntities_1, value);
+  }
+
+  NSString? get publicID {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_publicID1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get systemID {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_systemID1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get lineNumber {
+    return _lib._objc_msgSend_78(_id, _lib._sel_lineNumber1);
+  }
+
+  int get columnNumber {
+    return _lib._objc_msgSend_78(_id, _lib._sel_columnNumber1);
+  }
+
+  static NSXMLParser new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSXMLParser1, _lib._sel_new1);
+    return NSXMLParser._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSXMLParser alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSXMLParser1, _lib._sel_alloc1);
+    return NSXMLParser._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSXMLParser1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSXMLParser1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSXMLParser1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSXMLParser1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSXMLParser1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSXMLParser1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSXMLParser1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSXMLParser1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSXMLParser1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSXMLParserExternalEntityResolvingPolicy {
+  static const int NSXMLParserResolveExternalEntitiesNever = 0;
+  static const int NSXMLParserResolveExternalEntitiesNoNetwork = 1;
+  static const int NSXMLParserResolveExternalEntitiesSameOriginOnly = 2;
+  static const int NSXMLParserResolveExternalEntitiesAlways = 3;
+}
+
+class NSFileWrapper extends NSObject {
+  NSFileWrapper._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSFileWrapper] that points to the same underlying object as [other].
+  static NSFileWrapper castFrom<T extends _ObjCWrapper>(T other) {
+    return NSFileWrapper._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSFileWrapper] that wraps the given raw object pointer.
+  static NSFileWrapper castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSFileWrapper._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSFileWrapper].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSFileWrapper1);
+  }
+
+  NSFileWrapper initWithURL_options_error_(
+      NSURL? url, int options, ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    final _ret = _lib._objc_msgSend_903(
+        _id,
+        _lib._sel_initWithURL_options_error_1,
+        url?._id ?? ffi.nullptr,
+        options,
+        outError);
+    return NSFileWrapper._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSFileWrapper initDirectoryWithFileWrappers_(
+      NSDictionary? childrenByPreferredName) {
+    final _ret = _lib._objc_msgSend_143(
+        _id,
+        _lib._sel_initDirectoryWithFileWrappers_1,
+        childrenByPreferredName?._id ?? ffi.nullptr);
+    return NSFileWrapper._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSFileWrapper initRegularFileWithContents_(NSData? contents) {
+    final _ret = _lib._objc_msgSend_242(_id,
+        _lib._sel_initRegularFileWithContents_1, contents?._id ?? ffi.nullptr);
+    return NSFileWrapper._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSFileWrapper initSymbolicLinkWithDestinationURL_(NSURL? url) {
+    final _ret = _lib._objc_msgSend_226(
+        _id,
+        _lib._sel_initSymbolicLinkWithDestinationURL_1,
+        url?._id ?? ffi.nullptr);
+    return NSFileWrapper._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSFileWrapper initWithSerializedRepresentation_(
+      NSData? serializeRepresentation) {
+    final _ret = _lib._objc_msgSend_242(
+        _id,
+        _lib._sel_initWithSerializedRepresentation_1,
+        serializeRepresentation?._id ?? ffi.nullptr);
+    return NSFileWrapper._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSFileWrapper initWithCoder_(NSCoder? inCoder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, inCoder?._id ?? ffi.nullptr);
+    return NSFileWrapper._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool get directory {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isDirectory1);
+  }
+
+  bool get regularFile {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isRegularFile1);
+  }
+
+  bool get symbolicLink {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isSymbolicLink1);
+  }
+
+  NSString? get preferredFilename {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_preferredFilename1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set preferredFilename(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setPreferredFilename_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get filename {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_filename1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set filename(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setFilename_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSDictionary? get fileAttributes {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_fileAttributes1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  set fileAttributes(NSDictionary? value) {
+    _lib._objc_msgSend_165(
+        _id, _lib._sel_setFileAttributes_1, value?._id ?? ffi.nullptr);
+  }
+
+  bool matchesContentsOfURL_(NSURL? url) {
+    return _lib._objc_msgSend_229(
+        _id, _lib._sel_matchesContentsOfURL_1, url?._id ?? ffi.nullptr);
+  }
+
+  bool readFromURL_options_error_(
+      NSURL? url, int options, ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    return _lib._objc_msgSend_904(_id, _lib._sel_readFromURL_options_error_1,
+        url?._id ?? ffi.nullptr, options, outError);
+  }
+
+  bool writeToURL_options_originalContentsURL_error_(
+      NSURL? url,
+      int options,
+      NSURL? originalContentsURL,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    return _lib._objc_msgSend_905(
+        _id,
+        _lib._sel_writeToURL_options_originalContentsURL_error_1,
+        url?._id ?? ffi.nullptr,
+        options,
+        originalContentsURL?._id ?? ffi.nullptr,
+        outError);
+  }
+
+  NSData? get serializedRepresentation {
+    final _ret =
+        _lib._objc_msgSend_39(_id, _lib._sel_serializedRepresentation1);
+    return _ret.address == 0
+        ? null
+        : NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString addFileWrapper_(NSFileWrapper? child) {
+    final _ret = _lib._objc_msgSend_906(
+        _id, _lib._sel_addFileWrapper_1, child?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString addRegularFileWithContents_preferredFilename_(
+      NSData? data, NSString? fileName) {
+    final _ret = _lib._objc_msgSend_907(
+        _id,
+        _lib._sel_addRegularFileWithContents_preferredFilename_1,
+        data?._id ?? ffi.nullptr,
+        fileName?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  void removeFileWrapper_(NSFileWrapper? child) {
+    return _lib._objc_msgSend_908(
+        _id, _lib._sel_removeFileWrapper_1, child?._id ?? ffi.nullptr);
+  }
+
+  NSDictionary? get fileWrappers {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_fileWrappers1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString keyForFileWrapper_(NSFileWrapper? child) {
+    final _ret = _lib._objc_msgSend_906(
+        _id, _lib._sel_keyForFileWrapper_1, child?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData? get regularFileContents {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_regularFileContents1);
+    return _ret.address == 0
+        ? null
+        : NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get symbolicLinkDestinationURL {
+    final _ret =
+        _lib._objc_msgSend_40(_id, _lib._sel_symbolicLinkDestinationURL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject initWithPath_(NSString? path) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initWithPath_1, path?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject initSymbolicLinkWithDestination_(NSString? path) {
+    final _ret = _lib._objc_msgSend_30(_id,
+        _lib._sel_initSymbolicLinkWithDestination_1, path?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool needsToBeUpdatedFromPath_(NSString? path) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_needsToBeUpdatedFromPath_1, path?._id ?? ffi.nullptr);
+  }
+
+  bool updateFromPath_(NSString? path) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_updateFromPath_1, path?._id ?? ffi.nullptr);
+  }
+
+  bool writeToFile_atomically_updateFilenames_(
+      NSString? path, bool atomicFlag, bool updateFilenamesFlag) {
+    return _lib._objc_msgSend_909(
+        _id,
+        _lib._sel_writeToFile_atomically_updateFilenames_1,
+        path?._id ?? ffi.nullptr,
+        atomicFlag,
+        updateFilenamesFlag);
+  }
+
+  NSString addFileWithPath_(NSString? path) {
+    final _ret = _lib._objc_msgSend_64(
+        _id, _lib._sel_addFileWithPath_1, path?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString addSymbolicLinkWithDestination_preferredFilename_(
+      NSString? path, NSString? filename) {
+    final _ret = _lib._objc_msgSend_324(
+        _id,
+        _lib._sel_addSymbolicLinkWithDestination_preferredFilename_1,
+        path?._id ?? ffi.nullptr,
+        filename?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString symbolicLinkDestination() {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_symbolicLinkDestination1);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSFileWrapper new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSFileWrapper1, _lib._sel_new1);
+    return NSFileWrapper._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSFileWrapper alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSFileWrapper1, _lib._sel_alloc1);
+    return NSFileWrapper._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSFileWrapper1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSFileWrapper1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSFileWrapper1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSFileWrapper1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSFileWrapper1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSFileWrapper1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSFileWrapper1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSFileWrapper1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSFileWrapper1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSFileWrapperReadingOptions {
+  static const int NSFileWrapperReadingImmediate = 1;
+  static const int NSFileWrapperReadingWithoutMapping = 2;
+}
+
+abstract class NSFileWrapperWritingOptions {
+  static const int NSFileWrapperWritingAtomic = 1;
+  static const int NSFileWrapperWritingWithNameUpdating = 2;
+}
+
+class NSURLSession extends NSObject {
+  NSURLSession._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURLSession] that points to the same underlying object as [other].
+  static NSURLSession castFrom<T extends _ObjCWrapper>(T other) {
+    return NSURLSession._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSURLSession] that wraps the given raw object pointer.
+  static NSURLSession castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURLSession._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURLSession].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSURLSession1);
+  }
+
+  static NSURLSession? getSharedSession(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_910(
+        _lib._class_NSURLSession1, _lib._sel_sharedSession1);
+    return _ret.address == 0
+        ? null
+        : NSURLSession._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLSession sessionWithConfiguration_(
+      AVFAudio _lib, NSURLSessionConfiguration? configuration) {
+    final _ret = _lib._objc_msgSend_921(
+        _lib._class_NSURLSession1,
+        _lib._sel_sessionWithConfiguration_1,
+        configuration?._id ?? ffi.nullptr);
+    return NSURLSession._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLSession sessionWithConfiguration_delegate_delegateQueue_(
+      AVFAudio _lib,
+      NSURLSessionConfiguration? configuration,
+      NSObject? delegate,
+      NSOperationQueue? queue) {
+    final _ret = _lib._objc_msgSend_922(
+        _lib._class_NSURLSession1,
+        _lib._sel_sessionWithConfiguration_delegate_delegateQueue_1,
+        configuration?._id ?? ffi.nullptr,
+        delegate?._id ?? ffi.nullptr,
+        queue?._id ?? ffi.nullptr);
+    return NSURLSession._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSOperationQueue? get delegateQueue {
+    final _ret = _lib._objc_msgSend_790(_id, _lib._sel_delegateQueue1);
+    return _ret.address == 0
+        ? null
+        : NSOperationQueue._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject? get delegate {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_delegate1);
+    return _ret.address == 0
+        ? null
+        : NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionConfiguration? get configuration {
+    final _ret = _lib._objc_msgSend_911(_id, _lib._sel_configuration1);
+    return _ret.address == 0
+        ? null
+        : NSURLSessionConfiguration._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get sessionDescription {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_sessionDescription1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set sessionDescription(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setSessionDescription_1, value?._id ?? ffi.nullptr);
+  }
+
+  void finishTasksAndInvalidate() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_finishTasksAndInvalidate1);
+  }
+
+  void invalidateAndCancel() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_invalidateAndCancel1);
+  }
+
+  void resetWithCompletionHandler_(ObjCBlock16 completionHandler) {
+    return _lib._objc_msgSend_465(
+        _id, _lib._sel_resetWithCompletionHandler_1, completionHandler._id);
+  }
+
+  void flushWithCompletionHandler_(ObjCBlock16 completionHandler) {
+    return _lib._objc_msgSend_465(
+        _id, _lib._sel_flushWithCompletionHandler_1, completionHandler._id);
+  }
+
+  void getTasksWithCompletionHandler_(ObjCBlock37 completionHandler) {
+    return _lib._objc_msgSend_923(
+        _id, _lib._sel_getTasksWithCompletionHandler_1, completionHandler._id);
+  }
+
+  void getAllTasksWithCompletionHandler_(ObjCBlock30 completionHandler) {
+    return _lib._objc_msgSend_924(_id,
+        _lib._sel_getAllTasksWithCompletionHandler_1, completionHandler._id);
+  }
+
+  NSURLSessionDataTask dataTaskWithRequest_(NSURLRequest? request) {
+    final _ret = _lib._objc_msgSend_925(
+        _id, _lib._sel_dataTaskWithRequest_1, request?._id ?? ffi.nullptr);
+    return NSURLSessionDataTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionDataTask dataTaskWithURL_(NSURL? url) {
+    final _ret = _lib._objc_msgSend_926(
+        _id, _lib._sel_dataTaskWithURL_1, url?._id ?? ffi.nullptr);
+    return NSURLSessionDataTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionUploadTask uploadTaskWithRequest_fromFile_(
+      NSURLRequest? request, NSURL? fileURL) {
+    final _ret = _lib._objc_msgSend_927(
+        _id,
+        _lib._sel_uploadTaskWithRequest_fromFile_1,
+        request?._id ?? ffi.nullptr,
+        fileURL?._id ?? ffi.nullptr);
+    return NSURLSessionUploadTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionUploadTask uploadTaskWithRequest_fromData_(
+      NSURLRequest? request, NSData? bodyData) {
+    final _ret = _lib._objc_msgSend_928(
+        _id,
+        _lib._sel_uploadTaskWithRequest_fromData_1,
+        request?._id ?? ffi.nullptr,
+        bodyData?._id ?? ffi.nullptr);
+    return NSURLSessionUploadTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionUploadTask uploadTaskWithStreamedRequest_(NSURLRequest? request) {
+    final _ret = _lib._objc_msgSend_929(_id,
+        _lib._sel_uploadTaskWithStreamedRequest_1, request?._id ?? ffi.nullptr);
+    return NSURLSessionUploadTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionDownloadTask downloadTaskWithRequest_(NSURLRequest? request) {
+    final _ret = _lib._objc_msgSend_931(
+        _id, _lib._sel_downloadTaskWithRequest_1, request?._id ?? ffi.nullptr);
+    return NSURLSessionDownloadTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionDownloadTask downloadTaskWithURL_(NSURL? url) {
+    final _ret = _lib._objc_msgSend_932(
+        _id, _lib._sel_downloadTaskWithURL_1, url?._id ?? ffi.nullptr);
+    return NSURLSessionDownloadTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionDownloadTask downloadTaskWithResumeData_(NSData? resumeData) {
+    final _ret = _lib._objc_msgSend_933(_id,
+        _lib._sel_downloadTaskWithResumeData_1, resumeData?._id ?? ffi.nullptr);
+    return NSURLSessionDownloadTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionStreamTask streamTaskWithHostName_port_(
+      NSString? hostname, int port) {
+    final _ret = _lib._objc_msgSend_936(
+        _id,
+        _lib._sel_streamTaskWithHostName_port_1,
+        hostname?._id ?? ffi.nullptr,
+        port);
+    return NSURLSessionStreamTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionStreamTask streamTaskWithNetService_(NSNetService? service) {
+    final _ret = _lib._objc_msgSend_942(
+        _id, _lib._sel_streamTaskWithNetService_1, service?._id ?? ffi.nullptr);
+    return NSURLSessionStreamTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionWebSocketTask webSocketTaskWithURL_(NSURL? url) {
+    final _ret = _lib._objc_msgSend_949(
+        _id, _lib._sel_webSocketTaskWithURL_1, url?._id ?? ffi.nullptr);
+    return NSURLSessionWebSocketTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionWebSocketTask webSocketTaskWithURL_protocols_(
+      NSURL? url, NSArray? protocols) {
+    final _ret = _lib._objc_msgSend_950(
+        _id,
+        _lib._sel_webSocketTaskWithURL_protocols_1,
+        url?._id ?? ffi.nullptr,
+        protocols?._id ?? ffi.nullptr);
+    return NSURLSessionWebSocketTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionWebSocketTask webSocketTaskWithRequest_(NSURLRequest? request) {
+    final _ret = _lib._objc_msgSend_951(
+        _id, _lib._sel_webSocketTaskWithRequest_1, request?._id ?? ffi.nullptr);
+    return NSURLSessionWebSocketTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSURLSession init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSURLSession._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLSession new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSURLSession1, _lib._sel_new1);
+    return NSURLSession._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSURLSessionDataTask dataTaskWithRequest_completionHandler_(
+      NSURLRequest? request, ObjCBlock41 completionHandler) {
+    final _ret = _lib._objc_msgSend_952(
+        _id,
+        _lib._sel_dataTaskWithRequest_completionHandler_1,
+        request?._id ?? ffi.nullptr,
+        completionHandler._id);
+    return NSURLSessionDataTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionDataTask dataTaskWithURL_completionHandler_(
+      NSURL? url, ObjCBlock41 completionHandler) {
+    final _ret = _lib._objc_msgSend_953(
+        _id,
+        _lib._sel_dataTaskWithURL_completionHandler_1,
+        url?._id ?? ffi.nullptr,
+        completionHandler._id);
+    return NSURLSessionDataTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionUploadTask uploadTaskWithRequest_fromFile_completionHandler_(
+      NSURLRequest? request, NSURL? fileURL, ObjCBlock41 completionHandler) {
+    final _ret = _lib._objc_msgSend_954(
+        _id,
+        _lib._sel_uploadTaskWithRequest_fromFile_completionHandler_1,
+        request?._id ?? ffi.nullptr,
+        fileURL?._id ?? ffi.nullptr,
+        completionHandler._id);
+    return NSURLSessionUploadTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionUploadTask uploadTaskWithRequest_fromData_completionHandler_(
+      NSURLRequest? request, NSData? bodyData, ObjCBlock41 completionHandler) {
+    final _ret = _lib._objc_msgSend_955(
+        _id,
+        _lib._sel_uploadTaskWithRequest_fromData_completionHandler_1,
+        request?._id ?? ffi.nullptr,
+        bodyData?._id ?? ffi.nullptr,
+        completionHandler._id);
+    return NSURLSessionUploadTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionDownloadTask downloadTaskWithRequest_completionHandler_(
+      NSURLRequest? request, ObjCBlock42 completionHandler) {
+    final _ret = _lib._objc_msgSend_956(
+        _id,
+        _lib._sel_downloadTaskWithRequest_completionHandler_1,
+        request?._id ?? ffi.nullptr,
+        completionHandler._id);
+    return NSURLSessionDownloadTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionDownloadTask downloadTaskWithURL_completionHandler_(
+      NSURL? url, ObjCBlock42 completionHandler) {
+    final _ret = _lib._objc_msgSend_957(
+        _id,
+        _lib._sel_downloadTaskWithURL_completionHandler_1,
+        url?._id ?? ffi.nullptr,
+        completionHandler._id);
+    return NSURLSessionDownloadTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionDownloadTask downloadTaskWithResumeData_completionHandler_(
+      NSData? resumeData, ObjCBlock42 completionHandler) {
+    final _ret = _lib._objc_msgSend_958(
+        _id,
+        _lib._sel_downloadTaskWithResumeData_completionHandler_1,
+        resumeData?._id ?? ffi.nullptr,
+        completionHandler._id);
+    return NSURLSessionDownloadTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLSession alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSURLSession1, _lib._sel_alloc1);
+    return NSURLSession._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURLSession1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLSession1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLSession1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLSession1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURLSession1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURLSession1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURLSession1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSURLSession1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLSession1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSURLSessionConfiguration extends NSObject {
+  NSURLSessionConfiguration._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURLSessionConfiguration] that points to the same underlying object as [other].
+  static NSURLSessionConfiguration castFrom<T extends _ObjCWrapper>(T other) {
+    return NSURLSessionConfiguration._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSURLSessionConfiguration] that wraps the given raw object pointer.
+  static NSURLSessionConfiguration castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURLSessionConfiguration._(other, lib,
+        retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURLSessionConfiguration].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSURLSessionConfiguration1);
+  }
+
+  static NSURLSessionConfiguration? getDefaultSessionConfiguration(
+      AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_911(_lib._class_NSURLSessionConfiguration1,
+        _lib._sel_defaultSessionConfiguration1);
+    return _ret.address == 0
+        ? null
+        : NSURLSessionConfiguration._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLSessionConfiguration? getEphemeralSessionConfiguration(
+      AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_911(_lib._class_NSURLSessionConfiguration1,
+        _lib._sel_ephemeralSessionConfiguration1);
+    return _ret.address == 0
+        ? null
+        : NSURLSessionConfiguration._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLSessionConfiguration
+      backgroundSessionConfigurationWithIdentifier_(
+          AVFAudio _lib, NSString? identifier) {
+    final _ret = _lib._objc_msgSend_912(
+        _lib._class_NSURLSessionConfiguration1,
+        _lib._sel_backgroundSessionConfigurationWithIdentifier_1,
+        identifier?._id ?? ffi.nullptr);
+    return NSURLSessionConfiguration._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get identifier {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_identifier1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get requestCachePolicy {
+    return _lib._objc_msgSend_748(_id, _lib._sel_requestCachePolicy1);
+  }
+
+  set requestCachePolicy(int value) {
+    _lib._objc_msgSend_889(_id, _lib._sel_setRequestCachePolicy_1, value);
+  }
+
+  double get timeoutIntervalForRequest {
+    return _lib._objc_msgSend_149(_id, _lib._sel_timeoutIntervalForRequest1);
+  }
+
+  set timeoutIntervalForRequest(double value) {
+    _lib._objc_msgSend_474(
+        _id, _lib._sel_setTimeoutIntervalForRequest_1, value);
+  }
+
+  double get timeoutIntervalForResource {
+    return _lib._objc_msgSend_149(_id, _lib._sel_timeoutIntervalForResource1);
+  }
+
+  set timeoutIntervalForResource(double value) {
+    _lib._objc_msgSend_474(
+        _id, _lib._sel_setTimeoutIntervalForResource_1, value);
+  }
+
+  int get networkServiceType {
+    return _lib._objc_msgSend_749(_id, _lib._sel_networkServiceType1);
+  }
+
+  set networkServiceType(int value) {
+    _lib._objc_msgSend_890(_id, _lib._sel_setNetworkServiceType_1, value);
+  }
+
+  bool get allowsCellularAccess {
+    return _lib._objc_msgSend_12(_id, _lib._sel_allowsCellularAccess1);
+  }
+
+  set allowsCellularAccess(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setAllowsCellularAccess_1, value);
+  }
+
+  bool get allowsExpensiveNetworkAccess {
+    return _lib._objc_msgSend_12(_id, _lib._sel_allowsExpensiveNetworkAccess1);
+  }
+
+  set allowsExpensiveNetworkAccess(bool value) {
+    _lib._objc_msgSend_460(
+        _id, _lib._sel_setAllowsExpensiveNetworkAccess_1, value);
+  }
+
+  bool get allowsConstrainedNetworkAccess {
+    return _lib._objc_msgSend_12(
+        _id, _lib._sel_allowsConstrainedNetworkAccess1);
+  }
+
+  set allowsConstrainedNetworkAccess(bool value) {
+    _lib._objc_msgSend_460(
+        _id, _lib._sel_setAllowsConstrainedNetworkAccess_1, value);
+  }
+
+  bool get waitsForConnectivity {
+    return _lib._objc_msgSend_12(_id, _lib._sel_waitsForConnectivity1);
+  }
+
+  set waitsForConnectivity(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setWaitsForConnectivity_1, value);
+  }
+
+  bool get discretionary {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isDiscretionary1);
+  }
+
+  set discretionary(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setDiscretionary_1, value);
+  }
+
+  NSString? get sharedContainerIdentifier {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_sharedContainerIdentifier1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set sharedContainerIdentifier(NSString? value) {
+    _lib._objc_msgSend_477(_id, _lib._sel_setSharedContainerIdentifier_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  bool get sessionSendsLaunchEvents {
+    return _lib._objc_msgSend_12(_id, _lib._sel_sessionSendsLaunchEvents1);
+  }
+
+  set sessionSendsLaunchEvents(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setSessionSendsLaunchEvents_1, value);
+  }
+
+  NSDictionary? get connectionProxyDictionary {
+    final _ret =
+        _lib._objc_msgSend_164(_id, _lib._sel_connectionProxyDictionary1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  set connectionProxyDictionary(NSDictionary? value) {
+    _lib._objc_msgSend_165(_id, _lib._sel_setConnectionProxyDictionary_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  int get TLSMinimumSupportedProtocol {
+    return _lib._objc_msgSend_913(_id, _lib._sel_TLSMinimumSupportedProtocol1);
+  }
+
+  set TLSMinimumSupportedProtocol(int value) {
+    _lib._objc_msgSend_914(
+        _id, _lib._sel_setTLSMinimumSupportedProtocol_1, value);
+  }
+
+  int get TLSMaximumSupportedProtocol {
+    return _lib._objc_msgSend_913(_id, _lib._sel_TLSMaximumSupportedProtocol1);
+  }
+
+  set TLSMaximumSupportedProtocol(int value) {
+    _lib._objc_msgSend_914(
+        _id, _lib._sel_setTLSMaximumSupportedProtocol_1, value);
+  }
+
+  int get TLSMinimumSupportedProtocolVersion {
+    return _lib._objc_msgSend_915(
+        _id, _lib._sel_TLSMinimumSupportedProtocolVersion1);
+  }
+
+  set TLSMinimumSupportedProtocolVersion(int value) {
+    _lib._objc_msgSend_916(
+        _id, _lib._sel_setTLSMinimumSupportedProtocolVersion_1, value);
+  }
+
+  int get TLSMaximumSupportedProtocolVersion {
+    return _lib._objc_msgSend_915(
+        _id, _lib._sel_TLSMaximumSupportedProtocolVersion1);
+  }
+
+  set TLSMaximumSupportedProtocolVersion(int value) {
+    _lib._objc_msgSend_916(
+        _id, _lib._sel_setTLSMaximumSupportedProtocolVersion_1, value);
+  }
+
+  bool get HTTPShouldUsePipelining {
+    return _lib._objc_msgSend_12(_id, _lib._sel_HTTPShouldUsePipelining1);
+  }
+
+  set HTTPShouldUsePipelining(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setHTTPShouldUsePipelining_1, value);
+  }
+
+  bool get HTTPShouldSetCookies {
+    return _lib._objc_msgSend_12(_id, _lib._sel_HTTPShouldSetCookies1);
+  }
+
+  set HTTPShouldSetCookies(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setHTTPShouldSetCookies_1, value);
+  }
+
+  int get HTTPCookieAcceptPolicy {
+    return _lib._objc_msgSend_745(_id, _lib._sel_HTTPCookieAcceptPolicy1);
+  }
+
+  set HTTPCookieAcceptPolicy(int value) {
+    _lib._objc_msgSend_746(_id, _lib._sel_setHTTPCookieAcceptPolicy_1, value);
+  }
+
+  NSDictionary? get HTTPAdditionalHeaders {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_HTTPAdditionalHeaders1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  set HTTPAdditionalHeaders(NSDictionary? value) {
+    _lib._objc_msgSend_165(
+        _id, _lib._sel_setHTTPAdditionalHeaders_1, value?._id ?? ffi.nullptr);
+  }
+
+  int get HTTPMaximumConnectionsPerHost {
+    return _lib._objc_msgSend_78(_id, _lib._sel_HTTPMaximumConnectionsPerHost1);
+  }
+
+  set HTTPMaximumConnectionsPerHost(int value) {
+    _lib._objc_msgSend_558(
+        _id, _lib._sel_setHTTPMaximumConnectionsPerHost_1, value);
+  }
+
+  NSHTTPCookieStorage? get HTTPCookieStorage {
+    final _ret = _lib._objc_msgSend_739(_id, _lib._sel_HTTPCookieStorage1);
+    return _ret.address == 0
+        ? null
+        : NSHTTPCookieStorage._(_ret, _lib, retain: true, release: true);
+  }
+
+  set HTTPCookieStorage(NSHTTPCookieStorage? value) {
+    _lib._objc_msgSend_917(
+        _id, _lib._sel_setHTTPCookieStorage_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSURLCredentialStorage? get URLCredentialStorage {
+    final _ret = _lib._objc_msgSend_874(_id, _lib._sel_URLCredentialStorage1);
+    return _ret.address == 0
+        ? null
+        : NSURLCredentialStorage._(_ret, _lib, retain: true, release: true);
+  }
+
+  set URLCredentialStorage(NSURLCredentialStorage? value) {
+    _lib._objc_msgSend_918(
+        _id, _lib._sel_setURLCredentialStorage_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSURLCache? get URLCache {
+    final _ret = _lib._objc_msgSend_844(_id, _lib._sel_URLCache1);
+    return _ret.address == 0
+        ? null
+        : NSURLCache._(_ret, _lib, retain: true, release: true);
+  }
+
+  set URLCache(NSURLCache? value) {
+    _lib._objc_msgSend_845(
+        _id, _lib._sel_setURLCache_1, value?._id ?? ffi.nullptr);
+  }
+
+  bool get shouldUseExtendedBackgroundIdleMode {
+    return _lib._objc_msgSend_12(
+        _id, _lib._sel_shouldUseExtendedBackgroundIdleMode1);
+  }
+
+  set shouldUseExtendedBackgroundIdleMode(bool value) {
+    _lib._objc_msgSend_460(
+        _id, _lib._sel_setShouldUseExtendedBackgroundIdleMode_1, value);
+  }
+
+  NSArray? get protocolClasses {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_protocolClasses1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set protocolClasses(NSArray? value) {
+    _lib._objc_msgSend_696(
+        _id, _lib._sel_setProtocolClasses_1, value?._id ?? ffi.nullptr);
+  }
+
+  int get multipathServiceType {
+    return _lib._objc_msgSend_919(_id, _lib._sel_multipathServiceType1);
+  }
+
+  set multipathServiceType(int value) {
+    _lib._objc_msgSend_920(_id, _lib._sel_setMultipathServiceType_1, value);
+  }
+
+  @override
+  NSURLSessionConfiguration init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSURLSessionConfiguration._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLSessionConfiguration new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLSessionConfiguration1, _lib._sel_new1);
+    return NSURLSessionConfiguration._(_ret, _lib,
+        retain: false, release: true);
+  }
+
+  static NSURLSessionConfiguration backgroundSessionConfiguration_(
+      AVFAudio _lib, NSString? identifier) {
+    final _ret = _lib._objc_msgSend_912(
+        _lib._class_NSURLSessionConfiguration1,
+        _lib._sel_backgroundSessionConfiguration_1,
+        identifier?._id ?? ffi.nullptr);
+    return NSURLSessionConfiguration._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLSessionConfiguration alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLSessionConfiguration1, _lib._sel_alloc1);
+    return NSURLSessionConfiguration._(_ret, _lib,
+        retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURLSessionConfiguration1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLSessionConfiguration1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSURLSessionConfiguration1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLSessionConfiguration1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURLSessionConfiguration1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURLSessionConfiguration1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURLSessionConfiguration1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSURLSessionConfiguration1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSURLSessionConfiguration1,
+        _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class SSLProtocol {
+  static const int kSSLProtocolUnknown = 0;
+  static const int kTLSProtocol1 = 4;
+  static const int kTLSProtocol11 = 7;
+  static const int kTLSProtocol12 = 8;
+  static const int kDTLSProtocol1 = 9;
+  static const int kTLSProtocol13 = 10;
+  static const int kDTLSProtocol12 = 11;
+  static const int kTLSProtocolMaxSupported = 999;
+  static const int kSSLProtocol2 = 1;
+  static const int kSSLProtocol3 = 2;
+  static const int kSSLProtocol3Only = 3;
+  static const int kTLSProtocol1Only = 5;
+  static const int kSSLProtocolAll = 6;
+}
+
+abstract class tls_protocol_version_t {
+  static const int tls_protocol_version_TLSv10 = 769;
+  static const int tls_protocol_version_TLSv11 = 770;
+  static const int tls_protocol_version_TLSv12 = 771;
+  static const int tls_protocol_version_TLSv13 = 772;
+  static const int tls_protocol_version_DTLSv10 = -257;
+  static const int tls_protocol_version_DTLSv12 = -259;
+}
+
+abstract class NSURLSessionMultipathServiceType {
+  static const int NSURLSessionMultipathServiceTypeNone = 0;
+  static const int NSURLSessionMultipathServiceTypeHandover = 1;
+  static const int NSURLSessionMultipathServiceTypeInteractive = 2;
+  static const int NSURLSessionMultipathServiceTypeAggregate = 3;
+}
+
+void _ObjCBlock37_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0,
+    ffi.Pointer<ObjCObject> arg1,
+    ffi.Pointer<ObjCObject> arg2) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(
+                  ffi.Pointer<ObjCObject> arg0,
+                  ffi.Pointer<ObjCObject> arg1,
+                  ffi.Pointer<ObjCObject> arg2)>>()
+      .asFunction<
+          void Function(
+              ffi.Pointer<ObjCObject> arg0,
+              ffi.Pointer<ObjCObject> arg1,
+              ffi.Pointer<ObjCObject> arg2)>()(arg0, arg1, arg2);
+}
+
+final _ObjCBlock37_closureRegistry = <int, Function>{};
+int _ObjCBlock37_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock37_registerClosure(Function fn) {
+  final id = ++_ObjCBlock37_closureRegistryIndex;
+  _ObjCBlock37_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock37_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0,
+    ffi.Pointer<ObjCObject> arg1,
+    ffi.Pointer<ObjCObject> arg2) {
+  return _ObjCBlock37_closureRegistry[block.ref.target.address]!(
+      arg0, arg1, arg2);
+}
+
+class ObjCBlock37 extends _ObjCBlockBase {
+  ObjCBlock37._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock37.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(
+                      ffi.Pointer<ObjCObject> arg0,
+                      ffi.Pointer<ObjCObject> arg1,
+                      ffi.Pointer<ObjCObject> arg2)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1,
+                                ffi.Pointer<ObjCObject> arg2)>(
+                        _ObjCBlock37_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock37.fromFunction(
+      AVFAudio lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1,
+              ffi.Pointer<ObjCObject> arg2)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1,
+                                ffi.Pointer<ObjCObject> arg2)>(
+                        _ObjCBlock37_closureTrampoline)
+                    .cast(),
+                _ObjCBlock37_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1,
+      ffi.Pointer<ObjCObject> arg2) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    ffi.Pointer<ObjCObject> arg1,
+                    ffi.Pointer<ObjCObject> arg2)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                ffi.Pointer<ObjCObject> arg1,
+                ffi.Pointer<ObjCObject> arg2)>()(_id, arg0, arg1, arg2);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class NSURLSessionUploadTask extends NSURLSessionDataTask {
+  NSURLSessionUploadTask._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURLSessionUploadTask] that points to the same underlying object as [other].
+  static NSURLSessionUploadTask castFrom<T extends _ObjCWrapper>(T other) {
+    return NSURLSessionUploadTask._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSURLSessionUploadTask] that wraps the given raw object pointer.
+  static NSURLSessionUploadTask castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURLSessionUploadTask._(other, lib,
+        retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURLSessionUploadTask].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSURLSessionUploadTask1);
+  }
+
+  @override
+  NSURLSessionUploadTask init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSURLSessionUploadTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLSessionUploadTask new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLSessionUploadTask1, _lib._sel_new1);
+    return NSURLSessionUploadTask._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSURLSessionUploadTask alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLSessionUploadTask1, _lib._sel_alloc1);
+    return NSURLSessionUploadTask._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURLSessionUploadTask1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLSessionUploadTask1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSURLSessionUploadTask1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLSessionUploadTask1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURLSessionUploadTask1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURLSessionUploadTask1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURLSessionUploadTask1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSURLSessionUploadTask1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSURLSessionUploadTask1,
+        _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSURLSessionDownloadTask extends NSURLSessionTask {
+  NSURLSessionDownloadTask._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURLSessionDownloadTask] that points to the same underlying object as [other].
+  static NSURLSessionDownloadTask castFrom<T extends _ObjCWrapper>(T other) {
+    return NSURLSessionDownloadTask._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSURLSessionDownloadTask] that wraps the given raw object pointer.
+  static NSURLSessionDownloadTask castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURLSessionDownloadTask._(other, lib,
+        retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURLSessionDownloadTask].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSURLSessionDownloadTask1);
+  }
+
+  void cancelByProducingResumeData_(ObjCBlock38 completionHandler) {
+    return _lib._objc_msgSend_930(
+        _id, _lib._sel_cancelByProducingResumeData_1, completionHandler._id);
+  }
+
+  @override
+  NSURLSessionDownloadTask init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSURLSessionDownloadTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLSessionDownloadTask new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLSessionDownloadTask1, _lib._sel_new1);
+    return NSURLSessionDownloadTask._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSURLSessionDownloadTask alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLSessionDownloadTask1, _lib._sel_alloc1);
+    return NSURLSessionDownloadTask._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURLSessionDownloadTask1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLSessionDownloadTask1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSURLSessionDownloadTask1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLSessionDownloadTask1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURLSessionDownloadTask1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURLSessionDownloadTask1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURLSessionDownloadTask1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSURLSessionDownloadTask1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSURLSessionDownloadTask1,
+        _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+void _ObjCBlock38_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ObjCObject> arg0) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ObjCObject> arg0)>>()
+      .asFunction<void Function(ffi.Pointer<ObjCObject> arg0)>()(arg0);
+}
+
+final _ObjCBlock38_closureRegistry = <int, Function>{};
+int _ObjCBlock38_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock38_registerClosure(Function fn) {
+  final id = ++_ObjCBlock38_closureRegistryIndex;
+  _ObjCBlock38_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock38_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ObjCObject> arg0) {
+  return _ObjCBlock38_closureRegistry[block.ref.target.address]!(arg0);
+}
+
+class ObjCBlock38 extends _ObjCBlockBase {
+  ObjCBlock38._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock38.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0)>(
+                        _ObjCBlock38_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock38.fromFunction(
+      AVFAudio lib, void Function(ffi.Pointer<ObjCObject> arg0) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0)>(
+                        _ObjCBlock38_closureTrampoline)
+                    .cast(),
+                _ObjCBlock38_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0)>>()
+        .asFunction<
+            void Function(ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0)>()(_id, arg0);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class NSURLSessionStreamTask extends NSURLSessionTask {
+  NSURLSessionStreamTask._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURLSessionStreamTask] that points to the same underlying object as [other].
+  static NSURLSessionStreamTask castFrom<T extends _ObjCWrapper>(T other) {
+    return NSURLSessionStreamTask._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSURLSessionStreamTask] that wraps the given raw object pointer.
+  static NSURLSessionStreamTask castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURLSessionStreamTask._(other, lib,
+        retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURLSessionStreamTask].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSURLSessionStreamTask1);
+  }
+
+  void readDataOfMinLength_maxLength_timeout_completionHandler_(int minBytes,
+      int maxBytes, double timeout, ObjCBlock39 completionHandler) {
+    return _lib._objc_msgSend_934(
+        _id,
+        _lib._sel_readDataOfMinLength_maxLength_timeout_completionHandler_1,
+        minBytes,
+        maxBytes,
+        timeout,
+        completionHandler._id);
+  }
+
+  void writeData_timeout_completionHandler_(
+      NSData? data, double timeout, ObjCBlock15 completionHandler) {
+    return _lib._objc_msgSend_935(
+        _id,
+        _lib._sel_writeData_timeout_completionHandler_1,
+        data?._id ?? ffi.nullptr,
+        timeout,
+        completionHandler._id);
+  }
+
+  void captureStreams() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_captureStreams1);
+  }
+
+  void closeWrite() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_closeWrite1);
+  }
+
+  void closeRead() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_closeRead1);
+  }
+
+  void startSecureConnection() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_startSecureConnection1);
+  }
+
+  void stopSecureConnection() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_stopSecureConnection1);
+  }
+
+  @override
+  NSURLSessionStreamTask init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSURLSessionStreamTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLSessionStreamTask new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLSessionStreamTask1, _lib._sel_new1);
+    return NSURLSessionStreamTask._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSURLSessionStreamTask alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLSessionStreamTask1, _lib._sel_alloc1);
+    return NSURLSessionStreamTask._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURLSessionStreamTask1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLSessionStreamTask1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSURLSessionStreamTask1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLSessionStreamTask1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURLSessionStreamTask1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURLSessionStreamTask1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURLSessionStreamTask1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSURLSessionStreamTask1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSURLSessionStreamTask1,
+        _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+void _ObjCBlock39_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, bool arg1, ffi.Pointer<ObjCObject> arg2) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(ffi.Pointer<ObjCObject> arg0, ffi.Bool arg1,
+                  ffi.Pointer<ObjCObject> arg2)>>()
+      .asFunction<
+          void Function(ffi.Pointer<ObjCObject> arg0, bool arg1,
+              ffi.Pointer<ObjCObject> arg2)>()(arg0, arg1, arg2);
+}
+
+final _ObjCBlock39_closureRegistry = <int, Function>{};
+int _ObjCBlock39_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock39_registerClosure(Function fn) {
+  final id = ++_ObjCBlock39_closureRegistryIndex;
+  _ObjCBlock39_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock39_closureTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, bool arg1, ffi.Pointer<ObjCObject> arg2) {
+  return _ObjCBlock39_closureRegistry[block.ref.target.address]!(
+      arg0, arg1, arg2);
+}
+
+class ObjCBlock39 extends _ObjCBlockBase {
+  ObjCBlock39._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock39.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0, ffi.Bool arg1,
+                      ffi.Pointer<ObjCObject> arg2)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Bool arg1,
+                                ffi.Pointer<ObjCObject> arg2)>(
+                        _ObjCBlock39_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock39.fromFunction(
+      AVFAudio lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, bool arg1,
+              ffi.Pointer<ObjCObject> arg2)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Bool arg1,
+                                ffi.Pointer<ObjCObject> arg2)>(
+                        _ObjCBlock39_closureTrampoline)
+                    .cast(),
+                _ObjCBlock39_registerClosure(fn)),
+            lib);
+  void call(
+      ffi.Pointer<ObjCObject> arg0, bool arg1, ffi.Pointer<ObjCObject> arg2) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    ffi.Bool arg1,
+                    ffi.Pointer<ObjCObject> arg2)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                bool arg1,
+                ffi.Pointer<ObjCObject> arg2)>()(_id, arg0, arg1, arg2);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class NSNetService extends NSObject {
+  NSNetService._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSNetService] that points to the same underlying object as [other].
+  static NSNetService castFrom<T extends _ObjCWrapper>(T other) {
+    return NSNetService._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSNetService] that wraps the given raw object pointer.
+  static NSNetService castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSNetService._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSNetService].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSNetService1);
+  }
+
+  NSNetService initWithDomain_type_name_port_(
+      NSString? domain, NSString? type, NSString? name, int port) {
+    final _ret = _lib._objc_msgSend_937(
+        _id,
+        _lib._sel_initWithDomain_type_name_port_1,
+        domain?._id ?? ffi.nullptr,
+        type?._id ?? ffi.nullptr,
+        name?._id ?? ffi.nullptr,
+        port);
+    return NSNetService._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNetService initWithDomain_type_name_(
+      NSString? domain, NSString? type, NSString? name) {
+    final _ret = _lib._objc_msgSend_26(
+        _id,
+        _lib._sel_initWithDomain_type_name_1,
+        domain?._id ?? ffi.nullptr,
+        type?._id ?? ffi.nullptr,
+        name?._id ?? ffi.nullptr);
+    return NSNetService._(_ret, _lib, retain: true, release: true);
+  }
+
+  void scheduleInRunLoop_forMode_(NSRunLoop? aRunLoop, NSRunLoopMode mode) {
+    return _lib._objc_msgSend_501(_id, _lib._sel_scheduleInRunLoop_forMode_1,
+        aRunLoop?._id ?? ffi.nullptr, mode);
+  }
+
+  void removeFromRunLoop_forMode_(NSRunLoop? aRunLoop, NSRunLoopMode mode) {
+    return _lib._objc_msgSend_501(_id, _lib._sel_removeFromRunLoop_forMode_1,
+        aRunLoop?._id ?? ffi.nullptr, mode);
+  }
+
+  NSObject? get delegate {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_delegate1);
+    return _ret.address == 0
+        ? null
+        : NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  set delegate(NSObject? value) {
+    _lib._objc_msgSend_368(
+        _id, _lib._sel_setDelegate_1, value?._id ?? ffi.nullptr);
+  }
+
+  bool get includesPeerToPeer {
+    return _lib._objc_msgSend_12(_id, _lib._sel_includesPeerToPeer1);
+  }
+
+  set includesPeerToPeer(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setIncludesPeerToPeer_1, value);
+  }
+
+  NSString? get name {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_name1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get type {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_type1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get domain {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_domain1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get hostName {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_hostName1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get addresses {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_addresses1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get port {
+    return _lib._objc_msgSend_78(_id, _lib._sel_port1);
+  }
+
+  void publish() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_publish1);
+  }
+
+  void publishWithOptions_(int options) {
+    return _lib._objc_msgSend_938(_id, _lib._sel_publishWithOptions_1, options);
+  }
+
+  void resolve() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_resolve1);
+  }
+
+  void stop() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_stop1);
+  }
+
+  static NSDictionary dictionaryFromTXTRecordData_(
+      AVFAudio _lib, NSData? txtData) {
+    final _ret = _lib._objc_msgSend_939(_lib._class_NSNetService1,
+        _lib._sel_dictionaryFromTXTRecordData_1, txtData?._id ?? ffi.nullptr);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSData dataFromTXTRecordDictionary_(
+      AVFAudio _lib, NSDictionary? txtDictionary) {
+    final _ret = _lib._objc_msgSend_940(
+        _lib._class_NSNetService1,
+        _lib._sel_dataFromTXTRecordDictionary_1,
+        txtDictionary?._id ?? ffi.nullptr);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  void resolveWithTimeout_(double timeout) {
+    return _lib._objc_msgSend_473(_id, _lib._sel_resolveWithTimeout_1, timeout);
+  }
+
+  bool getInputStream_outputStream_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> inputStream,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outputStream) {
+    return _lib._objc_msgSend_941(_id, _lib._sel_getInputStream_outputStream_1,
+        inputStream, outputStream);
+  }
+
+  bool setTXTRecordData_(NSData? recordData) {
+    return _lib._objc_msgSend_23(
+        _id, _lib._sel_setTXTRecordData_1, recordData?._id ?? ffi.nullptr);
+  }
+
+  NSData TXTRecordData() {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_TXTRecordData1);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  void startMonitoring() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_startMonitoring1);
+  }
+
+  void stopMonitoring() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_stopMonitoring1);
+  }
+
+  static NSNetService new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSNetService1, _lib._sel_new1);
+    return NSNetService._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSNetService alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSNetService1, _lib._sel_alloc1);
+    return NSNetService._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSNetService1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSNetService1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSNetService1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSNetService1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSNetService1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSNetService1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSNetService1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSNetService1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSNetService1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSNetServiceOptions {
+  static const int NSNetServiceNoAutoRename = 1;
+  static const int NSNetServiceListenForConnections = 2;
+}
+
+class NSURLSessionWebSocketTask extends NSURLSessionTask {
+  NSURLSessionWebSocketTask._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURLSessionWebSocketTask] that points to the same underlying object as [other].
+  static NSURLSessionWebSocketTask castFrom<T extends _ObjCWrapper>(T other) {
+    return NSURLSessionWebSocketTask._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSURLSessionWebSocketTask] that wraps the given raw object pointer.
+  static NSURLSessionWebSocketTask castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURLSessionWebSocketTask._(other, lib,
+        retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURLSessionWebSocketTask].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSURLSessionWebSocketTask1);
+  }
+
+  void sendMessage_completionHandler_(
+      NSURLSessionWebSocketMessage? message, ObjCBlock15 completionHandler) {
+    return _lib._objc_msgSend_944(
+        _id,
+        _lib._sel_sendMessage_completionHandler_1,
+        message?._id ?? ffi.nullptr,
+        completionHandler._id);
+  }
+
+  void receiveMessageWithCompletionHandler_(ObjCBlock40 completionHandler) {
+    return _lib._objc_msgSend_945(_id,
+        _lib._sel_receiveMessageWithCompletionHandler_1, completionHandler._id);
+  }
+
+  void sendPingWithPongReceiveHandler_(ObjCBlock15 pongReceiveHandler) {
+    return _lib._objc_msgSend_946(_id,
+        _lib._sel_sendPingWithPongReceiveHandler_1, pongReceiveHandler._id);
+  }
+
+  void cancelWithCloseCode_reason_(int closeCode, NSData? reason) {
+    return _lib._objc_msgSend_947(_id, _lib._sel_cancelWithCloseCode_reason_1,
+        closeCode, reason?._id ?? ffi.nullptr);
+  }
+
+  int get maximumMessageSize {
+    return _lib._objc_msgSend_78(_id, _lib._sel_maximumMessageSize1);
+  }
+
+  set maximumMessageSize(int value) {
+    _lib._objc_msgSend_558(_id, _lib._sel_setMaximumMessageSize_1, value);
+  }
+
+  int get closeCode {
+    return _lib._objc_msgSend_948(_id, _lib._sel_closeCode1);
+  }
+
+  NSData? get closeReason {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_closeReason1);
+    return _ret.address == 0
+        ? null
+        : NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSURLSessionWebSocketTask init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSURLSessionWebSocketTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLSessionWebSocketTask new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLSessionWebSocketTask1, _lib._sel_new1);
+    return NSURLSessionWebSocketTask._(_ret, _lib,
+        retain: false, release: true);
+  }
+
+  static NSURLSessionWebSocketTask alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLSessionWebSocketTask1, _lib._sel_alloc1);
+    return NSURLSessionWebSocketTask._(_ret, _lib,
+        retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURLSessionWebSocketTask1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLSessionWebSocketTask1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSURLSessionWebSocketTask1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLSessionWebSocketTask1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURLSessionWebSocketTask1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURLSessionWebSocketTask1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURLSessionWebSocketTask1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSURLSessionWebSocketTask1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSURLSessionWebSocketTask1,
+        _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSURLSessionWebSocketMessage extends NSObject {
+  NSURLSessionWebSocketMessage._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURLSessionWebSocketMessage] that points to the same underlying object as [other].
+  static NSURLSessionWebSocketMessage castFrom<T extends _ObjCWrapper>(
+      T other) {
+    return NSURLSessionWebSocketMessage._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSURLSessionWebSocketMessage] that wraps the given raw object pointer.
+  static NSURLSessionWebSocketMessage castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURLSessionWebSocketMessage._(other, lib,
+        retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURLSessionWebSocketMessage].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSURLSessionWebSocketMessage1);
+  }
+
+  NSURLSessionWebSocketMessage initWithData_(NSData? data) {
+    final _ret = _lib._objc_msgSend_242(
+        _id, _lib._sel_initWithData_1, data?._id ?? ffi.nullptr);
+    return NSURLSessionWebSocketMessage._(_ret, _lib,
+        retain: true, release: true);
+  }
+
+  NSURLSessionWebSocketMessage initWithString_(NSString? string) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initWithString_1, string?._id ?? ffi.nullptr);
+    return NSURLSessionWebSocketMessage._(_ret, _lib,
+        retain: true, release: true);
+  }
+
+  int get type {
+    return _lib._objc_msgSend_943(_id, _lib._sel_type1);
+  }
+
+  NSData? get data {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_data1);
+    return _ret.address == 0
+        ? null
+        : NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get string {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_string1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSURLSessionWebSocketMessage init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSURLSessionWebSocketMessage._(_ret, _lib,
+        retain: true, release: true);
+  }
+
+  static NSURLSessionWebSocketMessage new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLSessionWebSocketMessage1, _lib._sel_new1);
+    return NSURLSessionWebSocketMessage._(_ret, _lib,
+        retain: false, release: true);
+  }
+
+  static NSURLSessionWebSocketMessage alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLSessionWebSocketMessage1, _lib._sel_alloc1);
+    return NSURLSessionWebSocketMessage._(_ret, _lib,
+        retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURLSessionWebSocketMessage1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLSessionWebSocketMessage1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSURLSessionWebSocketMessage1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSURLSessionWebSocketMessage1,
+        _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURLSessionWebSocketMessage1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURLSessionWebSocketMessage1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURLSessionWebSocketMessage1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSURLSessionWebSocketMessage1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSURLSessionWebSocketMessage1,
+        _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSURLSessionWebSocketMessageType {
+  static const int NSURLSessionWebSocketMessageTypeData = 0;
+  static const int NSURLSessionWebSocketMessageTypeString = 1;
+}
+
+void _ObjCBlock40_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(ffi.Pointer<ObjCObject> arg0,
+                  ffi.Pointer<ObjCObject> arg1)>>()
+      .asFunction<
+          void Function(ffi.Pointer<ObjCObject> arg0,
+              ffi.Pointer<ObjCObject> arg1)>()(arg0, arg1);
+}
+
+final _ObjCBlock40_closureRegistry = <int, Function>{};
+int _ObjCBlock40_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock40_registerClosure(Function fn) {
+  final id = ++_ObjCBlock40_closureRegistryIndex;
+  _ObjCBlock40_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock40_closureTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1) {
+  return _ObjCBlock40_closureRegistry[block.ref.target.address]!(arg0, arg1);
+}
+
+class ObjCBlock40 extends _ObjCBlockBase {
+  ObjCBlock40._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock40.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0,
+                      ffi.Pointer<ObjCObject> arg1)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1)>(
+                        _ObjCBlock40_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock40.fromFunction(
+      AVFAudio lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1)>(
+                        _ObjCBlock40_closureTrampoline)
+                    .cast(),
+                _ObjCBlock40_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    ffi.Pointer<ObjCObject> arg1)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                ffi.Pointer<ObjCObject> arg1)>()(_id, arg0, arg1);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+abstract class NSURLSessionWebSocketCloseCode {
+  static const int NSURLSessionWebSocketCloseCodeInvalid = 0;
+  static const int NSURLSessionWebSocketCloseCodeNormalClosure = 1000;
+  static const int NSURLSessionWebSocketCloseCodeGoingAway = 1001;
+  static const int NSURLSessionWebSocketCloseCodeProtocolError = 1002;
+  static const int NSURLSessionWebSocketCloseCodeUnsupportedData = 1003;
+  static const int NSURLSessionWebSocketCloseCodeNoStatusReceived = 1005;
+  static const int NSURLSessionWebSocketCloseCodeAbnormalClosure = 1006;
+  static const int NSURLSessionWebSocketCloseCodeInvalidFramePayloadData = 1007;
+  static const int NSURLSessionWebSocketCloseCodePolicyViolation = 1008;
+  static const int NSURLSessionWebSocketCloseCodeMessageTooBig = 1009;
+  static const int NSURLSessionWebSocketCloseCodeMandatoryExtensionMissing =
+      1010;
+  static const int NSURLSessionWebSocketCloseCodeInternalServerError = 1011;
+  static const int NSURLSessionWebSocketCloseCodeTLSHandshakeFailure = 1015;
+}
+
+void _ObjCBlock41_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0,
+    ffi.Pointer<ObjCObject> arg1,
+    ffi.Pointer<ObjCObject> arg2) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(
+                  ffi.Pointer<ObjCObject> arg0,
+                  ffi.Pointer<ObjCObject> arg1,
+                  ffi.Pointer<ObjCObject> arg2)>>()
+      .asFunction<
+          void Function(
+              ffi.Pointer<ObjCObject> arg0,
+              ffi.Pointer<ObjCObject> arg1,
+              ffi.Pointer<ObjCObject> arg2)>()(arg0, arg1, arg2);
+}
+
+final _ObjCBlock41_closureRegistry = <int, Function>{};
+int _ObjCBlock41_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock41_registerClosure(Function fn) {
+  final id = ++_ObjCBlock41_closureRegistryIndex;
+  _ObjCBlock41_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock41_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0,
+    ffi.Pointer<ObjCObject> arg1,
+    ffi.Pointer<ObjCObject> arg2) {
+  return _ObjCBlock41_closureRegistry[block.ref.target.address]!(
+      arg0, arg1, arg2);
+}
+
+class ObjCBlock41 extends _ObjCBlockBase {
+  ObjCBlock41._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock41.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(
+                      ffi.Pointer<ObjCObject> arg0,
+                      ffi.Pointer<ObjCObject> arg1,
+                      ffi.Pointer<ObjCObject> arg2)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1,
+                                ffi.Pointer<ObjCObject> arg2)>(
+                        _ObjCBlock41_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock41.fromFunction(
+      AVFAudio lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1,
+              ffi.Pointer<ObjCObject> arg2)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1,
+                                ffi.Pointer<ObjCObject> arg2)>(
+                        _ObjCBlock41_closureTrampoline)
+                    .cast(),
+                _ObjCBlock41_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1,
+      ffi.Pointer<ObjCObject> arg2) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    ffi.Pointer<ObjCObject> arg1,
+                    ffi.Pointer<ObjCObject> arg2)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                ffi.Pointer<ObjCObject> arg1,
+                ffi.Pointer<ObjCObject> arg2)>()(_id, arg0, arg1, arg2);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+void _ObjCBlock42_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0,
+    ffi.Pointer<ObjCObject> arg1,
+    ffi.Pointer<ObjCObject> arg2) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(
+                  ffi.Pointer<ObjCObject> arg0,
+                  ffi.Pointer<ObjCObject> arg1,
+                  ffi.Pointer<ObjCObject> arg2)>>()
+      .asFunction<
+          void Function(
+              ffi.Pointer<ObjCObject> arg0,
+              ffi.Pointer<ObjCObject> arg1,
+              ffi.Pointer<ObjCObject> arg2)>()(arg0, arg1, arg2);
+}
+
+final _ObjCBlock42_closureRegistry = <int, Function>{};
+int _ObjCBlock42_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock42_registerClosure(Function fn) {
+  final id = ++_ObjCBlock42_closureRegistryIndex;
+  _ObjCBlock42_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock42_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0,
+    ffi.Pointer<ObjCObject> arg1,
+    ffi.Pointer<ObjCObject> arg2) {
+  return _ObjCBlock42_closureRegistry[block.ref.target.address]!(
+      arg0, arg1, arg2);
+}
+
+class ObjCBlock42 extends _ObjCBlockBase {
+  ObjCBlock42._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock42.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(
+                      ffi.Pointer<ObjCObject> arg0,
+                      ffi.Pointer<ObjCObject> arg1,
+                      ffi.Pointer<ObjCObject> arg2)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1,
+                                ffi.Pointer<ObjCObject> arg2)>(
+                        _ObjCBlock42_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock42.fromFunction(
+      AVFAudio lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1,
+              ffi.Pointer<ObjCObject> arg2)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1,
+                                ffi.Pointer<ObjCObject> arg2)>(
+                        _ObjCBlock42_closureTrampoline)
+                    .cast(),
+                _ObjCBlock42_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1,
+      ffi.Pointer<ObjCObject> arg2) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    ffi.Pointer<ObjCObject> arg1,
+                    ffi.Pointer<ObjCObject> arg2)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                ffi.Pointer<ObjCObject> arg1,
+                ffi.Pointer<ObjCObject> arg2)>()(_id, arg0, arg1, arg2);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class NSProtocolChecker extends NSProxy {
+  NSProtocolChecker._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSProtocolChecker] that points to the same underlying object as [other].
+  static NSProtocolChecker castFrom<T extends _ObjCWrapper>(T other) {
+    return NSProtocolChecker._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSProtocolChecker] that wraps the given raw object pointer.
+  static NSProtocolChecker castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSProtocolChecker._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSProtocolChecker].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSProtocolChecker1);
+  }
+
+  Protocol? get protocol {
+    final _ret = _lib._objc_msgSend_959(_id, _lib._sel_protocol1);
+    return _ret.address == 0
+        ? null
+        : Protocol._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject? get target {
+    final _ret = _lib._objc_msgSend_788(_id, _lib._sel_target1);
+    return _ret.address == 0
+        ? null
+        : NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSProtocolChecker protocolCheckerWithTarget_protocol_(
+      AVFAudio _lib, NSObject? anObject, Protocol? aProtocol) {
+    final _ret = _lib._objc_msgSend_960(
+        _lib._class_NSProtocolChecker1,
+        _lib._sel_protocolCheckerWithTarget_protocol_1,
+        anObject?._id ?? ffi.nullptr,
+        aProtocol?._id ?? ffi.nullptr);
+    return NSProtocolChecker._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSProtocolChecker initWithTarget_protocol_(
+      NSObject? anObject, Protocol? aProtocol) {
+    final _ret = _lib._objc_msgSend_960(
+        _id,
+        _lib._sel_initWithTarget_protocol_1,
+        anObject?._id ?? ffi.nullptr,
+        aProtocol?._id ?? ffi.nullptr);
+    return NSProtocolChecker._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSProtocolChecker1, _lib._sel_alloc1);
+    return NSObject._(_ret, _lib, retain: false, release: true);
+  }
+
+  static bool respondsToSelector_(
+      AVFAudio _lib, ffi.Pointer<ObjCSel> aSelector) {
+    return _lib._objc_msgSend_4(_lib._class_NSProtocolChecker1,
+        _lib._sel_respondsToSelector_1, aSelector);
+  }
+}
+
+class NSTask extends NSObject {
+  NSTask._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSTask] that points to the same underlying object as [other].
+  static NSTask castFrom<T extends _ObjCWrapper>(T other) {
+    return NSTask._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSTask] that wraps the given raw object pointer.
+  static NSTask castFromPointer(AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSTask._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSTask].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSTask1);
+  }
+
+  @override
+  NSTask init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get executableURL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_executableURL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  set executableURL(NSURL? value) {
+    _lib._objc_msgSend_888(
+        _id, _lib._sel_setExecutableURL_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get arguments {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_arguments1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set arguments(NSArray? value) {
+    _lib._objc_msgSend_696(
+        _id, _lib._sel_setArguments_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSDictionary? get environment {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_environment1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  set environment(NSDictionary? value) {
+    _lib._objc_msgSend_165(
+        _id, _lib._sel_setEnvironment_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSURL? get currentDirectoryURL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_currentDirectoryURL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  set currentDirectoryURL(NSURL? value) {
+    _lib._objc_msgSend_888(
+        _id, _lib._sel_setCurrentDirectoryURL_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSObject get standardInput {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_standardInput1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  set standardInput(NSObject value) {
+    _lib._objc_msgSend_368(_id, _lib._sel_setStandardInput_1, value._id);
+  }
+
+  NSObject get standardOutput {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_standardOutput1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  set standardOutput(NSObject value) {
+    _lib._objc_msgSend_368(_id, _lib._sel_setStandardOutput_1, value._id);
+  }
+
+  NSObject get standardError {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_standardError1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  set standardError(NSObject value) {
+    _lib._objc_msgSend_368(_id, _lib._sel_setStandardError_1, value._id);
+  }
+
+  bool launchAndReturnError_(ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_219(_id, _lib._sel_launchAndReturnError_1, error);
+  }
+
+  void interrupt() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_interrupt1);
+  }
+
+  void terminate() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_terminate1);
+  }
+
+  bool suspend() {
+    return _lib._objc_msgSend_12(_id, _lib._sel_suspend1);
+  }
+
+  bool resume() {
+    return _lib._objc_msgSend_12(_id, _lib._sel_resume1);
+  }
+
+  int get processIdentifier {
+    return _lib._objc_msgSend_213(_id, _lib._sel_processIdentifier1);
+  }
+
+  bool get running {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isRunning1);
+  }
+
+  int get terminationStatus {
+    return _lib._objc_msgSend_213(_id, _lib._sel_terminationStatus1);
+  }
+
+  int get terminationReason {
+    return _lib._objc_msgSend_961(_id, _lib._sel_terminationReason1);
+  }
+
+  ObjCBlock43 get terminationHandler {
+    final _ret = _lib._objc_msgSend_962(_id, _lib._sel_terminationHandler1);
+    return ObjCBlock43._(_ret, _lib);
+  }
+
+  set terminationHandler(ObjCBlock43 value) {
+    _lib._objc_msgSend_963(_id, _lib._sel_setTerminationHandler_1, value._id);
+  }
+
+  int get qualityOfService {
+    return _lib._objc_msgSend_475(_id, _lib._sel_qualityOfService1);
+  }
+
+  set qualityOfService(int value) {
+    _lib._objc_msgSend_476(_id, _lib._sel_setQualityOfService_1, value);
+  }
+
+  static NSTask
+      launchedTaskWithExecutableURL_arguments_error_terminationHandler_(
+          AVFAudio _lib,
+          NSURL? url,
+          NSArray? arguments,
+          ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+          ObjCBlock43 terminationHandler) {
+    final _ret = _lib._objc_msgSend_964(
+        _lib._class_NSTask1,
+        _lib._sel_launchedTaskWithExecutableURL_arguments_error_terminationHandler_1,
+        url?._id ?? ffi.nullptr,
+        arguments?._id ?? ffi.nullptr,
+        error,
+        terminationHandler._id);
+    return NSTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  void waitUntilExit() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_waitUntilExit1);
+  }
+
+  NSString? get launchPath {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_launchPath1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set launchPath(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setLaunchPath_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get currentDirectoryPath {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_currentDirectoryPath1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set currentDirectoryPath(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setCurrentDirectoryPath_1, value?._id ?? ffi.nullptr);
+  }
+
+  void launch() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_launch1);
+  }
+
+  static NSTask launchedTaskWithLaunchPath_arguments_(
+      AVFAudio _lib, NSString? path, NSArray? arguments) {
+    final _ret = _lib._objc_msgSend_965(
+        _lib._class_NSTask1,
+        _lib._sel_launchedTaskWithLaunchPath_arguments_1,
+        path?._id ?? ffi.nullptr,
+        arguments?._id ?? ffi.nullptr);
+    return NSTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTask new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSTask1, _lib._sel_new1);
+    return NSTask._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSTask alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSTask1, _lib._sel_alloc1);
+    return NSTask._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSTask1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSTask1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSTask1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSTask1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSTask1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSTask1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSTask1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSTask1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSTask1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSTaskTerminationReason {
+  static const int NSTaskTerminationReasonExit = 1;
+  static const int NSTaskTerminationReasonUncaughtSignal = 2;
+}
+
+void _ObjCBlock43_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ObjCObject> arg0) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ObjCObject> arg0)>>()
+      .asFunction<void Function(ffi.Pointer<ObjCObject> arg0)>()(arg0);
+}
+
+final _ObjCBlock43_closureRegistry = <int, Function>{};
+int _ObjCBlock43_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock43_registerClosure(Function fn) {
+  final id = ++_ObjCBlock43_closureRegistryIndex;
+  _ObjCBlock43_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock43_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ObjCObject> arg0) {
+  return _ObjCBlock43_closureRegistry[block.ref.target.address]!(arg0);
+}
+
+class ObjCBlock43 extends _ObjCBlockBase {
+  ObjCBlock43._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock43.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0)>(
+                        _ObjCBlock43_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock43.fromFunction(
+      AVFAudio lib, void Function(ffi.Pointer<ObjCObject> arg0) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0)>(
+                        _ObjCBlock43_closureTrampoline)
+                    .cast(),
+                _ObjCBlock43_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0)>>()
+        .asFunction<
+            void Function(ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0)>()(_id, arg0);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class NSXMLElement extends NSXMLNode {
+  NSXMLElement._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSXMLElement] that points to the same underlying object as [other].
+  static NSXMLElement castFrom<T extends _ObjCWrapper>(T other) {
+    return NSXMLElement._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSXMLElement] that wraps the given raw object pointer.
+  static NSXMLElement castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSXMLElement._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSXMLElement].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSXMLElement1);
+  }
+
+  NSXMLElement initWithName_(NSString? name) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initWithName_1, name?._id ?? ffi.nullptr);
+    return NSXMLElement._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLElement initWithName_URI_(NSString? name, NSString? URI) {
+    final _ret = _lib._objc_msgSend_159(_id, _lib._sel_initWithName_URI_1,
+        name?._id ?? ffi.nullptr, URI?._id ?? ffi.nullptr);
+    return NSXMLElement._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLElement initWithName_stringValue_(NSString? name, NSString? string) {
+    final _ret = _lib._objc_msgSend_159(
+        _id,
+        _lib._sel_initWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        string?._id ?? ffi.nullptr);
+    return NSXMLElement._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLElement initWithXMLString_error_(
+      NSString? string, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_264(_id,
+        _lib._sel_initWithXMLString_error_1, string?._id ?? ffi.nullptr, error);
+    return NSXMLElement._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSXMLElement initWithKind_options_(int kind, int options) {
+    final _ret = _lib._objc_msgSend_967(
+        _id, _lib._sel_initWithKind_options_1, kind, options);
+    return NSXMLElement._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray elementsForName_(NSString? name) {
+    final _ret = _lib._objc_msgSend_119(
+        _id, _lib._sel_elementsForName_1, name?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray elementsForLocalName_URI_(NSString? localName, NSString? URI) {
+    final _ret = _lib._objc_msgSend_617(
+        _id,
+        _lib._sel_elementsForLocalName_URI_1,
+        localName?._id ?? ffi.nullptr,
+        URI?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  void addAttribute_(NSXMLNode? attribute) {
+    return _lib._objc_msgSend_979(
+        _id, _lib._sel_addAttribute_1, attribute?._id ?? ffi.nullptr);
+  }
+
+  void removeAttributeForName_(NSString? name) {
+    return _lib._objc_msgSend_186(
+        _id, _lib._sel_removeAttributeForName_1, name?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get attributes {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_attributes1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set attributes(NSArray? value) {
+    _lib._objc_msgSend_696(
+        _id, _lib._sel_setAttributes_1, value?._id ?? ffi.nullptr);
+  }
+
+  void setAttributesWithDictionary_(NSDictionary? attributes) {
+    return _lib._objc_msgSend_444(_id, _lib._sel_setAttributesWithDictionary_1,
+        attributes?._id ?? ffi.nullptr);
+  }
+
+  NSXMLNode attributeForName_(NSString? name) {
+    final _ret = _lib._objc_msgSend_983(
+        _id, _lib._sel_attributeForName_1, name?._id ?? ffi.nullptr);
+    return NSXMLNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLNode attributeForLocalName_URI_(NSString? localName, NSString? URI) {
+    final _ret = _lib._objc_msgSend_1000(
+        _id,
+        _lib._sel_attributeForLocalName_URI_1,
+        localName?._id ?? ffi.nullptr,
+        URI?._id ?? ffi.nullptr);
+    return NSXMLNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  void addNamespace_(NSXMLNode? aNamespace) {
+    return _lib._objc_msgSend_979(
+        _id, _lib._sel_addNamespace_1, aNamespace?._id ?? ffi.nullptr);
+  }
+
+  void removeNamespaceForPrefix_(NSString? name) {
+    return _lib._objc_msgSend_186(
+        _id, _lib._sel_removeNamespaceForPrefix_1, name?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get namespaces {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_namespaces1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set namespaces(NSArray? value) {
+    _lib._objc_msgSend_696(
+        _id, _lib._sel_setNamespaces_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSXMLNode namespaceForPrefix_(NSString? name) {
+    final _ret = _lib._objc_msgSend_983(
+        _id, _lib._sel_namespaceForPrefix_1, name?._id ?? ffi.nullptr);
+    return NSXMLNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLNode resolveNamespaceForName_(NSString? name) {
+    final _ret = _lib._objc_msgSend_983(
+        _id, _lib._sel_resolveNamespaceForName_1, name?._id ?? ffi.nullptr);
+    return NSXMLNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString resolvePrefixForNamespaceURI_(NSString? namespaceURI) {
+    final _ret = _lib._objc_msgSend_64(
+        _id,
+        _lib._sel_resolvePrefixForNamespaceURI_1,
+        namespaceURI?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  void insertChild_atIndex_(NSXMLNode? child, int index) {
+    return _lib._objc_msgSend_977(
+        _id, _lib._sel_insertChild_atIndex_1, child?._id ?? ffi.nullptr, index);
+  }
+
+  void insertChildren_atIndex_(NSArray? children, int index) {
+    return _lib._objc_msgSend_978(_id, _lib._sel_insertChildren_atIndex_1,
+        children?._id ?? ffi.nullptr, index);
+  }
+
+  void removeChildAtIndex_(int index) {
+    return _lib._objc_msgSend_410(_id, _lib._sel_removeChildAtIndex_1, index);
+  }
+
+  void setChildren_(NSArray? children) {
+    return _lib._objc_msgSend_412(
+        _id, _lib._sel_setChildren_1, children?._id ?? ffi.nullptr);
+  }
+
+  void addChild_(NSXMLNode? child) {
+    return _lib._objc_msgSend_979(
+        _id, _lib._sel_addChild_1, child?._id ?? ffi.nullptr);
+  }
+
+  void replaceChildAtIndex_withNode_(int index, NSXMLNode? node) {
+    return _lib._objc_msgSend_980(_id, _lib._sel_replaceChildAtIndex_withNode_1,
+        index, node?._id ?? ffi.nullptr);
+  }
+
+  void normalizeAdjacentTextNodesPreservingCDATA_(bool preserve) {
+    return _lib._objc_msgSend_756(
+        _id, _lib._sel_normalizeAdjacentTextNodesPreservingCDATA_1, preserve);
+  }
+
+  void setAttributesAsDictionary_(NSDictionary? attributes) {
+    return _lib._objc_msgSend_444(_id, _lib._sel_setAttributesAsDictionary_1,
+        attributes?._id ?? ffi.nullptr);
+  }
+
+  static NSObject document(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSXMLElement1, _lib._sel_document1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject documentWithRootElement_(
+      AVFAudio _lib, NSXMLElement? element) {
+    final _ret = _lib._objc_msgSend_968(_lib._class_NSXMLElement1,
+        _lib._sel_documentWithRootElement_1, element?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_(AVFAudio _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLElement1,
+        _lib._sel_elementWithName_1, name?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_URI_(
+      AVFAudio _lib, NSString? name, NSString? URI) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLElement1,
+        _lib._sel_elementWithName_URI_1,
+        name?._id ?? ffi.nullptr,
+        URI?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_stringValue_(
+      AVFAudio _lib, NSString? name, NSString? string) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLElement1,
+        _lib._sel_elementWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        string?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_children_attributes_(
+      AVFAudio _lib, NSString? name, NSArray? children, NSArray? attributes) {
+    final _ret = _lib._objc_msgSend_969(
+        _lib._class_NSXMLElement1,
+        _lib._sel_elementWithName_children_attributes_1,
+        name?._id ?? ffi.nullptr,
+        children?._id ?? ffi.nullptr,
+        attributes?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject attributeWithName_stringValue_(
+      AVFAudio _lib, NSString? name, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLElement1,
+        _lib._sel_attributeWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject attributeWithName_URI_stringValue_(
+      AVFAudio _lib, NSString? name, NSString? URI, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_26(
+        _lib._class_NSXMLElement1,
+        _lib._sel_attributeWithName_URI_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        URI?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject namespaceWithName_stringValue_(
+      AVFAudio _lib, NSString? name, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLElement1,
+        _lib._sel_namespaceWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject processingInstructionWithName_stringValue_(
+      AVFAudio _lib, NSString? name, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLElement1,
+        _lib._sel_processingInstructionWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject commentWithStringValue_(
+      AVFAudio _lib, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLElement1,
+        _lib._sel_commentWithStringValue_1, stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject textWithStringValue_(AVFAudio _lib, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLElement1,
+        _lib._sel_textWithStringValue_1, stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject DTDNodeWithXMLString_(AVFAudio _lib, NSString? string) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLElement1,
+        _lib._sel_DTDNodeWithXMLString_1, string?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString localNameForName_(AVFAudio _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_64(_lib._class_NSXMLElement1,
+        _lib._sel_localNameForName_1, name?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString prefixForName_(AVFAudio _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_64(_lib._class_NSXMLElement1,
+        _lib._sel_prefixForName_1, name?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSXMLNode predefinedNamespaceForPrefix_(
+      AVFAudio _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_983(_lib._class_NSXMLElement1,
+        _lib._sel_predefinedNamespaceForPrefix_1, name?._id ?? ffi.nullptr);
+    return NSXMLNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSXMLElement new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSXMLElement1, _lib._sel_new1);
+    return NSXMLElement._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSXMLElement alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSXMLElement1, _lib._sel_alloc1);
+    return NSXMLElement._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSXMLElement1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSXMLElement1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSXMLElement1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSXMLElement1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSXMLElement1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSXMLElement1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSXMLElement1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSXMLElement1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSXMLElement1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSXMLNode extends NSObject {
+  NSXMLNode._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSXMLNode] that points to the same underlying object as [other].
+  static NSXMLNode castFrom<T extends _ObjCWrapper>(T other) {
+    return NSXMLNode._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSXMLNode] that wraps the given raw object pointer.
+  static NSXMLNode castFromPointer(AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSXMLNode._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSXMLNode].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSXMLNode1);
+  }
+
+  @override
+  NSXMLNode init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSXMLNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLNode initWithKind_(int kind) {
+    final _ret = _lib._objc_msgSend_966(_id, _lib._sel_initWithKind_1, kind);
+    return NSXMLNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLNode initWithKind_options_(int kind, int options) {
+    final _ret = _lib._objc_msgSend_967(
+        _id, _lib._sel_initWithKind_options_1, kind, options);
+    return NSXMLNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject document(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSXMLNode1, _lib._sel_document1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject documentWithRootElement_(
+      AVFAudio _lib, NSXMLElement? element) {
+    final _ret = _lib._objc_msgSend_968(_lib._class_NSXMLNode1,
+        _lib._sel_documentWithRootElement_1, element?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_(AVFAudio _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLNode1,
+        _lib._sel_elementWithName_1, name?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_URI_(
+      AVFAudio _lib, NSString? name, NSString? URI) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLNode1,
+        _lib._sel_elementWithName_URI_1,
+        name?._id ?? ffi.nullptr,
+        URI?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_stringValue_(
+      AVFAudio _lib, NSString? name, NSString? string) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLNode1,
+        _lib._sel_elementWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        string?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_children_attributes_(
+      AVFAudio _lib, NSString? name, NSArray? children, NSArray? attributes) {
+    final _ret = _lib._objc_msgSend_969(
+        _lib._class_NSXMLNode1,
+        _lib._sel_elementWithName_children_attributes_1,
+        name?._id ?? ffi.nullptr,
+        children?._id ?? ffi.nullptr,
+        attributes?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject attributeWithName_stringValue_(
+      AVFAudio _lib, NSString? name, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLNode1,
+        _lib._sel_attributeWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject attributeWithName_URI_stringValue_(
+      AVFAudio _lib, NSString? name, NSString? URI, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_26(
+        _lib._class_NSXMLNode1,
+        _lib._sel_attributeWithName_URI_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        URI?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject namespaceWithName_stringValue_(
+      AVFAudio _lib, NSString? name, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLNode1,
+        _lib._sel_namespaceWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject processingInstructionWithName_stringValue_(
+      AVFAudio _lib, NSString? name, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLNode1,
+        _lib._sel_processingInstructionWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject commentWithStringValue_(
+      AVFAudio _lib, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLNode1,
+        _lib._sel_commentWithStringValue_1, stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject textWithStringValue_(AVFAudio _lib, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLNode1,
+        _lib._sel_textWithStringValue_1, stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject DTDNodeWithXMLString_(AVFAudio _lib, NSString? string) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLNode1,
+        _lib._sel_DTDNodeWithXMLString_1, string?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get kind {
+    return _lib._objc_msgSend_970(_id, _lib._sel_kind1);
+  }
+
+  NSString? get name {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_name1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set name(NSString? value) {
+    _lib._objc_msgSend_477(_id, _lib._sel_setName_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSObject get objectValue {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_objectValue1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  set objectValue(NSObject value) {
+    _lib._objc_msgSend_368(_id, _lib._sel_setObjectValue_1, value._id);
+  }
+
+  NSString? get stringValue {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_stringValue1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set stringValue(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setStringValue_1, value?._id ?? ffi.nullptr);
+  }
+
+  void setStringValue_resolvingEntities_(NSString? string, bool resolve) {
+    return _lib._objc_msgSend_971(
+        _id,
+        _lib._sel_setStringValue_resolvingEntities_1,
+        string?._id ?? ffi.nullptr,
+        resolve);
+  }
+
+  int get index {
+    return _lib._objc_msgSend_10(_id, _lib._sel_index1);
+  }
+
+  int get level {
+    return _lib._objc_msgSend_10(_id, _lib._sel_level1);
+  }
+
+  NSXMLDocument? get rootDocument {
+    final _ret = _lib._objc_msgSend_994(_id, _lib._sel_rootDocument1);
+    return _ret.address == 0
+        ? null
+        : NSXMLDocument._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLNode? get parent {
+    final _ret = _lib._objc_msgSend_995(_id, _lib._sel_parent1);
+    return _ret.address == 0
+        ? null
+        : NSXMLNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get childCount {
+    return _lib._objc_msgSend_10(_id, _lib._sel_childCount1);
+  }
+
+  NSArray? get children {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_children1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLNode childAtIndex_(int index) {
+    final _ret = _lib._objc_msgSend_996(_id, _lib._sel_childAtIndex_1, index);
+    return NSXMLNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLNode? get previousSibling {
+    final _ret = _lib._objc_msgSend_995(_id, _lib._sel_previousSibling1);
+    return _ret.address == 0
+        ? null
+        : NSXMLNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLNode? get nextSibling {
+    final _ret = _lib._objc_msgSend_995(_id, _lib._sel_nextSibling1);
+    return _ret.address == 0
+        ? null
+        : NSXMLNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLNode? get previousNode {
+    final _ret = _lib._objc_msgSend_995(_id, _lib._sel_previousNode1);
+    return _ret.address == 0
+        ? null
+        : NSXMLNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLNode? get nextNode {
+    final _ret = _lib._objc_msgSend_995(_id, _lib._sel_nextNode1);
+    return _ret.address == 0
+        ? null
+        : NSXMLNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  void detach() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_detach1);
+  }
+
+  NSString? get XPath {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_XPath1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get localName {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_localName1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get prefix {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_prefix1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get URI {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_URI1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set URI(NSString? value) {
+    _lib._objc_msgSend_477(_id, _lib._sel_setURI_1, value?._id ?? ffi.nullptr);
+  }
+
+  static NSString localNameForName_(AVFAudio _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_64(_lib._class_NSXMLNode1,
+        _lib._sel_localNameForName_1, name?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString prefixForName_(AVFAudio _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_64(_lib._class_NSXMLNode1,
+        _lib._sel_prefixForName_1, name?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSXMLNode predefinedNamespaceForPrefix_(
+      AVFAudio _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_983(_lib._class_NSXMLNode1,
+        _lib._sel_predefinedNamespaceForPrefix_1, name?._id ?? ffi.nullptr);
+    return NSXMLNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get description {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_description1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get XMLString {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_XMLString1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString XMLStringWithOptions_(int options) {
+    final _ret =
+        _lib._objc_msgSend_997(_id, _lib._sel_XMLStringWithOptions_1, options);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString canonicalXMLStringPreservingComments_(bool comments) {
+    final _ret = _lib._objc_msgSend_998(
+        _id, _lib._sel_canonicalXMLStringPreservingComments_1, comments);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray nodesForXPath_error_(
+      NSString? xpath, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_394(
+        _id, _lib._sel_nodesForXPath_error_1, xpath?._id ?? ffi.nullptr, error);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray objectsForXQuery_constants_error_(NSString? xquery,
+      NSDictionary? constants, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_999(
+        _id,
+        _lib._sel_objectsForXQuery_constants_error_1,
+        xquery?._id ?? ffi.nullptr,
+        constants?._id ?? ffi.nullptr,
+        error);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray objectsForXQuery_error_(
+      NSString? xquery, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_394(_id, _lib._sel_objectsForXQuery_error_1,
+        xquery?._id ?? ffi.nullptr, error);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSXMLNode new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSXMLNode1, _lib._sel_new1);
+    return NSXMLNode._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSXMLNode alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSXMLNode1, _lib._sel_alloc1);
+    return NSXMLNode._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSXMLNode1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSXMLNode1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSXMLNode1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSXMLNode1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSXMLNode1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSXMLNode1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSXMLNode1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSXMLNode1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSXMLNode1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSXMLNodeKind {
+  static const int NSXMLInvalidKind = 0;
+  static const int NSXMLDocumentKind = 1;
+  static const int NSXMLElementKind = 2;
+  static const int NSXMLAttributeKind = 3;
+  static const int NSXMLNamespaceKind = 4;
+  static const int NSXMLProcessingInstructionKind = 5;
+  static const int NSXMLCommentKind = 6;
+  static const int NSXMLTextKind = 7;
+  static const int NSXMLDTDKind = 8;
+  static const int NSXMLEntityDeclarationKind = 9;
+  static const int NSXMLAttributeDeclarationKind = 10;
+  static const int NSXMLElementDeclarationKind = 11;
+  static const int NSXMLNotationDeclarationKind = 12;
+}
+
+abstract class NSXMLNodeOptions {
+  static const int NSXMLNodeOptionsNone = 0;
+  static const int NSXMLNodeIsCDATA = 1;
+  static const int NSXMLNodeExpandEmptyElement = 2;
+  static const int NSXMLNodeCompactEmptyElement = 4;
+  static const int NSXMLNodeUseSingleQuotes = 8;
+  static const int NSXMLNodeUseDoubleQuotes = 16;
+  static const int NSXMLNodeNeverEscapeContents = 32;
+  static const int NSXMLDocumentTidyHTML = 512;
+  static const int NSXMLDocumentTidyXML = 1024;
+  static const int NSXMLDocumentValidate = 8192;
+  static const int NSXMLNodeLoadExternalEntitiesAlways = 16384;
+  static const int NSXMLNodeLoadExternalEntitiesSameOriginOnly = 32768;
+  static const int NSXMLNodeLoadExternalEntitiesNever = 524288;
+  static const int NSXMLDocumentXInclude = 65536;
+  static const int NSXMLNodePrettyPrint = 131072;
+  static const int NSXMLDocumentIncludeContentTypeDeclaration = 262144;
+  static const int NSXMLNodePreserveNamespaceOrder = 1048576;
+  static const int NSXMLNodePreserveAttributeOrder = 2097152;
+  static const int NSXMLNodePreserveEntities = 4194304;
+  static const int NSXMLNodePreservePrefixes = 8388608;
+  static const int NSXMLNodePreserveCDATA = 16777216;
+  static const int NSXMLNodePreserveWhitespace = 33554432;
+  static const int NSXMLNodePreserveDTD = 67108864;
+  static const int NSXMLNodePreserveCharacterReferences = 134217728;
+  static const int NSXMLNodePromoteSignificantWhitespace = 268435456;
+  static const int NSXMLNodePreserveEmptyElements = 6;
+  static const int NSXMLNodePreserveQuotes = 24;
+  static const int NSXMLNodePreserveAll = 4293918750;
+}
+
+class NSXMLDocument extends NSXMLNode {
+  NSXMLDocument._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSXMLDocument] that points to the same underlying object as [other].
+  static NSXMLDocument castFrom<T extends _ObjCWrapper>(T other) {
+    return NSXMLDocument._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSXMLDocument] that wraps the given raw object pointer.
+  static NSXMLDocument castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSXMLDocument._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSXMLDocument].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSXMLDocument1);
+  }
+
+  @override
+  NSXMLDocument init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSXMLDocument._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLDocument initWithXMLString_options_error_(
+      NSString? string, int mask, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_972(
+        _id,
+        _lib._sel_initWithXMLString_options_error_1,
+        string?._id ?? ffi.nullptr,
+        mask,
+        error);
+    return NSXMLDocument._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLDocument initWithContentsOfURL_options_error_(
+      NSURL? url, int mask, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_973(
+        _id,
+        _lib._sel_initWithContentsOfURL_options_error_1,
+        url?._id ?? ffi.nullptr,
+        mask,
+        error);
+    return NSXMLDocument._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLDocument initWithData_options_error_(
+      NSData? data, int mask, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_974(
+        _id,
+        _lib._sel_initWithData_options_error_1,
+        data?._id ?? ffi.nullptr,
+        mask,
+        error);
+    return NSXMLDocument._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLDocument initWithRootElement_(NSXMLElement? element) {
+    final _ret = _lib._objc_msgSend_968(
+        _id, _lib._sel_initWithRootElement_1, element?._id ?? ffi.nullptr);
+    return NSXMLDocument._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject replacementClassForClass_(AVFAudio _lib, NSObject cls) {
+    final _ret = _lib._objc_msgSend_16(_lib._class_NSXMLDocument1,
+        _lib._sel_replacementClassForClass_1, cls._id);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get characterEncoding {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_characterEncoding1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set characterEncoding(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setCharacterEncoding_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get version {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_version1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set version(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setVersion_1, value?._id ?? ffi.nullptr);
+  }
+
+  bool get standalone {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isStandalone1);
+  }
+
+  set standalone(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setStandalone_1, value);
+  }
+
+  int get documentContentKind {
+    return _lib._objc_msgSend_975(_id, _lib._sel_documentContentKind1);
+  }
+
+  set documentContentKind(int value) {
+    _lib._objc_msgSend_976(_id, _lib._sel_setDocumentContentKind_1, value);
+  }
+
+  NSString? get MIMEType {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_MIMEType1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set MIMEType(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setMIMEType_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSXMLDTD? get DTD {
+    final _ret = _lib._objc_msgSend_986(_id, _lib._sel_DTD1);
+    return _ret.address == 0
+        ? null
+        : NSXMLDTD._(_ret, _lib, retain: true, release: true);
+  }
+
+  set DTD(NSXMLDTD? value) {
+    _lib._objc_msgSend_987(_id, _lib._sel_setDTD_1, value?._id ?? ffi.nullptr);
+  }
+
+  void setRootElement_(NSXMLElement? root) {
+    return _lib._objc_msgSend_988(
+        _id, _lib._sel_setRootElement_1, root?._id ?? ffi.nullptr);
+  }
+
+  NSXMLElement rootElement() {
+    final _ret = _lib._objc_msgSend_989(_id, _lib._sel_rootElement1);
+    return NSXMLElement._(_ret, _lib, retain: true, release: true);
+  }
+
+  void insertChild_atIndex_(NSXMLNode? child, int index) {
+    return _lib._objc_msgSend_977(
+        _id, _lib._sel_insertChild_atIndex_1, child?._id ?? ffi.nullptr, index);
+  }
+
+  void insertChildren_atIndex_(NSArray? children, int index) {
+    return _lib._objc_msgSend_978(_id, _lib._sel_insertChildren_atIndex_1,
+        children?._id ?? ffi.nullptr, index);
+  }
+
+  void removeChildAtIndex_(int index) {
+    return _lib._objc_msgSend_410(_id, _lib._sel_removeChildAtIndex_1, index);
+  }
+
+  void setChildren_(NSArray? children) {
+    return _lib._objc_msgSend_412(
+        _id, _lib._sel_setChildren_1, children?._id ?? ffi.nullptr);
+  }
+
+  void addChild_(NSXMLNode? child) {
+    return _lib._objc_msgSend_979(
+        _id, _lib._sel_addChild_1, child?._id ?? ffi.nullptr);
+  }
+
+  void replaceChildAtIndex_withNode_(int index, NSXMLNode? node) {
+    return _lib._objc_msgSend_980(_id, _lib._sel_replaceChildAtIndex_withNode_1,
+        index, node?._id ?? ffi.nullptr);
+  }
+
+  NSData? get XMLData {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_XMLData1);
+    return _ret.address == 0
+        ? null
+        : NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData XMLDataWithOptions_(int options) {
+    final _ret =
+        _lib._objc_msgSend_990(_id, _lib._sel_XMLDataWithOptions_1, options);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject objectByApplyingXSLT_arguments_error_(NSData? xslt,
+      NSDictionary? arguments, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_991(
+        _id,
+        _lib._sel_objectByApplyingXSLT_arguments_error_1,
+        xslt?._id ?? ffi.nullptr,
+        arguments?._id ?? ffi.nullptr,
+        error);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject objectByApplyingXSLTString_arguments_error_(NSString? xslt,
+      NSDictionary? arguments, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_992(
+        _id,
+        _lib._sel_objectByApplyingXSLTString_arguments_error_1,
+        xslt?._id ?? ffi.nullptr,
+        arguments?._id ?? ffi.nullptr,
+        error);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject objectByApplyingXSLTAtURL_arguments_error_(NSURL? xsltURL,
+      NSDictionary? argument, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_993(
+        _id,
+        _lib._sel_objectByApplyingXSLTAtURL_arguments_error_1,
+        xsltURL?._id ?? ffi.nullptr,
+        argument?._id ?? ffi.nullptr,
+        error);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool validateAndReturnError_(ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_219(
+        _id, _lib._sel_validateAndReturnError_1, error);
+  }
+
+  static NSObject document(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSXMLDocument1, _lib._sel_document1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject documentWithRootElement_(
+      AVFAudio _lib, NSXMLElement? element) {
+    final _ret = _lib._objc_msgSend_968(_lib._class_NSXMLDocument1,
+        _lib._sel_documentWithRootElement_1, element?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_(AVFAudio _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLDocument1,
+        _lib._sel_elementWithName_1, name?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_URI_(
+      AVFAudio _lib, NSString? name, NSString? URI) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLDocument1,
+        _lib._sel_elementWithName_URI_1,
+        name?._id ?? ffi.nullptr,
+        URI?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_stringValue_(
+      AVFAudio _lib, NSString? name, NSString? string) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLDocument1,
+        _lib._sel_elementWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        string?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_children_attributes_(
+      AVFAudio _lib, NSString? name, NSArray? children, NSArray? attributes) {
+    final _ret = _lib._objc_msgSend_969(
+        _lib._class_NSXMLDocument1,
+        _lib._sel_elementWithName_children_attributes_1,
+        name?._id ?? ffi.nullptr,
+        children?._id ?? ffi.nullptr,
+        attributes?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject attributeWithName_stringValue_(
+      AVFAudio _lib, NSString? name, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLDocument1,
+        _lib._sel_attributeWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject attributeWithName_URI_stringValue_(
+      AVFAudio _lib, NSString? name, NSString? URI, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_26(
+        _lib._class_NSXMLDocument1,
+        _lib._sel_attributeWithName_URI_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        URI?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject namespaceWithName_stringValue_(
+      AVFAudio _lib, NSString? name, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLDocument1,
+        _lib._sel_namespaceWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject processingInstructionWithName_stringValue_(
+      AVFAudio _lib, NSString? name, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLDocument1,
+        _lib._sel_processingInstructionWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject commentWithStringValue_(
+      AVFAudio _lib, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLDocument1,
+        _lib._sel_commentWithStringValue_1, stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject textWithStringValue_(AVFAudio _lib, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLDocument1,
+        _lib._sel_textWithStringValue_1, stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject DTDNodeWithXMLString_(AVFAudio _lib, NSString? string) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLDocument1,
+        _lib._sel_DTDNodeWithXMLString_1, string?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString localNameForName_(AVFAudio _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_64(_lib._class_NSXMLDocument1,
+        _lib._sel_localNameForName_1, name?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString prefixForName_(AVFAudio _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_64(_lib._class_NSXMLDocument1,
+        _lib._sel_prefixForName_1, name?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSXMLNode predefinedNamespaceForPrefix_(
+      AVFAudio _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_983(_lib._class_NSXMLDocument1,
+        _lib._sel_predefinedNamespaceForPrefix_1, name?._id ?? ffi.nullptr);
+    return NSXMLNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSXMLDocument new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSXMLDocument1, _lib._sel_new1);
+    return NSXMLDocument._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSXMLDocument alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSXMLDocument1, _lib._sel_alloc1);
+    return NSXMLDocument._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSXMLDocument1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSXMLDocument1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSXMLDocument1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSXMLDocument1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSXMLDocument1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSXMLDocument1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSXMLDocument1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSXMLDocument1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSXMLDocument1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSXMLDocumentContentKind {
+  static const int NSXMLDocumentXMLKind = 0;
+  static const int NSXMLDocumentXHTMLKind = 1;
+  static const int NSXMLDocumentHTMLKind = 2;
+  static const int NSXMLDocumentTextKind = 3;
+}
+
+class NSXMLDTD extends NSXMLNode {
+  NSXMLDTD._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSXMLDTD] that points to the same underlying object as [other].
+  static NSXMLDTD castFrom<T extends _ObjCWrapper>(T other) {
+    return NSXMLDTD._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSXMLDTD] that wraps the given raw object pointer.
+  static NSXMLDTD castFromPointer(AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSXMLDTD._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSXMLDTD].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSXMLDTD1);
+  }
+
+  @override
+  NSXMLDTD init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSXMLDTD._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSXMLDTD initWithKind_options_(int kind, int options) {
+    final _ret = _lib._objc_msgSend_967(
+        _id, _lib._sel_initWithKind_options_1, kind, options);
+    return NSXMLDTD._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLDTD initWithContentsOfURL_options_error_(
+      NSURL? url, int mask, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_973(
+        _id,
+        _lib._sel_initWithContentsOfURL_options_error_1,
+        url?._id ?? ffi.nullptr,
+        mask,
+        error);
+    return NSXMLDTD._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLDTD initWithData_options_error_(
+      NSData? data, int mask, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_974(
+        _id,
+        _lib._sel_initWithData_options_error_1,
+        data?._id ?? ffi.nullptr,
+        mask,
+        error);
+    return NSXMLDTD._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get publicID {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_publicID1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set publicID(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setPublicID_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get systemID {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_systemID1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set systemID(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setSystemID_1, value?._id ?? ffi.nullptr);
+  }
+
+  void insertChild_atIndex_(NSXMLNode? child, int index) {
+    return _lib._objc_msgSend_977(
+        _id, _lib._sel_insertChild_atIndex_1, child?._id ?? ffi.nullptr, index);
+  }
+
+  void insertChildren_atIndex_(NSArray? children, int index) {
+    return _lib._objc_msgSend_978(_id, _lib._sel_insertChildren_atIndex_1,
+        children?._id ?? ffi.nullptr, index);
+  }
+
+  void removeChildAtIndex_(int index) {
+    return _lib._objc_msgSend_410(_id, _lib._sel_removeChildAtIndex_1, index);
+  }
+
+  void setChildren_(NSArray? children) {
+    return _lib._objc_msgSend_412(
+        _id, _lib._sel_setChildren_1, children?._id ?? ffi.nullptr);
+  }
+
+  void addChild_(NSXMLNode? child) {
+    return _lib._objc_msgSend_979(
+        _id, _lib._sel_addChild_1, child?._id ?? ffi.nullptr);
+  }
+
+  void replaceChildAtIndex_withNode_(int index, NSXMLNode? node) {
+    return _lib._objc_msgSend_980(_id, _lib._sel_replaceChildAtIndex_withNode_1,
+        index, node?._id ?? ffi.nullptr);
+  }
+
+  NSXMLDTDNode entityDeclarationForName_(NSString? name) {
+    final _ret = _lib._objc_msgSend_984(
+        _id, _lib._sel_entityDeclarationForName_1, name?._id ?? ffi.nullptr);
+    return NSXMLDTDNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLDTDNode notationDeclarationForName_(NSString? name) {
+    final _ret = _lib._objc_msgSend_984(
+        _id, _lib._sel_notationDeclarationForName_1, name?._id ?? ffi.nullptr);
+    return NSXMLDTDNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLDTDNode elementDeclarationForName_(NSString? name) {
+    final _ret = _lib._objc_msgSend_984(
+        _id, _lib._sel_elementDeclarationForName_1, name?._id ?? ffi.nullptr);
+    return NSXMLDTDNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLDTDNode attributeDeclarationForName_elementName_(
+      NSString? name, NSString? elementName) {
+    final _ret = _lib._objc_msgSend_985(
+        _id,
+        _lib._sel_attributeDeclarationForName_elementName_1,
+        name?._id ?? ffi.nullptr,
+        elementName?._id ?? ffi.nullptr);
+    return NSXMLDTDNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSXMLDTDNode predefinedEntityDeclarationForName_(
+      AVFAudio _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_984(
+        _lib._class_NSXMLDTD1,
+        _lib._sel_predefinedEntityDeclarationForName_1,
+        name?._id ?? ffi.nullptr);
+    return NSXMLDTDNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject document(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSXMLDTD1, _lib._sel_document1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject documentWithRootElement_(
+      AVFAudio _lib, NSXMLElement? element) {
+    final _ret = _lib._objc_msgSend_968(_lib._class_NSXMLDTD1,
+        _lib._sel_documentWithRootElement_1, element?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_(AVFAudio _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLDTD1,
+        _lib._sel_elementWithName_1, name?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_URI_(
+      AVFAudio _lib, NSString? name, NSString? URI) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLDTD1,
+        _lib._sel_elementWithName_URI_1,
+        name?._id ?? ffi.nullptr,
+        URI?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_stringValue_(
+      AVFAudio _lib, NSString? name, NSString? string) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLDTD1,
+        _lib._sel_elementWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        string?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_children_attributes_(
+      AVFAudio _lib, NSString? name, NSArray? children, NSArray? attributes) {
+    final _ret = _lib._objc_msgSend_969(
+        _lib._class_NSXMLDTD1,
+        _lib._sel_elementWithName_children_attributes_1,
+        name?._id ?? ffi.nullptr,
+        children?._id ?? ffi.nullptr,
+        attributes?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject attributeWithName_stringValue_(
+      AVFAudio _lib, NSString? name, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLDTD1,
+        _lib._sel_attributeWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject attributeWithName_URI_stringValue_(
+      AVFAudio _lib, NSString? name, NSString? URI, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_26(
+        _lib._class_NSXMLDTD1,
+        _lib._sel_attributeWithName_URI_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        URI?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject namespaceWithName_stringValue_(
+      AVFAudio _lib, NSString? name, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLDTD1,
+        _lib._sel_namespaceWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject processingInstructionWithName_stringValue_(
+      AVFAudio _lib, NSString? name, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLDTD1,
+        _lib._sel_processingInstructionWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject commentWithStringValue_(
+      AVFAudio _lib, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLDTD1,
+        _lib._sel_commentWithStringValue_1, stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject textWithStringValue_(AVFAudio _lib, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLDTD1,
+        _lib._sel_textWithStringValue_1, stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject DTDNodeWithXMLString_(AVFAudio _lib, NSString? string) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLDTD1,
+        _lib._sel_DTDNodeWithXMLString_1, string?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString localNameForName_(AVFAudio _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_64(_lib._class_NSXMLDTD1,
+        _lib._sel_localNameForName_1, name?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString prefixForName_(AVFAudio _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_64(_lib._class_NSXMLDTD1,
+        _lib._sel_prefixForName_1, name?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSXMLNode predefinedNamespaceForPrefix_(
+      AVFAudio _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_983(_lib._class_NSXMLDTD1,
+        _lib._sel_predefinedNamespaceForPrefix_1, name?._id ?? ffi.nullptr);
+    return NSXMLNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSXMLDTD new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSXMLDTD1, _lib._sel_new1);
+    return NSXMLDTD._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSXMLDTD alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSXMLDTD1, _lib._sel_alloc1);
+    return NSXMLDTD._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSXMLDTD1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSXMLDTD1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSXMLDTD1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSXMLDTD1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSXMLDTD1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSXMLDTD1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSXMLDTD1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSXMLDTD1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSXMLDTD1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSXMLDTDNode extends NSXMLNode {
+  NSXMLDTDNode._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSXMLDTDNode] that points to the same underlying object as [other].
+  static NSXMLDTDNode castFrom<T extends _ObjCWrapper>(T other) {
+    return NSXMLDTDNode._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSXMLDTDNode] that wraps the given raw object pointer.
+  static NSXMLDTDNode castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSXMLDTDNode._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSXMLDTDNode].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSXMLDTDNode1);
+  }
+
+  NSXMLDTDNode initWithXMLString_(NSString? string) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initWithXMLString_1, string?._id ?? ffi.nullptr);
+    return NSXMLDTDNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSXMLDTDNode initWithKind_options_(int kind, int options) {
+    final _ret = _lib._objc_msgSend_967(
+        _id, _lib._sel_initWithKind_options_1, kind, options);
+    return NSXMLDTDNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSXMLDTDNode init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSXMLDTDNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get DTDKind {
+    return _lib._objc_msgSend_981(_id, _lib._sel_DTDKind1);
+  }
+
+  set DTDKind(int value) {
+    _lib._objc_msgSend_982(_id, _lib._sel_setDTDKind_1, value);
+  }
+
+  bool get external1 {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isExternal1);
+  }
+
+  NSString? get publicID {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_publicID1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set publicID(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setPublicID_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get systemID {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_systemID1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set systemID(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setSystemID_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get notationName {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_notationName1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set notationName(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setNotationName_1, value?._id ?? ffi.nullptr);
+  }
+
+  static NSObject document(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSXMLDTDNode1, _lib._sel_document1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject documentWithRootElement_(
+      AVFAudio _lib, NSXMLElement? element) {
+    final _ret = _lib._objc_msgSend_968(_lib._class_NSXMLDTDNode1,
+        _lib._sel_documentWithRootElement_1, element?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_(AVFAudio _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLDTDNode1,
+        _lib._sel_elementWithName_1, name?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_URI_(
+      AVFAudio _lib, NSString? name, NSString? URI) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLDTDNode1,
+        _lib._sel_elementWithName_URI_1,
+        name?._id ?? ffi.nullptr,
+        URI?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_stringValue_(
+      AVFAudio _lib, NSString? name, NSString? string) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLDTDNode1,
+        _lib._sel_elementWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        string?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_children_attributes_(
+      AVFAudio _lib, NSString? name, NSArray? children, NSArray? attributes) {
+    final _ret = _lib._objc_msgSend_969(
+        _lib._class_NSXMLDTDNode1,
+        _lib._sel_elementWithName_children_attributes_1,
+        name?._id ?? ffi.nullptr,
+        children?._id ?? ffi.nullptr,
+        attributes?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject attributeWithName_stringValue_(
+      AVFAudio _lib, NSString? name, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLDTDNode1,
+        _lib._sel_attributeWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject attributeWithName_URI_stringValue_(
+      AVFAudio _lib, NSString? name, NSString? URI, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_26(
+        _lib._class_NSXMLDTDNode1,
+        _lib._sel_attributeWithName_URI_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        URI?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject namespaceWithName_stringValue_(
+      AVFAudio _lib, NSString? name, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLDTDNode1,
+        _lib._sel_namespaceWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject processingInstructionWithName_stringValue_(
+      AVFAudio _lib, NSString? name, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLDTDNode1,
+        _lib._sel_processingInstructionWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject commentWithStringValue_(
+      AVFAudio _lib, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLDTDNode1,
+        _lib._sel_commentWithStringValue_1, stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject textWithStringValue_(AVFAudio _lib, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLDTDNode1,
+        _lib._sel_textWithStringValue_1, stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject DTDNodeWithXMLString_(AVFAudio _lib, NSString? string) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLDTDNode1,
+        _lib._sel_DTDNodeWithXMLString_1, string?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString localNameForName_(AVFAudio _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_64(_lib._class_NSXMLDTDNode1,
+        _lib._sel_localNameForName_1, name?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString prefixForName_(AVFAudio _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_64(_lib._class_NSXMLDTDNode1,
+        _lib._sel_prefixForName_1, name?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSXMLNode predefinedNamespaceForPrefix_(
+      AVFAudio _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_983(_lib._class_NSXMLDTDNode1,
+        _lib._sel_predefinedNamespaceForPrefix_1, name?._id ?? ffi.nullptr);
+    return NSXMLNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSXMLDTDNode new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSXMLDTDNode1, _lib._sel_new1);
+    return NSXMLDTDNode._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSXMLDTDNode alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSXMLDTDNode1, _lib._sel_alloc1);
+    return NSXMLDTDNode._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSXMLDTDNode1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSXMLDTDNode1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSXMLDTDNode1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSXMLDTDNode1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSXMLDTDNode1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSXMLDTDNode1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSXMLDTDNode1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSXMLDTDNode1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSXMLDTDNode1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSXMLDTDNodeKind {
+  static const int NSXMLEntityGeneralKind = 1;
+  static const int NSXMLEntityParsedKind = 2;
+  static const int NSXMLEntityUnparsedKind = 3;
+  static const int NSXMLEntityParameterKind = 4;
+  static const int NSXMLEntityPredefined = 5;
+  static const int NSXMLAttributeCDATAKind = 6;
+  static const int NSXMLAttributeIDKind = 7;
+  static const int NSXMLAttributeIDRefKind = 8;
+  static const int NSXMLAttributeIDRefsKind = 9;
+  static const int NSXMLAttributeEntityKind = 10;
+  static const int NSXMLAttributeEntitiesKind = 11;
+  static const int NSXMLAttributeNMTokenKind = 12;
+  static const int NSXMLAttributeNMTokensKind = 13;
+  static const int NSXMLAttributeEnumerationKind = 14;
+  static const int NSXMLAttributeNotationKind = 15;
+  static const int NSXMLElementDeclarationUndefinedKind = 16;
+  static const int NSXMLElementDeclarationEmptyKind = 17;
+  static const int NSXMLElementDeclarationAnyKind = 18;
+  static const int NSXMLElementDeclarationMixedKind = 19;
+  static const int NSXMLElementDeclarationElementKind = 20;
+}
+
+class AVAudioSession extends NSObject {
+  AVAudioSession._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [AVAudioSession] that points to the same underlying object as [other].
+  static AVAudioSession castFrom<T extends _ObjCWrapper>(T other) {
+    return AVAudioSession._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [AVAudioSession] that wraps the given raw object pointer.
+  static AVAudioSession castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return AVAudioSession._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [AVAudioSession].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_AVAudioSession1);
+  }
+
+  static AVAudioSession sharedInstance(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_1001(
+        _lib._class_AVAudioSession1, _lib._sel_sharedInstance1);
+    return AVAudioSession._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get availableCategories {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_availableCategories1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool setCategory_error_(AVAudioSessionCategory category,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    return _lib._objc_msgSend_398(
+        _id, _lib._sel_setCategory_error_1, category, outError);
+  }
+
+  bool setCategory_withOptions_error_(AVAudioSessionCategory category,
+      int options, ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    return _lib._objc_msgSend_1002(_id,
+        _lib._sel_setCategory_withOptions_error_1, category, options, outError);
+  }
+
+  bool setCategory_mode_options_error_(
+      AVAudioSessionCategory category,
+      AVAudioSessionMode mode,
+      int options,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    return _lib._objc_msgSend_1003(
+        _id,
+        _lib._sel_setCategory_mode_options_error_1,
+        category,
+        mode,
+        options,
+        outError);
+  }
+
+  bool setCategory_mode_routeSharingPolicy_options_error_(
+      AVAudioSessionCategory category,
+      AVAudioSessionMode mode,
+      int policy,
+      int options,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    return _lib._objc_msgSend_1004(
+        _id,
+        _lib._sel_setCategory_mode_routeSharingPolicy_options_error_1,
+        category,
+        mode,
+        policy,
+        options,
+        outError);
+  }
+
+  AVAudioSessionCategory get category {
+    return _lib._objc_msgSend_20(_id, _lib._sel_category1);
+  }
+
+  int get categoryOptions {
+    return _lib._objc_msgSend_1005(_id, _lib._sel_categoryOptions1);
+  }
+
+  int get routeSharingPolicy {
+    return _lib._objc_msgSend_1006(_id, _lib._sel_routeSharingPolicy1);
+  }
+
+  NSArray? get availableModes {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_availableModes1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool setMode_error_(
+      AVAudioSessionMode mode, ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    return _lib._objc_msgSend_398(
+        _id, _lib._sel_setMode_error_1, mode, outError);
+  }
+
+  AVAudioSessionMode get mode {
+    return _lib._objc_msgSend_20(_id, _lib._sel_mode1);
+  }
+
+  bool setAllowHapticsAndSystemSoundsDuringRecording_error_(
+      bool inValue, ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    return _lib._objc_msgSend_1007(
+        _id,
+        _lib._sel_setAllowHapticsAndSystemSoundsDuringRecording_error_1,
+        inValue,
+        outError);
+  }
+
+  bool get allowHapticsAndSystemSoundsDuringRecording {
+    return _lib._objc_msgSend_12(
+        _id, _lib._sel_allowHapticsAndSystemSoundsDuringRecording1);
+  }
+
+  int get recordPermission {
+    return _lib._objc_msgSend_1008(_id, _lib._sel_recordPermission1);
+  }
+
+  void requestRecordPermission_(ObjCBlock31 response) {
+    return _lib._objc_msgSend_1009(
+        _id, _lib._sel_requestRecordPermission_1, response._id);
+  }
+
+  bool overrideOutputAudioPort_error_(
+      int portOverride, ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    return _lib._objc_msgSend_1010(
+        _id, _lib._sel_overrideOutputAudioPort_error_1, portOverride, outError);
+  }
+
+  bool setPreferredInput_error_(AVAudioSessionPortDescription? inPort,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    return _lib._objc_msgSend_1013(_id, _lib._sel_setPreferredInput_error_1,
+        inPort?._id ?? ffi.nullptr, outError);
+  }
+
+  AVAudioSessionPortDescription? get preferredInput {
+    final _ret = _lib._objc_msgSend_1014(_id, _lib._sel_preferredInput1);
+    return _ret.address == 0
+        ? null
+        : AVAudioSessionPortDescription._(_ret, _lib,
+            retain: true, release: true);
+  }
+
+  bool setPrefersNoInterruptionsFromSystemAlerts_error_(
+      bool inValue, ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    return _lib._objc_msgSend_1007(
+        _id,
+        _lib._sel_setPrefersNoInterruptionsFromSystemAlerts_error_1,
+        inValue,
+        outError);
+  }
+
+  bool get prefersNoInterruptionsFromSystemAlerts {
+    return _lib._objc_msgSend_12(
+        _id, _lib._sel_prefersNoInterruptionsFromSystemAlerts1);
+  }
+
+  bool setActive_error_(
+      bool active, ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    return _lib._objc_msgSend_1007(
+        _id, _lib._sel_setActive_error_1, active, outError);
+  }
+
+  bool setActive_withOptions_error_(
+      bool active, int options, ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    return _lib._objc_msgSend_1015(_id, _lib._sel_setActive_withOptions_error_1,
+        active, options, outError);
+  }
+
+  void activateWithOptions_completionHandler_(
+      int options, ObjCBlock44 handler) {
+    return _lib._objc_msgSend_1016(
+        _id,
+        _lib._sel_activateWithOptions_completionHandler_1,
+        options,
+        handler._id);
+  }
+
+  bool setPreferredSampleRate_error_(
+      double sampleRate, ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    return _lib._objc_msgSend_1017(
+        _id, _lib._sel_setPreferredSampleRate_error_1, sampleRate, outError);
+  }
+
+  double get preferredSampleRate {
+    return _lib._objc_msgSend_149(_id, _lib._sel_preferredSampleRate1);
+  }
+
+  bool setPreferredIOBufferDuration_error_(
+      double duration, ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    return _lib._objc_msgSend_1017(_id,
+        _lib._sel_setPreferredIOBufferDuration_error_1, duration, outError);
+  }
+
+  double get preferredIOBufferDuration {
+    return _lib._objc_msgSend_149(_id, _lib._sel_preferredIOBufferDuration1);
+  }
+
+  bool setPreferredInputNumberOfChannels_error_(
+      int count, ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    return _lib._objc_msgSend_1018(_id,
+        _lib._sel_setPreferredInputNumberOfChannels_error_1, count, outError);
+  }
+
+  int get preferredInputNumberOfChannels {
+    return _lib._objc_msgSend_78(
+        _id, _lib._sel_preferredInputNumberOfChannels1);
+  }
+
+  bool setPreferredOutputNumberOfChannels_error_(
+      int count, ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    return _lib._objc_msgSend_1018(_id,
+        _lib._sel_setPreferredOutputNumberOfChannels_error_1, count, outError);
+  }
+
+  int get preferredOutputNumberOfChannels {
+    return _lib._objc_msgSend_78(
+        _id, _lib._sel_preferredOutputNumberOfChannels1);
+  }
+
+  bool setPreferredInputOrientation_error_(
+      int orientation, ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    return _lib._objc_msgSend_1019(_id,
+        _lib._sel_setPreferredInputOrientation_error_1, orientation, outError);
+  }
+
+  int get preferredInputOrientation {
+    return _lib._objc_msgSend_1020(_id, _lib._sel_preferredInputOrientation1);
+  }
+
+  int get inputOrientation {
+    return _lib._objc_msgSend_1020(_id, _lib._sel_inputOrientation1);
+  }
+
+  int get maximumInputNumberOfChannels {
+    return _lib._objc_msgSend_78(_id, _lib._sel_maximumInputNumberOfChannels1);
+  }
+
+  int get maximumOutputNumberOfChannels {
+    return _lib._objc_msgSend_78(_id, _lib._sel_maximumOutputNumberOfChannels1);
+  }
+
+  bool setInputGain_error_(
+      double gain, ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    return _lib._objc_msgSend_1021(
+        _id, _lib._sel_setInputGain_error_1, gain, outError);
+  }
+
+  double get inputGain {
+    return _lib._objc_msgSend_215(_id, _lib._sel_inputGain1);
+  }
+
+  bool get inputGainSettable {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isInputGainSettable1);
+  }
+
+  bool get inputAvailable {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isInputAvailable1);
+  }
+
+  NSArray? get inputDataSources {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_inputDataSources1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  AVAudioSessionDataSourceDescription? get inputDataSource {
+    final _ret = _lib._objc_msgSend_1011(_id, _lib._sel_inputDataSource1);
+    return _ret.address == 0
+        ? null
+        : AVAudioSessionDataSourceDescription._(_ret, _lib,
+            retain: true, release: true);
+  }
+
+  bool setInputDataSource_error_(
+      AVAudioSessionDataSourceDescription? dataSource,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    return _lib._objc_msgSend_1012(_id, _lib._sel_setInputDataSource_error_1,
+        dataSource?._id ?? ffi.nullptr, outError);
+  }
+
+  NSArray? get outputDataSources {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_outputDataSources1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  AVAudioSessionDataSourceDescription? get outputDataSource {
+    final _ret = _lib._objc_msgSend_1011(_id, _lib._sel_outputDataSource1);
+    return _ret.address == 0
+        ? null
+        : AVAudioSessionDataSourceDescription._(_ret, _lib,
+            retain: true, release: true);
+  }
+
+  bool setOutputDataSource_error_(
+      AVAudioSessionDataSourceDescription? dataSource,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    return _lib._objc_msgSend_1012(_id, _lib._sel_setOutputDataSource_error_1,
+        dataSource?._id ?? ffi.nullptr, outError);
+  }
+
+  double get sampleRate {
+    return _lib._objc_msgSend_149(_id, _lib._sel_sampleRate1);
+  }
+
+  int get inputNumberOfChannels {
+    return _lib._objc_msgSend_78(_id, _lib._sel_inputNumberOfChannels1);
+  }
+
+  int get outputNumberOfChannels {
+    return _lib._objc_msgSend_78(_id, _lib._sel_outputNumberOfChannels1);
+  }
+
+  double get inputLatency {
+    return _lib._objc_msgSend_149(_id, _lib._sel_inputLatency1);
+  }
+
+  double get outputLatency {
+    return _lib._objc_msgSend_149(_id, _lib._sel_outputLatency1);
+  }
+
+  double get IOBufferDuration {
+    return _lib._objc_msgSend_149(_id, _lib._sel_IOBufferDuration1);
+  }
+
+  bool get otherAudioPlaying {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isOtherAudioPlaying1);
+  }
+
+  bool get secondaryAudioShouldBeSilencedHint {
+    return _lib._objc_msgSend_12(
+        _id, _lib._sel_secondaryAudioShouldBeSilencedHint1);
+  }
+
+  double get outputVolume {
+    return _lib._objc_msgSend_215(_id, _lib._sel_outputVolume1);
+  }
+
+  int get promptStyle {
+    return _lib._objc_msgSend_1022(_id, _lib._sel_promptStyle1);
+  }
+
+  NSArray? get availableInputs {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_availableInputs1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  AVAudioSessionRouteDescription? get currentRoute {
+    final _ret = _lib._objc_msgSend_1023(_id, _lib._sel_currentRoute1);
+    return _ret.address == 0
+        ? null
+        : AVAudioSessionRouteDescription._(_ret, _lib,
+            retain: true, release: true);
+  }
+
+  bool setAggregatedIOPreference_error_(
+      int inIOType, ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    return _lib._objc_msgSend_1024(
+        _id, _lib._sel_setAggregatedIOPreference_error_1, inIOType, outError);
+  }
+
+  bool setSupportsMultichannelContent_error_(
+      bool inValue, ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    return _lib._objc_msgSend_1007(_id,
+        _lib._sel_setSupportsMultichannelContent_error_1, inValue, outError);
+  }
+
+  bool get supportsMultichannelContent {
+    return _lib._objc_msgSend_12(_id, _lib._sel_supportsMultichannelContent1);
+  }
+
+  NSObject? get delegate {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_delegate1);
+    return _ret.address == 0
+        ? null
+        : NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  set delegate(NSObject? value) {
+    _lib._objc_msgSend_368(
+        _id, _lib._sel_setDelegate_1, value?._id ?? ffi.nullptr);
+  }
+
+  @override
+  AVAudioSession init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return AVAudioSession._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool setActive_withFlags_error_(
+      bool active, int flags, ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    return _lib._objc_msgSend_1025(
+        _id, _lib._sel_setActive_withFlags_error_1, active, flags, outError);
+  }
+
+  bool get inputIsAvailable {
+    return _lib._objc_msgSend_12(_id, _lib._sel_inputIsAvailable1);
+  }
+
+  double get currentHardwareSampleRate {
+    return _lib._objc_msgSend_149(_id, _lib._sel_currentHardwareSampleRate1);
+  }
+
+  int get currentHardwareInputNumberOfChannels {
+    return _lib._objc_msgSend_78(
+        _id, _lib._sel_currentHardwareInputNumberOfChannels1);
+  }
+
+  int get currentHardwareOutputNumberOfChannels {
+    return _lib._objc_msgSend_78(
+        _id, _lib._sel_currentHardwareOutputNumberOfChannels1);
+  }
+
+  bool setPreferredHardwareSampleRate_error_(
+      double sampleRate, ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    return _lib._objc_msgSend_1017(_id,
+        _lib._sel_setPreferredHardwareSampleRate_error_1, sampleRate, outError);
+  }
+
+  double get preferredHardwareSampleRate {
+    return _lib._objc_msgSend_149(_id, _lib._sel_preferredHardwareSampleRate1);
+  }
+
+  static AVAudioSession new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_AVAudioSession1, _lib._sel_new1);
+    return AVAudioSession._(_ret, _lib, retain: false, release: true);
+  }
+
+  static AVAudioSession alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_AVAudioSession1, _lib._sel_alloc1);
+    return AVAudioSession._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_AVAudioSession1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_AVAudioSession1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_AVAudioSession1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_AVAudioSession1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_AVAudioSession1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_AVAudioSession1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_AVAudioSession1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_AVAudioSession1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_AVAudioSession1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef AVAudioSessionCategory = ffi.Pointer<ObjCObject>;
+
+abstract class AVAudioSessionCategoryOptions {
+  static const int AVAudioSessionCategoryOptionMixWithOthers = 1;
+  static const int AVAudioSessionCategoryOptionDuckOthers = 2;
+  static const int AVAudioSessionCategoryOptionAllowBluetooth = 4;
+  static const int AVAudioSessionCategoryOptionDefaultToSpeaker = 8;
+  static const int
+      AVAudioSessionCategoryOptionInterruptSpokenAudioAndMixWithOthers = 17;
+  static const int AVAudioSessionCategoryOptionAllowBluetoothA2DP = 32;
+  static const int AVAudioSessionCategoryOptionAllowAirPlay = 64;
+  static const int
+      AVAudioSessionCategoryOptionOverrideMutedMicrophoneInterruption = 128;
+}
+
+typedef AVAudioSessionMode = ffi.Pointer<ObjCObject>;
+
+abstract class AVAudioSessionRouteSharingPolicy {
+  static const int AVAudioSessionRouteSharingPolicyDefault = 0;
+  static const int AVAudioSessionRouteSharingPolicyLongFormAudio = 1;
+  static const int AVAudioSessionRouteSharingPolicyLongForm = 1;
+  static const int AVAudioSessionRouteSharingPolicyIndependent = 2;
+  static const int AVAudioSessionRouteSharingPolicyLongFormVideo = 3;
+}
+
+abstract class AVAudioSessionRecordPermission {
+  static const int AVAudioSessionRecordPermissionUndetermined = 1970168948;
+  static const int AVAudioSessionRecordPermissionDenied = 1684369017;
+  static const int AVAudioSessionRecordPermissionGranted = 1735552628;
+}
+
+abstract class AVAudioSessionPortOverride {
+  static const int AVAudioSessionPortOverrideNone = 0;
+  static const int AVAudioSessionPortOverrideSpeaker = 1936747378;
+}
+
+class AVAudioSessionPortDescription extends NSObject {
+  AVAudioSessionPortDescription._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [AVAudioSessionPortDescription] that points to the same underlying object as [other].
+  static AVAudioSessionPortDescription castFrom<T extends _ObjCWrapper>(
+      T other) {
+    return AVAudioSessionPortDescription._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [AVAudioSessionPortDescription] that wraps the given raw object pointer.
+  static AVAudioSessionPortDescription castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return AVAudioSessionPortDescription._(other, lib,
+        retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [AVAudioSessionPortDescription].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_AVAudioSessionPortDescription1);
+  }
+
+  AVAudioSessionPort get portType {
+    return _lib._objc_msgSend_20(_id, _lib._sel_portType1);
+  }
+
+  NSString? get portName {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_portName1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get UID {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_UID1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool get hasHardwareVoiceCallProcessing {
+    return _lib._objc_msgSend_12(
+        _id, _lib._sel_hasHardwareVoiceCallProcessing1);
+  }
+
+  bool get spatialAudioEnabled {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isSpatialAudioEnabled1);
+  }
+
+  NSArray? get channels {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_channels1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get dataSources {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_dataSources1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  AVAudioSessionDataSourceDescription? get selectedDataSource {
+    final _ret = _lib._objc_msgSend_1011(_id, _lib._sel_selectedDataSource1);
+    return _ret.address == 0
+        ? null
+        : AVAudioSessionDataSourceDescription._(_ret, _lib,
+            retain: true, release: true);
+  }
+
+  AVAudioSessionDataSourceDescription? get preferredDataSource {
+    final _ret = _lib._objc_msgSend_1011(_id, _lib._sel_preferredDataSource1);
+    return _ret.address == 0
+        ? null
+        : AVAudioSessionDataSourceDescription._(_ret, _lib,
+            retain: true, release: true);
+  }
+
+  bool setPreferredDataSource_error_(
+      AVAudioSessionDataSourceDescription? dataSource,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    return _lib._objc_msgSend_1012(
+        _id,
+        _lib._sel_setPreferredDataSource_error_1,
+        dataSource?._id ?? ffi.nullptr,
+        outError);
+  }
+
+  static AVAudioSessionPortDescription new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_AVAudioSessionPortDescription1, _lib._sel_new1);
+    return AVAudioSessionPortDescription._(_ret, _lib,
+        retain: false, release: true);
+  }
+
+  static AVAudioSessionPortDescription alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_AVAudioSessionPortDescription1, _lib._sel_alloc1);
+    return AVAudioSessionPortDescription._(_ret, _lib,
+        retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_AVAudioSessionPortDescription1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_AVAudioSessionPortDescription1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_AVAudioSessionPortDescription1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_AVAudioSessionPortDescription1,
+        _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_AVAudioSessionPortDescription1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_AVAudioSessionPortDescription1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_AVAudioSessionPortDescription1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_AVAudioSessionPortDescription1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_AVAudioSessionPortDescription1,
+        _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef AVAudioSessionPort = ffi.Pointer<ObjCObject>;
+
+class AVAudioSessionDataSourceDescription extends NSObject {
+  AVAudioSessionDataSourceDescription._(
+      ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [AVAudioSessionDataSourceDescription] that points to the same underlying object as [other].
+  static AVAudioSessionDataSourceDescription castFrom<T extends _ObjCWrapper>(
+      T other) {
+    return AVAudioSessionDataSourceDescription._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [AVAudioSessionDataSourceDescription] that wraps the given raw object pointer.
+  static AVAudioSessionDataSourceDescription castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return AVAudioSessionDataSourceDescription._(other, lib,
+        retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [AVAudioSessionDataSourceDescription].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_AVAudioSessionDataSourceDescription1);
+  }
+
+  NSNumber? get dataSourceID {
+    final _ret = _lib._objc_msgSend_192(_id, _lib._sel_dataSourceID1);
+    return _ret.address == 0
+        ? null
+        : NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get dataSourceName {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_dataSourceName1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  AVAudioSessionLocation get location {
+    return _lib._objc_msgSend_20(_id, _lib._sel_location1);
+  }
+
+  AVAudioSessionOrientation get orientation {
+    return _lib._objc_msgSend_20(_id, _lib._sel_orientation1);
+  }
+
+  NSArray? get supportedPolarPatterns {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_supportedPolarPatterns1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  AVAudioSessionPolarPattern get selectedPolarPattern {
+    return _lib._objc_msgSend_20(_id, _lib._sel_selectedPolarPattern1);
+  }
+
+  AVAudioSessionPolarPattern get preferredPolarPattern {
+    return _lib._objc_msgSend_20(_id, _lib._sel_preferredPolarPattern1);
+  }
+
+  bool setPreferredPolarPattern_error_(AVAudioSessionPolarPattern pattern,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    return _lib._objc_msgSend_398(
+        _id, _lib._sel_setPreferredPolarPattern_error_1, pattern, outError);
+  }
+
+  static AVAudioSessionDataSourceDescription new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_AVAudioSessionDataSourceDescription1, _lib._sel_new1);
+    return AVAudioSessionDataSourceDescription._(_ret, _lib,
+        retain: false, release: true);
+  }
+
+  static AVAudioSessionDataSourceDescription alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_AVAudioSessionDataSourceDescription1, _lib._sel_alloc1);
+    return AVAudioSessionDataSourceDescription._(_ret, _lib,
+        retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_AVAudioSessionDataSourceDescription1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(
+        _lib._class_AVAudioSessionDataSourceDescription1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1,
+        aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_AVAudioSessionDataSourceDescription1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_AVAudioSessionDataSourceDescription1,
+        _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_AVAudioSessionDataSourceDescription1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_AVAudioSessionDataSourceDescription1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_AVAudioSessionDataSourceDescription1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_AVAudioSessionDataSourceDescription1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_AVAudioSessionDataSourceDescription1,
+        _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef AVAudioSessionLocation = ffi.Pointer<ObjCObject>;
+typedef AVAudioSessionOrientation = ffi.Pointer<ObjCObject>;
+typedef AVAudioSessionPolarPattern = ffi.Pointer<ObjCObject>;
+
+abstract class AVAudioSessionSetActiveOptions {
+  static const int AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation = 1;
+}
+
+abstract class AVAudioSessionActivationOptions {
+  static const int AVAudioSessionActivationOptionNone = 0;
+}
+
+void _ObjCBlock44_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block, bool arg0, ffi.Pointer<ObjCObject> arg1) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(ffi.Bool arg0, ffi.Pointer<ObjCObject> arg1)>>()
+      .asFunction<
+          void Function(bool arg0, ffi.Pointer<ObjCObject> arg1)>()(arg0, arg1);
+}
+
+final _ObjCBlock44_closureRegistry = <int, Function>{};
+int _ObjCBlock44_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock44_registerClosure(Function fn) {
+  final id = ++_ObjCBlock44_closureRegistryIndex;
+  _ObjCBlock44_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock44_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block, bool arg0, ffi.Pointer<ObjCObject> arg1) {
+  return _ObjCBlock44_closureRegistry[block.ref.target.address]!(arg0, arg1);
+}
+
+class ObjCBlock44 extends _ObjCBlockBase {
+  ObjCBlock44._(ffi.Pointer<_ObjCBlock> id, AVFAudio lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock44.fromFunctionPointer(
+      AVFAudio lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(
+                      ffi.Bool arg0, ffi.Pointer<ObjCObject> arg1)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Bool arg0, ffi.Pointer<ObjCObject> arg1)>(
+                        _ObjCBlock44_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock44.fromFunction(
+      AVFAudio lib, void Function(bool arg0, ffi.Pointer<ObjCObject> arg1) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Bool arg0, ffi.Pointer<ObjCObject> arg1)>(
+                        _ObjCBlock44_closureTrampoline)
+                    .cast(),
+                _ObjCBlock44_registerClosure(fn)),
+            lib);
+  void call(bool arg0, ffi.Pointer<ObjCObject> arg1) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(ffi.Pointer<_ObjCBlock> block, ffi.Bool arg0,
+                    ffi.Pointer<ObjCObject> arg1)>>()
+        .asFunction<
+            void Function(ffi.Pointer<_ObjCBlock> block, bool arg0,
+                ffi.Pointer<ObjCObject> arg1)>()(_id, arg0, arg1);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+abstract class AVAudioStereoOrientation {
+  static const int AVAudioStereoOrientationNone = 0;
+  static const int AVAudioStereoOrientationPortrait = 1;
+  static const int AVAudioStereoOrientationPortraitUpsideDown = 2;
+  static const int AVAudioStereoOrientationLandscapeRight = 3;
+  static const int AVAudioStereoOrientationLandscapeLeft = 4;
+}
+
+abstract class AVAudioSessionPromptStyle {
+  static const int AVAudioSessionPromptStyleNone = 1852796517;
+  static const int AVAudioSessionPromptStyleShort = 1936224884;
+  static const int AVAudioSessionPromptStyleNormal = 1852992876;
+}
+
+class AVAudioSessionRouteDescription extends NSObject {
+  AVAudioSessionRouteDescription._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [AVAudioSessionRouteDescription] that points to the same underlying object as [other].
+  static AVAudioSessionRouteDescription castFrom<T extends _ObjCWrapper>(
+      T other) {
+    return AVAudioSessionRouteDescription._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [AVAudioSessionRouteDescription] that wraps the given raw object pointer.
+  static AVAudioSessionRouteDescription castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return AVAudioSessionRouteDescription._(other, lib,
+        retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [AVAudioSessionRouteDescription].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_AVAudioSessionRouteDescription1);
+  }
+
+  NSArray? get inputs {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_inputs1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get outputs {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_outputs1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static AVAudioSessionRouteDescription new1(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_AVAudioSessionRouteDescription1, _lib._sel_new1);
+    return AVAudioSessionRouteDescription._(_ret, _lib,
+        retain: false, release: true);
+  }
+
+  static AVAudioSessionRouteDescription alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_AVAudioSessionRouteDescription1, _lib._sel_alloc1);
+    return AVAudioSessionRouteDescription._(_ret, _lib,
+        retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_AVAudioSessionRouteDescription1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_AVAudioSessionRouteDescription1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_AVAudioSessionRouteDescription1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_AVAudioSessionRouteDescription1,
+        _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_AVAudioSessionRouteDescription1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_AVAudioSessionRouteDescription1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_AVAudioSessionRouteDescription1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_AVAudioSessionRouteDescription1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_AVAudioSessionRouteDescription1,
+        _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class AVAudioSessionIOType {
+  static const int AVAudioSessionIOTypeNotSpecified = 0;
+  static const int AVAudioSessionIOTypeAggregated = 1;
+}
+
+class AVAudioPlayer extends NSObject {
+  AVAudioPlayer._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [AVAudioPlayer] that points to the same underlying object as [other].
+  static AVAudioPlayer castFrom<T extends _ObjCWrapper>(T other) {
+    return AVAudioPlayer._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [AVAudioPlayer] that wraps the given raw object pointer.
+  static AVAudioPlayer castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return AVAudioPlayer._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [AVAudioPlayer].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_AVAudioPlayer1);
+  }
+
+  AVAudioPlayer initWithContentsOfURL_error_(
+      NSURL? url, ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    final _ret = _lib._objc_msgSend_734(
+        _id,
+        _lib._sel_initWithContentsOfURL_error_1,
+        url?._id ?? ffi.nullptr,
+        outError);
+    return AVAudioPlayer._(_ret, _lib, retain: true, release: true);
+  }
+
+  AVAudioPlayer initWithData_error_(
+      NSData? data, ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    final _ret = _lib._objc_msgSend_1026(_id, _lib._sel_initWithData_error_1,
+        data?._id ?? ffi.nullptr, outError);
+    return AVAudioPlayer._(_ret, _lib, retain: true, release: true);
+  }
+
+  AVAudioPlayer initWithContentsOfURL_fileTypeHint_error_(NSURL? url,
+      NSString? utiString, ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    final _ret = _lib._objc_msgSend_1027(
+        _id,
+        _lib._sel_initWithContentsOfURL_fileTypeHint_error_1,
+        url?._id ?? ffi.nullptr,
+        utiString?._id ?? ffi.nullptr,
+        outError);
+    return AVAudioPlayer._(_ret, _lib, retain: true, release: true);
+  }
+
+  AVAudioPlayer initWithData_fileTypeHint_error_(NSData? data,
+      NSString? utiString, ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    final _ret = _lib._objc_msgSend_1028(
+        _id,
+        _lib._sel_initWithData_fileTypeHint_error_1,
+        data?._id ?? ffi.nullptr,
+        utiString?._id ?? ffi.nullptr,
+        outError);
+    return AVAudioPlayer._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool prepareToPlay() {
+    return _lib._objc_msgSend_12(_id, _lib._sel_prepareToPlay1);
+  }
+
+  bool play() {
+    return _lib._objc_msgSend_12(_id, _lib._sel_play1);
+  }
+
+  bool playAtTime_(double time) {
+    return _lib._objc_msgSend_1029(_id, _lib._sel_playAtTime_1, time);
+  }
+
+  void pause() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_pause1);
+  }
+
+  void stop() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_stop1);
+  }
+
+  bool get playing {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isPlaying1);
+  }
+
+  int get numberOfChannels {
+    return _lib._objc_msgSend_10(_id, _lib._sel_numberOfChannels1);
+  }
+
+  double get duration {
+    return _lib._objc_msgSend_149(_id, _lib._sel_duration1);
+  }
+
+  NSString? get currentDevice {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_currentDevice1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set currentDevice(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setCurrentDevice_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSObject? get delegate {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_delegate1);
+    return _ret.address == 0
+        ? null
+        : NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  set delegate(NSObject? value) {
+    _lib._objc_msgSend_368(
+        _id, _lib._sel_setDelegate_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSURL? get url {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_url1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData? get data {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_data1);
+    return _ret.address == 0
+        ? null
+        : NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  double get pan {
+    return _lib._objc_msgSend_215(_id, _lib._sel_pan1);
+  }
+
+  set pan(double value) {
+    _lib._objc_msgSend_765(_id, _lib._sel_setPan_1, value);
+  }
+
+  double get volume {
+    return _lib._objc_msgSend_215(_id, _lib._sel_volume1);
+  }
+
+  set volume(double value) {
+    _lib._objc_msgSend_765(_id, _lib._sel_setVolume_1, value);
+  }
+
+  void setVolume_fadeDuration_(double volume, double duration) {
+    return _lib._objc_msgSend_1030(
+        _id, _lib._sel_setVolume_fadeDuration_1, volume, duration);
+  }
+
+  bool get enableRate {
+    return _lib._objc_msgSend_12(_id, _lib._sel_enableRate1);
+  }
+
+  set enableRate(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setEnableRate_1, value);
+  }
+
+  double get rate {
+    return _lib._objc_msgSend_215(_id, _lib._sel_rate1);
+  }
+
+  set rate(double value) {
+    _lib._objc_msgSend_765(_id, _lib._sel_setRate_1, value);
+  }
+
+  double get currentTime {
+    return _lib._objc_msgSend_149(_id, _lib._sel_currentTime1);
+  }
+
+  set currentTime(double value) {
+    _lib._objc_msgSend_474(_id, _lib._sel_setCurrentTime_1, value);
+  }
+
+  double get deviceCurrentTime {
+    return _lib._objc_msgSend_149(_id, _lib._sel_deviceCurrentTime1);
+  }
+
+  int get numberOfLoops {
+    return _lib._objc_msgSend_78(_id, _lib._sel_numberOfLoops1);
+  }
+
+  set numberOfLoops(int value) {
+    _lib._objc_msgSend_558(_id, _lib._sel_setNumberOfLoops_1, value);
+  }
+
+  NSDictionary? get settings {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_settings1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  AVAudioFormat? get format {
+    final _ret = _lib._objc_msgSend_1046(_id, _lib._sel_format1);
+    return _ret.address == 0
+        ? null
+        : AVAudioFormat._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool get meteringEnabled {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isMeteringEnabled1);
+  }
+
+  set meteringEnabled(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setMeteringEnabled_1, value);
+  }
+
+  void updateMeters() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_updateMeters1);
+  }
+
+  double peakPowerForChannel_(int channelNumber) {
+    return _lib._objc_msgSend_1047(
+        _id, _lib._sel_peakPowerForChannel_1, channelNumber);
+  }
+
+  double averagePowerForChannel_(int channelNumber) {
+    return _lib._objc_msgSend_1047(
+        _id, _lib._sel_averagePowerForChannel_1, channelNumber);
+  }
+
+  NSArray? get channelAssignments {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_channelAssignments1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set channelAssignments(NSArray? value) {
+    _lib._objc_msgSend_696(
+        _id, _lib._sel_setChannelAssignments_1, value?._id ?? ffi.nullptr);
+  }
+
+  static AVAudioPlayer new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_AVAudioPlayer1, _lib._sel_new1);
+    return AVAudioPlayer._(_ret, _lib, retain: false, release: true);
+  }
+
+  static AVAudioPlayer alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_AVAudioPlayer1, _lib._sel_alloc1);
+    return AVAudioPlayer._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_AVAudioPlayer1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_AVAudioPlayer1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_AVAudioPlayer1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_AVAudioPlayer1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_AVAudioPlayer1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_AVAudioPlayer1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_AVAudioPlayer1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_AVAudioPlayer1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_AVAudioPlayer1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class AVAudioFormat extends NSObject {
+  AVAudioFormat._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [AVAudioFormat] that points to the same underlying object as [other].
+  static AVAudioFormat castFrom<T extends _ObjCWrapper>(T other) {
+    return AVAudioFormat._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [AVAudioFormat] that wraps the given raw object pointer.
+  static AVAudioFormat castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return AVAudioFormat._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [AVAudioFormat].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_AVAudioFormat1);
+  }
+
+  AVAudioFormat initWithStreamDescription_(
+      ffi.Pointer<AudioStreamBasicDescription> asbd) {
+    final _ret = _lib._objc_msgSend_1031(
+        _id, _lib._sel_initWithStreamDescription_1, asbd);
+    return AVAudioFormat._(_ret, _lib, retain: true, release: true);
+  }
+
+  AVAudioFormat initWithStreamDescription_channelLayout_(
+      ffi.Pointer<AudioStreamBasicDescription> asbd,
+      AVAudioChannelLayout? layout) {
+    final _ret = _lib._objc_msgSend_1036(
+        _id,
+        _lib._sel_initWithStreamDescription_channelLayout_1,
+        asbd,
+        layout?._id ?? ffi.nullptr);
+    return AVAudioFormat._(_ret, _lib, retain: true, release: true);
+  }
+
+  AVAudioFormat initStandardFormatWithSampleRate_channels_(
+      double sampleRate, int channels) {
+    final _ret = _lib._objc_msgSend_1037(
+        _id,
+        _lib._sel_initStandardFormatWithSampleRate_channels_1,
+        sampleRate,
+        channels);
+    return AVAudioFormat._(_ret, _lib, retain: true, release: true);
+  }
+
+  AVAudioFormat initStandardFormatWithSampleRate_channelLayout_(
+      double sampleRate, AVAudioChannelLayout? layout) {
+    final _ret = _lib._objc_msgSend_1038(
+        _id,
+        _lib._sel_initStandardFormatWithSampleRate_channelLayout_1,
+        sampleRate,
+        layout?._id ?? ffi.nullptr);
+    return AVAudioFormat._(_ret, _lib, retain: true, release: true);
+  }
+
+  AVAudioFormat initWithCommonFormat_sampleRate_channels_interleaved_(
+      int format, double sampleRate, int channels, bool interleaved) {
+    final _ret = _lib._objc_msgSend_1039(
+        _id,
+        _lib._sel_initWithCommonFormat_sampleRate_channels_interleaved_1,
+        format,
+        sampleRate,
+        channels,
+        interleaved);
+    return AVAudioFormat._(_ret, _lib, retain: true, release: true);
+  }
+
+  AVAudioFormat initWithCommonFormat_sampleRate_interleaved_channelLayout_(
+      int format,
+      double sampleRate,
+      bool interleaved,
+      AVAudioChannelLayout? layout) {
+    final _ret = _lib._objc_msgSend_1040(
+        _id,
+        _lib._sel_initWithCommonFormat_sampleRate_interleaved_channelLayout_1,
+        format,
+        sampleRate,
+        interleaved,
+        layout?._id ?? ffi.nullptr);
+    return AVAudioFormat._(_ret, _lib, retain: true, release: true);
+  }
+
+  AVAudioFormat initWithSettings_(NSDictionary? settings) {
+    final _ret = _lib._objc_msgSend_143(
+        _id, _lib._sel_initWithSettings_1, settings?._id ?? ffi.nullptr);
+    return AVAudioFormat._(_ret, _lib, retain: true, release: true);
+  }
+
+  AVAudioFormat initWithCMAudioFormatDescription_(
+      CMAudioFormatDescriptionRef formatDescription) {
+    final _ret = _lib._objc_msgSend_1041(
+        _id, _lib._sel_initWithCMAudioFormatDescription_1, formatDescription);
+    return AVAudioFormat._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool isEqual_(NSObject object) {
+    return _lib._objc_msgSend_0(_id, _lib._sel_isEqual_1, object._id);
+  }
+
+  bool get standard {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isStandard1);
+  }
+
+  int get commonFormat {
+    return _lib._objc_msgSend_1042(_id, _lib._sel_commonFormat1);
+  }
+
+  int get channelCount {
+    return _lib._objc_msgSend_1035(_id, _lib._sel_channelCount1);
+  }
+
+  double get sampleRate {
+    return _lib._objc_msgSend_149(_id, _lib._sel_sampleRate1);
+  }
+
+  bool get interleaved {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isInterleaved1);
+  }
+
+  ffi.Pointer<AudioStreamBasicDescription> get streamDescription {
+    return _lib._objc_msgSend_1043(_id, _lib._sel_streamDescription1);
+  }
+
+  AVAudioChannelLayout? get channelLayout {
+    final _ret = _lib._objc_msgSend_1044(_id, _lib._sel_channelLayout1);
+    return _ret.address == 0
+        ? null
+        : AVAudioChannelLayout._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData? get magicCookie {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_magicCookie1);
+    return _ret.address == 0
+        ? null
+        : NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  set magicCookie(NSData? value) {
+    _lib._objc_msgSend_892(
+        _id, _lib._sel_setMagicCookie_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSDictionary? get settings {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_settings1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  CMAudioFormatDescriptionRef get formatDescription {
+    return _lib._objc_msgSend_1045(_id, _lib._sel_formatDescription1);
+  }
+
+  static AVAudioFormat new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_AVAudioFormat1, _lib._sel_new1);
+    return AVAudioFormat._(_ret, _lib, retain: false, release: true);
+  }
+
+  static AVAudioFormat alloc(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_AVAudioFormat1, _lib._sel_alloc1);
+    return AVAudioFormat._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_AVAudioFormat1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_AVAudioFormat1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_AVAudioFormat1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_AVAudioFormat1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_AVAudioFormat1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_AVAudioFormat1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_AVAudioFormat1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_AVAudioFormat1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_AVAudioFormat1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class AudioStreamBasicDescription extends ffi.Struct {
+  @Float64()
+  external double mSampleRate;
+
+  @AudioFormatID()
+  external int mFormatID;
+
+  @AudioFormatFlags()
+  external int mFormatFlags;
+
+  @UInt32()
+  external int mBytesPerPacket;
+
+  @UInt32()
+  external int mFramesPerPacket;
+
+  @UInt32()
+  external int mBytesPerFrame;
+
+  @UInt32()
+  external int mChannelsPerFrame;
+
+  @UInt32()
+  external int mBitsPerChannel;
+
+  @UInt32()
+  external int mReserved;
+}
+
+typedef Float64 = ffi.Double;
+typedef AudioFormatID = UInt32;
+typedef AudioFormatFlags = UInt32;
+
+class AVAudioChannelLayout extends NSObject {
+  AVAudioChannelLayout._(ffi.Pointer<ObjCObject> id, AVFAudio lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [AVAudioChannelLayout] that points to the same underlying object as [other].
+  static AVAudioChannelLayout castFrom<T extends _ObjCWrapper>(T other) {
+    return AVAudioChannelLayout._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [AVAudioChannelLayout] that wraps the given raw object pointer.
+  static AVAudioChannelLayout castFromPointer(
+      AVFAudio lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return AVAudioChannelLayout._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [AVAudioChannelLayout].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_AVAudioChannelLayout1);
+  }
+
+  @override
+  AVAudioChannelLayout init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return AVAudioChannelLayout._(_ret, _lib, retain: true, release: true);
+  }
+
+  AVAudioChannelLayout initWithLayoutTag_(int layoutTag) {
+    final _ret =
+        _lib._objc_msgSend_1032(_id, _lib._sel_initWithLayoutTag_1, layoutTag);
+    return AVAudioChannelLayout._(_ret, _lib, retain: true, release: true);
+  }
+
+  AVAudioChannelLayout initWithLayout_(ffi.Pointer<AudioChannelLayout> layout) {
+    final _ret =
+        _lib._objc_msgSend_1033(_id, _lib._sel_initWithLayout_1, layout);
+    return AVAudioChannelLayout._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool isEqual_(NSObject object) {
+    return _lib._objc_msgSend_0(_id, _lib._sel_isEqual_1, object._id);
+  }
+
+  static AVAudioChannelLayout layoutWithLayoutTag_(
+      AVFAudio _lib, int layoutTag) {
+    final _ret = _lib._objc_msgSend_1032(_lib._class_AVAudioChannelLayout1,
+        _lib._sel_layoutWithLayoutTag_1, layoutTag);
+    return AVAudioChannelLayout._(_ret, _lib, retain: true, release: true);
+  }
+
+  static AVAudioChannelLayout layoutWithLayout_(
+      AVFAudio _lib, ffi.Pointer<AudioChannelLayout> layout) {
+    final _ret = _lib._objc_msgSend_1033(_lib._class_AVAudioChannelLayout1,
+        _lib._sel_layoutWithLayout_1, layout);
+    return AVAudioChannelLayout._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get layoutTag {
+    return _lib._objc_msgSend_191(_id, _lib._sel_layoutTag1);
+  }
+
+  ffi.Pointer<AudioChannelLayout> get layout {
+    return _lib._objc_msgSend_1034(_id, _lib._sel_layout1);
+  }
+
+  int get channelCount {
+    return _lib._objc_msgSend_1035(_id, _lib._sel_channelCount1);
+  }
+
+  static AVAudioChannelLayout new1(AVFAudio _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_AVAudioChannelLayout1, _lib._sel_new1);
+    return AVAudioChannelLayout._(_ret, _lib, retain: false, release: true);
+  }
+
+  static AVAudioChannelLayout alloc(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_AVAudioChannelLayout1, _lib._sel_alloc1);
+    return AVAudioChannelLayout._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      AVFAudio _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_AVAudioChannelLayout1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      AVFAudio _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_AVAudioChannelLayout1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(_lib._class_AVAudioChannelLayout1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(AVFAudio _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_AVAudioChannelLayout1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      AVFAudio _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_AVAudioChannelLayout1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      AVFAudio _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_AVAudioChannelLayout1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      AVFAudio _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_AVAudioChannelLayout1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_AVAudioChannelLayout1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(AVFAudio _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_AVAudioChannelLayout1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef AudioChannelLayoutTag = UInt32;
+
+class AudioChannelLayout extends ffi.Struct {
+  @AudioChannelLayoutTag()
+  external int mChannelLayoutTag;
+
+  @ffi.Int32()
+  external int mChannelBitmap;
+
+  @UInt32()
+  external int mNumberChannelDescriptions;
+
+  @ffi.Array.multi([1])
+  external ffi.Array<AudioChannelDescription> mChannelDescriptions;
+}
+
+abstract class AudioChannelBitmap {
+  static const int kAudioChannelBit_Left = 1;
+  static const int kAudioChannelBit_Right = 2;
+  static const int kAudioChannelBit_Center = 4;
+  static const int kAudioChannelBit_LFEScreen = 8;
+  static const int kAudioChannelBit_LeftSurround = 16;
+  static const int kAudioChannelBit_RightSurround = 32;
+  static const int kAudioChannelBit_LeftCenter = 64;
+  static const int kAudioChannelBit_RightCenter = 128;
+  static const int kAudioChannelBit_CenterSurround = 256;
+  static const int kAudioChannelBit_LeftSurroundDirect = 512;
+  static const int kAudioChannelBit_RightSurroundDirect = 1024;
+  static const int kAudioChannelBit_TopCenterSurround = 2048;
+  static const int kAudioChannelBit_VerticalHeightLeft = 4096;
+  static const int kAudioChannelBit_VerticalHeightCenter = 8192;
+  static const int kAudioChannelBit_VerticalHeightRight = 16384;
+  static const int kAudioChannelBit_TopBackLeft = 32768;
+  static const int kAudioChannelBit_TopBackCenter = 65536;
+  static const int kAudioChannelBit_TopBackRight = 131072;
+  static const int kAudioChannelBit_LeftTopFront = 4096;
+  static const int kAudioChannelBit_CenterTopFront = 8192;
+  static const int kAudioChannelBit_RightTopFront = 16384;
+  static const int kAudioChannelBit_LeftTopMiddle = 2097152;
+  static const int kAudioChannelBit_CenterTopMiddle = 2048;
+  static const int kAudioChannelBit_RightTopMiddle = 8388608;
+  static const int kAudioChannelBit_LeftTopRear = 16777216;
+  static const int kAudioChannelBit_CenterTopRear = 33554432;
+  static const int kAudioChannelBit_RightTopRear = 67108864;
+}
+
+class AudioChannelDescription extends ffi.Struct {
+  @AudioChannelLabel()
+  external int mChannelLabel;
+
+  @ffi.Int32()
+  external int mChannelFlags;
+
+  @ffi.Array.multi([3])
+  external ffi.Array<Float32> mCoordinates;
+}
+
+typedef AudioChannelLabel = UInt32;
+
+abstract class AudioChannelFlags {
+  static const int kAudioChannelFlags_AllOff = 0;
+  static const int kAudioChannelFlags_RectangularCoordinates = 1;
+  static const int kAudioChannelFlags_SphericalCoordinates = 2;
+  static const int kAudioChannelFlags_Meters = 4;
+}
+
+typedef Float32 = ffi.Float;
+typedef AVAudioChannelCount = ffi.Uint32;
+
+abstract class AVAudioCommonFormat {
+  static const int AVAudioOtherFormat = 0;
+  static const int AVAudioPCMFormatFloat32 = 1;
+  static const int AVAudioPCMFormatFloat64 = 2;
+  static const int AVAudioPCMFormatInt16 = 3;
+  static const int AVAudioPCMFormatInt32 = 4;
+}
+
+typedef CMAudioFormatDescriptionRef = CMFormatDescriptionRef;
+typedef CMFormatDescriptionRef = ffi.Pointer<opaqueCMFormatDescription>;
+
+class opaqueCMFormatDescription extends ffi.Opaque {}
diff --git a/pkgs/ffigen/example/objective_c/config.yaml b/pkgs/ffigen/example/objective_c/config.yaml
new file mode 100644
index 0000000..94764ca
--- /dev/null
+++ b/pkgs/ffigen/example/objective_c/config.yaml
@@ -0,0 +1,13 @@
+name: AVFAudio
+description: Bindings for AVFAudio.
+language: objc
+output: 'avf_audio_bindings.dart'
+exclude-all-by-default: true
+objc-interfaces:
+  include:
+    - 'AVAudioPlayer'
+headers:
+  entry-points:
+    - '/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/AVFAudio.framework/Headers/AVAudioPlayer.h'
+preamble: |
+  // ignore_for_file: camel_case_types, non_constant_identifier_names, unused_element, unused_field, return_of_invalid_type, void_checks, annotate_overrides, no_leading_underscores_for_local_identifiers, library_private_types_in_public_api
diff --git a/pkgs/ffigen/example/objective_c/play_audio.dart b/pkgs/ffigen/example/objective_c/play_audio.dart
new file mode 100644
index 0000000..05708c6
--- /dev/null
+++ b/pkgs/ffigen/example/objective_c/play_audio.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2022, 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:ffi';
+import 'avf_audio_bindings.dart';
+
+const _dylibPath =
+    '/System/Library/Frameworks/AVFAudio.framework/Versions/Current/AVFAudio';
+
+void main(List<String> args) async {
+  final lib = AVFAudio(DynamicLibrary.open(_dylibPath));
+  for (final file in args) {
+    final fileStr = NSString(lib, file);
+    print('Loading $fileStr');
+    final fileUrl = NSURL.fileURLWithPath_(lib, fileStr);
+    final player =
+        AVAudioPlayer.alloc(lib).initWithContentsOfURL_error_(fileUrl, nullptr);
+    final durationSeconds = player.duration.ceil();
+    print('$durationSeconds sec');
+    final status = player.play();
+    if (status) {
+      print('Playing...');
+      await Future<void>.delayed(Duration(seconds: durationSeconds));
+    } else {
+      print('Failed to play audio.');
+    }
+  }
+}
diff --git a/pkgs/ffigen/example/objective_c/pubspec.yaml b/pkgs/ffigen/example/objective_c/pubspec.yaml
new file mode 100644
index 0000000..33b0c31
--- /dev/null
+++ b/pkgs/ffigen/example/objective_c/pubspec.yaml
@@ -0,0 +1,15 @@
+# Copyright (c) 2022, 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.
+
+name: objective_c_example
+
+environment:
+  sdk: '>=2.17.0 <4.0.0'
+
+dependencies:
+  ffi: ^2.0.1
+dev_dependencies:
+  ffigen:
+    path: '../../'
+  lints: ^2.0.0
diff --git a/pkgs/ffigen/example/objective_c/test.mp3 b/pkgs/ffigen/example/objective_c/test.mp3
new file mode 100644
index 0000000..077b618
--- /dev/null
+++ b/pkgs/ffigen/example/objective_c/test.mp3
Binary files differ
diff --git a/pkgs/ffigen/example/shared_bindings/.gitignore b/pkgs/ffigen/example/shared_bindings/.gitignore
new file mode 100644
index 0000000..1b05164
--- /dev/null
+++ b/pkgs/ffigen/example/shared_bindings/.gitignore
@@ -0,0 +1,11 @@
+# Files and directories created by pub.
+.dart_tool/
+.packages
+# Remove the following pattern if you wish to check in your lock file.
+pubspec.lock
+
+# Conventional directory for build outputs.
+build/
+
+# Directory created by dartdoc.
+doc/api/
diff --git a/pkgs/ffigen/example/shared_bindings/README.md b/pkgs/ffigen/example/shared_bindings/README.md
new file mode 100644
index 0000000..6a81fdd
--- /dev/null
+++ b/pkgs/ffigen/example/shared_bindings/README.md
@@ -0,0 +1,10 @@
+# Shared bindings
+
+An example to showcase how bindings can share types
+with other bindings.
+
+## Generating bindings
+At the root of this example (`example/shared_bindings`), run -
+```
+dart run generate.dart
+```
diff --git a/pkgs/ffigen/example/shared_bindings/ffigen_configs/a.yaml b/pkgs/ffigen/example/shared_bindings/ffigen_configs/a.yaml
new file mode 100644
index 0000000..55a720e
--- /dev/null
+++ b/pkgs/ffigen/example/shared_bindings/ffigen_configs/a.yaml
@@ -0,0 +1,12 @@
+# Copyright (c) 2022, 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.
+
+name: NativeLibraryA
+description: Bindings to `headers/a.h`.
+output: '../lib/generated/a_gen.dart'
+headers:
+  entry-points:
+    - '../headers/a.h'
+preamble: |
+  // ignore_for_file: non_constant_identifier_names, camel_case_types
diff --git a/pkgs/ffigen/example/shared_bindings/ffigen_configs/a_shared_base.yaml b/pkgs/ffigen/example/shared_bindings/ffigen_configs/a_shared_base.yaml
new file mode 100644
index 0000000..0adcc20
--- /dev/null
+++ b/pkgs/ffigen/example/shared_bindings/ffigen_configs/a_shared_base.yaml
@@ -0,0 +1,16 @@
+# Copyright (c) 2022, 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.
+
+name: NativeLibraryASharedB
+description: Bindings to `headers/a.h` with shared definitions from `headers/base.h`.
+output: '../lib/generated/a_shared_b_gen.dart'
+headers:
+  entry-points:
+    - '../headers/a.h'
+import:
+  symbol-files:
+    # Both package Uri and file paths are supported here.
+    - 'package:shared_bindings/generated/base_symbols.yaml'
+preamble: |
+  // ignore_for_file: non_constant_identifier_names, camel_case_types
diff --git a/pkgs/ffigen/example/shared_bindings/ffigen_configs/base.yaml b/pkgs/ffigen/example/shared_bindings/ffigen_configs/base.yaml
new file mode 100644
index 0000000..474d0f9
--- /dev/null
+++ b/pkgs/ffigen/example/shared_bindings/ffigen_configs/base.yaml
@@ -0,0 +1,17 @@
+# Copyright (c) 2022, 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.
+
+name: NativeLibraryBase
+description: Bindings to `headers/base.h`.
+output:
+  bindings: '../lib/generated/base_gen.dart'
+  symbol-file:
+    # Although file paths are supported here, prefer Package Uri's here.
+    output: 'package:shared_bindings/generated/base_symbols.yaml'
+    import-path: 'package:shared_bindings/generated/base_gen.dart'
+headers:
+  entry-points:
+    - '../headers/base.h'
+preamble: |
+  // ignore_for_file: non_constant_identifier_names, camel_case_types
diff --git a/pkgs/ffigen/example/shared_bindings/generate.dart b/pkgs/ffigen/example/shared_bindings/generate.dart
new file mode 100644
index 0000000..8e565cf
--- /dev/null
+++ b/pkgs/ffigen/example/shared_bindings/generate.dart
@@ -0,0 +1,32 @@
+import 'dart:io';
+
+import 'package:cli_util/cli_util.dart';
+import 'package:path/path.dart' as p;
+
+ProcessResult runFfigenForConfig(String sdkPath, String configPath) {
+  return Process.runSync(
+    p.join(sdkPath, 'bin', 'dart'),
+    [
+      'run',
+      'ffigen',
+      '--config=$configPath',
+    ],
+    runInShell: Platform.isWindows,
+  );
+}
+
+void main() {
+  final sdkPath = getSdkPath();
+  final configPaths = [
+    'ffigen_configs/base.yaml',
+    'ffigen_configs/a.yaml',
+    'ffigen_configs/a_shared_base.yaml'
+  ];
+  for (final configPath in configPaths) {
+    final res = runFfigenForConfig(sdkPath, configPath);
+    print(res.stdout.toString());
+    if (res.exitCode != 0) {
+      throw Exception("Some error occurred: ${res.stderr.toString()}");
+    }
+  }
+}
diff --git a/pkgs/ffigen/example/shared_bindings/headers/a.h b/pkgs/ffigen/example/shared_bindings/headers/a.h
new file mode 100644
index 0000000..ef3bbea
--- /dev/null
+++ b/pkgs/ffigen/example/shared_bindings/headers/a.h
@@ -0,0 +1,21 @@
+
+#include "base.h"
+
+struct A_Struct1{
+    int a;
+};
+
+union A_Union1{
+    int a;
+};
+
+enum A_Enum{
+    A_ENUM_1,
+    A_ENUM_2,
+};
+
+#define A_MACRO_1 1;
+
+void a_func1();
+
+void a_func2(struct BaseStruct2 s, union BaseUnion2 u, BaseTypedef2 t);
diff --git a/pkgs/ffigen/example/shared_bindings/headers/base.h b/pkgs/ffigen/example/shared_bindings/headers/base.h
new file mode 100644
index 0000000..345cac6
--- /dev/null
+++ b/pkgs/ffigen/example/shared_bindings/headers/base.h
@@ -0,0 +1,31 @@
+// Copyright (c) 2022, 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.
+
+struct BaseStruct1{
+    int a;
+};
+
+union BaseUnion1{
+    int a;
+};
+
+struct BaseStruct2{
+    int a;
+};
+
+union BaseUnion2{
+    int a;
+};
+
+typedef struct BaseStruct1 BaseTypedef1;
+typedef struct BaseStruct2 BaseTypedef2;
+
+enum BaseEnum{
+    BASE_ENUM_1,
+    BASE_ENUM_2,
+};
+
+#define BASE_MACRO_1 1;
+
+void base_func1(BaseTypedef1 t1, BaseTypedef2 t2);
diff --git a/pkgs/ffigen/example/shared_bindings/lib/generated/a_gen.dart b/pkgs/ffigen/example/shared_bindings/lib/generated/a_gen.dart
new file mode 100644
index 0000000..6cd4f8a
--- /dev/null
+++ b/pkgs/ffigen/example/shared_bindings/lib/generated/a_gen.dart
@@ -0,0 +1,113 @@
+// ignore_for_file: non_constant_identifier_names, camel_case_types
+
+// AUTO GENERATED FILE, DO NOT EDIT.
+//
+// Generated by `package:ffigen`.
+// ignore_for_file: type=lint
+import 'dart:ffi' as ffi;
+
+/// Bindings to `headers/a.h`.
+class NativeLibraryA {
+  /// Holds the symbol lookup function.
+  final ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
+      _lookup;
+
+  /// The symbols are looked up in [dynamicLibrary].
+  NativeLibraryA(ffi.DynamicLibrary dynamicLibrary)
+      : _lookup = dynamicLibrary.lookup;
+
+  /// The symbols are looked up with [lookup].
+  NativeLibraryA.fromLookup(
+      ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
+          lookup)
+      : _lookup = lookup;
+
+  void base_func1(
+    BaseTypedef1 t1,
+    BaseTypedef2 t2,
+  ) {
+    return _base_func1(
+      t1,
+      t2,
+    );
+  }
+
+  late final _base_func1Ptr = _lookup<
+          ffi.NativeFunction<ffi.Void Function(BaseTypedef1, BaseTypedef2)>>(
+      'base_func1');
+  late final _base_func1 =
+      _base_func1Ptr.asFunction<void Function(BaseTypedef1, BaseTypedef2)>();
+
+  void a_func1() {
+    return _a_func1();
+  }
+
+  late final _a_func1Ptr =
+      _lookup<ffi.NativeFunction<ffi.Void Function()>>('a_func1');
+  late final _a_func1 = _a_func1Ptr.asFunction<void Function()>();
+
+  void a_func2(
+    BaseStruct2 s,
+    BaseUnion2 u,
+    BaseTypedef2 t,
+  ) {
+    return _a_func2(
+      s,
+      u,
+      t,
+    );
+  }
+
+  late final _a_func2Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(BaseStruct2, BaseUnion2, BaseTypedef2)>>('a_func2');
+  late final _a_func2 = _a_func2Ptr
+      .asFunction<void Function(BaseStruct2, BaseUnion2, BaseTypedef2)>();
+}
+
+class BaseStruct1 extends ffi.Struct {
+  @ffi.Int()
+  external int a;
+}
+
+class BaseUnion1 extends ffi.Union {
+  @ffi.Int()
+  external int a;
+}
+
+class BaseStruct2 extends ffi.Struct {
+  @ffi.Int()
+  external int a;
+}
+
+class BaseUnion2 extends ffi.Union {
+  @ffi.Int()
+  external int a;
+}
+
+abstract class BaseEnum {
+  static const int BASE_ENUM_1 = 0;
+  static const int BASE_ENUM_2 = 1;
+}
+
+typedef BaseTypedef1 = BaseStruct1;
+typedef BaseTypedef2 = BaseStruct2;
+
+class A_Struct1 extends ffi.Struct {
+  @ffi.Int()
+  external int a;
+}
+
+class A_Union1 extends ffi.Union {
+  @ffi.Int()
+  external int a;
+}
+
+abstract class A_Enum {
+  static const int A_ENUM_1 = 0;
+  static const int A_ENUM_2 = 1;
+}
+
+const int BASE_MACRO_1 = 1;
+
+const int A_MACRO_1 = 1;
diff --git a/pkgs/ffigen/example/shared_bindings/lib/generated/a_shared_b_gen.dart b/pkgs/ffigen/example/shared_bindings/lib/generated/a_shared_b_gen.dart
new file mode 100644
index 0000000..1346bec
--- /dev/null
+++ b/pkgs/ffigen/example/shared_bindings/lib/generated/a_shared_b_gen.dart
@@ -0,0 +1,71 @@
+// ignore_for_file: non_constant_identifier_names, camel_case_types
+
+// AUTO GENERATED FILE, DO NOT EDIT.
+//
+// Generated by `package:ffigen`.
+// ignore_for_file: type=lint
+import 'dart:ffi' as ffi;
+import 'package:shared_bindings/generated/base_gen.dart' as imp1;
+
+/// Bindings to `headers/a.h` with shared definitions from `headers/base.h`.
+class NativeLibraryASharedB {
+  /// Holds the symbol lookup function.
+  final ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
+      _lookup;
+
+  /// The symbols are looked up in [dynamicLibrary].
+  NativeLibraryASharedB(ffi.DynamicLibrary dynamicLibrary)
+      : _lookup = dynamicLibrary.lookup;
+
+  /// The symbols are looked up with [lookup].
+  NativeLibraryASharedB.fromLookup(
+      ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
+          lookup)
+      : _lookup = lookup;
+
+  void a_func1() {
+    return _a_func1();
+  }
+
+  late final _a_func1Ptr =
+      _lookup<ffi.NativeFunction<ffi.Void Function()>>('a_func1');
+  late final _a_func1 = _a_func1Ptr.asFunction<void Function()>();
+
+  void a_func2(
+    imp1.BaseStruct2 s,
+    imp1.BaseUnion2 u,
+    imp1.BaseTypedef2 t,
+  ) {
+    return _a_func2(
+      s,
+      u,
+      t,
+    );
+  }
+
+  late final _a_func2Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(imp1.BaseStruct2, imp1.BaseUnion2,
+              imp1.BaseTypedef2)>>('a_func2');
+  late final _a_func2 = _a_func2Ptr.asFunction<
+      void Function(imp1.BaseStruct2, imp1.BaseUnion2, imp1.BaseTypedef2)>();
+}
+
+class A_Struct1 extends ffi.Struct {
+  @ffi.Int()
+  external int a;
+}
+
+class A_Union1 extends ffi.Union {
+  @ffi.Int()
+  external int a;
+}
+
+abstract class A_Enum {
+  static const int A_ENUM_1 = 0;
+  static const int A_ENUM_2 = 1;
+}
+
+const int BASE_MACRO_1 = 1;
+
+const int A_MACRO_1 = 1;
diff --git a/pkgs/ffigen/example/shared_bindings/lib/generated/base_gen.dart b/pkgs/ffigen/example/shared_bindings/lib/generated/base_gen.dart
new file mode 100644
index 0000000..b31c2e8
--- /dev/null
+++ b/pkgs/ffigen/example/shared_bindings/lib/generated/base_gen.dart
@@ -0,0 +1,70 @@
+// ignore_for_file: non_constant_identifier_names, camel_case_types
+
+// AUTO GENERATED FILE, DO NOT EDIT.
+//
+// Generated by `package:ffigen`.
+// ignore_for_file: type=lint
+import 'dart:ffi' as ffi;
+
+/// Bindings to `headers/base.h`.
+class NativeLibraryBase {
+  /// Holds the symbol lookup function.
+  final ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
+      _lookup;
+
+  /// The symbols are looked up in [dynamicLibrary].
+  NativeLibraryBase(ffi.DynamicLibrary dynamicLibrary)
+      : _lookup = dynamicLibrary.lookup;
+
+  /// The symbols are looked up with [lookup].
+  NativeLibraryBase.fromLookup(
+      ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
+          lookup)
+      : _lookup = lookup;
+
+  void base_func1(
+    BaseTypedef1 t1,
+    BaseTypedef2 t2,
+  ) {
+    return _base_func1(
+      t1,
+      t2,
+    );
+  }
+
+  late final _base_func1Ptr = _lookup<
+          ffi.NativeFunction<ffi.Void Function(BaseTypedef1, BaseTypedef2)>>(
+      'base_func1');
+  late final _base_func1 =
+      _base_func1Ptr.asFunction<void Function(BaseTypedef1, BaseTypedef2)>();
+}
+
+class BaseStruct1 extends ffi.Struct {
+  @ffi.Int()
+  external int a;
+}
+
+class BaseUnion1 extends ffi.Union {
+  @ffi.Int()
+  external int a;
+}
+
+class BaseStruct2 extends ffi.Struct {
+  @ffi.Int()
+  external int a;
+}
+
+class BaseUnion2 extends ffi.Union {
+  @ffi.Int()
+  external int a;
+}
+
+abstract class BaseEnum {
+  static const int BASE_ENUM_1 = 0;
+  static const int BASE_ENUM_2 = 1;
+}
+
+typedef BaseTypedef1 = BaseStruct1;
+typedef BaseTypedef2 = BaseStruct2;
+
+const int BASE_MACRO_1 = 1;
diff --git a/pkgs/ffigen/example/shared_bindings/lib/generated/base_symbols.yaml b/pkgs/ffigen/example/shared_bindings/lib/generated/base_symbols.yaml
new file mode 100644
index 0000000..ad455fa
--- /dev/null
+++ b/pkgs/ffigen/example/shared_bindings/lib/generated/base_symbols.yaml
@@ -0,0 +1,22 @@
+format_version: 1.0.0
+files:
+  package:shared_bindings/generated/base_gen.dart:
+    used-config:
+      ffi-native: false
+    symbols:
+      c:@E@BaseEnum:
+        name: BaseEnum
+      c:@F@base_func1:
+        name: base_func1
+      c:@S@BaseStruct1:
+        name: BaseStruct1
+      c:@S@BaseStruct2:
+        name: BaseStruct2
+      c:@U@BaseUnion1:
+        name: BaseUnion1
+      c:@U@BaseUnion2:
+        name: BaseUnion2
+      c:base.h@T@BaseTypedef1:
+        name: BaseTypedef1
+      c:base.h@T@BaseTypedef2:
+        name: BaseTypedef2
diff --git a/pkgs/ffigen/example/shared_bindings/pubspec.yaml b/pkgs/ffigen/example/shared_bindings/pubspec.yaml
new file mode 100644
index 0000000..fbe942e
--- /dev/null
+++ b/pkgs/ffigen/example/shared_bindings/pubspec.yaml
@@ -0,0 +1,18 @@
+# Copyright (c) 2022, 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.
+
+name: shared_bindings
+
+environment:
+  sdk: '>=2.17.0 <4.0.0'
+
+dependencies:
+  cli_util: ^0.4.0
+  ffi: ^2.0.1
+  path: ^1.8.0
+
+dev_dependencies:
+  ffigen:
+    path: '../../'
+  lints: ^2.0.1
diff --git a/pkgs/ffigen/example/simple/README.md b/pkgs/ffigen/example/simple/README.md
index 026ae9f..81d9569 100644
--- a/pkgs/ffigen/example/simple/README.md
+++ b/pkgs/ffigen/example/simple/README.md
@@ -5,6 +5,6 @@
 ## Generating bindings
 At the root of this example (`example/simple`), run -
 ```
-dart run ffigen
+dart run ffigen --config config.yaml
 ```
 This will generate bindings in a file: [generated_bindings.dart](./generated_bindings.dart).
diff --git a/pkgs/ffigen/example/simple/config.yaml b/pkgs/ffigen/example/simple/config.yaml
new file mode 100644
index 0000000..82ed925
--- /dev/null
+++ b/pkgs/ffigen/example/simple/config.yaml
@@ -0,0 +1,6 @@
+name: NativeLibrary
+description: Bindings to `headers/example.h`.
+output: 'generated_bindings.dart'
+headers:
+  entry-points:
+    - 'headers/example.h'
\ No newline at end of file
diff --git a/pkgs/ffigen/example/simple/generated_bindings.dart b/pkgs/ffigen/example/simple/generated_bindings.dart
index 6685438..71f0414 100644
--- a/pkgs/ffigen/example/simple/generated_bindings.dart
+++ b/pkgs/ffigen/example/simple/generated_bindings.dart
@@ -1,6 +1,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 //
 // Generated by `package:ffigen`.
+// ignore_for_file: type=lint
 import 'dart:ffi' as ffi;
 
 /// Bindings to `headers/example.h`.
@@ -31,13 +32,12 @@
   }
 
   late final _sumPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Int32, ffi.Int32)>>(
-          'sum');
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Int, ffi.Int)>>('sum');
   late final _sum = _sumPtr.asFunction<int Function(int, int)>();
 
   /// Subtracts 2 integers.
   int subtract(
-    ffi.Pointer<ffi.Int32> a,
+    ffi.Pointer<ffi.Int> a,
     int b,
   ) {
     return _subtract(
@@ -47,13 +47,13 @@
   }
 
   late final _subtractPtr = _lookup<
-      ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<ffi.Int32>, ffi.Int32)>>('subtract');
+          ffi.NativeFunction<ffi.Int Function(ffi.Pointer<ffi.Int>, ffi.Int)>>(
+      'subtract');
   late final _subtract =
-      _subtractPtr.asFunction<int Function(ffi.Pointer<ffi.Int32>, int)>();
+      _subtractPtr.asFunction<int Function(ffi.Pointer<ffi.Int>, int)>();
 
   /// Multiplies 2 integers, returns pointer to an integer,.
-  ffi.Pointer<ffi.Int32> multiply(
+  ffi.Pointer<ffi.Int> multiply(
     int a,
     int b,
   ) {
@@ -64,10 +64,10 @@
   }
 
   late final _multiplyPtr = _lookup<
-      ffi.NativeFunction<
-          ffi.Pointer<ffi.Int32> Function(ffi.Int32, ffi.Int32)>>('multiply');
+          ffi.NativeFunction<ffi.Pointer<ffi.Int> Function(ffi.Int, ffi.Int)>>(
+      'multiply');
   late final _multiply =
-      _multiplyPtr.asFunction<ffi.Pointer<ffi.Int32> Function(int, int)>();
+      _multiplyPtr.asFunction<ffi.Pointer<ffi.Int> Function(int, int)>();
 
   /// Divides 2 integers, returns pointer to a float.
   ffi.Pointer<ffi.Float> divide(
@@ -82,26 +82,26 @@
 
   late final _dividePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Float> Function(ffi.Int32, ffi.Int32)>>('divide');
+          ffi.Pointer<ffi.Float> Function(ffi.Int, ffi.Int)>>('divide');
   late final _divide =
       _dividePtr.asFunction<ffi.Pointer<ffi.Float> Function(int, int)>();
 
   /// Divides 2 floats, returns a pointer to double.
-  ffi.Pointer<ffi.Double> dividePercision(
+  ffi.Pointer<ffi.Double> dividePrecision(
     ffi.Pointer<ffi.Float> a,
     ffi.Pointer<ffi.Float> b,
   ) {
-    return _dividePercision(
+    return _dividePrecision(
       a,
       b,
     );
   }
 
-  late final _dividePercisionPtr = _lookup<
+  late final _dividePrecisionPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<ffi.Double> Function(ffi.Pointer<ffi.Float>,
-              ffi.Pointer<ffi.Float>)>>('dividePercision');
-  late final _dividePercision = _dividePercisionPtr.asFunction<
+              ffi.Pointer<ffi.Float>)>>('dividePrecision');
+  late final _dividePrecision = _dividePrecisionPtr.asFunction<
       ffi.Pointer<ffi.Double> Function(
           ffi.Pointer<ffi.Float>, ffi.Pointer<ffi.Float>)>();
 }
diff --git a/pkgs/ffigen/example/simple/headers/example.h b/pkgs/ffigen/example/simple/headers/example.h
index 0f936ee..40c6b9e 100644
--- a/pkgs/ffigen/example/simple/headers/example.h
+++ b/pkgs/ffigen/example/simple/headers/example.h
@@ -15,4 +15,4 @@
 float *divide(int a, int b);
 
 /** Divides 2 floats, returns a pointer to double. */
-double *dividePercision(float *a, float *b);
+double *dividePrecision(float *a, float *b);
diff --git a/pkgs/ffigen/example/simple/pubspec.yaml b/pkgs/ffigen/example/simple/pubspec.yaml
index e419d1c..d59f53e 100644
--- a/pkgs/ffigen/example/simple/pubspec.yaml
+++ b/pkgs/ffigen/example/simple/pubspec.yaml
@@ -5,17 +5,12 @@
 name: simple_example
 
 environment:
-  sdk: '>=2.12.0 <3.0.0'
+  sdk: '>=2.17.0 <4.0.0'
 
+dependencies:
+  ffi: ^2.0.1
 dev_dependencies:
   ffigen:
     path: '../../'
-  lints: ^1.0.1
+  lints: ^2.0.1
 
-ffigen:
-  name: NativeLibrary
-  description: Bindings to `headers/example.h`.
-  output: 'generated_bindings.dart'
-  headers:
-    entry-points:
-      - 'headers/example.h'
diff --git a/pkgs/ffigen/example/swift/README.md b/pkgs/ffigen/example/swift/README.md
new file mode 100644
index 0000000..d53778e
--- /dev/null
+++ b/pkgs/ffigen/example/swift/README.md
@@ -0,0 +1,72 @@
+# Swift example
+
+This example shows how to use ffigen to interact with Swift libraries.
+
+Swift APIs can be made compatible with Objective-C, using the `@objc`
+annotation. Then you can use the `swiftc` tool to build a dylib for the library
+using `-emit-library`, and generate an Objective-C wrapper header using
+`-emit-objc-header-path filename.h`:
+
+```shell
+swiftc -c swift_api.swift               \
+    -module-name swift_module           \
+    -emit-objc-header-path swift_api.h  \
+    -emit-library -o libswiftapi.dylib
+```
+
+This should generate libswiftapi.dylib and swift_api.h.
+For more information about Objective-C / Swift interoperability, see the
+[Apple documentation](https://developer.apple.com/documentation/swift/importing-swift-into-objective-c).
+
+Once you have an Objective-C wrapper header, ffigen can parse it like
+any other header:
+
+```shell
+dart run ffigen --config config.yaml
+```
+
+This will generate [swift_api_bindings.dart](./swift_api_bindings.dart),
+using the config in the ffigen section of the pubspec.yaml.
+
+Finally, you can run the example using this command:
+
+```shell
+dart run example.dart
+```
+
+## Config notes
+
+Ffigen only sees the Objective-C wrapper header, swift_api.h. So you
+need to set the language to objc, and set the entry-point to the header:
+
+```yaml
+language: objc
+headers:
+  entry-points:
+    - 'swift_api.h'
+```
+
+Swift classes become Objective-C interfaces, so include them like this:
+
+```yaml
+objc-interfaces:
+  include:
+    - 'SwiftClass'
+```
+
+There is one extra option you need to set when wrapping a Swift library.
+When `swiftc` compiles the library, it gives the Objective-C interface
+a module prefix. Internally, our `SwiftClass` is actually registered
+as `swift_module.SwiftClass`. So you need to tell ffigen about this prefix,
+so it loads the correct class from the dylib:
+
+```yaml
+objc-interfaces:
+  include:
+    - 'SwiftClass'
+  module:
+    'SwiftClass': 'swift_module'
+```
+
+The module prefix is whatever you passed to `swiftc` in the
+`-module-name` flag.
diff --git a/pkgs/ffigen/example/swift/config.yaml b/pkgs/ffigen/example/swift/config.yaml
new file mode 100644
index 0000000..e1a8322
--- /dev/null
+++ b/pkgs/ffigen/example/swift/config.yaml
@@ -0,0 +1,19 @@
+name: SwiftLibrary
+description: Bindings for swift_api.
+language: objc
+output: 'swift_api_bindings.dart'
+exclude-all-by-default: true
+objc-interfaces:
+  include:
+    - 'SwiftClass'
+  module:
+    'SwiftClass': 'swift_module'
+headers:
+  entry-points:
+    - 'swift_api.h'
+preamble: |
+  // ignore_for_file: camel_case_types, non_constant_identifier_names
+  // ignore_for_file: unused_element, unused_field, return_of_invalid_type
+  // ignore_for_file: void_checks, annotate_overrides
+  // ignore_for_file: no_leading_underscores_for_local_identifiers
+  // ignore_for_file: library_private_types_in_public_api
\ No newline at end of file
diff --git a/pkgs/ffigen/example/swift/example.dart b/pkgs/ffigen/example/swift/example.dart
new file mode 100644
index 0000000..0e6d928
--- /dev/null
+++ b/pkgs/ffigen/example/swift/example.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2022, 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:ffi';
+import 'swift_api_bindings.dart';
+
+void main() {
+  // TODO(#443): Add a test for this.
+  final lib = SwiftLibrary(DynamicLibrary.open('libswiftapi.dylib'));
+  final object = SwiftClass.new1(lib);
+  print(object.sayHello());
+  print('field = ${object.someField}');
+  object.someField = 456;
+  print('field = ${object.someField}');
+}
diff --git a/pkgs/ffigen/example/swift/pubspec.yaml b/pkgs/ffigen/example/swift/pubspec.yaml
new file mode 100644
index 0000000..d00ffa9
--- /dev/null
+++ b/pkgs/ffigen/example/swift/pubspec.yaml
@@ -0,0 +1,15 @@
+# Copyright (c) 2022, 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.
+
+name: swift_example
+
+environment:
+  sdk: '>=2.17.0 <4.0.0'
+
+dependencies:
+  ffi: ^2.0.1
+dev_dependencies:
+  ffigen:
+    path: '../../'
+  lints: ^2.0.0
diff --git a/pkgs/ffigen/example/swift/swift_api.h b/pkgs/ffigen/example/swift/swift_api.h
new file mode 100644
index 0000000..0928c49
--- /dev/null
+++ b/pkgs/ffigen/example/swift/swift_api.h
@@ -0,0 +1,268 @@
+// Generated by Apple Swift version 5.7.2 (swiftlang-5.7.2.135.5 clang-1400.0.29.51)
+#ifndef SWIFT_MODULE_SWIFT_H
+#define SWIFT_MODULE_SWIFT_H
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wgcc-compat"
+
+#if !defined(__has_include)
+# define __has_include(x) 0
+#endif
+#if !defined(__has_attribute)
+# define __has_attribute(x) 0
+#endif
+#if !defined(__has_feature)
+# define __has_feature(x) 0
+#endif
+#if !defined(__has_warning)
+# define __has_warning(x) 0
+#endif
+
+#if __has_include(<swift/objc-prologue.h>)
+# include <swift/objc-prologue.h>
+#endif
+
+#pragma clang diagnostic ignored "-Wduplicate-method-match"
+#pragma clang diagnostic ignored "-Wauto-import"
+#if defined(__OBJC__)
+#include <Foundation/Foundation.h>
+#endif
+#if defined(__cplusplus)
+#include <cstdint>
+#include <cstddef>
+#include <cstdbool>
+#else
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#endif
+
+#if !defined(SWIFT_TYPEDEFS)
+# define SWIFT_TYPEDEFS 1
+# if __has_include(<uchar.h>)
+#  include <uchar.h>
+# elif !defined(__cplusplus)
+typedef uint_least16_t char16_t;
+typedef uint_least32_t char32_t;
+# endif
+typedef float swift_float2  __attribute__((__ext_vector_type__(2)));
+typedef float swift_float3  __attribute__((__ext_vector_type__(3)));
+typedef float swift_float4  __attribute__((__ext_vector_type__(4)));
+typedef double swift_double2  __attribute__((__ext_vector_type__(2)));
+typedef double swift_double3  __attribute__((__ext_vector_type__(3)));
+typedef double swift_double4  __attribute__((__ext_vector_type__(4)));
+typedef int swift_int2  __attribute__((__ext_vector_type__(2)));
+typedef int swift_int3  __attribute__((__ext_vector_type__(3)));
+typedef int swift_int4  __attribute__((__ext_vector_type__(4)));
+typedef unsigned int swift_uint2  __attribute__((__ext_vector_type__(2)));
+typedef unsigned int swift_uint3  __attribute__((__ext_vector_type__(3)));
+typedef unsigned int swift_uint4  __attribute__((__ext_vector_type__(4)));
+#endif
+
+#if !defined(SWIFT_PASTE)
+# define SWIFT_PASTE_HELPER(x, y) x##y
+# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y)
+#endif
+#if !defined(SWIFT_METATYPE)
+# define SWIFT_METATYPE(X) Class
+#endif
+#if !defined(SWIFT_CLASS_PROPERTY)
+# if __has_feature(objc_class_property)
+#  define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__
+# else
+#  define SWIFT_CLASS_PROPERTY(...)
+# endif
+#endif
+
+#if __has_attribute(objc_runtime_name)
+# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X)))
+#else
+# define SWIFT_RUNTIME_NAME(X)
+#endif
+#if __has_attribute(swift_name)
+# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X)))
+#else
+# define SWIFT_COMPILE_NAME(X)
+#endif
+#if __has_attribute(objc_method_family)
+# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X)))
+#else
+# define SWIFT_METHOD_FAMILY(X)
+#endif
+#if __has_attribute(noescape)
+# define SWIFT_NOESCAPE __attribute__((noescape))
+#else
+# define SWIFT_NOESCAPE
+#endif
+#if __has_attribute(ns_consumed)
+# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed))
+#else
+# define SWIFT_RELEASES_ARGUMENT
+#endif
+#if __has_attribute(warn_unused_result)
+# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
+#else
+# define SWIFT_WARN_UNUSED_RESULT
+#endif
+#if __has_attribute(noreturn)
+# define SWIFT_NORETURN __attribute__((noreturn))
+#else
+# define SWIFT_NORETURN
+#endif
+#if !defined(SWIFT_CLASS_EXTRA)
+# define SWIFT_CLASS_EXTRA
+#endif
+#if !defined(SWIFT_PROTOCOL_EXTRA)
+# define SWIFT_PROTOCOL_EXTRA
+#endif
+#if !defined(SWIFT_ENUM_EXTRA)
+# define SWIFT_ENUM_EXTRA
+#endif
+#if !defined(SWIFT_CLASS)
+# if __has_attribute(objc_subclassing_restricted)
+#  define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA
+#  define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
+# else
+#  define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
+#  define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
+# endif
+#endif
+#if !defined(SWIFT_RESILIENT_CLASS)
+# if __has_attribute(objc_class_stub)
+#  define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub))
+#  define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME)
+# else
+#  define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME)
+#  define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME)
+# endif
+#endif
+
+#if !defined(SWIFT_PROTOCOL)
+# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
+# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
+#endif
+
+#if !defined(SWIFT_EXTENSION)
+# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__)
+#endif
+
+#if !defined(OBJC_DESIGNATED_INITIALIZER)
+# if __has_attribute(objc_designated_initializer)
+#  define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
+# else
+#  define OBJC_DESIGNATED_INITIALIZER
+# endif
+#endif
+#if !defined(SWIFT_ENUM_ATTR)
+# if defined(__has_attribute) && __has_attribute(enum_extensibility)
+#  define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility)))
+# else
+#  define SWIFT_ENUM_ATTR(_extensibility)
+# endif
+#endif
+#if !defined(SWIFT_ENUM)
+# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type
+# if __has_feature(generalized_swift_name)
+#  define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type
+# else
+#  define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility)
+# endif
+#endif
+#if !defined(SWIFT_UNAVAILABLE)
+# define SWIFT_UNAVAILABLE __attribute__((unavailable))
+#endif
+#if !defined(SWIFT_UNAVAILABLE_MSG)
+# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg)))
+#endif
+#if !defined(SWIFT_AVAILABILITY)
+# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__)))
+#endif
+#if !defined(SWIFT_WEAK_IMPORT)
+# define SWIFT_WEAK_IMPORT __attribute__((weak_import))
+#endif
+#if !defined(SWIFT_DEPRECATED)
+# define SWIFT_DEPRECATED __attribute__((deprecated))
+#endif
+#if !defined(SWIFT_DEPRECATED_MSG)
+# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__)))
+#endif
+#if __has_feature(attribute_diagnose_if_objc)
+# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning")))
+#else
+# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg)
+#endif
+#if defined(__OBJC__)
+#if !defined(IBSegueAction)
+# define IBSegueAction
+#endif
+#endif
+#if !defined(SWIFT_EXTERN)
+# if defined(__cplusplus)
+#  define SWIFT_EXTERN extern "C"
+# else
+#  define SWIFT_EXTERN extern
+# endif
+#endif
+#if !defined(SWIFT_CALL)
+# define SWIFT_CALL __attribute__((swiftcall))
+#endif
+#if defined(__cplusplus)
+#if !defined(SWIFT_NOEXCEPT)
+# define SWIFT_NOEXCEPT noexcept
+#endif
+#else
+#if !defined(SWIFT_NOEXCEPT)
+# define SWIFT_NOEXCEPT 
+#endif
+#endif
+#if defined(__cplusplus)
+#if !defined(SWIFT_CXX_INT_DEFINED)
+#define SWIFT_CXX_INT_DEFINED
+namespace swift {
+using Int = ptrdiff_t;
+using UInt = size_t;
+}
+#endif
+#endif
+#if defined(__OBJC__)
+#if __has_feature(modules)
+#if __has_warning("-Watimport-in-framework-header")
+#pragma clang diagnostic ignored "-Watimport-in-framework-header"
+#endif
+@import ObjectiveC;
+#endif
+
+#endif
+#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch"
+#pragma clang diagnostic ignored "-Wduplicate-method-arg"
+#if __has_warning("-Wpragma-clang-attribute")
+# pragma clang diagnostic ignored "-Wpragma-clang-attribute"
+#endif
+#pragma clang diagnostic ignored "-Wunknown-pragmas"
+#pragma clang diagnostic ignored "-Wnullability"
+#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension"
+
+#if __has_attribute(external_source_symbol)
+# pragma push_macro("any")
+# undef any
+# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="swift_module",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol))
+# pragma pop_macro("any")
+#endif
+
+#if defined(__OBJC__)
+@class NSString;
+
+SWIFT_CLASS("_TtC12swift_module10SwiftClass")
+@interface SwiftClass : NSObject
+- (NSString * _Nonnull)sayHello SWIFT_WARN_UNUSED_RESULT;
+@property (nonatomic) NSInteger someField;
+- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
+@end
+
+#endif
+#if defined(__cplusplus)
+#endif
+#if __has_attribute(external_source_symbol)
+# pragma clang attribute pop
+#endif
+#pragma clang diagnostic pop
+#endif
diff --git a/pkgs/ffigen/example/swift/swift_api.swift b/pkgs/ffigen/example/swift/swift_api.swift
new file mode 100644
index 0000000..a978226
--- /dev/null
+++ b/pkgs/ffigen/example/swift/swift_api.swift
@@ -0,0 +1,13 @@
+// Copyright (c) 2022, 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 Foundation
+
+@objc public class SwiftClass: NSObject {
+  @objc public func sayHello() -> String {
+    return "Hello from Swift!";
+  }
+
+  @objc public var someField = 123;
+}
diff --git a/pkgs/ffigen/example/swift/swift_api_bindings.dart b/pkgs/ffigen/example/swift/swift_api_bindings.dart
new file mode 100644
index 0000000..383944f
--- /dev/null
+++ b/pkgs/ffigen/example/swift/swift_api_bindings.dart
@@ -0,0 +1,64750 @@
+// ignore_for_file: camel_case_types, non_constant_identifier_names
+// ignore_for_file: unused_element, unused_field, return_of_invalid_type
+// ignore_for_file: void_checks, annotate_overrides
+// ignore_for_file: no_leading_underscores_for_local_identifiers
+// ignore_for_file: library_private_types_in_public_api
+
+// AUTO GENERATED FILE, DO NOT EDIT.
+//
+// Generated by `package:ffigen`.
+// ignore_for_file: type=lint
+import 'dart:ffi' as ffi;
+import 'package:ffi/ffi.dart' as pkg_ffi;
+
+/// Bindings for swift_api.
+class SwiftLibrary {
+  /// Holds the symbol lookup function.
+  final ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
+      _lookup;
+
+  /// The symbols are looked up in [dynamicLibrary].
+  SwiftLibrary(ffi.DynamicLibrary dynamicLibrary)
+      : _lookup = dynamicLibrary.lookup;
+
+  /// The symbols are looked up with [lookup].
+  SwiftLibrary.fromLookup(
+      ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
+          lookup)
+      : _lookup = lookup;
+
+  ffi.Pointer<ObjCSel> _registerName1(String name) {
+    final cstr = name.toNativeUtf8();
+    final sel = _sel_registerName(cstr.cast());
+    pkg_ffi.calloc.free(cstr);
+    return sel;
+  }
+
+  ffi.Pointer<ObjCSel> _sel_registerName(
+    ffi.Pointer<ffi.Char> str,
+  ) {
+    return __sel_registerName(
+      str,
+    );
+  }
+
+  late final __sel_registerNamePtr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCSel> Function(
+              ffi.Pointer<ffi.Char>)>>('sel_registerName');
+  late final __sel_registerName = __sel_registerNamePtr
+      .asFunction<ffi.Pointer<ObjCSel> Function(ffi.Pointer<ffi.Char>)>();
+
+  ffi.Pointer<ObjCObject> _getClass1(String name) {
+    final cstr = name.toNativeUtf8();
+    final clazz = _objc_getClass(cstr.cast());
+    pkg_ffi.calloc.free(cstr);
+    if (clazz == ffi.nullptr) {
+      throw Exception('Failed to load Objective-C class: $name');
+    }
+    return clazz;
+  }
+
+  ffi.Pointer<ObjCObject> _objc_getClass(
+    ffi.Pointer<ffi.Char> str,
+  ) {
+    return __objc_getClass(
+      str,
+    );
+  }
+
+  late final __objc_getClassPtr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ffi.Char>)>>('objc_getClass');
+  late final __objc_getClass = __objc_getClassPtr
+      .asFunction<ffi.Pointer<ObjCObject> Function(ffi.Pointer<ffi.Char>)>();
+
+  ffi.Pointer<ObjCObject> _objc_retain(
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_retain(
+      value,
+    );
+  }
+
+  late final __objc_retainPtr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>)>>('objc_retain');
+  late final __objc_retain = __objc_retainPtr
+      .asFunction<ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>)>();
+
+  void _objc_release(
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_release(
+      value,
+    );
+  }
+
+  late final __objc_releasePtr =
+      _lookup<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ObjCObject>)>>(
+          'objc_release');
+  late final __objc_release =
+      __objc_releasePtr.asFunction<void Function(ffi.Pointer<ObjCObject>)>();
+
+  late final _objc_releaseFinalizer2 =
+      ffi.NativeFinalizer(__objc_releasePtr.cast());
+  late final _class_NSObject1 = _getClass1("NSObject");
+  late final _sel_load1 = _registerName1("load");
+  void _objc_msgSend_1(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_1(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_1Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_1 = __objc_msgSend_1Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_initialize1 = _registerName1("initialize");
+  late final _sel_init1 = _registerName1("init");
+  instancetype _objc_msgSend_2(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_2(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_2Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_2 = __objc_msgSend_2Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_new1 = _registerName1("new");
+  late final _sel_allocWithZone_1 = _registerName1("allocWithZone:");
+  instancetype _objc_msgSend_3(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_NSZone> zone,
+  ) {
+    return __objc_msgSend_3(
+      obj,
+      sel,
+      zone,
+    );
+  }
+
+  late final __objc_msgSend_3Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_NSZone>)>>('objc_msgSend');
+  late final __objc_msgSend_3 = __objc_msgSend_3Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_NSZone>)>();
+
+  late final _sel_alloc1 = _registerName1("alloc");
+  late final _sel_dealloc1 = _registerName1("dealloc");
+  late final _sel_finalize1 = _registerName1("finalize");
+  late final _sel_copy1 = _registerName1("copy");
+  late final _sel_mutableCopy1 = _registerName1("mutableCopy");
+  late final _sel_copyWithZone_1 = _registerName1("copyWithZone:");
+  late final _sel_mutableCopyWithZone_1 =
+      _registerName1("mutableCopyWithZone:");
+  late final _sel_instancesRespondToSelector_1 =
+      _registerName1("instancesRespondToSelector:");
+  bool _objc_msgSend_4(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCSel> aSelector,
+  ) {
+    return __objc_msgSend_4(
+      obj,
+      sel,
+      aSelector,
+    );
+  }
+
+  late final __objc_msgSend_4Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_4 = __objc_msgSend_4Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCSel>)>();
+
+  bool _objc_msgSend_0(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> clazz,
+  ) {
+    return __objc_msgSend_0(
+      obj,
+      sel,
+      clazz,
+    );
+  }
+
+  late final __objc_msgSend_0Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_0 = __objc_msgSend_0Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_isKindOfClass_1 = _registerName1("isKindOfClass:");
+  late final _class_Protocol1 = _getClass1("Protocol");
+  late final _sel_conformsToProtocol_1 = _registerName1("conformsToProtocol:");
+  bool _objc_msgSend_5(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> protocol,
+  ) {
+    return __objc_msgSend_5(
+      obj,
+      sel,
+      protocol,
+    );
+  }
+
+  late final __objc_msgSend_5Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_5 = __objc_msgSend_5Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_methodForSelector_1 = _registerName1("methodForSelector:");
+  IMP _objc_msgSend_6(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCSel> aSelector,
+  ) {
+    return __objc_msgSend_6(
+      obj,
+      sel,
+      aSelector,
+    );
+  }
+
+  late final __objc_msgSend_6Ptr = _lookup<
+      ffi.NativeFunction<
+          IMP Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_6 = __objc_msgSend_6Ptr.asFunction<
+      IMP Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_instanceMethodForSelector_1 =
+      _registerName1("instanceMethodForSelector:");
+  late final _sel_doesNotRecognizeSelector_1 =
+      _registerName1("doesNotRecognizeSelector:");
+  void _objc_msgSend_7(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCSel> aSelector,
+  ) {
+    return __objc_msgSend_7(
+      obj,
+      sel,
+      aSelector,
+    );
+  }
+
+  late final __objc_msgSend_7Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_7 = __objc_msgSend_7Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_forwardingTargetForSelector_1 =
+      _registerName1("forwardingTargetForSelector:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_8(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCSel> aSelector,
+  ) {
+    return __objc_msgSend_8(
+      obj,
+      sel,
+      aSelector,
+    );
+  }
+
+  late final __objc_msgSend_8Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_8 = __objc_msgSend_8Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCSel>)>();
+
+  late final _class_NSInvocation1 = _getClass1("NSInvocation");
+  late final _class_NSMethodSignature1 = _getClass1("NSMethodSignature");
+  late final _sel_signatureWithObjCTypes_1 =
+      _registerName1("signatureWithObjCTypes:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_9(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Char> types,
+  ) {
+    return __objc_msgSend_9(
+      obj,
+      sel,
+      types,
+    );
+  }
+
+  late final __objc_msgSend_9Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ffi.Char>)>>('objc_msgSend');
+  late final __objc_msgSend_9 = __objc_msgSend_9Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ffi.Char>)>();
+
+  late final _sel_numberOfArguments1 = _registerName1("numberOfArguments");
+  int _objc_msgSend_10(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_10(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_10Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_10 = __objc_msgSend_10Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_getArgumentTypeAtIndex_1 =
+      _registerName1("getArgumentTypeAtIndex:");
+  ffi.Pointer<ffi.Char> _objc_msgSend_11(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int idx,
+  ) {
+    return __objc_msgSend_11(
+      obj,
+      sel,
+      idx,
+    );
+  }
+
+  late final __objc_msgSend_11Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ffi.Char> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_11 = __objc_msgSend_11Ptr.asFunction<
+      ffi.Pointer<ffi.Char> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_frameLength1 = _registerName1("frameLength");
+  late final _sel_isOneway1 = _registerName1("isOneway");
+  bool _objc_msgSend_12(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_12(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_12Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_12 = __objc_msgSend_12Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_methodReturnType1 = _registerName1("methodReturnType");
+  ffi.Pointer<ffi.Char> _objc_msgSend_13(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_13(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_13Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ffi.Char> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_13 = __objc_msgSend_13Ptr.asFunction<
+      ffi.Pointer<ffi.Char> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_methodReturnLength1 = _registerName1("methodReturnLength");
+  late final _sel_cancelPreviousPerformRequestsWithTarget_selector_object_1 =
+      _registerName1(
+          "cancelPreviousPerformRequestsWithTarget:selector:object:");
+  void _objc_msgSend_14(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> aTarget,
+    ffi.Pointer<ObjCSel> aSelector,
+    ffi.Pointer<ObjCObject> anArgument,
+  ) {
+    return __objc_msgSend_14(
+      obj,
+      sel,
+      aTarget,
+      aSelector,
+      anArgument,
+    );
+  }
+
+  late final __objc_msgSend_14Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_14 = __objc_msgSend_14Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_cancelPreviousPerformRequestsWithTarget_1 =
+      _registerName1("cancelPreviousPerformRequestsWithTarget:");
+  void _objc_msgSend_15(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> aTarget,
+  ) {
+    return __objc_msgSend_15(
+      obj,
+      sel,
+      aTarget,
+    );
+  }
+
+  late final __objc_msgSend_15Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_15 = __objc_msgSend_15Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_accessInstanceVariablesDirectly1 =
+      _registerName1("accessInstanceVariablesDirectly");
+  late final _sel_useStoredAccessor1 = _registerName1("useStoredAccessor");
+  late final _class_NSSet1 = _getClass1("NSSet");
+  late final _sel_count1 = _registerName1("count");
+  late final _sel_member_1 = _registerName1("member:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_16(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> object,
+  ) {
+    return __objc_msgSend_16(
+      obj,
+      sel,
+      object,
+    );
+  }
+
+  late final __objc_msgSend_16Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_16 = __objc_msgSend_16Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSEnumerator1 = _getClass1("NSEnumerator");
+  late final _sel_nextObject1 = _registerName1("nextObject");
+  late final _class_NSString1 = _getClass1("NSString");
+  late final _sel_length1 = _registerName1("length");
+  late final _sel_characterAtIndex_1 = _registerName1("characterAtIndex:");
+  int _objc_msgSend_17(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int index,
+  ) {
+    return __objc_msgSend_17(
+      obj,
+      sel,
+      index,
+    );
+  }
+
+  late final __objc_msgSend_17Ptr = _lookup<
+      ffi.NativeFunction<
+          unichar Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_17 = __objc_msgSend_17Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _class_NSCoder1 = _getClass1("NSCoder");
+  late final _sel_encodeValueOfObjCType_at_1 =
+      _registerName1("encodeValueOfObjCType:at:");
+  void _objc_msgSend_18(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Char> type,
+    ffi.Pointer<ffi.Void> addr,
+  ) {
+    return __objc_msgSend_18(
+      obj,
+      sel,
+      type,
+      addr,
+    );
+  }
+
+  late final __objc_msgSend_18Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Char>, ffi.Pointer<ffi.Void>)>>('objc_msgSend');
+  late final __objc_msgSend_18 = __objc_msgSend_18Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Char>, ffi.Pointer<ffi.Void>)>();
+
+  late final _class_NSData1 = _getClass1("NSData");
+  late final _sel_bytes1 = _registerName1("bytes");
+  ffi.Pointer<ffi.Void> _objc_msgSend_19(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_19(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_19Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ffi.Void> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_19 = __objc_msgSend_19Ptr.asFunction<
+      ffi.Pointer<ffi.Void> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_description1 = _registerName1("description");
+  ffi.Pointer<ObjCObject> _objc_msgSend_20(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_20(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_20Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_20 = __objc_msgSend_20Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_getBytes_length_1 = _registerName1("getBytes:length:");
+  void _objc_msgSend_21(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Void> buffer,
+    int length,
+  ) {
+    return __objc_msgSend_21(
+      obj,
+      sel,
+      buffer,
+      length,
+    );
+  }
+
+  late final __objc_msgSend_21Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Void>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_21 = __objc_msgSend_21Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Void>, int)>();
+
+  late final _sel_getBytes_range_1 = _registerName1("getBytes:range:");
+  void _objc_msgSend_22(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Void> buffer,
+    NSRange range,
+  ) {
+    return __objc_msgSend_22(
+      obj,
+      sel,
+      buffer,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_22Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Void>, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_22 = __objc_msgSend_22Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Void>, NSRange)>();
+
+  late final _sel_isEqualToData_1 = _registerName1("isEqualToData:");
+  bool _objc_msgSend_23(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> other,
+  ) {
+    return __objc_msgSend_23(
+      obj,
+      sel,
+      other,
+    );
+  }
+
+  late final __objc_msgSend_23Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_23 = __objc_msgSend_23Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_subdataWithRange_1 = _registerName1("subdataWithRange:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_24(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+  ) {
+    return __objc_msgSend_24(
+      obj,
+      sel,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_24Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_24 = __objc_msgSend_24Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange)>();
+
+  late final _sel_writeToFile_atomically_1 =
+      _registerName1("writeToFile:atomically:");
+  bool _objc_msgSend_25(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    bool useAuxiliaryFile,
+  ) {
+    return __objc_msgSend_25(
+      obj,
+      sel,
+      path,
+      useAuxiliaryFile,
+    );
+  }
+
+  late final __objc_msgSend_25Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_25 = __objc_msgSend_25Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, bool)>();
+
+  late final _class_NSURL1 = _getClass1("NSURL");
+  late final _sel_initWithScheme_host_path_1 =
+      _registerName1("initWithScheme:host:path:");
+  instancetype _objc_msgSend_26(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> scheme,
+    ffi.Pointer<ObjCObject> host,
+    ffi.Pointer<ObjCObject> path,
+  ) {
+    return __objc_msgSend_26(
+      obj,
+      sel,
+      scheme,
+      host,
+      path,
+    );
+  }
+
+  late final __objc_msgSend_26Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_26 = __objc_msgSend_26Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initFileURLWithPath_isDirectory_relativeToURL_1 =
+      _registerName1("initFileURLWithPath:isDirectory:relativeToURL:");
+  instancetype _objc_msgSend_27(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    bool isDir,
+    ffi.Pointer<ObjCObject> baseURL,
+  ) {
+    return __objc_msgSend_27(
+      obj,
+      sel,
+      path,
+      isDir,
+      baseURL,
+    );
+  }
+
+  late final __objc_msgSend_27Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_27 = __objc_msgSend_27Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, bool, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initFileURLWithPath_relativeToURL_1 =
+      _registerName1("initFileURLWithPath:relativeToURL:");
+  instancetype _objc_msgSend_28(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    ffi.Pointer<ObjCObject> baseURL,
+  ) {
+    return __objc_msgSend_28(
+      obj,
+      sel,
+      path,
+      baseURL,
+    );
+  }
+
+  late final __objc_msgSend_28Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_28 = __objc_msgSend_28Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initFileURLWithPath_isDirectory_1 =
+      _registerName1("initFileURLWithPath:isDirectory:");
+  instancetype _objc_msgSend_29(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    bool isDir,
+  ) {
+    return __objc_msgSend_29(
+      obj,
+      sel,
+      path,
+      isDir,
+    );
+  }
+
+  late final __objc_msgSend_29Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_29 = __objc_msgSend_29Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, bool)>();
+
+  late final _sel_initFileURLWithPath_1 =
+      _registerName1("initFileURLWithPath:");
+  instancetype _objc_msgSend_30(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+  ) {
+    return __objc_msgSend_30(
+      obj,
+      sel,
+      path,
+    );
+  }
+
+  late final __objc_msgSend_30Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_30 = __objc_msgSend_30Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_fileURLWithPath_isDirectory_relativeToURL_1 =
+      _registerName1("fileURLWithPath:isDirectory:relativeToURL:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_31(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    bool isDir,
+    ffi.Pointer<ObjCObject> baseURL,
+  ) {
+    return __objc_msgSend_31(
+      obj,
+      sel,
+      path,
+      isDir,
+      baseURL,
+    );
+  }
+
+  late final __objc_msgSend_31Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_31 = __objc_msgSend_31Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          bool,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_fileURLWithPath_relativeToURL_1 =
+      _registerName1("fileURLWithPath:relativeToURL:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_32(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    ffi.Pointer<ObjCObject> baseURL,
+  ) {
+    return __objc_msgSend_32(
+      obj,
+      sel,
+      path,
+      baseURL,
+    );
+  }
+
+  late final __objc_msgSend_32Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_32 = __objc_msgSend_32Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_fileURLWithPath_isDirectory_1 =
+      _registerName1("fileURLWithPath:isDirectory:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_33(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    bool isDir,
+  ) {
+    return __objc_msgSend_33(
+      obj,
+      sel,
+      path,
+      isDir,
+    );
+  }
+
+  late final __objc_msgSend_33Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_33 = __objc_msgSend_33Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>, bool)>();
+
+  late final _sel_fileURLWithPath_1 = _registerName1("fileURLWithPath:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_34(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+  ) {
+    return __objc_msgSend_34(
+      obj,
+      sel,
+      path,
+    );
+  }
+
+  late final __objc_msgSend_34Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_34 = __objc_msgSend_34Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initFileURLWithFileSystemRepresentation_isDirectory_relativeToURL_1 =
+      _registerName1(
+          "initFileURLWithFileSystemRepresentation:isDirectory:relativeToURL:");
+  instancetype _objc_msgSend_35(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Char> path,
+    bool isDir,
+    ffi.Pointer<ObjCObject> baseURL,
+  ) {
+    return __objc_msgSend_35(
+      obj,
+      sel,
+      path,
+      isDir,
+      baseURL,
+    );
+  }
+
+  late final __objc_msgSend_35Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Char>,
+              ffi.Bool,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_35 = __objc_msgSend_35Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Char>, bool, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_fileURLWithFileSystemRepresentation_isDirectory_relativeToURL_1 =
+      _registerName1(
+          "fileURLWithFileSystemRepresentation:isDirectory:relativeToURL:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_36(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Char> path,
+    bool isDir,
+    ffi.Pointer<ObjCObject> baseURL,
+  ) {
+    return __objc_msgSend_36(
+      obj,
+      sel,
+      path,
+      isDir,
+      baseURL,
+    );
+  }
+
+  late final __objc_msgSend_36Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Char>,
+              ffi.Bool,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_36 = __objc_msgSend_36Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Char>,
+          bool,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithString_1 = _registerName1("initWithString:");
+  late final _sel_initWithString_relativeToURL_1 =
+      _registerName1("initWithString:relativeToURL:");
+  late final _sel_URLWithString_1 = _registerName1("URLWithString:");
+  late final _sel_URLWithString_relativeToURL_1 =
+      _registerName1("URLWithString:relativeToURL:");
+  late final _sel_initWithDataRepresentation_relativeToURL_1 =
+      _registerName1("initWithDataRepresentation:relativeToURL:");
+  instancetype _objc_msgSend_37(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> data,
+    ffi.Pointer<ObjCObject> baseURL,
+  ) {
+    return __objc_msgSend_37(
+      obj,
+      sel,
+      data,
+      baseURL,
+    );
+  }
+
+  late final __objc_msgSend_37Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_37 = __objc_msgSend_37Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_URLWithDataRepresentation_relativeToURL_1 =
+      _registerName1("URLWithDataRepresentation:relativeToURL:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_38(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> data,
+    ffi.Pointer<ObjCObject> baseURL,
+  ) {
+    return __objc_msgSend_38(
+      obj,
+      sel,
+      data,
+      baseURL,
+    );
+  }
+
+  late final __objc_msgSend_38Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_38 = __objc_msgSend_38Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initAbsoluteURLWithDataRepresentation_relativeToURL_1 =
+      _registerName1("initAbsoluteURLWithDataRepresentation:relativeToURL:");
+  late final _sel_absoluteURLWithDataRepresentation_relativeToURL_1 =
+      _registerName1("absoluteURLWithDataRepresentation:relativeToURL:");
+  late final _sel_dataRepresentation1 = _registerName1("dataRepresentation");
+  ffi.Pointer<ObjCObject> _objc_msgSend_39(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_39(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_39Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_39 = __objc_msgSend_39Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_absoluteString1 = _registerName1("absoluteString");
+  late final _sel_relativeString1 = _registerName1("relativeString");
+  late final _sel_baseURL1 = _registerName1("baseURL");
+  ffi.Pointer<ObjCObject> _objc_msgSend_40(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_40(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_40Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_40 = __objc_msgSend_40Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_absoluteURL1 = _registerName1("absoluteURL");
+  late final _sel_scheme1 = _registerName1("scheme");
+  late final _sel_resourceSpecifier1 = _registerName1("resourceSpecifier");
+  late final _sel_host1 = _registerName1("host");
+  late final _class_NSNumber1 = _getClass1("NSNumber");
+  late final _class_NSValue1 = _getClass1("NSValue");
+  late final _sel_getValue_size_1 = _registerName1("getValue:size:");
+  late final _sel_objCType1 = _registerName1("objCType");
+  late final _sel_initWithBytes_objCType_1 =
+      _registerName1("initWithBytes:objCType:");
+  instancetype _objc_msgSend_41(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Void> value,
+    ffi.Pointer<ffi.Char> type,
+  ) {
+    return __objc_msgSend_41(
+      obj,
+      sel,
+      value,
+      type,
+    );
+  }
+
+  late final __objc_msgSend_41Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Char>)>>('objc_msgSend');
+  late final __objc_msgSend_41 = __objc_msgSend_41Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Char>)>();
+
+  late final _sel_initWithCoder_1 = _registerName1("initWithCoder:");
+  instancetype _objc_msgSend_42(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> coder,
+  ) {
+    return __objc_msgSend_42(
+      obj,
+      sel,
+      coder,
+    );
+  }
+
+  late final __objc_msgSend_42Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_42 = __objc_msgSend_42Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_valueWithBytes_objCType_1 =
+      _registerName1("valueWithBytes:objCType:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_43(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Void> value,
+    ffi.Pointer<ffi.Char> type,
+  ) {
+    return __objc_msgSend_43(
+      obj,
+      sel,
+      value,
+      type,
+    );
+  }
+
+  late final __objc_msgSend_43Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Void>,
+              ffi.Pointer<ffi.Char>)>>('objc_msgSend');
+  late final __objc_msgSend_43 = __objc_msgSend_43Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Void>,
+          ffi.Pointer<ffi.Char>)>();
+
+  late final _sel_value_withObjCType_1 = _registerName1("value:withObjCType:");
+  late final _sel_valueWithNonretainedObject_1 =
+      _registerName1("valueWithNonretainedObject:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_44(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> anObject,
+  ) {
+    return __objc_msgSend_44(
+      obj,
+      sel,
+      anObject,
+    );
+  }
+
+  late final __objc_msgSend_44Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_44 = __objc_msgSend_44Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_nonretainedObjectValue1 =
+      _registerName1("nonretainedObjectValue");
+  late final _sel_valueWithPointer_1 = _registerName1("valueWithPointer:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_45(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Void> pointer,
+  ) {
+    return __objc_msgSend_45(
+      obj,
+      sel,
+      pointer,
+    );
+  }
+
+  late final __objc_msgSend_45Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ffi.Void>)>>('objc_msgSend');
+  late final __objc_msgSend_45 = __objc_msgSend_45Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ffi.Void>)>();
+
+  late final _sel_pointerValue1 = _registerName1("pointerValue");
+  late final _sel_isEqualToValue_1 = _registerName1("isEqualToValue:");
+  bool _objc_msgSend_46(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_46(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_46Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_46 = __objc_msgSend_46Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_getValue_1 = _registerName1("getValue:");
+  void _objc_msgSend_47(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Void> value,
+  ) {
+    return __objc_msgSend_47(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_47Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Void>)>>('objc_msgSend');
+  late final __objc_msgSend_47 = __objc_msgSend_47Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Void>)>();
+
+  late final _sel_valueWithRange_1 = _registerName1("valueWithRange:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_48(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+  ) {
+    return __objc_msgSend_48(
+      obj,
+      sel,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_48Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_48 = __objc_msgSend_48Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange)>();
+
+  late final _sel_rangeValue1 = _registerName1("rangeValue");
+  NSRange _objc_msgSend_49(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_49(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_49Ptr = _lookup<
+      ffi.NativeFunction<
+          NSRange Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_49 = __objc_msgSend_49Ptr.asFunction<
+      NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_valueWithPoint_1 = _registerName1("valueWithPoint:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_50(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSPoint point,
+  ) {
+    return __objc_msgSend_50(
+      obj,
+      sel,
+      point,
+    );
+  }
+
+  late final __objc_msgSend_50Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSPoint)>>('objc_msgSend');
+  late final __objc_msgSend_50 = __objc_msgSend_50Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSPoint)>();
+
+  late final _sel_valueWithSize_1 = _registerName1("valueWithSize:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_51(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSSize size,
+  ) {
+    return __objc_msgSend_51(
+      obj,
+      sel,
+      size,
+    );
+  }
+
+  late final __objc_msgSend_51Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSSize)>>('objc_msgSend');
+  late final __objc_msgSend_51 = __objc_msgSend_51Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSSize)>();
+
+  late final _sel_valueWithRect_1 = _registerName1("valueWithRect:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_52(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRect rect,
+  ) {
+    return __objc_msgSend_52(
+      obj,
+      sel,
+      rect,
+    );
+  }
+
+  late final __objc_msgSend_52Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSRect)>>('objc_msgSend');
+  late final __objc_msgSend_52 = __objc_msgSend_52Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRect)>();
+
+  late final _sel_valueWithEdgeInsets_1 =
+      _registerName1("valueWithEdgeInsets:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_53(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSEdgeInsets insets,
+  ) {
+    return __objc_msgSend_53(
+      obj,
+      sel,
+      insets,
+    );
+  }
+
+  late final __objc_msgSend_53Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSEdgeInsets)>>('objc_msgSend');
+  late final __objc_msgSend_53 = __objc_msgSend_53Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSEdgeInsets)>();
+
+  late final _sel_pointValue1 = _registerName1("pointValue");
+  NSPoint _objc_msgSend_54(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_54(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_54Ptr = _lookup<
+      ffi.NativeFunction<
+          NSPoint Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_54 = __objc_msgSend_54Ptr.asFunction<
+      NSPoint Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_sizeValue1 = _registerName1("sizeValue");
+  NSSize _objc_msgSend_55(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_55(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_55Ptr = _lookup<
+      ffi.NativeFunction<
+          NSSize Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_55 = __objc_msgSend_55Ptr.asFunction<
+      NSSize Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_rectValue1 = _registerName1("rectValue");
+  NSRect _objc_msgSend_56(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_56(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_56Ptr = _lookup<
+      ffi.NativeFunction<
+          NSRect Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_56 = __objc_msgSend_56Ptr.asFunction<
+      NSRect Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_edgeInsetsValue1 = _registerName1("edgeInsetsValue");
+  NSEdgeInsets _objc_msgSend_57(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_57(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_57Ptr = _lookup<
+      ffi.NativeFunction<
+          NSEdgeInsets Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_57 = __objc_msgSend_57Ptr.asFunction<
+      NSEdgeInsets Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_keyPathsForValuesAffectingValueForKey_1 =
+      _registerName1("keyPathsForValuesAffectingValueForKey:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_58(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_58(
+      obj,
+      sel,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_58Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_58 = __objc_msgSend_58Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_automaticallyNotifiesObserversForKey_1 =
+      _registerName1("automaticallyNotifiesObserversForKey:");
+  bool _objc_msgSend_59(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_59(
+      obj,
+      sel,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_59Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_59 = __objc_msgSend_59Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSArray1 = _getClass1("NSArray");
+  late final _sel_objectAtIndex_1 = _registerName1("objectAtIndex:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_60(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int index,
+  ) {
+    return __objc_msgSend_60(
+      obj,
+      sel,
+      index,
+    );
+  }
+
+  late final __objc_msgSend_60Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_60 = __objc_msgSend_60Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_initWithObjects_count_1 =
+      _registerName1("initWithObjects:count:");
+  instancetype _objc_msgSend_61(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> objects,
+    int cnt,
+  ) {
+    return __objc_msgSend_61(
+      obj,
+      sel,
+      objects,
+      cnt,
+    );
+  }
+
+  late final __objc_msgSend_61Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_61 = __objc_msgSend_61Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>, int)>();
+
+  late final _sel_arrayByAddingObject_1 =
+      _registerName1("arrayByAddingObject:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_62(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> anObject,
+  ) {
+    return __objc_msgSend_62(
+      obj,
+      sel,
+      anObject,
+    );
+  }
+
+  late final __objc_msgSend_62Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_62 = __objc_msgSend_62Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_arrayByAddingObjectsFromArray_1 =
+      _registerName1("arrayByAddingObjectsFromArray:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_63(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> otherArray,
+  ) {
+    return __objc_msgSend_63(
+      obj,
+      sel,
+      otherArray,
+    );
+  }
+
+  late final __objc_msgSend_63Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_63 = __objc_msgSend_63Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_componentsJoinedByString_1 =
+      _registerName1("componentsJoinedByString:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_64(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> separator,
+  ) {
+    return __objc_msgSend_64(
+      obj,
+      sel,
+      separator,
+    );
+  }
+
+  late final __objc_msgSend_64Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_64 = __objc_msgSend_64Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_containsObject_1 = _registerName1("containsObject:");
+  late final _sel_descriptionWithLocale_1 =
+      _registerName1("descriptionWithLocale:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_65(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> locale,
+  ) {
+    return __objc_msgSend_65(
+      obj,
+      sel,
+      locale,
+    );
+  }
+
+  late final __objc_msgSend_65Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_65 = __objc_msgSend_65Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_descriptionWithLocale_indent_1 =
+      _registerName1("descriptionWithLocale:indent:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_66(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> locale,
+    int level,
+  ) {
+    return __objc_msgSend_66(
+      obj,
+      sel,
+      locale,
+      level,
+    );
+  }
+
+  late final __objc_msgSend_66Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_66 = __objc_msgSend_66Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_firstObjectCommonWithArray_1 =
+      _registerName1("firstObjectCommonWithArray:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_67(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> otherArray,
+  ) {
+    return __objc_msgSend_67(
+      obj,
+      sel,
+      otherArray,
+    );
+  }
+
+  late final __objc_msgSend_67Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_67 = __objc_msgSend_67Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_getObjects_range_1 = _registerName1("getObjects:range:");
+  void _objc_msgSend_68(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> objects,
+    NSRange range,
+  ) {
+    return __objc_msgSend_68(
+      obj,
+      sel,
+      objects,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_68Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_68 = __objc_msgSend_68Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>, NSRange)>();
+
+  late final _sel_indexOfObject_1 = _registerName1("indexOfObject:");
+  int _objc_msgSend_69(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> anObject,
+  ) {
+    return __objc_msgSend_69(
+      obj,
+      sel,
+      anObject,
+    );
+  }
+
+  late final __objc_msgSend_69Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_69 = __objc_msgSend_69Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_indexOfObject_inRange_1 =
+      _registerName1("indexOfObject:inRange:");
+  int _objc_msgSend_70(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> anObject,
+    NSRange range,
+  ) {
+    return __objc_msgSend_70(
+      obj,
+      sel,
+      anObject,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_70Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_70 = __objc_msgSend_70Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, NSRange)>();
+
+  late final _sel_indexOfObjectIdenticalTo_1 =
+      _registerName1("indexOfObjectIdenticalTo:");
+  late final _sel_indexOfObjectIdenticalTo_inRange_1 =
+      _registerName1("indexOfObjectIdenticalTo:inRange:");
+  late final _sel_isEqualToArray_1 = _registerName1("isEqualToArray:");
+  bool _objc_msgSend_71(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> otherArray,
+  ) {
+    return __objc_msgSend_71(
+      obj,
+      sel,
+      otherArray,
+    );
+  }
+
+  late final __objc_msgSend_71Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_71 = __objc_msgSend_71Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_firstObject1 = _registerName1("firstObject");
+  late final _sel_lastObject1 = _registerName1("lastObject");
+  late final _sel_objectEnumerator1 = _registerName1("objectEnumerator");
+  ffi.Pointer<ObjCObject> _objc_msgSend_72(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_72(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_72Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_72 = __objc_msgSend_72Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_reverseObjectEnumerator1 =
+      _registerName1("reverseObjectEnumerator");
+  late final _sel_sortedArrayHint1 = _registerName1("sortedArrayHint");
+  late final _sel_sortedArrayUsingFunction_context_1 =
+      _registerName1("sortedArrayUsingFunction:context:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_73(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<
+            ffi.NativeFunction<
+                NSInteger Function(ffi.Pointer<ObjCObject>,
+                    ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Void>)>>
+        comparator,
+    ffi.Pointer<ffi.Void> context,
+  ) {
+    return __objc_msgSend_73(
+      obj,
+      sel,
+      comparator,
+      context,
+    );
+  }
+
+  late final __objc_msgSend_73Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<
+                  ffi.NativeFunction<
+                      NSInteger Function(ffi.Pointer<ObjCObject>,
+                          ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Void>)>>,
+              ffi.Pointer<ffi.Void>)>>('objc_msgSend');
+  late final __objc_msgSend_73 = __objc_msgSend_73Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<
+              ffi.NativeFunction<
+                  NSInteger Function(ffi.Pointer<ObjCObject>,
+                      ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Void>)>>,
+          ffi.Pointer<ffi.Void>)>();
+
+  late final _sel_sortedArrayUsingFunction_context_hint_1 =
+      _registerName1("sortedArrayUsingFunction:context:hint:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_74(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<
+            ffi.NativeFunction<
+                NSInteger Function(ffi.Pointer<ObjCObject>,
+                    ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Void>)>>
+        comparator,
+    ffi.Pointer<ffi.Void> context,
+    ffi.Pointer<ObjCObject> hint,
+  ) {
+    return __objc_msgSend_74(
+      obj,
+      sel,
+      comparator,
+      context,
+      hint,
+    );
+  }
+
+  late final __objc_msgSend_74Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<
+                  ffi.NativeFunction<
+                      NSInteger Function(ffi.Pointer<ObjCObject>,
+                          ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Void>)>>,
+              ffi.Pointer<ffi.Void>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_74 = __objc_msgSend_74Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<
+              ffi.NativeFunction<
+                  NSInteger Function(ffi.Pointer<ObjCObject>,
+                      ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Void>)>>,
+          ffi.Pointer<ffi.Void>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_sortedArrayUsingSelector_1 =
+      _registerName1("sortedArrayUsingSelector:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_75(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCSel> comparator,
+  ) {
+    return __objc_msgSend_75(
+      obj,
+      sel,
+      comparator,
+    );
+  }
+
+  late final __objc_msgSend_75Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_75 = __objc_msgSend_75Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_subarrayWithRange_1 = _registerName1("subarrayWithRange:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_76(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+  ) {
+    return __objc_msgSend_76(
+      obj,
+      sel,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_76Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_76 = __objc_msgSend_76Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange)>();
+
+  late final _class_NSError1 = _getClass1("NSError");
+  late final _sel_initWithDomain_code_userInfo_1 =
+      _registerName1("initWithDomain:code:userInfo:");
+  instancetype _objc_msgSend_77(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSErrorDomain domain,
+    int code,
+  ) {
+    return __objc_msgSend_77(
+      obj,
+      sel,
+      domain,
+      code,
+    );
+  }
+
+  late final __objc_msgSend_77Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSErrorDomain, NSInteger)>>('objc_msgSend');
+  late final __objc_msgSend_77 = __objc_msgSend_77Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSErrorDomain, int)>();
+
+  late final _sel_errorWithDomain_code_userInfo_1 =
+      _registerName1("errorWithDomain:code:userInfo:");
+  late final _sel_domain1 = _registerName1("domain");
+  late final _sel_code1 = _registerName1("code");
+  int _objc_msgSend_78(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_78(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_78Ptr = _lookup<
+      ffi.NativeFunction<
+          NSInteger Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_78 = __objc_msgSend_78Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setKeys_triggerChangeNotificationsForDependentKey_1 =
+      _registerName1("setKeys:triggerChangeNotificationsForDependentKey:");
+  void _objc_msgSend_79(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> keys,
+    ffi.Pointer<ObjCObject> dependentKey,
+  ) {
+    return __objc_msgSend_79(
+      obj,
+      sel,
+      keys,
+      dependentKey,
+    );
+  }
+
+  late final __objc_msgSend_79Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_79 = __objc_msgSend_79Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_classFallbacksForKeyedArchiver1 =
+      _registerName1("classFallbacksForKeyedArchiver");
+  ffi.Pointer<ObjCObject> _objc_msgSend_80(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_80(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_80Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_80 = __objc_msgSend_80Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_classForKeyedUnarchiver1 =
+      _registerName1("classForKeyedUnarchiver");
+  late final _sel_writeToURL_error_1 = _registerName1("writeToURL:error:");
+  bool _objc_msgSend_81(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_81(
+      obj,
+      sel,
+      url,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_81Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_81 = __objc_msgSend_81Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_makeObjectsPerformSelector_1 =
+      _registerName1("makeObjectsPerformSelector:");
+  late final _sel_makeObjectsPerformSelector_withObject_1 =
+      _registerName1("makeObjectsPerformSelector:withObject:");
+  void _objc_msgSend_82(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCSel> aSelector,
+    ffi.Pointer<ObjCObject> argument,
+  ) {
+    return __objc_msgSend_82(
+      obj,
+      sel,
+      aSelector,
+      argument,
+    );
+  }
+
+  late final __objc_msgSend_82Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_82 = __objc_msgSend_82Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSIndexSet1 = _getClass1("NSIndexSet");
+  late final _sel_indexSet1 = _registerName1("indexSet");
+  late final _sel_indexSetWithIndex_1 = _registerName1("indexSetWithIndex:");
+  late final _sel_indexSetWithIndexesInRange_1 =
+      _registerName1("indexSetWithIndexesInRange:");
+  instancetype _objc_msgSend_83(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+  ) {
+    return __objc_msgSend_83(
+      obj,
+      sel,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_83Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_83 = __objc_msgSend_83Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange)>();
+
+  late final _sel_initWithIndexesInRange_1 =
+      _registerName1("initWithIndexesInRange:");
+  late final _sel_initWithIndexSet_1 = _registerName1("initWithIndexSet:");
+  instancetype _objc_msgSend_84(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> indexSet,
+  ) {
+    return __objc_msgSend_84(
+      obj,
+      sel,
+      indexSet,
+    );
+  }
+
+  late final __objc_msgSend_84Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_84 = __objc_msgSend_84Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithIndex_1 = _registerName1("initWithIndex:");
+  late final _sel_isEqualToIndexSet_1 = _registerName1("isEqualToIndexSet:");
+  bool _objc_msgSend_85(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> indexSet,
+  ) {
+    return __objc_msgSend_85(
+      obj,
+      sel,
+      indexSet,
+    );
+  }
+
+  late final __objc_msgSend_85Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_85 = __objc_msgSend_85Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_firstIndex1 = _registerName1("firstIndex");
+  late final _sel_lastIndex1 = _registerName1("lastIndex");
+  late final _sel_indexGreaterThanIndex_1 =
+      _registerName1("indexGreaterThanIndex:");
+  int _objc_msgSend_86(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_86(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_86Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_86 = __objc_msgSend_86Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_indexLessThanIndex_1 = _registerName1("indexLessThanIndex:");
+  late final _sel_indexGreaterThanOrEqualToIndex_1 =
+      _registerName1("indexGreaterThanOrEqualToIndex:");
+  late final _sel_indexLessThanOrEqualToIndex_1 =
+      _registerName1("indexLessThanOrEqualToIndex:");
+  late final _sel_getIndexes_maxCount_inIndexRange_1 =
+      _registerName1("getIndexes:maxCount:inIndexRange:");
+  int _objc_msgSend_87(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<NSUInteger> indexBuffer,
+    int bufferSize,
+    NSRangePointer range,
+  ) {
+    return __objc_msgSend_87(
+      obj,
+      sel,
+      indexBuffer,
+      bufferSize,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_87Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<NSUInteger>,
+              NSUInteger,
+              NSRangePointer)>>('objc_msgSend');
+  late final __objc_msgSend_87 = __objc_msgSend_87Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<NSUInteger>, int, NSRangePointer)>();
+
+  late final _sel_countOfIndexesInRange_1 =
+      _registerName1("countOfIndexesInRange:");
+  int _objc_msgSend_88(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+  ) {
+    return __objc_msgSend_88(
+      obj,
+      sel,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_88Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_88 = __objc_msgSend_88Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange)>();
+
+  late final _sel_containsIndex_1 = _registerName1("containsIndex:");
+  bool _objc_msgSend_89(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_89(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_89Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_89 = __objc_msgSend_89Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_containsIndexesInRange_1 =
+      _registerName1("containsIndexesInRange:");
+  bool _objc_msgSend_90(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+  ) {
+    return __objc_msgSend_90(
+      obj,
+      sel,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_90Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_90 = __objc_msgSend_90Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange)>();
+
+  late final _sel_containsIndexes_1 = _registerName1("containsIndexes:");
+  late final _sel_intersectsIndexesInRange_1 =
+      _registerName1("intersectsIndexesInRange:");
+  ffi.Pointer<_ObjCBlockDesc> _newBlockDesc1() {
+    final d =
+        pkg_ffi.calloc.allocate<_ObjCBlockDesc>(ffi.sizeOf<_ObjCBlockDesc>());
+    d.ref.size = ffi.sizeOf<_ObjCBlock>();
+    return d;
+  }
+
+  late final _objc_block_desc1 = _newBlockDesc1();
+  late final _objc_concrete_global_block1 =
+      _lookup<ffi.Void>('_NSConcreteGlobalBlock');
+  ffi.Pointer<_ObjCBlock> _newBlock1(
+      ffi.Pointer<ffi.Void> invoke, ffi.Pointer<ffi.Void> target) {
+    final b = pkg_ffi.calloc.allocate<_ObjCBlock>(ffi.sizeOf<_ObjCBlock>());
+    b.ref.isa = _objc_concrete_global_block1;
+    b.ref.invoke = invoke;
+    b.ref.target = target;
+    b.ref.descriptor = _objc_block_desc1;
+    final copy = _Block_copy(b.cast()).cast<_ObjCBlock>();
+    pkg_ffi.calloc.free(b);
+    return copy;
+  }
+
+  ffi.Pointer<ffi.Void> _Block_copy(
+    ffi.Pointer<ffi.Void> value,
+  ) {
+    return __Block_copy(
+      value,
+    );
+  }
+
+  late final __Block_copyPtr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ffi.Void> Function(
+              ffi.Pointer<ffi.Void>)>>('_Block_copy');
+  late final __Block_copy = __Block_copyPtr
+      .asFunction<ffi.Pointer<ffi.Void> Function(ffi.Pointer<ffi.Void>)>();
+
+  void _Block_release(
+    ffi.Pointer<ffi.Void> value,
+  ) {
+    return __Block_release(
+      value,
+    );
+  }
+
+  late final __Block_releasePtr =
+      _lookup<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>(
+          '_Block_release');
+  late final __Block_release =
+      __Block_releasePtr.asFunction<void Function(ffi.Pointer<ffi.Void>)>();
+
+  late final _objc_releaseFinalizer11 =
+      ffi.NativeFinalizer(__Block_releasePtr.cast());
+  late final _sel_enumerateIndexesUsingBlock_1 =
+      _registerName1("enumerateIndexesUsingBlock:");
+  void _objc_msgSend_91(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_91(
+      obj,
+      sel,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_91Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_91 = __objc_msgSend_91Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_enumerateIndexesWithOptions_usingBlock_1 =
+      _registerName1("enumerateIndexesWithOptions:usingBlock:");
+  void _objc_msgSend_92(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int opts,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_92(
+      obj,
+      sel,
+      opts,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_92Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_92 = __objc_msgSend_92Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_enumerateIndexesInRange_options_usingBlock_1 =
+      _registerName1("enumerateIndexesInRange:options:usingBlock:");
+  void _objc_msgSend_93(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    int opts,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_93(
+      obj,
+      sel,
+      range,
+      opts,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_93Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRange, ffi.Int32, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_93 = __objc_msgSend_93Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange, int,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_indexPassingTest_1 = _registerName1("indexPassingTest:");
+  int _objc_msgSend_94(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> predicate,
+  ) {
+    return __objc_msgSend_94(
+      obj,
+      sel,
+      predicate,
+    );
+  }
+
+  late final __objc_msgSend_94Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_94 = __objc_msgSend_94Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_indexWithOptions_passingTest_1 =
+      _registerName1("indexWithOptions:passingTest:");
+  int _objc_msgSend_95(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int opts,
+    ffi.Pointer<_ObjCBlock> predicate,
+  ) {
+    return __objc_msgSend_95(
+      obj,
+      sel,
+      opts,
+      predicate,
+    );
+  }
+
+  late final __objc_msgSend_95Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_95 = __objc_msgSend_95Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_indexInRange_options_passingTest_1 =
+      _registerName1("indexInRange:options:passingTest:");
+  int _objc_msgSend_96(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    int opts,
+    ffi.Pointer<_ObjCBlock> predicate,
+  ) {
+    return __objc_msgSend_96(
+      obj,
+      sel,
+      range,
+      opts,
+      predicate,
+    );
+  }
+
+  late final __objc_msgSend_96Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRange, ffi.Int32, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_96 = __objc_msgSend_96Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange, int,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_indexesPassingTest_1 = _registerName1("indexesPassingTest:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_97(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> predicate,
+  ) {
+    return __objc_msgSend_97(
+      obj,
+      sel,
+      predicate,
+    );
+  }
+
+  late final __objc_msgSend_97Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_97 = __objc_msgSend_97Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_indexesWithOptions_passingTest_1 =
+      _registerName1("indexesWithOptions:passingTest:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_98(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int opts,
+    ffi.Pointer<_ObjCBlock> predicate,
+  ) {
+    return __objc_msgSend_98(
+      obj,
+      sel,
+      opts,
+      predicate,
+    );
+  }
+
+  late final __objc_msgSend_98Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_98 = __objc_msgSend_98Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_indexesInRange_options_passingTest_1 =
+      _registerName1("indexesInRange:options:passingTest:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_99(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    int opts,
+    ffi.Pointer<_ObjCBlock> predicate,
+  ) {
+    return __objc_msgSend_99(
+      obj,
+      sel,
+      range,
+      opts,
+      predicate,
+    );
+  }
+
+  late final __objc_msgSend_99Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSRange,
+              ffi.Int32,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_99 = __objc_msgSend_99Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, NSRange, int, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_enumerateRangesUsingBlock_1 =
+      _registerName1("enumerateRangesUsingBlock:");
+  void _objc_msgSend_100(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_100(
+      obj,
+      sel,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_100Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_100 = __objc_msgSend_100Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_enumerateRangesWithOptions_usingBlock_1 =
+      _registerName1("enumerateRangesWithOptions:usingBlock:");
+  void _objc_msgSend_101(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int opts,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_101(
+      obj,
+      sel,
+      opts,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_101Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_101 = __objc_msgSend_101Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_enumerateRangesInRange_options_usingBlock_1 =
+      _registerName1("enumerateRangesInRange:options:usingBlock:");
+  void _objc_msgSend_102(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    int opts,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_102(
+      obj,
+      sel,
+      range,
+      opts,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_102Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRange, ffi.Int32, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_102 = __objc_msgSend_102Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange, int,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_objectsAtIndexes_1 = _registerName1("objectsAtIndexes:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_103(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> indexes,
+  ) {
+    return __objc_msgSend_103(
+      obj,
+      sel,
+      indexes,
+    );
+  }
+
+  late final __objc_msgSend_103Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_103 = __objc_msgSend_103Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_objectAtIndexedSubscript_1 =
+      _registerName1("objectAtIndexedSubscript:");
+  late final _sel_enumerateObjectsUsingBlock_1 =
+      _registerName1("enumerateObjectsUsingBlock:");
+  void _objc_msgSend_104(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_104(
+      obj,
+      sel,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_104Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_104 = __objc_msgSend_104Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_enumerateObjectsWithOptions_usingBlock_1 =
+      _registerName1("enumerateObjectsWithOptions:usingBlock:");
+  void _objc_msgSend_105(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int opts,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_105(
+      obj,
+      sel,
+      opts,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_105Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_105 = __objc_msgSend_105Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_enumerateObjectsAtIndexes_options_usingBlock_1 =
+      _registerName1("enumerateObjectsAtIndexes:options:usingBlock:");
+  void _objc_msgSend_106(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> s,
+    int opts,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_106(
+      obj,
+      sel,
+      s,
+      opts,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_106Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_106 = __objc_msgSend_106Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_indexOfObjectPassingTest_1 =
+      _registerName1("indexOfObjectPassingTest:");
+  int _objc_msgSend_107(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> predicate,
+  ) {
+    return __objc_msgSend_107(
+      obj,
+      sel,
+      predicate,
+    );
+  }
+
+  late final __objc_msgSend_107Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_107 = __objc_msgSend_107Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_indexOfObjectWithOptions_passingTest_1 =
+      _registerName1("indexOfObjectWithOptions:passingTest:");
+  int _objc_msgSend_108(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int opts,
+    ffi.Pointer<_ObjCBlock> predicate,
+  ) {
+    return __objc_msgSend_108(
+      obj,
+      sel,
+      opts,
+      predicate,
+    );
+  }
+
+  late final __objc_msgSend_108Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_108 = __objc_msgSend_108Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_indexOfObjectAtIndexes_options_passingTest_1 =
+      _registerName1("indexOfObjectAtIndexes:options:passingTest:");
+  int _objc_msgSend_109(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> s,
+    int opts,
+    ffi.Pointer<_ObjCBlock> predicate,
+  ) {
+    return __objc_msgSend_109(
+      obj,
+      sel,
+      s,
+      opts,
+      predicate,
+    );
+  }
+
+  late final __objc_msgSend_109Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_109 = __objc_msgSend_109Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_indexesOfObjectsPassingTest_1 =
+      _registerName1("indexesOfObjectsPassingTest:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_110(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> predicate,
+  ) {
+    return __objc_msgSend_110(
+      obj,
+      sel,
+      predicate,
+    );
+  }
+
+  late final __objc_msgSend_110Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_110 = __objc_msgSend_110Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_indexesOfObjectsWithOptions_passingTest_1 =
+      _registerName1("indexesOfObjectsWithOptions:passingTest:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_111(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int opts,
+    ffi.Pointer<_ObjCBlock> predicate,
+  ) {
+    return __objc_msgSend_111(
+      obj,
+      sel,
+      opts,
+      predicate,
+    );
+  }
+
+  late final __objc_msgSend_111Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_111 = __objc_msgSend_111Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_indexesOfObjectsAtIndexes_options_passingTest_1 =
+      _registerName1("indexesOfObjectsAtIndexes:options:passingTest:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_112(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> s,
+    int opts,
+    ffi.Pointer<_ObjCBlock> predicate,
+  ) {
+    return __objc_msgSend_112(
+      obj,
+      sel,
+      s,
+      opts,
+      predicate,
+    );
+  }
+
+  late final __objc_msgSend_112Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_112 = __objc_msgSend_112Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_sortedArrayUsingComparator_1 =
+      _registerName1("sortedArrayUsingComparator:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_113(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSComparator cmptr,
+  ) {
+    return __objc_msgSend_113(
+      obj,
+      sel,
+      cmptr,
+    );
+  }
+
+  late final __objc_msgSend_113Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSComparator)>>('objc_msgSend');
+  late final __objc_msgSend_113 = __objc_msgSend_113Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSComparator)>();
+
+  late final _sel_sortedArrayWithOptions_usingComparator_1 =
+      _registerName1("sortedArrayWithOptions:usingComparator:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_114(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int opts,
+    NSComparator cmptr,
+  ) {
+    return __objc_msgSend_114(
+      obj,
+      sel,
+      opts,
+      cmptr,
+    );
+  }
+
+  late final __objc_msgSend_114Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Int32, NSComparator)>>('objc_msgSend');
+  late final __objc_msgSend_114 = __objc_msgSend_114Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int, NSComparator)>();
+
+  late final _sel_indexOfObject_inSortedRange_options_usingComparator_1 =
+      _registerName1("indexOfObject:inSortedRange:options:usingComparator:");
+  int _objc_msgSend_115(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> obj1,
+    NSRange r,
+    int opts,
+    NSComparator cmp,
+  ) {
+    return __objc_msgSend_115(
+      obj,
+      sel,
+      obj1,
+      r,
+      opts,
+      cmp,
+    );
+  }
+
+  late final __objc_msgSend_115Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSRange,
+              ffi.Int32,
+              NSComparator)>>('objc_msgSend');
+  late final __objc_msgSend_115 = __objc_msgSend_115Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, NSRange, int, NSComparator)>();
+
+  late final _sel_array1 = _registerName1("array");
+  late final _sel_arrayWithObject_1 = _registerName1("arrayWithObject:");
+  late final _sel_arrayWithObjects_count_1 =
+      _registerName1("arrayWithObjects:count:");
+  late final _sel_arrayWithObjects_1 = _registerName1("arrayWithObjects:");
+  late final _sel_arrayWithArray_1 = _registerName1("arrayWithArray:");
+  late final _sel_initWithObjects_1 = _registerName1("initWithObjects:");
+  late final _sel_initWithArray_1 = _registerName1("initWithArray:");
+  late final _sel_initWithArray_copyItems_1 =
+      _registerName1("initWithArray:copyItems:");
+  instancetype _objc_msgSend_116(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> array,
+    bool flag,
+  ) {
+    return __objc_msgSend_116(
+      obj,
+      sel,
+      array,
+      flag,
+    );
+  }
+
+  late final __objc_msgSend_116Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_116 = __objc_msgSend_116Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, bool)>();
+
+  late final _sel_initWithContentsOfURL_error_1 =
+      _registerName1("initWithContentsOfURL:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_117(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_117(
+      obj,
+      sel,
+      url,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_117Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_117 = __objc_msgSend_117Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_arrayWithContentsOfURL_error_1 =
+      _registerName1("arrayWithContentsOfURL:error:");
+  late final _sel_getObjects_1 = _registerName1("getObjects:");
+  void _objc_msgSend_118(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> objects,
+  ) {
+    return __objc_msgSend_118(
+      obj,
+      sel,
+      objects,
+    );
+  }
+
+  late final __objc_msgSend_118Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_118 = __objc_msgSend_118Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_arrayWithContentsOfFile_1 =
+      _registerName1("arrayWithContentsOfFile:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_119(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+  ) {
+    return __objc_msgSend_119(
+      obj,
+      sel,
+      path,
+    );
+  }
+
+  late final __objc_msgSend_119Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_119 = __objc_msgSend_119Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_arrayWithContentsOfURL_1 =
+      _registerName1("arrayWithContentsOfURL:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_120(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+  ) {
+    return __objc_msgSend_120(
+      obj,
+      sel,
+      url,
+    );
+  }
+
+  late final __objc_msgSend_120Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_120 = __objc_msgSend_120Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithContentsOfFile_1 =
+      _registerName1("initWithContentsOfFile:");
+  late final _sel_initWithContentsOfURL_1 =
+      _registerName1("initWithContentsOfURL:");
+  late final _sel_writeToURL_atomically_1 =
+      _registerName1("writeToURL:atomically:");
+  bool _objc_msgSend_121(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    bool atomically,
+  ) {
+    return __objc_msgSend_121(
+      obj,
+      sel,
+      url,
+      atomically,
+    );
+  }
+
+  late final __objc_msgSend_121Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_121 = __objc_msgSend_121Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, bool)>();
+
+  late final _sel_pathsMatchingExtensions_1 =
+      _registerName1("pathsMatchingExtensions:");
+  late final _sel_valueForKey_1 = _registerName1("valueForKey:");
+  late final _sel_setValue_forKey_1 = _registerName1("setValue:forKey:");
+  void _objc_msgSend_122(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_122(
+      obj,
+      sel,
+      value,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_122Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_122 = __objc_msgSend_122Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_addObserver_toObjectsAtIndexes_forKeyPath_options_context_1 =
+      _registerName1(
+          "addObserver:toObjectsAtIndexes:forKeyPath:options:context:");
+  void _objc_msgSend_123(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> observer,
+    ffi.Pointer<ObjCObject> indexes,
+    ffi.Pointer<ObjCObject> keyPath,
+    int options,
+    ffi.Pointer<ffi.Void> context,
+  ) {
+    return __objc_msgSend_123(
+      obj,
+      sel,
+      observer,
+      indexes,
+      keyPath,
+      options,
+      context,
+    );
+  }
+
+  late final __objc_msgSend_123Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Void>)>>('objc_msgSend');
+  late final __objc_msgSend_123 = __objc_msgSend_123Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ffi.Void>)>();
+
+  late final _sel_removeObserver_fromObjectsAtIndexes_forKeyPath_context_1 =
+      _registerName1("removeObserver:fromObjectsAtIndexes:forKeyPath:context:");
+  void _objc_msgSend_124(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> observer,
+    ffi.Pointer<ObjCObject> indexes,
+    ffi.Pointer<ObjCObject> keyPath,
+    ffi.Pointer<ffi.Void> context,
+  ) {
+    return __objc_msgSend_124(
+      obj,
+      sel,
+      observer,
+      indexes,
+      keyPath,
+      context,
+    );
+  }
+
+  late final __objc_msgSend_124Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Void>)>>('objc_msgSend');
+  late final __objc_msgSend_124 = __objc_msgSend_124Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Void>)>();
+
+  late final _sel_removeObserver_fromObjectsAtIndexes_forKeyPath_1 =
+      _registerName1("removeObserver:fromObjectsAtIndexes:forKeyPath:");
+  void _objc_msgSend_125(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> observer,
+    ffi.Pointer<ObjCObject> indexes,
+    ffi.Pointer<ObjCObject> keyPath,
+  ) {
+    return __objc_msgSend_125(
+      obj,
+      sel,
+      observer,
+      indexes,
+      keyPath,
+    );
+  }
+
+  late final __objc_msgSend_125Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_125 = __objc_msgSend_125Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_addObserver_forKeyPath_options_context_1 =
+      _registerName1("addObserver:forKeyPath:options:context:");
+  void _objc_msgSend_126(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> observer,
+    ffi.Pointer<ObjCObject> keyPath,
+    int options,
+    ffi.Pointer<ffi.Void> context,
+  ) {
+    return __objc_msgSend_126(
+      obj,
+      sel,
+      observer,
+      keyPath,
+      options,
+      context,
+    );
+  }
+
+  late final __objc_msgSend_126Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Void>)>>('objc_msgSend');
+  late final __objc_msgSend_126 = __objc_msgSend_126Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ffi.Void>)>();
+
+  late final _sel_removeObserver_forKeyPath_context_1 =
+      _registerName1("removeObserver:forKeyPath:context:");
+  void _objc_msgSend_127(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> observer,
+    ffi.Pointer<ObjCObject> keyPath,
+    ffi.Pointer<ffi.Void> context,
+  ) {
+    return __objc_msgSend_127(
+      obj,
+      sel,
+      observer,
+      keyPath,
+      context,
+    );
+  }
+
+  late final __objc_msgSend_127Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Void>)>>('objc_msgSend');
+  late final __objc_msgSend_127 = __objc_msgSend_127Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Void>)>();
+
+  late final _sel_removeObserver_forKeyPath_1 =
+      _registerName1("removeObserver:forKeyPath:");
+  void _objc_msgSend_128(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> observer,
+    ffi.Pointer<ObjCObject> keyPath,
+  ) {
+    return __objc_msgSend_128(
+      obj,
+      sel,
+      observer,
+      keyPath,
+    );
+  }
+
+  late final __objc_msgSend_128Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_128 = __objc_msgSend_128Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_sortedArrayUsingDescriptors_1 =
+      _registerName1("sortedArrayUsingDescriptors:");
+  late final _class_NSPredicate1 = _getClass1("NSPredicate");
+  late final _sel_predicateWithFormat_argumentArray_1 =
+      _registerName1("predicateWithFormat:argumentArray:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_129(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> predicateFormat,
+    ffi.Pointer<ObjCObject> arguments,
+  ) {
+    return __objc_msgSend_129(
+      obj,
+      sel,
+      predicateFormat,
+      arguments,
+    );
+  }
+
+  late final __objc_msgSend_129Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_129 = __objc_msgSend_129Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_predicateWithFormat_1 =
+      _registerName1("predicateWithFormat:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_130(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> predicateFormat,
+  ) {
+    return __objc_msgSend_130(
+      obj,
+      sel,
+      predicateFormat,
+    );
+  }
+
+  late final __objc_msgSend_130Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_130 = __objc_msgSend_130Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_predicateWithFormat_arguments_1 =
+      _registerName1("predicateWithFormat:arguments:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_131(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> predicateFormat,
+    ffi.Pointer<__va_list_tag> argList,
+  ) {
+    return __objc_msgSend_131(
+      obj,
+      sel,
+      predicateFormat,
+      argList,
+    );
+  }
+
+  late final __objc_msgSend_131Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<__va_list_tag>)>>('objc_msgSend');
+  late final __objc_msgSend_131 = __objc_msgSend_131Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<__va_list_tag>)>();
+
+  late final _sel_predicateFromMetadataQueryString_1 =
+      _registerName1("predicateFromMetadataQueryString:");
+  late final _sel_predicateWithValue_1 = _registerName1("predicateWithValue:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_132(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    bool value,
+  ) {
+    return __objc_msgSend_132(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_132Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_132 = __objc_msgSend_132Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, bool)>();
+
+  late final _class_NSDictionary1 = _getClass1("NSDictionary");
+  late final _sel_objectForKey_1 = _registerName1("objectForKey:");
+  late final _sel_keyEnumerator1 = _registerName1("keyEnumerator");
+  late final _sel_initWithObjects_forKeys_count_1 =
+      _registerName1("initWithObjects:forKeys:count:");
+  instancetype _objc_msgSend_133(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> objects,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> keys,
+    int cnt,
+  ) {
+    return __objc_msgSend_133(
+      obj,
+      sel,
+      objects,
+      keys,
+      cnt,
+    );
+  }
+
+  late final __objc_msgSend_133Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_133 = __objc_msgSend_133Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          int)>();
+
+  late final _sel_allKeys1 = _registerName1("allKeys");
+  late final _sel_allKeysForObject_1 = _registerName1("allKeysForObject:");
+  late final _sel_allValues1 = _registerName1("allValues");
+  late final _sel_descriptionInStringsFileFormat1 =
+      _registerName1("descriptionInStringsFileFormat");
+  late final _sel_isEqualToDictionary_1 =
+      _registerName1("isEqualToDictionary:");
+  bool _objc_msgSend_134(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> otherDictionary,
+  ) {
+    return __objc_msgSend_134(
+      obj,
+      sel,
+      otherDictionary,
+    );
+  }
+
+  late final __objc_msgSend_134Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_134 = __objc_msgSend_134Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_objectsForKeys_notFoundMarker_1 =
+      _registerName1("objectsForKeys:notFoundMarker:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_135(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> keys,
+    ffi.Pointer<ObjCObject> marker,
+  ) {
+    return __objc_msgSend_135(
+      obj,
+      sel,
+      keys,
+      marker,
+    );
+  }
+
+  late final __objc_msgSend_135Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_135 = __objc_msgSend_135Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_keysSortedByValueUsingSelector_1 =
+      _registerName1("keysSortedByValueUsingSelector:");
+  late final _sel_getObjects_andKeys_count_1 =
+      _registerName1("getObjects:andKeys:count:");
+  void _objc_msgSend_136(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> objects,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> keys,
+    int count,
+  ) {
+    return __objc_msgSend_136(
+      obj,
+      sel,
+      objects,
+      keys,
+      count,
+    );
+  }
+
+  late final __objc_msgSend_136Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_136 = __objc_msgSend_136Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          int)>();
+
+  late final _sel_objectForKeyedSubscript_1 =
+      _registerName1("objectForKeyedSubscript:");
+  late final _sel_enumerateKeysAndObjectsUsingBlock_1 =
+      _registerName1("enumerateKeysAndObjectsUsingBlock:");
+  void _objc_msgSend_137(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_137(
+      obj,
+      sel,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_137Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_137 = __objc_msgSend_137Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_enumerateKeysAndObjectsWithOptions_usingBlock_1 =
+      _registerName1("enumerateKeysAndObjectsWithOptions:usingBlock:");
+  void _objc_msgSend_138(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int opts,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_138(
+      obj,
+      sel,
+      opts,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_138Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_138 = __objc_msgSend_138Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_keysSortedByValueUsingComparator_1 =
+      _registerName1("keysSortedByValueUsingComparator:");
+  late final _sel_keysSortedByValueWithOptions_usingComparator_1 =
+      _registerName1("keysSortedByValueWithOptions:usingComparator:");
+  late final _sel_getObjects_andKeys_1 = _registerName1("getObjects:andKeys:");
+  void _objc_msgSend_139(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> objects,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> keys,
+  ) {
+    return __objc_msgSend_139(
+      obj,
+      sel,
+      objects,
+      keys,
+    );
+  }
+
+  late final __objc_msgSend_139Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_139 = __objc_msgSend_139Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_dictionaryWithContentsOfFile_1 =
+      _registerName1("dictionaryWithContentsOfFile:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_140(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+  ) {
+    return __objc_msgSend_140(
+      obj,
+      sel,
+      path,
+    );
+  }
+
+  late final __objc_msgSend_140Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_140 = __objc_msgSend_140Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dictionaryWithContentsOfURL_1 =
+      _registerName1("dictionaryWithContentsOfURL:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_141(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+  ) {
+    return __objc_msgSend_141(
+      obj,
+      sel,
+      url,
+    );
+  }
+
+  late final __objc_msgSend_141Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_141 = __objc_msgSend_141Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dictionary1 = _registerName1("dictionary");
+  late final _sel_dictionaryWithObject_forKey_1 =
+      _registerName1("dictionaryWithObject:forKey:");
+  instancetype _objc_msgSend_142(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> object,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_142(
+      obj,
+      sel,
+      object,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_142Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_142 = __objc_msgSend_142Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dictionaryWithObjects_forKeys_count_1 =
+      _registerName1("dictionaryWithObjects:forKeys:count:");
+  late final _sel_dictionaryWithObjectsAndKeys_1 =
+      _registerName1("dictionaryWithObjectsAndKeys:");
+  late final _sel_dictionaryWithDictionary_1 =
+      _registerName1("dictionaryWithDictionary:");
+  instancetype _objc_msgSend_143(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> dict,
+  ) {
+    return __objc_msgSend_143(
+      obj,
+      sel,
+      dict,
+    );
+  }
+
+  late final __objc_msgSend_143Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_143 = __objc_msgSend_143Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dictionaryWithObjects_forKeys_1 =
+      _registerName1("dictionaryWithObjects:forKeys:");
+  instancetype _objc_msgSend_144(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> objects,
+    ffi.Pointer<ObjCObject> keys,
+  ) {
+    return __objc_msgSend_144(
+      obj,
+      sel,
+      objects,
+      keys,
+    );
+  }
+
+  late final __objc_msgSend_144Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_144 = __objc_msgSend_144Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithObjectsAndKeys_1 =
+      _registerName1("initWithObjectsAndKeys:");
+  late final _sel_initWithDictionary_1 = _registerName1("initWithDictionary:");
+  late final _sel_initWithDictionary_copyItems_1 =
+      _registerName1("initWithDictionary:copyItems:");
+  instancetype _objc_msgSend_145(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> otherDictionary,
+    bool flag,
+  ) {
+    return __objc_msgSend_145(
+      obj,
+      sel,
+      otherDictionary,
+      flag,
+    );
+  }
+
+  late final __objc_msgSend_145Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_145 = __objc_msgSend_145Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, bool)>();
+
+  late final _sel_initWithObjects_forKeys_1 =
+      _registerName1("initWithObjects:forKeys:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_146(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_146(
+      obj,
+      sel,
+      url,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_146Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_146 = __objc_msgSend_146Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_dictionaryWithContentsOfURL_error_1 =
+      _registerName1("dictionaryWithContentsOfURL:error:");
+  late final _sel_sharedKeySetForKeys_1 =
+      _registerName1("sharedKeySetForKeys:");
+  late final _sel_countByEnumeratingWithState_objects_count_1 =
+      _registerName1("countByEnumeratingWithState:objects:count:");
+  int _objc_msgSend_147(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<NSFastEnumerationState> state,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> buffer,
+    int len,
+  ) {
+    return __objc_msgSend_147(
+      obj,
+      sel,
+      state,
+      buffer,
+      len,
+    );
+  }
+
+  late final __objc_msgSend_147Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<NSFastEnumerationState>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_147 = __objc_msgSend_147Ptr.asFunction<
+      int Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<NSFastEnumerationState>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          int)>();
+
+  late final _sel_fileSize1 = _registerName1("fileSize");
+  int _objc_msgSend_148(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_148(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_148Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.UnsignedLongLong Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_148 = __objc_msgSend_148Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _class_NSDate1 = _getClass1("NSDate");
+  late final _sel_timeIntervalSinceReferenceDate1 =
+      _registerName1("timeIntervalSinceReferenceDate");
+  double _objc_msgSend_149(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_149(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_149Ptr = _lookup<
+      ffi.NativeFunction<
+          NSTimeInterval Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_149 = __objc_msgSend_149Ptr.asFunction<
+      double Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_initWithTimeIntervalSinceReferenceDate_1 =
+      _registerName1("initWithTimeIntervalSinceReferenceDate:");
+  instancetype _objc_msgSend_150(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    double ti,
+  ) {
+    return __objc_msgSend_150(
+      obj,
+      sel,
+      ti,
+    );
+  }
+
+  late final __objc_msgSend_150Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSTimeInterval)>>('objc_msgSend');
+  late final __objc_msgSend_150 = __objc_msgSend_150Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, double)>();
+
+  late final _sel_timeIntervalSinceDate_1 =
+      _registerName1("timeIntervalSinceDate:");
+  double _objc_msgSend_151(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> anotherDate,
+  ) {
+    return __objc_msgSend_151(
+      obj,
+      sel,
+      anotherDate,
+    );
+  }
+
+  late final __objc_msgSend_151Ptr = _lookup<
+      ffi.NativeFunction<
+          NSTimeInterval Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_151 = __objc_msgSend_151Ptr.asFunction<
+      double Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_timeIntervalSinceNow1 =
+      _registerName1("timeIntervalSinceNow");
+  late final _sel_timeIntervalSince19701 =
+      _registerName1("timeIntervalSince1970");
+  late final _sel_addTimeInterval_1 = _registerName1("addTimeInterval:");
+  late final _sel_dateByAddingTimeInterval_1 =
+      _registerName1("dateByAddingTimeInterval:");
+  late final _sel_earlierDate_1 = _registerName1("earlierDate:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_152(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> anotherDate,
+  ) {
+    return __objc_msgSend_152(
+      obj,
+      sel,
+      anotherDate,
+    );
+  }
+
+  late final __objc_msgSend_152Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_152 = __objc_msgSend_152Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_laterDate_1 = _registerName1("laterDate:");
+  late final _sel_compare_1 = _registerName1("compare:");
+  int _objc_msgSend_153(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> other,
+  ) {
+    return __objc_msgSend_153(
+      obj,
+      sel,
+      other,
+    );
+  }
+
+  late final __objc_msgSend_153Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_153 = __objc_msgSend_153Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_isEqualToDate_1 = _registerName1("isEqualToDate:");
+  bool _objc_msgSend_154(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> otherDate,
+  ) {
+    return __objc_msgSend_154(
+      obj,
+      sel,
+      otherDate,
+    );
+  }
+
+  late final __objc_msgSend_154Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_154 = __objc_msgSend_154Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_date1 = _registerName1("date");
+  late final _sel_dateWithTimeIntervalSinceNow_1 =
+      _registerName1("dateWithTimeIntervalSinceNow:");
+  late final _sel_dateWithTimeIntervalSinceReferenceDate_1 =
+      _registerName1("dateWithTimeIntervalSinceReferenceDate:");
+  late final _sel_dateWithTimeIntervalSince1970_1 =
+      _registerName1("dateWithTimeIntervalSince1970:");
+  late final _sel_dateWithTimeInterval_sinceDate_1 =
+      _registerName1("dateWithTimeInterval:sinceDate:");
+  instancetype _objc_msgSend_155(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    double secsToBeAdded,
+    ffi.Pointer<ObjCObject> date,
+  ) {
+    return __objc_msgSend_155(
+      obj,
+      sel,
+      secsToBeAdded,
+      date,
+    );
+  }
+
+  late final __objc_msgSend_155Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSTimeInterval, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_155 = __objc_msgSend_155Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          double, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_distantFuture1 = _registerName1("distantFuture");
+  ffi.Pointer<ObjCObject> _objc_msgSend_156(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_156(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_156Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_156 = __objc_msgSend_156Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_distantPast1 = _registerName1("distantPast");
+  late final _sel_now1 = _registerName1("now");
+  late final _sel_initWithTimeIntervalSinceNow_1 =
+      _registerName1("initWithTimeIntervalSinceNow:");
+  late final _sel_initWithTimeIntervalSince1970_1 =
+      _registerName1("initWithTimeIntervalSince1970:");
+  late final _sel_initWithTimeInterval_sinceDate_1 =
+      _registerName1("initWithTimeInterval:sinceDate:");
+  late final _sel_dateWithNaturalLanguageString_locale_1 =
+      _registerName1("dateWithNaturalLanguageString:locale:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_157(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> string,
+    ffi.Pointer<ObjCObject> locale,
+  ) {
+    return __objc_msgSend_157(
+      obj,
+      sel,
+      string,
+      locale,
+    );
+  }
+
+  late final __objc_msgSend_157Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_157 = __objc_msgSend_157Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dateWithNaturalLanguageString_1 =
+      _registerName1("dateWithNaturalLanguageString:");
+  late final _sel_dateWithString_1 = _registerName1("dateWithString:");
+  late final _class_NSCalendarDate1 = _getClass1("NSCalendarDate");
+  late final _sel_calendarDate1 = _registerName1("calendarDate");
+  late final _sel_dateWithString_calendarFormat_locale_1 =
+      _registerName1("dateWithString:calendarFormat:locale:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_158(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> description,
+    ffi.Pointer<ObjCObject> format,
+    ffi.Pointer<ObjCObject> locale,
+  ) {
+    return __objc_msgSend_158(
+      obj,
+      sel,
+      description,
+      format,
+      locale,
+    );
+  }
+
+  late final __objc_msgSend_158Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_158 = __objc_msgSend_158Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dateWithString_calendarFormat_1 =
+      _registerName1("dateWithString:calendarFormat:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_159(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> description,
+    ffi.Pointer<ObjCObject> format,
+  ) {
+    return __objc_msgSend_159(
+      obj,
+      sel,
+      description,
+      format,
+    );
+  }
+
+  late final __objc_msgSend_159Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_159 = __objc_msgSend_159Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSTimeZone1 = _getClass1("NSTimeZone");
+  late final _sel_name1 = _registerName1("name");
+  late final _sel_data1 = _registerName1("data");
+  late final _sel_secondsFromGMTForDate_1 =
+      _registerName1("secondsFromGMTForDate:");
+  int _objc_msgSend_160(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> aDate,
+  ) {
+    return __objc_msgSend_160(
+      obj,
+      sel,
+      aDate,
+    );
+  }
+
+  late final __objc_msgSend_160Ptr = _lookup<
+      ffi.NativeFunction<
+          NSInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_160 = __objc_msgSend_160Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_abbreviationForDate_1 =
+      _registerName1("abbreviationForDate:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_161(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> aDate,
+  ) {
+    return __objc_msgSend_161(
+      obj,
+      sel,
+      aDate,
+    );
+  }
+
+  late final __objc_msgSend_161Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_161 = __objc_msgSend_161Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_isDaylightSavingTimeForDate_1 =
+      _registerName1("isDaylightSavingTimeForDate:");
+  late final _sel_daylightSavingTimeOffsetForDate_1 =
+      _registerName1("daylightSavingTimeOffsetForDate:");
+  late final _sel_nextDaylightSavingTimeTransitionAfterDate_1 =
+      _registerName1("nextDaylightSavingTimeTransitionAfterDate:");
+  late final _sel_systemTimeZone1 = _registerName1("systemTimeZone");
+  ffi.Pointer<ObjCObject> _objc_msgSend_162(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_162(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_162Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_162 = __objc_msgSend_162Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_resetSystemTimeZone1 = _registerName1("resetSystemTimeZone");
+  late final _sel_defaultTimeZone1 = _registerName1("defaultTimeZone");
+  late final _sel_setDefaultTimeZone_1 = _registerName1("setDefaultTimeZone:");
+  void _objc_msgSend_163(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_163(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_163Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_163 = __objc_msgSend_163Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_localTimeZone1 = _registerName1("localTimeZone");
+  late final _sel_knownTimeZoneNames1 = _registerName1("knownTimeZoneNames");
+  late final _sel_abbreviationDictionary1 =
+      _registerName1("abbreviationDictionary");
+  ffi.Pointer<ObjCObject> _objc_msgSend_164(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_164(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_164Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_164 = __objc_msgSend_164Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setAbbreviationDictionary_1 =
+      _registerName1("setAbbreviationDictionary:");
+  void _objc_msgSend_165(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_165(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_165Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_165 = __objc_msgSend_165Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_timeZoneDataVersion1 = _registerName1("timeZoneDataVersion");
+  late final _sel_secondsFromGMT1 = _registerName1("secondsFromGMT");
+  late final _sel_abbreviation1 = _registerName1("abbreviation");
+  late final _sel_isDaylightSavingTime1 =
+      _registerName1("isDaylightSavingTime");
+  late final _sel_daylightSavingTimeOffset1 =
+      _registerName1("daylightSavingTimeOffset");
+  late final _sel_nextDaylightSavingTimeTransition1 =
+      _registerName1("nextDaylightSavingTimeTransition");
+  late final _sel_isEqualToTimeZone_1 = _registerName1("isEqualToTimeZone:");
+  bool _objc_msgSend_166(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> aTimeZone,
+  ) {
+    return __objc_msgSend_166(
+      obj,
+      sel,
+      aTimeZone,
+    );
+  }
+
+  late final __objc_msgSend_166Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_166 = __objc_msgSend_166Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSLocale1 = _getClass1("NSLocale");
+  late final _sel_displayNameForKey_value_1 =
+      _registerName1("displayNameForKey:value:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_167(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSLocaleKey key,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_167(
+      obj,
+      sel,
+      key,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_167Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSLocaleKey,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_167 = __objc_msgSend_167Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, NSLocaleKey, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithLocaleIdentifier_1 =
+      _registerName1("initWithLocaleIdentifier:");
+  late final _sel_localeIdentifier1 = _registerName1("localeIdentifier");
+  late final _sel_localizedStringForLocaleIdentifier_1 =
+      _registerName1("localizedStringForLocaleIdentifier:");
+  late final _sel_languageCode1 = _registerName1("languageCode");
+  late final _sel_localizedStringForLanguageCode_1 =
+      _registerName1("localizedStringForLanguageCode:");
+  late final _sel_countryCode1 = _registerName1("countryCode");
+  late final _sel_localizedStringForCountryCode_1 =
+      _registerName1("localizedStringForCountryCode:");
+  late final _sel_scriptCode1 = _registerName1("scriptCode");
+  late final _sel_localizedStringForScriptCode_1 =
+      _registerName1("localizedStringForScriptCode:");
+  late final _sel_variantCode1 = _registerName1("variantCode");
+  late final _sel_localizedStringForVariantCode_1 =
+      _registerName1("localizedStringForVariantCode:");
+  late final _class_NSCharacterSet1 = _getClass1("NSCharacterSet");
+  late final _sel_controlCharacterSet1 = _registerName1("controlCharacterSet");
+  ffi.Pointer<ObjCObject> _objc_msgSend_168(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_168(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_168Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_168 = __objc_msgSend_168Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_whitespaceCharacterSet1 =
+      _registerName1("whitespaceCharacterSet");
+  late final _sel_whitespaceAndNewlineCharacterSet1 =
+      _registerName1("whitespaceAndNewlineCharacterSet");
+  late final _sel_decimalDigitCharacterSet1 =
+      _registerName1("decimalDigitCharacterSet");
+  late final _sel_letterCharacterSet1 = _registerName1("letterCharacterSet");
+  late final _sel_lowercaseLetterCharacterSet1 =
+      _registerName1("lowercaseLetterCharacterSet");
+  late final _sel_uppercaseLetterCharacterSet1 =
+      _registerName1("uppercaseLetterCharacterSet");
+  late final _sel_nonBaseCharacterSet1 = _registerName1("nonBaseCharacterSet");
+  late final _sel_alphanumericCharacterSet1 =
+      _registerName1("alphanumericCharacterSet");
+  late final _sel_decomposableCharacterSet1 =
+      _registerName1("decomposableCharacterSet");
+  late final _sel_illegalCharacterSet1 = _registerName1("illegalCharacterSet");
+  late final _sel_punctuationCharacterSet1 =
+      _registerName1("punctuationCharacterSet");
+  late final _sel_capitalizedLetterCharacterSet1 =
+      _registerName1("capitalizedLetterCharacterSet");
+  late final _sel_symbolCharacterSet1 = _registerName1("symbolCharacterSet");
+  late final _sel_newlineCharacterSet1 = _registerName1("newlineCharacterSet");
+  late final _sel_characterSetWithRange_1 =
+      _registerName1("characterSetWithRange:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_169(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange aRange,
+  ) {
+    return __objc_msgSend_169(
+      obj,
+      sel,
+      aRange,
+    );
+  }
+
+  late final __objc_msgSend_169Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_169 = __objc_msgSend_169Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange)>();
+
+  late final _sel_characterSetWithCharactersInString_1 =
+      _registerName1("characterSetWithCharactersInString:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_170(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> aString,
+  ) {
+    return __objc_msgSend_170(
+      obj,
+      sel,
+      aString,
+    );
+  }
+
+  late final __objc_msgSend_170Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_170 = __objc_msgSend_170Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_characterSetWithBitmapRepresentation_1 =
+      _registerName1("characterSetWithBitmapRepresentation:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_171(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> data,
+  ) {
+    return __objc_msgSend_171(
+      obj,
+      sel,
+      data,
+    );
+  }
+
+  late final __objc_msgSend_171Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_171 = __objc_msgSend_171Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_characterSetWithContentsOfFile_1 =
+      _registerName1("characterSetWithContentsOfFile:");
+  late final _sel_characterIsMember_1 = _registerName1("characterIsMember:");
+  bool _objc_msgSend_172(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int aCharacter,
+  ) {
+    return __objc_msgSend_172(
+      obj,
+      sel,
+      aCharacter,
+    );
+  }
+
+  late final __objc_msgSend_172Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              unichar)>>('objc_msgSend');
+  late final __objc_msgSend_172 = __objc_msgSend_172Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_bitmapRepresentation1 =
+      _registerName1("bitmapRepresentation");
+  late final _sel_invertedSet1 = _registerName1("invertedSet");
+  late final _sel_longCharacterIsMember_1 =
+      _registerName1("longCharacterIsMember:");
+  bool _objc_msgSend_173(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int theLongChar,
+  ) {
+    return __objc_msgSend_173(
+      obj,
+      sel,
+      theLongChar,
+    );
+  }
+
+  late final __objc_msgSend_173Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              UTF32Char)>>('objc_msgSend');
+  late final __objc_msgSend_173 = __objc_msgSend_173Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_isSupersetOfSet_1 = _registerName1("isSupersetOfSet:");
+  bool _objc_msgSend_174(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> theOtherSet,
+  ) {
+    return __objc_msgSend_174(
+      obj,
+      sel,
+      theOtherSet,
+    );
+  }
+
+  late final __objc_msgSend_174Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_174 = __objc_msgSend_174Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_hasMemberInPlane_1 = _registerName1("hasMemberInPlane:");
+  bool _objc_msgSend_175(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int thePlane,
+  ) {
+    return __objc_msgSend_175(
+      obj,
+      sel,
+      thePlane,
+    );
+  }
+
+  late final __objc_msgSend_175Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Uint8)>>('objc_msgSend');
+  late final __objc_msgSend_175 = __objc_msgSend_175Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_URLUserAllowedCharacterSet1 =
+      _registerName1("URLUserAllowedCharacterSet");
+  late final _sel_URLPasswordAllowedCharacterSet1 =
+      _registerName1("URLPasswordAllowedCharacterSet");
+  late final _sel_URLHostAllowedCharacterSet1 =
+      _registerName1("URLHostAllowedCharacterSet");
+  late final _sel_URLPathAllowedCharacterSet1 =
+      _registerName1("URLPathAllowedCharacterSet");
+  late final _sel_URLQueryAllowedCharacterSet1 =
+      _registerName1("URLQueryAllowedCharacterSet");
+  late final _sel_URLFragmentAllowedCharacterSet1 =
+      _registerName1("URLFragmentAllowedCharacterSet");
+  late final _sel_exemplarCharacterSet1 =
+      _registerName1("exemplarCharacterSet");
+  late final _sel_calendarIdentifier1 = _registerName1("calendarIdentifier");
+  late final _sel_localizedStringForCalendarIdentifier_1 =
+      _registerName1("localizedStringForCalendarIdentifier:");
+  late final _sel_collationIdentifier1 = _registerName1("collationIdentifier");
+  late final _sel_localizedStringForCollationIdentifier_1 =
+      _registerName1("localizedStringForCollationIdentifier:");
+  late final _sel_usesMetricSystem1 = _registerName1("usesMetricSystem");
+  late final _sel_decimalSeparator1 = _registerName1("decimalSeparator");
+  late final _sel_groupingSeparator1 = _registerName1("groupingSeparator");
+  late final _sel_currencySymbol1 = _registerName1("currencySymbol");
+  late final _sel_currencyCode1 = _registerName1("currencyCode");
+  late final _sel_localizedStringForCurrencyCode_1 =
+      _registerName1("localizedStringForCurrencyCode:");
+  late final _sel_collatorIdentifier1 = _registerName1("collatorIdentifier");
+  late final _sel_localizedStringForCollatorIdentifier_1 =
+      _registerName1("localizedStringForCollatorIdentifier:");
+  late final _sel_quotationBeginDelimiter1 =
+      _registerName1("quotationBeginDelimiter");
+  late final _sel_quotationEndDelimiter1 =
+      _registerName1("quotationEndDelimiter");
+  late final _sel_alternateQuotationBeginDelimiter1 =
+      _registerName1("alternateQuotationBeginDelimiter");
+  late final _sel_alternateQuotationEndDelimiter1 =
+      _registerName1("alternateQuotationEndDelimiter");
+  late final _sel_autoupdatingCurrentLocale1 =
+      _registerName1("autoupdatingCurrentLocale");
+  ffi.Pointer<ObjCObject> _objc_msgSend_176(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_176(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_176Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_176 = __objc_msgSend_176Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_currentLocale1 = _registerName1("currentLocale");
+  late final _sel_systemLocale1 = _registerName1("systemLocale");
+  late final _sel_localeWithLocaleIdentifier_1 =
+      _registerName1("localeWithLocaleIdentifier:");
+  late final _sel_availableLocaleIdentifiers1 =
+      _registerName1("availableLocaleIdentifiers");
+  late final _sel_ISOLanguageCodes1 = _registerName1("ISOLanguageCodes");
+  late final _sel_ISOCountryCodes1 = _registerName1("ISOCountryCodes");
+  late final _sel_ISOCurrencyCodes1 = _registerName1("ISOCurrencyCodes");
+  late final _sel_commonISOCurrencyCodes1 =
+      _registerName1("commonISOCurrencyCodes");
+  late final _sel_preferredLanguages1 = _registerName1("preferredLanguages");
+  late final _sel_componentsFromLocaleIdentifier_1 =
+      _registerName1("componentsFromLocaleIdentifier:");
+  late final _sel_localeIdentifierFromComponents_1 =
+      _registerName1("localeIdentifierFromComponents:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_177(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> dict,
+  ) {
+    return __objc_msgSend_177(
+      obj,
+      sel,
+      dict,
+    );
+  }
+
+  late final __objc_msgSend_177Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_177 = __objc_msgSend_177Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_canonicalLocaleIdentifierFromString_1 =
+      _registerName1("canonicalLocaleIdentifierFromString:");
+  late final _sel_canonicalLanguageIdentifierFromString_1 =
+      _registerName1("canonicalLanguageIdentifierFromString:");
+  late final _sel_localeIdentifierFromWindowsLocaleCode_1 =
+      _registerName1("localeIdentifierFromWindowsLocaleCode:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_178(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int lcid,
+  ) {
+    return __objc_msgSend_178(
+      obj,
+      sel,
+      lcid,
+    );
+  }
+
+  late final __objc_msgSend_178Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Uint32)>>('objc_msgSend');
+  late final __objc_msgSend_178 = __objc_msgSend_178Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_windowsLocaleCodeFromLocaleIdentifier_1 =
+      _registerName1("windowsLocaleCodeFromLocaleIdentifier:");
+  int _objc_msgSend_179(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> localeIdentifier,
+  ) {
+    return __objc_msgSend_179(
+      obj,
+      sel,
+      localeIdentifier,
+    );
+  }
+
+  late final __objc_msgSend_179Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Uint32 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_179 = __objc_msgSend_179Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_characterDirectionForLanguage_1 =
+      _registerName1("characterDirectionForLanguage:");
+  int _objc_msgSend_180(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> isoLangCode,
+  ) {
+    return __objc_msgSend_180(
+      obj,
+      sel,
+      isoLangCode,
+    );
+  }
+
+  late final __objc_msgSend_180Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_180 = __objc_msgSend_180Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_lineDirectionForLanguage_1 =
+      _registerName1("lineDirectionForLanguage:");
+  late final _sel_localizedName_locale_1 =
+      _registerName1("localizedName:locale:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_181(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int style,
+    ffi.Pointer<ObjCObject> locale,
+  ) {
+    return __objc_msgSend_181(
+      obj,
+      sel,
+      style,
+      locale,
+    );
+  }
+
+  late final __objc_msgSend_181Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_181 = __objc_msgSend_181Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_timeZoneWithName_1 = _registerName1("timeZoneWithName:");
+  late final _sel_timeZoneWithName_data_1 =
+      _registerName1("timeZoneWithName:data:");
+  instancetype _objc_msgSend_182(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> tzName,
+    ffi.Pointer<ObjCObject> aData,
+  ) {
+    return __objc_msgSend_182(
+      obj,
+      sel,
+      tzName,
+      aData,
+    );
+  }
+
+  late final __objc_msgSend_182Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_182 = __objc_msgSend_182Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithName_1 = _registerName1("initWithName:");
+  late final _sel_initWithName_data_1 = _registerName1("initWithName:data:");
+  late final _sel_timeZoneForSecondsFromGMT_1 =
+      _registerName1("timeZoneForSecondsFromGMT:");
+  instancetype _objc_msgSend_183(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int seconds,
+  ) {
+    return __objc_msgSend_183(
+      obj,
+      sel,
+      seconds,
+    );
+  }
+
+  late final __objc_msgSend_183Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSInteger)>>('objc_msgSend');
+  late final __objc_msgSend_183 = __objc_msgSend_183Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_timeZoneWithAbbreviation_1 =
+      _registerName1("timeZoneWithAbbreviation:");
+  late final _sel_dateWithYear_month_day_hour_minute_second_timeZone_1 =
+      _registerName1("dateWithYear:month:day:hour:minute:second:timeZone:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_184(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int year,
+    int month,
+    int day,
+    int hour,
+    int minute,
+    int second,
+    ffi.Pointer<ObjCObject> aTimeZone,
+  ) {
+    return __objc_msgSend_184(
+      obj,
+      sel,
+      year,
+      month,
+      day,
+      hour,
+      minute,
+      second,
+      aTimeZone,
+    );
+  }
+
+  late final __objc_msgSend_184Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSInteger,
+              NSUInteger,
+              NSUInteger,
+              NSUInteger,
+              NSUInteger,
+              NSUInteger,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_184 = __objc_msgSend_184Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          int,
+          int,
+          int,
+          int,
+          int,
+          int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dateByAddingYears_months_days_hours_minutes_seconds_1 =
+      _registerName1("dateByAddingYears:months:days:hours:minutes:seconds:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_185(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int year,
+    int month,
+    int day,
+    int hour,
+    int minute,
+    int second,
+  ) {
+    return __objc_msgSend_185(
+      obj,
+      sel,
+      year,
+      month,
+      day,
+      hour,
+      minute,
+      second,
+    );
+  }
+
+  late final __objc_msgSend_185Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSInteger,
+              NSInteger,
+              NSInteger,
+              NSInteger,
+              NSInteger,
+              NSInteger)>>('objc_msgSend');
+  late final __objc_msgSend_185 = __objc_msgSend_185Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, int, int, int, int, int)>();
+
+  late final _sel_dayOfCommonEra1 = _registerName1("dayOfCommonEra");
+  late final _sel_dayOfMonth1 = _registerName1("dayOfMonth");
+  late final _sel_dayOfWeek1 = _registerName1("dayOfWeek");
+  late final _sel_dayOfYear1 = _registerName1("dayOfYear");
+  late final _sel_hourOfDay1 = _registerName1("hourOfDay");
+  late final _sel_minuteOfHour1 = _registerName1("minuteOfHour");
+  late final _sel_monthOfYear1 = _registerName1("monthOfYear");
+  late final _sel_secondOfMinute1 = _registerName1("secondOfMinute");
+  late final _sel_yearOfCommonEra1 = _registerName1("yearOfCommonEra");
+  late final _sel_calendarFormat1 = _registerName1("calendarFormat");
+  late final _sel_descriptionWithCalendarFormat_locale_1 =
+      _registerName1("descriptionWithCalendarFormat:locale:");
+  late final _sel_descriptionWithCalendarFormat_1 =
+      _registerName1("descriptionWithCalendarFormat:");
+  late final _sel_timeZone1 = _registerName1("timeZone");
+  late final _sel_initWithString_calendarFormat_locale_1 =
+      _registerName1("initWithString:calendarFormat:locale:");
+  late final _sel_initWithString_calendarFormat_1 =
+      _registerName1("initWithString:calendarFormat:");
+  late final _sel_initWithYear_month_day_hour_minute_second_timeZone_1 =
+      _registerName1("initWithYear:month:day:hour:minute:second:timeZone:");
+  late final _sel_setCalendarFormat_1 = _registerName1("setCalendarFormat:");
+  void _objc_msgSend_186(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> format,
+  ) {
+    return __objc_msgSend_186(
+      obj,
+      sel,
+      format,
+    );
+  }
+
+  late final __objc_msgSend_186Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_186 = __objc_msgSend_186Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_setTimeZone_1 = _registerName1("setTimeZone:");
+  void _objc_msgSend_187(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> aTimeZone,
+  ) {
+    return __objc_msgSend_187(
+      obj,
+      sel,
+      aTimeZone,
+    );
+  }
+
+  late final __objc_msgSend_187Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_187 = __objc_msgSend_187Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_years_months_days_hours_minutes_seconds_sinceDate_1 =
+      _registerName1("years:months:days:hours:minutes:seconds:sinceDate:");
+  void _objc_msgSend_188(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<NSInteger> yp,
+    ffi.Pointer<NSInteger> mop,
+    ffi.Pointer<NSInteger> dp,
+    ffi.Pointer<NSInteger> hp,
+    ffi.Pointer<NSInteger> mip,
+    ffi.Pointer<NSInteger> sp,
+    ffi.Pointer<ObjCObject> date,
+  ) {
+    return __objc_msgSend_188(
+      obj,
+      sel,
+      yp,
+      mop,
+      dp,
+      hp,
+      mip,
+      sp,
+      date,
+    );
+  }
+
+  late final __objc_msgSend_188Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<NSInteger>,
+              ffi.Pointer<NSInteger>,
+              ffi.Pointer<NSInteger>,
+              ffi.Pointer<NSInteger>,
+              ffi.Pointer<NSInteger>,
+              ffi.Pointer<NSInteger>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_188 = __objc_msgSend_188Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<NSInteger>,
+          ffi.Pointer<NSInteger>,
+          ffi.Pointer<NSInteger>,
+          ffi.Pointer<NSInteger>,
+          ffi.Pointer<NSInteger>,
+          ffi.Pointer<NSInteger>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dateWithCalendarFormat_timeZone_1 =
+      _registerName1("dateWithCalendarFormat:timeZone:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_189(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> format,
+    ffi.Pointer<ObjCObject> aTimeZone,
+  ) {
+    return __objc_msgSend_189(
+      obj,
+      sel,
+      format,
+      aTimeZone,
+    );
+  }
+
+  late final __objc_msgSend_189Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_189 = __objc_msgSend_189Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_descriptionWithCalendarFormat_timeZone_locale_1 =
+      _registerName1("descriptionWithCalendarFormat:timeZone:locale:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_190(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> format,
+    ffi.Pointer<ObjCObject> aTimeZone,
+    ffi.Pointer<ObjCObject> locale,
+  ) {
+    return __objc_msgSend_190(
+      obj,
+      sel,
+      format,
+      aTimeZone,
+      locale,
+    );
+  }
+
+  late final __objc_msgSend_190Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_190 = __objc_msgSend_190Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_fileModificationDate1 =
+      _registerName1("fileModificationDate");
+  late final _sel_fileType1 = _registerName1("fileType");
+  late final _sel_filePosixPermissions1 =
+      _registerName1("filePosixPermissions");
+  late final _sel_fileOwnerAccountName1 =
+      _registerName1("fileOwnerAccountName");
+  late final _sel_fileGroupOwnerAccountName1 =
+      _registerName1("fileGroupOwnerAccountName");
+  late final _sel_fileSystemNumber1 = _registerName1("fileSystemNumber");
+  late final _sel_fileSystemFileNumber1 =
+      _registerName1("fileSystemFileNumber");
+  late final _sel_fileExtensionHidden1 = _registerName1("fileExtensionHidden");
+  late final _sel_fileHFSCreatorCode1 = _registerName1("fileHFSCreatorCode");
+  int _objc_msgSend_191(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_191(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_191Ptr = _lookup<
+      ffi.NativeFunction<
+          OSType Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_191 = __objc_msgSend_191Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_fileHFSTypeCode1 = _registerName1("fileHFSTypeCode");
+  late final _sel_fileIsImmutable1 = _registerName1("fileIsImmutable");
+  late final _sel_fileIsAppendOnly1 = _registerName1("fileIsAppendOnly");
+  late final _sel_fileCreationDate1 = _registerName1("fileCreationDate");
+  late final _sel_fileOwnerAccountID1 = _registerName1("fileOwnerAccountID");
+  ffi.Pointer<ObjCObject> _objc_msgSend_192(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_192(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_192Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_192 = __objc_msgSend_192Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_fileGroupOwnerAccountID1 =
+      _registerName1("fileGroupOwnerAccountID");
+  late final _sel_predicateWithBlock_1 = _registerName1("predicateWithBlock:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_193(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_193(
+      obj,
+      sel,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_193Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_193 = __objc_msgSend_193Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_predicateFormat1 = _registerName1("predicateFormat");
+  late final _sel_predicateWithSubstitutionVariables_1 =
+      _registerName1("predicateWithSubstitutionVariables:");
+  late final _sel_evaluateWithObject_1 = _registerName1("evaluateWithObject:");
+  late final _sel_evaluateWithObject_substitutionVariables_1 =
+      _registerName1("evaluateWithObject:substitutionVariables:");
+  bool _objc_msgSend_194(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> object,
+    ffi.Pointer<ObjCObject> bindings,
+  ) {
+    return __objc_msgSend_194(
+      obj,
+      sel,
+      object,
+      bindings,
+    );
+  }
+
+  late final __objc_msgSend_194Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_194 = __objc_msgSend_194Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_allowEvaluation1 = _registerName1("allowEvaluation");
+  late final _sel_filteredArrayUsingPredicate_1 =
+      _registerName1("filteredArrayUsingPredicate:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_195(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> predicate,
+  ) {
+    return __objc_msgSend_195(
+      obj,
+      sel,
+      predicate,
+    );
+  }
+
+  late final __objc_msgSend_195Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_195 = __objc_msgSend_195Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithChar_1 = _registerName1("initWithChar:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_196(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_196(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_196Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Char)>>('objc_msgSend');
+  late final __objc_msgSend_196 = __objc_msgSend_196Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_initWithUnsignedChar_1 =
+      _registerName1("initWithUnsignedChar:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_197(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_197(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_197Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.UnsignedChar)>>('objc_msgSend');
+  late final __objc_msgSend_197 = __objc_msgSend_197Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_initWithShort_1 = _registerName1("initWithShort:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_198(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_198(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_198Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Short)>>('objc_msgSend');
+  late final __objc_msgSend_198 = __objc_msgSend_198Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_initWithUnsignedShort_1 =
+      _registerName1("initWithUnsignedShort:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_199(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_199(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_199Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.UnsignedShort)>>('objc_msgSend');
+  late final __objc_msgSend_199 = __objc_msgSend_199Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_initWithInt_1 = _registerName1("initWithInt:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_200(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_200(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_200Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Int)>>('objc_msgSend');
+  late final __objc_msgSend_200 = __objc_msgSend_200Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_initWithUnsignedInt_1 =
+      _registerName1("initWithUnsignedInt:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_201(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_201(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_201Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.UnsignedInt)>>('objc_msgSend');
+  late final __objc_msgSend_201 = __objc_msgSend_201Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_initWithLong_1 = _registerName1("initWithLong:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_202(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_202(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_202Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Long)>>('objc_msgSend');
+  late final __objc_msgSend_202 = __objc_msgSend_202Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_initWithUnsignedLong_1 =
+      _registerName1("initWithUnsignedLong:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_203(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_203(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_203Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.UnsignedLong)>>('objc_msgSend');
+  late final __objc_msgSend_203 = __objc_msgSend_203Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_initWithLongLong_1 = _registerName1("initWithLongLong:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_204(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_204(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_204Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.LongLong)>>('objc_msgSend');
+  late final __objc_msgSend_204 = __objc_msgSend_204Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_initWithUnsignedLongLong_1 =
+      _registerName1("initWithUnsignedLongLong:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_205(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_205(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_205Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.UnsignedLongLong)>>('objc_msgSend');
+  late final __objc_msgSend_205 = __objc_msgSend_205Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_initWithFloat_1 = _registerName1("initWithFloat:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_206(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    double value,
+  ) {
+    return __objc_msgSend_206(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_206Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Float)>>('objc_msgSend');
+  late final __objc_msgSend_206 = __objc_msgSend_206Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, double)>();
+
+  late final _sel_initWithDouble_1 = _registerName1("initWithDouble:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_207(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    double value,
+  ) {
+    return __objc_msgSend_207(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_207Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Double)>>('objc_msgSend');
+  late final __objc_msgSend_207 = __objc_msgSend_207Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, double)>();
+
+  late final _sel_initWithBool_1 = _registerName1("initWithBool:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_208(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    bool value,
+  ) {
+    return __objc_msgSend_208(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_208Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_208 = __objc_msgSend_208Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, bool)>();
+
+  late final _sel_initWithInteger_1 = _registerName1("initWithInteger:");
+  late final _sel_initWithUnsignedInteger_1 =
+      _registerName1("initWithUnsignedInteger:");
+  late final _sel_charValue1 = _registerName1("charValue");
+  int _objc_msgSend_209(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_209(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_209Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Char Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_209 = __objc_msgSend_209Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_unsignedCharValue1 = _registerName1("unsignedCharValue");
+  int _objc_msgSend_210(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_210(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_210Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.UnsignedChar Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_210 = __objc_msgSend_210Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_shortValue1 = _registerName1("shortValue");
+  int _objc_msgSend_211(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_211(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_211Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Short Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_211 = __objc_msgSend_211Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_unsignedShortValue1 = _registerName1("unsignedShortValue");
+  int _objc_msgSend_212(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_212(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_212Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.UnsignedShort Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_212 = __objc_msgSend_212Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_intValue1 = _registerName1("intValue");
+  int _objc_msgSend_213(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_213(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_213Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_213 = __objc_msgSend_213Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_unsignedIntValue1 = _registerName1("unsignedIntValue");
+  late final _sel_longValue1 = _registerName1("longValue");
+  late final _sel_unsignedLongValue1 = _registerName1("unsignedLongValue");
+  late final _sel_longLongValue1 = _registerName1("longLongValue");
+  int _objc_msgSend_214(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_214(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_214Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.LongLong Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_214 = __objc_msgSend_214Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_unsignedLongLongValue1 =
+      _registerName1("unsignedLongLongValue");
+  late final _sel_floatValue1 = _registerName1("floatValue");
+  double _objc_msgSend_215(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_215(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_215Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Float Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_215 = __objc_msgSend_215Ptr.asFunction<
+      double Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_doubleValue1 = _registerName1("doubleValue");
+  late final _sel_boolValue1 = _registerName1("boolValue");
+  late final _sel_integerValue1 = _registerName1("integerValue");
+  late final _sel_unsignedIntegerValue1 =
+      _registerName1("unsignedIntegerValue");
+  late final _sel_stringValue1 = _registerName1("stringValue");
+  int _objc_msgSend_216(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> otherNumber,
+  ) {
+    return __objc_msgSend_216(
+      obj,
+      sel,
+      otherNumber,
+    );
+  }
+
+  late final __objc_msgSend_216Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_216 = __objc_msgSend_216Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_isEqualToNumber_1 = _registerName1("isEqualToNumber:");
+  bool _objc_msgSend_217(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> number,
+  ) {
+    return __objc_msgSend_217(
+      obj,
+      sel,
+      number,
+    );
+  }
+
+  late final __objc_msgSend_217Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_217 = __objc_msgSend_217Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_numberWithChar_1 = _registerName1("numberWithChar:");
+  late final _sel_numberWithUnsignedChar_1 =
+      _registerName1("numberWithUnsignedChar:");
+  late final _sel_numberWithShort_1 = _registerName1("numberWithShort:");
+  late final _sel_numberWithUnsignedShort_1 =
+      _registerName1("numberWithUnsignedShort:");
+  late final _sel_numberWithInt_1 = _registerName1("numberWithInt:");
+  late final _sel_numberWithUnsignedInt_1 =
+      _registerName1("numberWithUnsignedInt:");
+  late final _sel_numberWithLong_1 = _registerName1("numberWithLong:");
+  late final _sel_numberWithUnsignedLong_1 =
+      _registerName1("numberWithUnsignedLong:");
+  late final _sel_numberWithLongLong_1 = _registerName1("numberWithLongLong:");
+  late final _sel_numberWithUnsignedLongLong_1 =
+      _registerName1("numberWithUnsignedLongLong:");
+  late final _sel_numberWithFloat_1 = _registerName1("numberWithFloat:");
+  late final _sel_numberWithDouble_1 = _registerName1("numberWithDouble:");
+  late final _sel_numberWithBool_1 = _registerName1("numberWithBool:");
+  late final _sel_numberWithInteger_1 = _registerName1("numberWithInteger:");
+  late final _sel_numberWithUnsignedInteger_1 =
+      _registerName1("numberWithUnsignedInteger:");
+  late final _sel_port1 = _registerName1("port");
+  late final _sel_user1 = _registerName1("user");
+  late final _sel_password1 = _registerName1("password");
+  late final _sel_path1 = _registerName1("path");
+  late final _sel_fragment1 = _registerName1("fragment");
+  late final _sel_parameterString1 = _registerName1("parameterString");
+  late final _sel_query1 = _registerName1("query");
+  late final _sel_relativePath1 = _registerName1("relativePath");
+  late final _sel_hasDirectoryPath1 = _registerName1("hasDirectoryPath");
+  late final _sel_getFileSystemRepresentation_maxLength_1 =
+      _registerName1("getFileSystemRepresentation:maxLength:");
+  bool _objc_msgSend_218(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Char> buffer,
+    int maxBufferLength,
+  ) {
+    return __objc_msgSend_218(
+      obj,
+      sel,
+      buffer,
+      maxBufferLength,
+    );
+  }
+
+  late final __objc_msgSend_218Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Char>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_218 = __objc_msgSend_218Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Char>, int)>();
+
+  late final _sel_fileSystemRepresentation1 =
+      _registerName1("fileSystemRepresentation");
+  late final _sel_isFileURL1 = _registerName1("isFileURL");
+  late final _sel_standardizedURL1 = _registerName1("standardizedURL");
+  late final _sel_checkResourceIsReachableAndReturnError_1 =
+      _registerName1("checkResourceIsReachableAndReturnError:");
+  bool _objc_msgSend_219(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_219(
+      obj,
+      sel,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_219Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_219 = __objc_msgSend_219Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_isFileReferenceURL1 = _registerName1("isFileReferenceURL");
+  late final _sel_fileReferenceURL1 = _registerName1("fileReferenceURL");
+  late final _sel_filePathURL1 = _registerName1("filePathURL");
+  late final _sel_getResourceValue_forKey_error_1 =
+      _registerName1("getResourceValue:forKey:error:");
+  bool _objc_msgSend_220(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> value,
+    NSURLResourceKey key,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_220(
+      obj,
+      sel,
+      value,
+      key,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_220Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              NSURLResourceKey,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_220 = __objc_msgSend_220Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          NSURLResourceKey,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_getPromisedItemResourceValue_forKey_error_1 =
+      _registerName1("getPromisedItemResourceValue:forKey:error:");
+  late final _sel_promisedItemResourceValuesForKeys_error_1 =
+      _registerName1("promisedItemResourceValuesForKeys:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_221(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> keys,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_221(
+      obj,
+      sel,
+      keys,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_221Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_221 = __objc_msgSend_221Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_checkPromisedItemIsReachableAndReturnError_1 =
+      _registerName1("checkPromisedItemIsReachableAndReturnError:");
+  late final _sel_fileURLWithPathComponents_1 =
+      _registerName1("fileURLWithPathComponents:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_222(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> components,
+  ) {
+    return __objc_msgSend_222(
+      obj,
+      sel,
+      components,
+    );
+  }
+
+  late final __objc_msgSend_222Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_222 = __objc_msgSend_222Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_pathComponents1 = _registerName1("pathComponents");
+  late final _sel_lastPathComponent1 = _registerName1("lastPathComponent");
+  late final _sel_pathExtension1 = _registerName1("pathExtension");
+  late final _sel_URLByAppendingPathComponent_1 =
+      _registerName1("URLByAppendingPathComponent:");
+  late final _sel_URLByAppendingPathComponent_isDirectory_1 =
+      _registerName1("URLByAppendingPathComponent:isDirectory:");
+  late final _sel_URLByDeletingLastPathComponent1 =
+      _registerName1("URLByDeletingLastPathComponent");
+  late final _sel_URLByAppendingPathExtension_1 =
+      _registerName1("URLByAppendingPathExtension:");
+  late final _sel_URLByDeletingPathExtension1 =
+      _registerName1("URLByDeletingPathExtension");
+  late final _sel_URLByStandardizingPath1 =
+      _registerName1("URLByStandardizingPath");
+  late final _sel_URLByResolvingSymlinksInPath1 =
+      _registerName1("URLByResolvingSymlinksInPath");
+  late final _sel_resourceDataUsingCache_1 =
+      _registerName1("resourceDataUsingCache:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_223(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    bool shouldUseCache,
+  ) {
+    return __objc_msgSend_223(
+      obj,
+      sel,
+      shouldUseCache,
+    );
+  }
+
+  late final __objc_msgSend_223Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_223 = __objc_msgSend_223Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, bool)>();
+
+  late final _sel_loadResourceDataNotifyingClient_usingCache_1 =
+      _registerName1("loadResourceDataNotifyingClient:usingCache:");
+  void _objc_msgSend_224(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> client,
+    bool shouldUseCache,
+  ) {
+    return __objc_msgSend_224(
+      obj,
+      sel,
+      client,
+      shouldUseCache,
+    );
+  }
+
+  late final __objc_msgSend_224Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_224 = __objc_msgSend_224Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, bool)>();
+
+  late final _sel_propertyForKey_1 = _registerName1("propertyForKey:");
+  late final _sel_setResourceData_1 = _registerName1("setResourceData:");
+  late final _sel_setProperty_forKey_1 = _registerName1("setProperty:forKey:");
+  bool _objc_msgSend_225(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> property,
+    ffi.Pointer<ObjCObject> propertyKey,
+  ) {
+    return __objc_msgSend_225(
+      obj,
+      sel,
+      property,
+      propertyKey,
+    );
+  }
+
+  late final __objc_msgSend_225Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_225 = __objc_msgSend_225Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSURLHandle1 = _getClass1("NSURLHandle");
+  late final _sel_registerURLHandleClass_1 =
+      _registerName1("registerURLHandleClass:");
+  late final _sel_URLHandleClassForURL_1 =
+      _registerName1("URLHandleClassForURL:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_226(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> anURL,
+  ) {
+    return __objc_msgSend_226(
+      obj,
+      sel,
+      anURL,
+    );
+  }
+
+  late final __objc_msgSend_226Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_226 = __objc_msgSend_226Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_status1 = _registerName1("status");
+  int _objc_msgSend_227(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_227(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_227Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_227 = __objc_msgSend_227Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_failureReason1 = _registerName1("failureReason");
+  late final _sel_addClient_1 = _registerName1("addClient:");
+  late final _sel_removeClient_1 = _registerName1("removeClient:");
+  late final _sel_loadInBackground1 = _registerName1("loadInBackground");
+  late final _sel_cancelLoadInBackground1 =
+      _registerName1("cancelLoadInBackground");
+  late final _sel_resourceData1 = _registerName1("resourceData");
+  late final _sel_availableResourceData1 =
+      _registerName1("availableResourceData");
+  late final _sel_expectedResourceDataSize1 =
+      _registerName1("expectedResourceDataSize");
+  late final _sel_flushCachedData1 = _registerName1("flushCachedData");
+  late final _sel_backgroundLoadDidFailWithReason_1 =
+      _registerName1("backgroundLoadDidFailWithReason:");
+  late final _sel_didLoadBytes_loadComplete_1 =
+      _registerName1("didLoadBytes:loadComplete:");
+  void _objc_msgSend_228(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> newBytes,
+    bool yorn,
+  ) {
+    return __objc_msgSend_228(
+      obj,
+      sel,
+      newBytes,
+      yorn,
+    );
+  }
+
+  late final __objc_msgSend_228Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_228 = __objc_msgSend_228Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, bool)>();
+
+  late final _sel_canInitWithURL_1 = _registerName1("canInitWithURL:");
+  bool _objc_msgSend_229(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> anURL,
+  ) {
+    return __objc_msgSend_229(
+      obj,
+      sel,
+      anURL,
+    );
+  }
+
+  late final __objc_msgSend_229Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_229 = __objc_msgSend_229Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_cachedHandleForURL_1 = _registerName1("cachedHandleForURL:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_230(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> anURL,
+  ) {
+    return __objc_msgSend_230(
+      obj,
+      sel,
+      anURL,
+    );
+  }
+
+  late final __objc_msgSend_230Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_230 = __objc_msgSend_230Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithURL_cached_1 = _registerName1("initWithURL:cached:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_231(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> anURL,
+    bool willCache,
+  ) {
+    return __objc_msgSend_231(
+      obj,
+      sel,
+      anURL,
+      willCache,
+    );
+  }
+
+  late final __objc_msgSend_231Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_231 = __objc_msgSend_231Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>, bool)>();
+
+  late final _sel_propertyForKeyIfAvailable_1 =
+      _registerName1("propertyForKeyIfAvailable:");
+  late final _sel_writeProperty_forKey_1 =
+      _registerName1("writeProperty:forKey:");
+  late final _sel_writeData_1 = _registerName1("writeData:");
+  late final _sel_loadInForeground1 = _registerName1("loadInForeground");
+  late final _sel_beginLoadInBackground1 =
+      _registerName1("beginLoadInBackground");
+  late final _sel_endLoadInBackground1 = _registerName1("endLoadInBackground");
+  late final _sel_URLHandleUsingCache_1 =
+      _registerName1("URLHandleUsingCache:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_232(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    bool shouldUseCache,
+  ) {
+    return __objc_msgSend_232(
+      obj,
+      sel,
+      shouldUseCache,
+    );
+  }
+
+  late final __objc_msgSend_232Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_232 = __objc_msgSend_232Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, bool)>();
+
+  late final _sel_writeToFile_options_error_1 =
+      _registerName1("writeToFile:options:error:");
+  bool _objc_msgSend_233(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    int writeOptionsMask,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> errorPtr,
+  ) {
+    return __objc_msgSend_233(
+      obj,
+      sel,
+      path,
+      writeOptionsMask,
+      errorPtr,
+    );
+  }
+
+  late final __objc_msgSend_233Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_233 = __objc_msgSend_233Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_writeToURL_options_error_1 =
+      _registerName1("writeToURL:options:error:");
+  bool _objc_msgSend_234(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    int writeOptionsMask,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> errorPtr,
+  ) {
+    return __objc_msgSend_234(
+      obj,
+      sel,
+      url,
+      writeOptionsMask,
+      errorPtr,
+    );
+  }
+
+  late final __objc_msgSend_234Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_234 = __objc_msgSend_234Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_rangeOfData_options_range_1 =
+      _registerName1("rangeOfData:options:range:");
+  NSRange _objc_msgSend_235(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> dataToFind,
+    int mask,
+    NSRange searchRange,
+  ) {
+    return __objc_msgSend_235(
+      obj,
+      sel,
+      dataToFind,
+      mask,
+      searchRange,
+    );
+  }
+
+  late final __objc_msgSend_235Ptr = _lookup<
+      ffi.NativeFunction<
+          NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Int32, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_235 = __objc_msgSend_235Ptr.asFunction<
+      NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, NSRange)>();
+
+  late final _sel_enumerateByteRangesUsingBlock_1 =
+      _registerName1("enumerateByteRangesUsingBlock:");
+  void _objc_msgSend_236(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_236(
+      obj,
+      sel,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_236Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_236 = __objc_msgSend_236Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_dataWithBytes_length_1 =
+      _registerName1("dataWithBytes:length:");
+  instancetype _objc_msgSend_237(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Void> bytes,
+    int length,
+  ) {
+    return __objc_msgSend_237(
+      obj,
+      sel,
+      bytes,
+      length,
+    );
+  }
+
+  late final __objc_msgSend_237Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Void>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_237 = __objc_msgSend_237Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Void>, int)>();
+
+  late final _sel_dataWithBytesNoCopy_length_1 =
+      _registerName1("dataWithBytesNoCopy:length:");
+  late final _sel_dataWithBytesNoCopy_length_freeWhenDone_1 =
+      _registerName1("dataWithBytesNoCopy:length:freeWhenDone:");
+  instancetype _objc_msgSend_238(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Void> bytes,
+    int length,
+    bool b,
+  ) {
+    return __objc_msgSend_238(
+      obj,
+      sel,
+      bytes,
+      length,
+      b,
+    );
+  }
+
+  late final __objc_msgSend_238Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Void>, NSUInteger, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_238 = __objc_msgSend_238Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Void>, int, bool)>();
+
+  late final _sel_dataWithContentsOfFile_options_error_1 =
+      _registerName1("dataWithContentsOfFile:options:error:");
+  instancetype _objc_msgSend_239(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    int readOptionsMask,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> errorPtr,
+  ) {
+    return __objc_msgSend_239(
+      obj,
+      sel,
+      path,
+      readOptionsMask,
+      errorPtr,
+    );
+  }
+
+  late final __objc_msgSend_239Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_239 = __objc_msgSend_239Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_dataWithContentsOfURL_options_error_1 =
+      _registerName1("dataWithContentsOfURL:options:error:");
+  instancetype _objc_msgSend_240(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    int readOptionsMask,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> errorPtr,
+  ) {
+    return __objc_msgSend_240(
+      obj,
+      sel,
+      url,
+      readOptionsMask,
+      errorPtr,
+    );
+  }
+
+  late final __objc_msgSend_240Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_240 = __objc_msgSend_240Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_dataWithContentsOfFile_1 =
+      _registerName1("dataWithContentsOfFile:");
+  late final _sel_dataWithContentsOfURL_1 =
+      _registerName1("dataWithContentsOfURL:");
+  late final _sel_initWithBytes_length_1 =
+      _registerName1("initWithBytes:length:");
+  late final _sel_initWithBytesNoCopy_length_1 =
+      _registerName1("initWithBytesNoCopy:length:");
+  late final _sel_initWithBytesNoCopy_length_freeWhenDone_1 =
+      _registerName1("initWithBytesNoCopy:length:freeWhenDone:");
+  late final _sel_initWithBytesNoCopy_length_deallocator_1 =
+      _registerName1("initWithBytesNoCopy:length:deallocator:");
+  instancetype _objc_msgSend_241(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Void> bytes,
+    int length,
+    ffi.Pointer<_ObjCBlock> deallocator,
+  ) {
+    return __objc_msgSend_241(
+      obj,
+      sel,
+      bytes,
+      length,
+      deallocator,
+    );
+  }
+
+  late final __objc_msgSend_241Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Void>,
+              NSUInteger,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_241 = __objc_msgSend_241Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Void>, int, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_initWithContentsOfFile_options_error_1 =
+      _registerName1("initWithContentsOfFile:options:error:");
+  late final _sel_initWithContentsOfURL_options_error_1 =
+      _registerName1("initWithContentsOfURL:options:error:");
+  late final _sel_initWithData_1 = _registerName1("initWithData:");
+  instancetype _objc_msgSend_242(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> data,
+  ) {
+    return __objc_msgSend_242(
+      obj,
+      sel,
+      data,
+    );
+  }
+
+  late final __objc_msgSend_242Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_242 = __objc_msgSend_242Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dataWithData_1 = _registerName1("dataWithData:");
+  late final _sel_initWithBase64EncodedString_options_1 =
+      _registerName1("initWithBase64EncodedString:options:");
+  instancetype _objc_msgSend_243(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> base64String,
+    int options,
+  ) {
+    return __objc_msgSend_243(
+      obj,
+      sel,
+      base64String,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_243Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_243 = __objc_msgSend_243Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_base64EncodedStringWithOptions_1 =
+      _registerName1("base64EncodedStringWithOptions:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_244(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int options,
+  ) {
+    return __objc_msgSend_244(
+      obj,
+      sel,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_244Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_244 = __objc_msgSend_244Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_initWithBase64EncodedData_options_1 =
+      _registerName1("initWithBase64EncodedData:options:");
+  instancetype _objc_msgSend_245(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> base64Data,
+    int options,
+  ) {
+    return __objc_msgSend_245(
+      obj,
+      sel,
+      base64Data,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_245Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_245 = __objc_msgSend_245Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_base64EncodedDataWithOptions_1 =
+      _registerName1("base64EncodedDataWithOptions:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_246(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int options,
+  ) {
+    return __objc_msgSend_246(
+      obj,
+      sel,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_246Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_246 = __objc_msgSend_246Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_decompressedDataUsingAlgorithm_error_1 =
+      _registerName1("decompressedDataUsingAlgorithm:error:");
+  instancetype _objc_msgSend_247(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int algorithm,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_247(
+      obj,
+      sel,
+      algorithm,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_247Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_247 = __objc_msgSend_247Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_compressedDataUsingAlgorithm_error_1 =
+      _registerName1("compressedDataUsingAlgorithm:error:");
+  late final _sel_getBytes_1 = _registerName1("getBytes:");
+  late final _sel_dataWithContentsOfMappedFile_1 =
+      _registerName1("dataWithContentsOfMappedFile:");
+  late final _sel_initWithContentsOfMappedFile_1 =
+      _registerName1("initWithContentsOfMappedFile:");
+  late final _sel_initWithBase64Encoding_1 =
+      _registerName1("initWithBase64Encoding:");
+  late final _sel_base64Encoding1 = _registerName1("base64Encoding");
+  late final _sel_encodeDataObject_1 = _registerName1("encodeDataObject:");
+  void _objc_msgSend_248(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> data,
+  ) {
+    return __objc_msgSend_248(
+      obj,
+      sel,
+      data,
+    );
+  }
+
+  late final __objc_msgSend_248Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_248 = __objc_msgSend_248Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_decodeDataObject1 = _registerName1("decodeDataObject");
+  late final _sel_decodeValueOfObjCType_at_size_1 =
+      _registerName1("decodeValueOfObjCType:at:size:");
+  void _objc_msgSend_249(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Char> type,
+    ffi.Pointer<ffi.Void> data,
+    int size,
+  ) {
+    return __objc_msgSend_249(
+      obj,
+      sel,
+      type,
+      data,
+      size,
+    );
+  }
+
+  late final __objc_msgSend_249Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Void>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_249 = __objc_msgSend_249Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Char>, ffi.Pointer<ffi.Void>, int)>();
+
+  late final _sel_versionForClassName_1 =
+      _registerName1("versionForClassName:");
+  int _objc_msgSend_250(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> className,
+  ) {
+    return __objc_msgSend_250(
+      obj,
+      sel,
+      className,
+    );
+  }
+
+  late final __objc_msgSend_250Ptr = _lookup<
+      ffi.NativeFunction<
+          NSInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_250 = __objc_msgSend_250Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_encodeObject_1 = _registerName1("encodeObject:");
+  late final _sel_encodeRootObject_1 = _registerName1("encodeRootObject:");
+  late final _sel_encodeBycopyObject_1 = _registerName1("encodeBycopyObject:");
+  late final _sel_encodeByrefObject_1 = _registerName1("encodeByrefObject:");
+  late final _sel_encodeConditionalObject_1 =
+      _registerName1("encodeConditionalObject:");
+  late final _sel_encodeValuesOfObjCTypes_1 =
+      _registerName1("encodeValuesOfObjCTypes:");
+  void _objc_msgSend_251(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Char> types,
+  ) {
+    return __objc_msgSend_251(
+      obj,
+      sel,
+      types,
+    );
+  }
+
+  late final __objc_msgSend_251Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Char>)>>('objc_msgSend');
+  late final __objc_msgSend_251 = __objc_msgSend_251Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Char>)>();
+
+  late final _sel_encodeArrayOfObjCType_count_at_1 =
+      _registerName1("encodeArrayOfObjCType:count:at:");
+  void _objc_msgSend_252(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Char> type,
+    int count,
+    ffi.Pointer<ffi.Void> array,
+  ) {
+    return __objc_msgSend_252(
+      obj,
+      sel,
+      type,
+      count,
+      array,
+    );
+  }
+
+  late final __objc_msgSend_252Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Char>,
+              NSUInteger,
+              ffi.Pointer<ffi.Void>)>>('objc_msgSend');
+  late final __objc_msgSend_252 = __objc_msgSend_252Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Char>, int, ffi.Pointer<ffi.Void>)>();
+
+  late final _sel_encodeBytes_length_1 = _registerName1("encodeBytes:length:");
+  late final _sel_decodeObject1 = _registerName1("decodeObject");
+  late final _sel_decodeTopLevelObjectAndReturnError_1 =
+      _registerName1("decodeTopLevelObjectAndReturnError:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_253(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_253(
+      obj,
+      sel,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_253Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_253 = __objc_msgSend_253Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_decodeValuesOfObjCTypes_1 =
+      _registerName1("decodeValuesOfObjCTypes:");
+  late final _sel_decodeArrayOfObjCType_count_at_1 =
+      _registerName1("decodeArrayOfObjCType:count:at:");
+  late final _sel_decodeBytesWithReturnedLength_1 =
+      _registerName1("decodeBytesWithReturnedLength:");
+  ffi.Pointer<ffi.Void> _objc_msgSend_254(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<NSUInteger> lengthp,
+  ) {
+    return __objc_msgSend_254(
+      obj,
+      sel,
+      lengthp,
+    );
+  }
+
+  late final __objc_msgSend_254Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ffi.Void> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<NSUInteger>)>>('objc_msgSend');
+  late final __objc_msgSend_254 = __objc_msgSend_254Ptr.asFunction<
+      ffi.Pointer<ffi.Void> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<NSUInteger>)>();
+
+  late final _sel_encodePropertyList_1 = _registerName1("encodePropertyList:");
+  late final _sel_decodePropertyList1 = _registerName1("decodePropertyList");
+  late final _sel_setObjectZone_1 = _registerName1("setObjectZone:");
+  void _objc_msgSend_255(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<NSZone> zone,
+  ) {
+    return __objc_msgSend_255(
+      obj,
+      sel,
+      zone,
+    );
+  }
+
+  late final __objc_msgSend_255Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<NSZone>)>>('objc_msgSend');
+  late final __objc_msgSend_255 = __objc_msgSend_255Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<NSZone>)>();
+
+  late final _sel_objectZone1 = _registerName1("objectZone");
+  ffi.Pointer<NSZone> _objc_msgSend_256(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_256(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_256Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<NSZone> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_256 = __objc_msgSend_256Ptr.asFunction<
+      ffi.Pointer<NSZone> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_systemVersion1 = _registerName1("systemVersion");
+  late final _sel_allowsKeyedCoding1 = _registerName1("allowsKeyedCoding");
+  late final _sel_encodeObject_forKey_1 =
+      _registerName1("encodeObject:forKey:");
+  late final _sel_encodeConditionalObject_forKey_1 =
+      _registerName1("encodeConditionalObject:forKey:");
+  late final _sel_encodeBool_forKey_1 = _registerName1("encodeBool:forKey:");
+  void _objc_msgSend_257(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    bool value,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_257(
+      obj,
+      sel,
+      value,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_257Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Bool, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_257 = __objc_msgSend_257Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, bool,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_encodeInt_forKey_1 = _registerName1("encodeInt:forKey:");
+  void _objc_msgSend_258(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_258(
+      obj,
+      sel,
+      value,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_258Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_258 = __objc_msgSend_258Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_encodeInt32_forKey_1 = _registerName1("encodeInt32:forKey:");
+  void _objc_msgSend_259(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_259(
+      obj,
+      sel,
+      value,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_259Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_259 = __objc_msgSend_259Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_encodeInt64_forKey_1 = _registerName1("encodeInt64:forKey:");
+  void _objc_msgSend_260(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_260(
+      obj,
+      sel,
+      value,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_260Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int64, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_260 = __objc_msgSend_260Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_encodeFloat_forKey_1 = _registerName1("encodeFloat:forKey:");
+  void _objc_msgSend_261(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    double value,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_261(
+      obj,
+      sel,
+      value,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_261Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Float, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_261 = __objc_msgSend_261Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, double,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_encodeDouble_forKey_1 =
+      _registerName1("encodeDouble:forKey:");
+  void _objc_msgSend_262(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    double value,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_262(
+      obj,
+      sel,
+      value,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_262Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Double, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_262 = __objc_msgSend_262Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, double,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_encodeBytes_length_forKey_1 =
+      _registerName1("encodeBytes:length:forKey:");
+  void _objc_msgSend_263(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Uint8> bytes,
+    int length,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_263(
+      obj,
+      sel,
+      bytes,
+      length,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_263Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Uint8>,
+              NSUInteger,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_263 = __objc_msgSend_263Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Uint8>, int, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_containsValueForKey_1 =
+      _registerName1("containsValueForKey:");
+  late final _sel_decodeObjectForKey_1 = _registerName1("decodeObjectForKey:");
+  late final _sel_decodeTopLevelObjectForKey_error_1 =
+      _registerName1("decodeTopLevelObjectForKey:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_264(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_264(
+      obj,
+      sel,
+      key,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_264Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_264 = __objc_msgSend_264Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_decodeBoolForKey_1 = _registerName1("decodeBoolForKey:");
+  late final _sel_decodeIntForKey_1 = _registerName1("decodeIntForKey:");
+  int _objc_msgSend_265(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_265(
+      obj,
+      sel,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_265Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_265 = __objc_msgSend_265Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_decodeInt32ForKey_1 = _registerName1("decodeInt32ForKey:");
+  int _objc_msgSend_266(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_266(
+      obj,
+      sel,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_266Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_266 = __objc_msgSend_266Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_decodeInt64ForKey_1 = _registerName1("decodeInt64ForKey:");
+  int _objc_msgSend_267(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_267(
+      obj,
+      sel,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_267Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int64 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_267 = __objc_msgSend_267Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_decodeFloatForKey_1 = _registerName1("decodeFloatForKey:");
+  double _objc_msgSend_268(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_268(
+      obj,
+      sel,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_268Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Float Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_268 = __objc_msgSend_268Ptr.asFunction<
+      double Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_decodeDoubleForKey_1 = _registerName1("decodeDoubleForKey:");
+  double _objc_msgSend_269(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_269(
+      obj,
+      sel,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_269Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Double Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_269 = __objc_msgSend_269Ptr.asFunction<
+      double Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_decodeBytesForKey_returnedLength_1 =
+      _registerName1("decodeBytesForKey:returnedLength:");
+  ffi.Pointer<ffi.Uint8> _objc_msgSend_270(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+    ffi.Pointer<NSUInteger> lengthp,
+  ) {
+    return __objc_msgSend_270(
+      obj,
+      sel,
+      key,
+      lengthp,
+    );
+  }
+
+  late final __objc_msgSend_270Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ffi.Uint8> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<NSUInteger>)>>('objc_msgSend');
+  late final __objc_msgSend_270 = __objc_msgSend_270Ptr.asFunction<
+      ffi.Pointer<ffi.Uint8> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<NSUInteger>)>();
+
+  late final _sel_encodeInteger_forKey_1 =
+      _registerName1("encodeInteger:forKey:");
+  void _objc_msgSend_271(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_271(
+      obj,
+      sel,
+      value,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_271Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSInteger, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_271 = __objc_msgSend_271Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_decodeIntegerForKey_1 =
+      _registerName1("decodeIntegerForKey:");
+  late final _sel_requiresSecureCoding1 =
+      _registerName1("requiresSecureCoding");
+  late final _sel_decodeObjectOfClass_forKey_1 =
+      _registerName1("decodeObjectOfClass:forKey:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_272(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> aClass,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_272(
+      obj,
+      sel,
+      aClass,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_272Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_272 = __objc_msgSend_272Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_decodeTopLevelObjectOfClass_forKey_error_1 =
+      _registerName1("decodeTopLevelObjectOfClass:forKey:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_273(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> aClass,
+    ffi.Pointer<ObjCObject> key,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_273(
+      obj,
+      sel,
+      aClass,
+      key,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_273Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_273 = __objc_msgSend_273Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_decodeArrayOfObjectsOfClass_forKey_1 =
+      _registerName1("decodeArrayOfObjectsOfClass:forKey:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_274(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> cls,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_274(
+      obj,
+      sel,
+      cls,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_274Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_274 = __objc_msgSend_274Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_decodeDictionaryWithKeysOfClass_objectsOfClass_forKey_1 =
+      _registerName1("decodeDictionaryWithKeysOfClass:objectsOfClass:forKey:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_275(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> keyCls,
+    ffi.Pointer<ObjCObject> objectCls,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_275(
+      obj,
+      sel,
+      keyCls,
+      objectCls,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_275Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_275 = __objc_msgSend_275Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_decodeObjectOfClasses_forKey_1 =
+      _registerName1("decodeObjectOfClasses:forKey:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_276(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> classes,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_276(
+      obj,
+      sel,
+      classes,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_276Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_276 = __objc_msgSend_276Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_decodeTopLevelObjectOfClasses_forKey_error_1 =
+      _registerName1("decodeTopLevelObjectOfClasses:forKey:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_277(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> classes,
+    ffi.Pointer<ObjCObject> key,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_277(
+      obj,
+      sel,
+      classes,
+      key,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_277Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_277 = __objc_msgSend_277Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_decodeArrayOfObjectsOfClasses_forKey_1 =
+      _registerName1("decodeArrayOfObjectsOfClasses:forKey:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_278(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> classes,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_278(
+      obj,
+      sel,
+      classes,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_278Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_278 = __objc_msgSend_278Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_decodeDictionaryWithKeysOfClasses_objectsOfClasses_forKey_1 =
+      _registerName1(
+          "decodeDictionaryWithKeysOfClasses:objectsOfClasses:forKey:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_279(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> keyClasses,
+    ffi.Pointer<ObjCObject> objectClasses,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_279(
+      obj,
+      sel,
+      keyClasses,
+      objectClasses,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_279Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_279 = __objc_msgSend_279Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_decodePropertyListForKey_1 =
+      _registerName1("decodePropertyListForKey:");
+  late final _sel_allowedClasses1 = _registerName1("allowedClasses");
+  ffi.Pointer<ObjCObject> _objc_msgSend_280(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_280(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_280Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_280 = __objc_msgSend_280Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_failWithError_1 = _registerName1("failWithError:");
+  void _objc_msgSend_281(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> error,
+  ) {
+    return __objc_msgSend_281(
+      obj,
+      sel,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_281Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_281 = __objc_msgSend_281Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_decodingFailurePolicy1 =
+      _registerName1("decodingFailurePolicy");
+  int _objc_msgSend_282(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_282(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_282Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_282 = __objc_msgSend_282Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_error1 = _registerName1("error");
+  ffi.Pointer<ObjCObject> _objc_msgSend_283(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_283(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_283Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_283 = __objc_msgSend_283Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_encodeNXObject_1 = _registerName1("encodeNXObject:");
+  late final _sel_decodeNXObject1 = _registerName1("decodeNXObject");
+  late final _sel_decodeValueOfObjCType_at_1 =
+      _registerName1("decodeValueOfObjCType:at:");
+  late final _sel_encodePoint_1 = _registerName1("encodePoint:");
+  void _objc_msgSend_284(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSPoint point,
+  ) {
+    return __objc_msgSend_284(
+      obj,
+      sel,
+      point,
+    );
+  }
+
+  late final __objc_msgSend_284Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSPoint)>>('objc_msgSend');
+  late final __objc_msgSend_284 = __objc_msgSend_284Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSPoint)>();
+
+  late final _sel_decodePoint1 = _registerName1("decodePoint");
+  late final _sel_encodeSize_1 = _registerName1("encodeSize:");
+  void _objc_msgSend_285(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSSize size,
+  ) {
+    return __objc_msgSend_285(
+      obj,
+      sel,
+      size,
+    );
+  }
+
+  late final __objc_msgSend_285Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSSize)>>('objc_msgSend');
+  late final __objc_msgSend_285 = __objc_msgSend_285Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSSize)>();
+
+  late final _sel_decodeSize1 = _registerName1("decodeSize");
+  late final _sel_encodeRect_1 = _registerName1("encodeRect:");
+  void _objc_msgSend_286(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRect rect,
+  ) {
+    return __objc_msgSend_286(
+      obj,
+      sel,
+      rect,
+    );
+  }
+
+  late final __objc_msgSend_286Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRect)>>('objc_msgSend');
+  late final __objc_msgSend_286 = __objc_msgSend_286Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRect)>();
+
+  late final _sel_decodeRect1 = _registerName1("decodeRect");
+  late final _sel_encodePoint_forKey_1 = _registerName1("encodePoint:forKey:");
+  void _objc_msgSend_287(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSPoint point,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_287(
+      obj,
+      sel,
+      point,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_287Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSPoint, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_287 = __objc_msgSend_287Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSPoint,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_encodeSize_forKey_1 = _registerName1("encodeSize:forKey:");
+  void _objc_msgSend_288(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSSize size,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_288(
+      obj,
+      sel,
+      size,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_288Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSSize, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_288 = __objc_msgSend_288Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSSize,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_encodeRect_forKey_1 = _registerName1("encodeRect:forKey:");
+  void _objc_msgSend_289(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRect rect,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_289(
+      obj,
+      sel,
+      rect,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_289Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRect, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_289 = __objc_msgSend_289Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRect,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_decodePointForKey_1 = _registerName1("decodePointForKey:");
+  NSPoint _objc_msgSend_290(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_290(
+      obj,
+      sel,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_290Ptr = _lookup<
+      ffi.NativeFunction<
+          NSPoint Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_290 = __objc_msgSend_290Ptr.asFunction<
+      NSPoint Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_decodeSizeForKey_1 = _registerName1("decodeSizeForKey:");
+  NSSize _objc_msgSend_291(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_291(
+      obj,
+      sel,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_291Ptr = _lookup<
+      ffi.NativeFunction<
+          NSSize Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_291 = __objc_msgSend_291Ptr.asFunction<
+      NSSize Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_decodeRectForKey_1 = _registerName1("decodeRectForKey:");
+  NSRect _objc_msgSend_292(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_292(
+      obj,
+      sel,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_292Ptr = _lookup<
+      ffi.NativeFunction<
+          NSRect Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_292 = __objc_msgSend_292Ptr.asFunction<
+      NSRect Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_substringFromIndex_1 = _registerName1("substringFromIndex:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_293(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int from,
+  ) {
+    return __objc_msgSend_293(
+      obj,
+      sel,
+      from,
+    );
+  }
+
+  late final __objc_msgSend_293Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_293 = __objc_msgSend_293Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_substringToIndex_1 = _registerName1("substringToIndex:");
+  late final _sel_substringWithRange_1 = _registerName1("substringWithRange:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_294(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+  ) {
+    return __objc_msgSend_294(
+      obj,
+      sel,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_294Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_294 = __objc_msgSend_294Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange)>();
+
+  late final _sel_getCharacters_range_1 =
+      _registerName1("getCharacters:range:");
+  void _objc_msgSend_295(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<unichar> buffer,
+    NSRange range,
+  ) {
+    return __objc_msgSend_295(
+      obj,
+      sel,
+      buffer,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_295Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<unichar>, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_295 = __objc_msgSend_295Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<unichar>, NSRange)>();
+
+  int _objc_msgSend_296(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> string,
+  ) {
+    return __objc_msgSend_296(
+      obj,
+      sel,
+      string,
+    );
+  }
+
+  late final __objc_msgSend_296Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_296 = __objc_msgSend_296Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_compare_options_1 = _registerName1("compare:options:");
+  int _objc_msgSend_297(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> string,
+    int mask,
+  ) {
+    return __objc_msgSend_297(
+      obj,
+      sel,
+      string,
+      mask,
+    );
+  }
+
+  late final __objc_msgSend_297Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_297 = __objc_msgSend_297Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_compare_options_range_1 =
+      _registerName1("compare:options:range:");
+  int _objc_msgSend_298(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> string,
+    int mask,
+    NSRange rangeOfReceiverToCompare,
+  ) {
+    return __objc_msgSend_298(
+      obj,
+      sel,
+      string,
+      mask,
+      rangeOfReceiverToCompare,
+    );
+  }
+
+  late final __objc_msgSend_298Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Int32, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_298 = __objc_msgSend_298Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, NSRange)>();
+
+  late final _sel_compare_options_range_locale_1 =
+      _registerName1("compare:options:range:locale:");
+  int _objc_msgSend_299(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> string,
+    int mask,
+    NSRange rangeOfReceiverToCompare,
+    ffi.Pointer<ObjCObject> locale,
+  ) {
+    return __objc_msgSend_299(
+      obj,
+      sel,
+      string,
+      mask,
+      rangeOfReceiverToCompare,
+      locale,
+    );
+  }
+
+  late final __objc_msgSend_299Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              NSRange,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_299 = __objc_msgSend_299Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, NSRange, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_caseInsensitiveCompare_1 =
+      _registerName1("caseInsensitiveCompare:");
+  late final _sel_localizedCompare_1 = _registerName1("localizedCompare:");
+  late final _sel_localizedCaseInsensitiveCompare_1 =
+      _registerName1("localizedCaseInsensitiveCompare:");
+  late final _sel_localizedStandardCompare_1 =
+      _registerName1("localizedStandardCompare:");
+  late final _sel_isEqualToString_1 = _registerName1("isEqualToString:");
+  late final _sel_hasPrefix_1 = _registerName1("hasPrefix:");
+  late final _sel_hasSuffix_1 = _registerName1("hasSuffix:");
+  late final _sel_commonPrefixWithString_options_1 =
+      _registerName1("commonPrefixWithString:options:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_300(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> str,
+    int mask,
+  ) {
+    return __objc_msgSend_300(
+      obj,
+      sel,
+      str,
+      mask,
+    );
+  }
+
+  late final __objc_msgSend_300Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_300 = __objc_msgSend_300Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_containsString_1 = _registerName1("containsString:");
+  late final _sel_localizedCaseInsensitiveContainsString_1 =
+      _registerName1("localizedCaseInsensitiveContainsString:");
+  late final _sel_localizedStandardContainsString_1 =
+      _registerName1("localizedStandardContainsString:");
+  late final _sel_localizedStandardRangeOfString_1 =
+      _registerName1("localizedStandardRangeOfString:");
+  NSRange _objc_msgSend_301(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> str,
+  ) {
+    return __objc_msgSend_301(
+      obj,
+      sel,
+      str,
+    );
+  }
+
+  late final __objc_msgSend_301Ptr = _lookup<
+      ffi.NativeFunction<
+          NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_301 = __objc_msgSend_301Ptr.asFunction<
+      NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_rangeOfString_1 = _registerName1("rangeOfString:");
+  late final _sel_rangeOfString_options_1 =
+      _registerName1("rangeOfString:options:");
+  NSRange _objc_msgSend_302(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> searchString,
+    int mask,
+  ) {
+    return __objc_msgSend_302(
+      obj,
+      sel,
+      searchString,
+      mask,
+    );
+  }
+
+  late final __objc_msgSend_302Ptr = _lookup<
+      ffi.NativeFunction<
+          NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_302 = __objc_msgSend_302Ptr.asFunction<
+      NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_rangeOfString_options_range_1 =
+      _registerName1("rangeOfString:options:range:");
+  NSRange _objc_msgSend_303(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> searchString,
+    int mask,
+    NSRange rangeOfReceiverToSearch,
+  ) {
+    return __objc_msgSend_303(
+      obj,
+      sel,
+      searchString,
+      mask,
+      rangeOfReceiverToSearch,
+    );
+  }
+
+  late final __objc_msgSend_303Ptr = _lookup<
+      ffi.NativeFunction<
+          NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Int32, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_303 = __objc_msgSend_303Ptr.asFunction<
+      NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, NSRange)>();
+
+  late final _sel_rangeOfString_options_range_locale_1 =
+      _registerName1("rangeOfString:options:range:locale:");
+  NSRange _objc_msgSend_304(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> searchString,
+    int mask,
+    NSRange rangeOfReceiverToSearch,
+    ffi.Pointer<ObjCObject> locale,
+  ) {
+    return __objc_msgSend_304(
+      obj,
+      sel,
+      searchString,
+      mask,
+      rangeOfReceiverToSearch,
+      locale,
+    );
+  }
+
+  late final __objc_msgSend_304Ptr = _lookup<
+      ffi.NativeFunction<
+          NSRange Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              NSRange,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_304 = __objc_msgSend_304Ptr.asFunction<
+      NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, NSRange, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_rangeOfCharacterFromSet_1 =
+      _registerName1("rangeOfCharacterFromSet:");
+  NSRange _objc_msgSend_305(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> searchSet,
+  ) {
+    return __objc_msgSend_305(
+      obj,
+      sel,
+      searchSet,
+    );
+  }
+
+  late final __objc_msgSend_305Ptr = _lookup<
+      ffi.NativeFunction<
+          NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_305 = __objc_msgSend_305Ptr.asFunction<
+      NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_rangeOfCharacterFromSet_options_1 =
+      _registerName1("rangeOfCharacterFromSet:options:");
+  NSRange _objc_msgSend_306(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> searchSet,
+    int mask,
+  ) {
+    return __objc_msgSend_306(
+      obj,
+      sel,
+      searchSet,
+      mask,
+    );
+  }
+
+  late final __objc_msgSend_306Ptr = _lookup<
+      ffi.NativeFunction<
+          NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_306 = __objc_msgSend_306Ptr.asFunction<
+      NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_rangeOfCharacterFromSet_options_range_1 =
+      _registerName1("rangeOfCharacterFromSet:options:range:");
+  NSRange _objc_msgSend_307(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> searchSet,
+    int mask,
+    NSRange rangeOfReceiverToSearch,
+  ) {
+    return __objc_msgSend_307(
+      obj,
+      sel,
+      searchSet,
+      mask,
+      rangeOfReceiverToSearch,
+    );
+  }
+
+  late final __objc_msgSend_307Ptr = _lookup<
+      ffi.NativeFunction<
+          NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Int32, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_307 = __objc_msgSend_307Ptr.asFunction<
+      NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, NSRange)>();
+
+  late final _sel_rangeOfComposedCharacterSequenceAtIndex_1 =
+      _registerName1("rangeOfComposedCharacterSequenceAtIndex:");
+  NSRange _objc_msgSend_308(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int index,
+  ) {
+    return __objc_msgSend_308(
+      obj,
+      sel,
+      index,
+    );
+  }
+
+  late final __objc_msgSend_308Ptr = _lookup<
+      ffi.NativeFunction<
+          NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_308 = __objc_msgSend_308Ptr.asFunction<
+      NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_rangeOfComposedCharacterSequencesForRange_1 =
+      _registerName1("rangeOfComposedCharacterSequencesForRange:");
+  NSRange _objc_msgSend_309(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+  ) {
+    return __objc_msgSend_309(
+      obj,
+      sel,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_309Ptr = _lookup<
+      ffi.NativeFunction<
+          NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_309 = __objc_msgSend_309Ptr.asFunction<
+      NSRange Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange)>();
+
+  late final _sel_stringByAppendingString_1 =
+      _registerName1("stringByAppendingString:");
+  late final _sel_stringByAppendingFormat_1 =
+      _registerName1("stringByAppendingFormat:");
+  late final _sel_uppercaseString1 = _registerName1("uppercaseString");
+  late final _sel_lowercaseString1 = _registerName1("lowercaseString");
+  late final _sel_capitalizedString1 = _registerName1("capitalizedString");
+  late final _sel_localizedUppercaseString1 =
+      _registerName1("localizedUppercaseString");
+  late final _sel_localizedLowercaseString1 =
+      _registerName1("localizedLowercaseString");
+  late final _sel_localizedCapitalizedString1 =
+      _registerName1("localizedCapitalizedString");
+  late final _sel_uppercaseStringWithLocale_1 =
+      _registerName1("uppercaseStringWithLocale:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_310(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> locale,
+  ) {
+    return __objc_msgSend_310(
+      obj,
+      sel,
+      locale,
+    );
+  }
+
+  late final __objc_msgSend_310Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_310 = __objc_msgSend_310Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_lowercaseStringWithLocale_1 =
+      _registerName1("lowercaseStringWithLocale:");
+  late final _sel_capitalizedStringWithLocale_1 =
+      _registerName1("capitalizedStringWithLocale:");
+  late final _sel_getLineStart_end_contentsEnd_forRange_1 =
+      _registerName1("getLineStart:end:contentsEnd:forRange:");
+  void _objc_msgSend_311(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<NSUInteger> startPtr,
+    ffi.Pointer<NSUInteger> lineEndPtr,
+    ffi.Pointer<NSUInteger> contentsEndPtr,
+    NSRange range,
+  ) {
+    return __objc_msgSend_311(
+      obj,
+      sel,
+      startPtr,
+      lineEndPtr,
+      contentsEndPtr,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_311Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<NSUInteger>,
+              ffi.Pointer<NSUInteger>,
+              ffi.Pointer<NSUInteger>,
+              NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_311 = __objc_msgSend_311Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<NSUInteger>,
+          ffi.Pointer<NSUInteger>,
+          ffi.Pointer<NSUInteger>,
+          NSRange)>();
+
+  late final _sel_lineRangeForRange_1 = _registerName1("lineRangeForRange:");
+  late final _sel_getParagraphStart_end_contentsEnd_forRange_1 =
+      _registerName1("getParagraphStart:end:contentsEnd:forRange:");
+  late final _sel_paragraphRangeForRange_1 =
+      _registerName1("paragraphRangeForRange:");
+  late final _sel_enumerateSubstringsInRange_options_usingBlock_1 =
+      _registerName1("enumerateSubstringsInRange:options:usingBlock:");
+  void _objc_msgSend_312(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    int opts,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_312(
+      obj,
+      sel,
+      range,
+      opts,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_312Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRange, ffi.Int32, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_312 = __objc_msgSend_312Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange, int,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_enumerateLinesUsingBlock_1 =
+      _registerName1("enumerateLinesUsingBlock:");
+  void _objc_msgSend_313(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_313(
+      obj,
+      sel,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_313Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_313 = __objc_msgSend_313Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_UTF8String1 = _registerName1("UTF8String");
+  late final _sel_fastestEncoding1 = _registerName1("fastestEncoding");
+  late final _sel_smallestEncoding1 = _registerName1("smallestEncoding");
+  late final _sel_dataUsingEncoding_allowLossyConversion_1 =
+      _registerName1("dataUsingEncoding:allowLossyConversion:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_314(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int encoding,
+    bool lossy,
+  ) {
+    return __objc_msgSend_314(
+      obj,
+      sel,
+      encoding,
+      lossy,
+    );
+  }
+
+  late final __objc_msgSend_314Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSStringEncoding,
+              ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_314 = __objc_msgSend_314Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int, bool)>();
+
+  late final _sel_dataUsingEncoding_1 = _registerName1("dataUsingEncoding:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_315(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int encoding,
+  ) {
+    return __objc_msgSend_315(
+      obj,
+      sel,
+      encoding,
+    );
+  }
+
+  late final __objc_msgSend_315Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSStringEncoding)>>('objc_msgSend');
+  late final __objc_msgSend_315 = __objc_msgSend_315Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_canBeConvertedToEncoding_1 =
+      _registerName1("canBeConvertedToEncoding:");
+  late final _sel_cStringUsingEncoding_1 =
+      _registerName1("cStringUsingEncoding:");
+  late final _sel_getCString_maxLength_encoding_1 =
+      _registerName1("getCString:maxLength:encoding:");
+  bool _objc_msgSend_316(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Char> buffer,
+    int maxBufferCount,
+    int encoding,
+  ) {
+    return __objc_msgSend_316(
+      obj,
+      sel,
+      buffer,
+      maxBufferCount,
+      encoding,
+    );
+  }
+
+  late final __objc_msgSend_316Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Char>,
+              NSUInteger,
+              NSStringEncoding)>>('objc_msgSend');
+  late final __objc_msgSend_316 = __objc_msgSend_316Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Char>, int, int)>();
+
+  late final _sel_getBytes_maxLength_usedLength_encoding_options_range_remainingRange_1 =
+      _registerName1(
+          "getBytes:maxLength:usedLength:encoding:options:range:remainingRange:");
+  bool _objc_msgSend_317(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Void> buffer,
+    int maxBufferCount,
+    ffi.Pointer<NSUInteger> usedBufferCount,
+    int encoding,
+    int options,
+    NSRange range,
+    NSRangePointer leftover,
+  ) {
+    return __objc_msgSend_317(
+      obj,
+      sel,
+      buffer,
+      maxBufferCount,
+      usedBufferCount,
+      encoding,
+      options,
+      range,
+      leftover,
+    );
+  }
+
+  late final __objc_msgSend_317Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Void>,
+              NSUInteger,
+              ffi.Pointer<NSUInteger>,
+              NSStringEncoding,
+              ffi.Int32,
+              NSRange,
+              NSRangePointer)>>('objc_msgSend');
+  late final __objc_msgSend_317 = __objc_msgSend_317Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Void>,
+          int,
+          ffi.Pointer<NSUInteger>,
+          int,
+          int,
+          NSRange,
+          NSRangePointer)>();
+
+  late final _sel_maximumLengthOfBytesUsingEncoding_1 =
+      _registerName1("maximumLengthOfBytesUsingEncoding:");
+  late final _sel_lengthOfBytesUsingEncoding_1 =
+      _registerName1("lengthOfBytesUsingEncoding:");
+  late final _sel_availableStringEncodings1 =
+      _registerName1("availableStringEncodings");
+  ffi.Pointer<NSStringEncoding> _objc_msgSend_318(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_318(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_318Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<NSStringEncoding> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_318 = __objc_msgSend_318Ptr.asFunction<
+      ffi.Pointer<NSStringEncoding> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_localizedNameOfStringEncoding_1 =
+      _registerName1("localizedNameOfStringEncoding:");
+  late final _sel_defaultCStringEncoding1 =
+      _registerName1("defaultCStringEncoding");
+  late final _sel_decomposedStringWithCanonicalMapping1 =
+      _registerName1("decomposedStringWithCanonicalMapping");
+  late final _sel_precomposedStringWithCanonicalMapping1 =
+      _registerName1("precomposedStringWithCanonicalMapping");
+  late final _sel_decomposedStringWithCompatibilityMapping1 =
+      _registerName1("decomposedStringWithCompatibilityMapping");
+  late final _sel_precomposedStringWithCompatibilityMapping1 =
+      _registerName1("precomposedStringWithCompatibilityMapping");
+  late final _sel_componentsSeparatedByString_1 =
+      _registerName1("componentsSeparatedByString:");
+  late final _sel_componentsSeparatedByCharactersInSet_1 =
+      _registerName1("componentsSeparatedByCharactersInSet:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_319(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> separator,
+  ) {
+    return __objc_msgSend_319(
+      obj,
+      sel,
+      separator,
+    );
+  }
+
+  late final __objc_msgSend_319Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_319 = __objc_msgSend_319Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_stringByTrimmingCharactersInSet_1 =
+      _registerName1("stringByTrimmingCharactersInSet:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_320(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> set1,
+  ) {
+    return __objc_msgSend_320(
+      obj,
+      sel,
+      set1,
+    );
+  }
+
+  late final __objc_msgSend_320Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_320 = __objc_msgSend_320Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_stringByPaddingToLength_withString_startingAtIndex_1 =
+      _registerName1("stringByPaddingToLength:withString:startingAtIndex:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_321(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int newLength,
+    ffi.Pointer<ObjCObject> padString,
+    int padIndex,
+  ) {
+    return __objc_msgSend_321(
+      obj,
+      sel,
+      newLength,
+      padString,
+      padIndex,
+    );
+  }
+
+  late final __objc_msgSend_321Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSUInteger,
+              ffi.Pointer<ObjCObject>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_321 = __objc_msgSend_321Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_stringByFoldingWithOptions_locale_1 =
+      _registerName1("stringByFoldingWithOptions:locale:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_322(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int options,
+    ffi.Pointer<ObjCObject> locale,
+  ) {
+    return __objc_msgSend_322(
+      obj,
+      sel,
+      options,
+      locale,
+    );
+  }
+
+  late final __objc_msgSend_322Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_322 = __objc_msgSend_322Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_stringByReplacingOccurrencesOfString_withString_options_range_1 =
+      _registerName1(
+          "stringByReplacingOccurrencesOfString:withString:options:range:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_323(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> target,
+    ffi.Pointer<ObjCObject> replacement,
+    int options,
+    NSRange searchRange,
+  ) {
+    return __objc_msgSend_323(
+      obj,
+      sel,
+      target,
+      replacement,
+      options,
+      searchRange,
+    );
+  }
+
+  late final __objc_msgSend_323Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_323 = __objc_msgSend_323Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          NSRange)>();
+
+  late final _sel_stringByReplacingOccurrencesOfString_withString_1 =
+      _registerName1("stringByReplacingOccurrencesOfString:withString:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_324(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> target,
+    ffi.Pointer<ObjCObject> replacement,
+  ) {
+    return __objc_msgSend_324(
+      obj,
+      sel,
+      target,
+      replacement,
+    );
+  }
+
+  late final __objc_msgSend_324Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_324 = __objc_msgSend_324Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_stringByReplacingCharactersInRange_withString_1 =
+      _registerName1("stringByReplacingCharactersInRange:withString:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_325(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    ffi.Pointer<ObjCObject> replacement,
+  ) {
+    return __objc_msgSend_325(
+      obj,
+      sel,
+      range,
+      replacement,
+    );
+  }
+
+  late final __objc_msgSend_325Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSRange,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_325 = __objc_msgSend_325Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, NSRange, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_stringByApplyingTransform_reverse_1 =
+      _registerName1("stringByApplyingTransform:reverse:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_326(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSStringTransform transform,
+    bool reverse,
+  ) {
+    return __objc_msgSend_326(
+      obj,
+      sel,
+      transform,
+      reverse,
+    );
+  }
+
+  late final __objc_msgSend_326Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSStringTransform,
+              ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_326 = __objc_msgSend_326Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, NSStringTransform, bool)>();
+
+  late final _sel_writeToURL_atomically_encoding_error_1 =
+      _registerName1("writeToURL:atomically:encoding:error:");
+  bool _objc_msgSend_327(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    bool useAuxiliaryFile,
+    int enc,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_327(
+      obj,
+      sel,
+      url,
+      useAuxiliaryFile,
+      enc,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_327Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool,
+              NSStringEncoding,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_327 = __objc_msgSend_327Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          bool,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_writeToFile_atomically_encoding_error_1 =
+      _registerName1("writeToFile:atomically:encoding:error:");
+  bool _objc_msgSend_328(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    bool useAuxiliaryFile,
+    int enc,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_328(
+      obj,
+      sel,
+      path,
+      useAuxiliaryFile,
+      enc,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_328Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool,
+              NSStringEncoding,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_328 = __objc_msgSend_328Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          bool,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_hash1 = _registerName1("hash");
+  late final _sel_initWithCharactersNoCopy_length_freeWhenDone_1 =
+      _registerName1("initWithCharactersNoCopy:length:freeWhenDone:");
+  instancetype _objc_msgSend_329(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<unichar> characters,
+    int length,
+    bool freeBuffer,
+  ) {
+    return __objc_msgSend_329(
+      obj,
+      sel,
+      characters,
+      length,
+      freeBuffer,
+    );
+  }
+
+  late final __objc_msgSend_329Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<unichar>, NSUInteger, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_329 = __objc_msgSend_329Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<unichar>, int, bool)>();
+
+  late final _sel_initWithCharactersNoCopy_length_deallocator_1 =
+      _registerName1("initWithCharactersNoCopy:length:deallocator:");
+  instancetype _objc_msgSend_330(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<unichar> chars,
+    int len,
+    ffi.Pointer<_ObjCBlock> deallocator,
+  ) {
+    return __objc_msgSend_330(
+      obj,
+      sel,
+      chars,
+      len,
+      deallocator,
+    );
+  }
+
+  late final __objc_msgSend_330Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<unichar>,
+              NSUInteger,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_330 = __objc_msgSend_330Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<unichar>, int, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_initWithCharacters_length_1 =
+      _registerName1("initWithCharacters:length:");
+  instancetype _objc_msgSend_331(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<unichar> characters,
+    int length,
+  ) {
+    return __objc_msgSend_331(
+      obj,
+      sel,
+      characters,
+      length,
+    );
+  }
+
+  late final __objc_msgSend_331Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<unichar>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_331 = __objc_msgSend_331Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<unichar>, int)>();
+
+  late final _sel_initWithUTF8String_1 = _registerName1("initWithUTF8String:");
+  instancetype _objc_msgSend_332(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Char> nullTerminatedCString,
+  ) {
+    return __objc_msgSend_332(
+      obj,
+      sel,
+      nullTerminatedCString,
+    );
+  }
+
+  late final __objc_msgSend_332Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Char>)>>('objc_msgSend');
+  late final __objc_msgSend_332 = __objc_msgSend_332Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Char>)>();
+
+  late final _sel_initWithFormat_1 = _registerName1("initWithFormat:");
+  late final _sel_initWithFormat_arguments_1 =
+      _registerName1("initWithFormat:arguments:");
+  instancetype _objc_msgSend_333(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> format,
+    ffi.Pointer<__va_list_tag> argList,
+  ) {
+    return __objc_msgSend_333(
+      obj,
+      sel,
+      format,
+      argList,
+    );
+  }
+
+  late final __objc_msgSend_333Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<__va_list_tag>)>>('objc_msgSend');
+  late final __objc_msgSend_333 = __objc_msgSend_333Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<__va_list_tag>)>();
+
+  late final _sel_initWithFormat_locale_1 =
+      _registerName1("initWithFormat:locale:");
+  late final _sel_initWithFormat_locale_arguments_1 =
+      _registerName1("initWithFormat:locale:arguments:");
+  instancetype _objc_msgSend_334(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> format,
+    ffi.Pointer<ObjCObject> locale,
+    ffi.Pointer<__va_list_tag> argList,
+  ) {
+    return __objc_msgSend_334(
+      obj,
+      sel,
+      format,
+      locale,
+      argList,
+    );
+  }
+
+  late final __objc_msgSend_334Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<__va_list_tag>)>>('objc_msgSend');
+  late final __objc_msgSend_334 = __objc_msgSend_334Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<__va_list_tag>)>();
+
+  late final _sel_initWithData_encoding_1 =
+      _registerName1("initWithData:encoding:");
+  instancetype _objc_msgSend_335(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> data,
+    int encoding,
+  ) {
+    return __objc_msgSend_335(
+      obj,
+      sel,
+      data,
+      encoding,
+    );
+  }
+
+  late final __objc_msgSend_335Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, NSStringEncoding)>>('objc_msgSend');
+  late final __objc_msgSend_335 = __objc_msgSend_335Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_initWithBytes_length_encoding_1 =
+      _registerName1("initWithBytes:length:encoding:");
+  instancetype _objc_msgSend_336(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Void> bytes,
+    int len,
+    int encoding,
+  ) {
+    return __objc_msgSend_336(
+      obj,
+      sel,
+      bytes,
+      len,
+      encoding,
+    );
+  }
+
+  late final __objc_msgSend_336Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Void>,
+              NSUInteger,
+              NSStringEncoding)>>('objc_msgSend');
+  late final __objc_msgSend_336 = __objc_msgSend_336Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Void>, int, int)>();
+
+  late final _sel_initWithBytesNoCopy_length_encoding_freeWhenDone_1 =
+      _registerName1("initWithBytesNoCopy:length:encoding:freeWhenDone:");
+  instancetype _objc_msgSend_337(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Void> bytes,
+    int len,
+    int encoding,
+    bool freeBuffer,
+  ) {
+    return __objc_msgSend_337(
+      obj,
+      sel,
+      bytes,
+      len,
+      encoding,
+      freeBuffer,
+    );
+  }
+
+  late final __objc_msgSend_337Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Void>,
+              NSUInteger,
+              NSStringEncoding,
+              ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_337 = __objc_msgSend_337Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Void>, int, int, bool)>();
+
+  late final _sel_initWithBytesNoCopy_length_encoding_deallocator_1 =
+      _registerName1("initWithBytesNoCopy:length:encoding:deallocator:");
+  instancetype _objc_msgSend_338(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Void> bytes,
+    int len,
+    int encoding,
+    ffi.Pointer<_ObjCBlock> deallocator,
+  ) {
+    return __objc_msgSend_338(
+      obj,
+      sel,
+      bytes,
+      len,
+      encoding,
+      deallocator,
+    );
+  }
+
+  late final __objc_msgSend_338Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Void>,
+              NSUInteger,
+              NSStringEncoding,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_338 = __objc_msgSend_338Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Void>, int, int, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_string1 = _registerName1("string");
+  late final _sel_stringWithString_1 = _registerName1("stringWithString:");
+  late final _sel_stringWithCharacters_length_1 =
+      _registerName1("stringWithCharacters:length:");
+  late final _sel_stringWithUTF8String_1 =
+      _registerName1("stringWithUTF8String:");
+  late final _sel_stringWithFormat_1 = _registerName1("stringWithFormat:");
+  late final _sel_localizedStringWithFormat_1 =
+      _registerName1("localizedStringWithFormat:");
+  late final _sel_initWithCString_encoding_1 =
+      _registerName1("initWithCString:encoding:");
+  instancetype _objc_msgSend_339(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Char> nullTerminatedCString,
+    int encoding,
+  ) {
+    return __objc_msgSend_339(
+      obj,
+      sel,
+      nullTerminatedCString,
+      encoding,
+    );
+  }
+
+  late final __objc_msgSend_339Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Char>, NSStringEncoding)>>('objc_msgSend');
+  late final __objc_msgSend_339 = __objc_msgSend_339Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Char>, int)>();
+
+  late final _sel_stringWithCString_encoding_1 =
+      _registerName1("stringWithCString:encoding:");
+  late final _sel_initWithContentsOfURL_encoding_error_1 =
+      _registerName1("initWithContentsOfURL:encoding:error:");
+  instancetype _objc_msgSend_340(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    int enc,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_340(
+      obj,
+      sel,
+      url,
+      enc,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_340Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSStringEncoding,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_340 = __objc_msgSend_340Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_initWithContentsOfFile_encoding_error_1 =
+      _registerName1("initWithContentsOfFile:encoding:error:");
+  instancetype _objc_msgSend_341(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    int enc,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_341(
+      obj,
+      sel,
+      path,
+      enc,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_341Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSStringEncoding,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_341 = __objc_msgSend_341Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_stringWithContentsOfURL_encoding_error_1 =
+      _registerName1("stringWithContentsOfURL:encoding:error:");
+  late final _sel_stringWithContentsOfFile_encoding_error_1 =
+      _registerName1("stringWithContentsOfFile:encoding:error:");
+  late final _sel_initWithContentsOfURL_usedEncoding_error_1 =
+      _registerName1("initWithContentsOfURL:usedEncoding:error:");
+  instancetype _objc_msgSend_342(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    ffi.Pointer<NSStringEncoding> enc,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_342(
+      obj,
+      sel,
+      url,
+      enc,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_342Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<NSStringEncoding>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_342 = __objc_msgSend_342Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<NSStringEncoding>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_initWithContentsOfFile_usedEncoding_error_1 =
+      _registerName1("initWithContentsOfFile:usedEncoding:error:");
+  instancetype _objc_msgSend_343(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    ffi.Pointer<NSStringEncoding> enc,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_343(
+      obj,
+      sel,
+      path,
+      enc,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_343Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<NSStringEncoding>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_343 = __objc_msgSend_343Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<NSStringEncoding>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_stringWithContentsOfURL_usedEncoding_error_1 =
+      _registerName1("stringWithContentsOfURL:usedEncoding:error:");
+  late final _sel_stringWithContentsOfFile_usedEncoding_error_1 =
+      _registerName1("stringWithContentsOfFile:usedEncoding:error:");
+  late final _sel_stringEncodingForData_encodingOptions_convertedString_usedLossyConversion_1 =
+      _registerName1(
+          "stringEncodingForData:encodingOptions:convertedString:usedLossyConversion:");
+  int _objc_msgSend_344(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> data,
+    ffi.Pointer<ObjCObject> opts,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> string,
+    ffi.Pointer<ffi.Bool> usedLossyConversion,
+  ) {
+    return __objc_msgSend_344(
+      obj,
+      sel,
+      data,
+      opts,
+      string,
+      usedLossyConversion,
+    );
+  }
+
+  late final __objc_msgSend_344Ptr = _lookup<
+      ffi.NativeFunction<
+          NSStringEncoding Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Pointer<ffi.Bool>)>>('objc_msgSend');
+  late final __objc_msgSend_344 = __objc_msgSend_344Ptr.asFunction<
+      int Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          ffi.Pointer<ffi.Bool>)>();
+
+  late final _sel_propertyList1 = _registerName1("propertyList");
+  late final _sel_propertyListFromStringsFileFormat1 =
+      _registerName1("propertyListFromStringsFileFormat");
+  late final _sel_cString1 = _registerName1("cString");
+  late final _sel_lossyCString1 = _registerName1("lossyCString");
+  late final _sel_cStringLength1 = _registerName1("cStringLength");
+  late final _sel_getCString_1 = _registerName1("getCString:");
+  late final _sel_getCString_maxLength_1 =
+      _registerName1("getCString:maxLength:");
+  void _objc_msgSend_345(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Char> bytes,
+    int maxLength,
+  ) {
+    return __objc_msgSend_345(
+      obj,
+      sel,
+      bytes,
+      maxLength,
+    );
+  }
+
+  late final __objc_msgSend_345Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Char>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_345 = __objc_msgSend_345Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Char>, int)>();
+
+  late final _sel_getCString_maxLength_range_remainingRange_1 =
+      _registerName1("getCString:maxLength:range:remainingRange:");
+  void _objc_msgSend_346(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Char> bytes,
+    int maxLength,
+    NSRange aRange,
+    NSRangePointer leftoverRange,
+  ) {
+    return __objc_msgSend_346(
+      obj,
+      sel,
+      bytes,
+      maxLength,
+      aRange,
+      leftoverRange,
+    );
+  }
+
+  late final __objc_msgSend_346Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Char>,
+              NSUInteger,
+              NSRange,
+              NSRangePointer)>>('objc_msgSend');
+  late final __objc_msgSend_346 = __objc_msgSend_346Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Char>, int, NSRange, NSRangePointer)>();
+
+  late final _sel_stringWithContentsOfFile_1 =
+      _registerName1("stringWithContentsOfFile:");
+  late final _sel_stringWithContentsOfURL_1 =
+      _registerName1("stringWithContentsOfURL:");
+  late final _sel_initWithCStringNoCopy_length_freeWhenDone_1 =
+      _registerName1("initWithCStringNoCopy:length:freeWhenDone:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_347(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Char> bytes,
+    int length,
+    bool freeBuffer,
+  ) {
+    return __objc_msgSend_347(
+      obj,
+      sel,
+      bytes,
+      length,
+      freeBuffer,
+    );
+  }
+
+  late final __objc_msgSend_347Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Char>,
+              NSUInteger,
+              ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_347 = __objc_msgSend_347Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ffi.Char>, int, bool)>();
+
+  late final _sel_initWithCString_length_1 =
+      _registerName1("initWithCString:length:");
+  late final _sel_initWithCString_1 = _registerName1("initWithCString:");
+  late final _sel_stringWithCString_length_1 =
+      _registerName1("stringWithCString:length:");
+  late final _sel_stringWithCString_1 = _registerName1("stringWithCString:");
+  late final _sel_getCharacters_1 = _registerName1("getCharacters:");
+  void _objc_msgSend_348(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<unichar> buffer,
+  ) {
+    return __objc_msgSend_348(
+      obj,
+      sel,
+      buffer,
+    );
+  }
+
+  late final __objc_msgSend_348Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<unichar>)>>('objc_msgSend');
+  late final __objc_msgSend_348 = __objc_msgSend_348Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<unichar>)>();
+
+  late final _sel_variantFittingPresentationWidth_1 =
+      _registerName1("variantFittingPresentationWidth:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_349(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int width,
+  ) {
+    return __objc_msgSend_349(
+      obj,
+      sel,
+      width,
+    );
+  }
+
+  late final __objc_msgSend_349Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSInteger)>>('objc_msgSend');
+  late final __objc_msgSend_349 = __objc_msgSend_349Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_pathWithComponents_1 = _registerName1("pathWithComponents:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_350(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> components,
+  ) {
+    return __objc_msgSend_350(
+      obj,
+      sel,
+      components,
+    );
+  }
+
+  late final __objc_msgSend_350Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_350 = __objc_msgSend_350Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_isAbsolutePath1 = _registerName1("isAbsolutePath");
+  late final _sel_stringByDeletingLastPathComponent1 =
+      _registerName1("stringByDeletingLastPathComponent");
+  late final _sel_stringByAppendingPathComponent_1 =
+      _registerName1("stringByAppendingPathComponent:");
+  late final _sel_stringByDeletingPathExtension1 =
+      _registerName1("stringByDeletingPathExtension");
+  late final _sel_stringByAppendingPathExtension_1 =
+      _registerName1("stringByAppendingPathExtension:");
+  late final _sel_stringByAbbreviatingWithTildeInPath1 =
+      _registerName1("stringByAbbreviatingWithTildeInPath");
+  late final _sel_stringByExpandingTildeInPath1 =
+      _registerName1("stringByExpandingTildeInPath");
+  late final _sel_stringByStandardizingPath1 =
+      _registerName1("stringByStandardizingPath");
+  late final _sel_stringByResolvingSymlinksInPath1 =
+      _registerName1("stringByResolvingSymlinksInPath");
+  late final _sel_stringsByAppendingPaths_1 =
+      _registerName1("stringsByAppendingPaths:");
+  late final _sel_completePathIntoString_caseSensitive_matchesIntoArray_filterTypes_1 =
+      _registerName1(
+          "completePathIntoString:caseSensitive:matchesIntoArray:filterTypes:");
+  int _objc_msgSend_351(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outputName,
+    bool flag,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outputArray,
+    ffi.Pointer<ObjCObject> filterTypes,
+  ) {
+    return __objc_msgSend_351(
+      obj,
+      sel,
+      outputName,
+      flag,
+      outputArray,
+      filterTypes,
+    );
+  }
+
+  late final __objc_msgSend_351Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Bool,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_351 = __objc_msgSend_351Ptr.asFunction<
+      int Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          bool,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_stringByAddingPercentEncodingWithAllowedCharacters_1 =
+      _registerName1("stringByAddingPercentEncodingWithAllowedCharacters:");
+  late final _sel_stringByRemovingPercentEncoding1 =
+      _registerName1("stringByRemovingPercentEncoding");
+  late final _sel_stringByAddingPercentEscapesUsingEncoding_1 =
+      _registerName1("stringByAddingPercentEscapesUsingEncoding:");
+  late final _sel_stringByReplacingPercentEscapesUsingEncoding_1 =
+      _registerName1("stringByReplacingPercentEscapesUsingEncoding:");
+  late final _class_NSOrthography1 = _getClass1("NSOrthography");
+  late final _sel_dominantScript1 = _registerName1("dominantScript");
+  late final _sel_languageMap1 = _registerName1("languageMap");
+  late final _sel_initWithDominantScript_languageMap_1 =
+      _registerName1("initWithDominantScript:languageMap:");
+  instancetype _objc_msgSend_352(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> script,
+    ffi.Pointer<ObjCObject> map,
+  ) {
+    return __objc_msgSend_352(
+      obj,
+      sel,
+      script,
+      map,
+    );
+  }
+
+  late final __objc_msgSend_352Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_352 = __objc_msgSend_352Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_languagesForScript_1 = _registerName1("languagesForScript:");
+  late final _sel_dominantLanguageForScript_1 =
+      _registerName1("dominantLanguageForScript:");
+  late final _sel_dominantLanguage1 = _registerName1("dominantLanguage");
+  late final _sel_allScripts1 = _registerName1("allScripts");
+  late final _sel_allLanguages1 = _registerName1("allLanguages");
+  late final _sel_defaultOrthographyForLanguage_1 =
+      _registerName1("defaultOrthographyForLanguage:");
+  late final _sel_orthographyWithDominantScript_languageMap_1 =
+      _registerName1("orthographyWithDominantScript:languageMap:");
+  late final _sel_linguisticTagsInRange_scheme_options_orthography_tokenRanges_1 =
+      _registerName1(
+          "linguisticTagsInRange:scheme:options:orthography:tokenRanges:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_353(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    NSLinguisticTagScheme scheme,
+    int options,
+    ffi.Pointer<ObjCObject> orthography,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> tokenRanges,
+  ) {
+    return __objc_msgSend_353(
+      obj,
+      sel,
+      range,
+      scheme,
+      options,
+      orthography,
+      tokenRanges,
+    );
+  }
+
+  late final __objc_msgSend_353Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSRange,
+              NSLinguisticTagScheme,
+              ffi.Int32,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_353 = __objc_msgSend_353Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          NSRange,
+          NSLinguisticTagScheme,
+          int,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_enumerateLinguisticTagsInRange_scheme_options_orthography_usingBlock_1 =
+      _registerName1(
+          "enumerateLinguisticTagsInRange:scheme:options:orthography:usingBlock:");
+  void _objc_msgSend_354(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    NSLinguisticTagScheme scheme,
+    int options,
+    ffi.Pointer<ObjCObject> orthography,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_354(
+      obj,
+      sel,
+      range,
+      scheme,
+      options,
+      orthography,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_354Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSRange,
+              NSLinguisticTagScheme,
+              ffi.Int32,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_354 = __objc_msgSend_354Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          NSRange,
+          NSLinguisticTagScheme,
+          int,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_allObjects1 = _registerName1("allObjects");
+  late final _sel_anyObject1 = _registerName1("anyObject");
+  late final _sel_intersectsSet_1 = _registerName1("intersectsSet:");
+  bool _objc_msgSend_355(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> otherSet,
+  ) {
+    return __objc_msgSend_355(
+      obj,
+      sel,
+      otherSet,
+    );
+  }
+
+  late final __objc_msgSend_355Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_355 = __objc_msgSend_355Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_isEqualToSet_1 = _registerName1("isEqualToSet:");
+  late final _sel_isSubsetOfSet_1 = _registerName1("isSubsetOfSet:");
+  late final _sel_setByAddingObject_1 = _registerName1("setByAddingObject:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_356(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> anObject,
+  ) {
+    return __objc_msgSend_356(
+      obj,
+      sel,
+      anObject,
+    );
+  }
+
+  late final __objc_msgSend_356Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_356 = __objc_msgSend_356Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_setByAddingObjectsFromSet_1 =
+      _registerName1("setByAddingObjectsFromSet:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_357(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> other,
+  ) {
+    return __objc_msgSend_357(
+      obj,
+      sel,
+      other,
+    );
+  }
+
+  late final __objc_msgSend_357Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_357 = __objc_msgSend_357Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_setByAddingObjectsFromArray_1 =
+      _registerName1("setByAddingObjectsFromArray:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_358(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> other,
+  ) {
+    return __objc_msgSend_358(
+      obj,
+      sel,
+      other,
+    );
+  }
+
+  late final __objc_msgSend_358Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_358 = __objc_msgSend_358Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  void _objc_msgSend_359(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_359(
+      obj,
+      sel,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_359Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_359 = __objc_msgSend_359Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  void _objc_msgSend_360(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int opts,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_360(
+      obj,
+      sel,
+      opts,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_360Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_360 = __objc_msgSend_360Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_objectsPassingTest_1 = _registerName1("objectsPassingTest:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_361(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> predicate,
+  ) {
+    return __objc_msgSend_361(
+      obj,
+      sel,
+      predicate,
+    );
+  }
+
+  late final __objc_msgSend_361Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_361 = __objc_msgSend_361Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_objectsWithOptions_passingTest_1 =
+      _registerName1("objectsWithOptions:passingTest:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_362(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int opts,
+    ffi.Pointer<_ObjCBlock> predicate,
+  ) {
+    return __objc_msgSend_362(
+      obj,
+      sel,
+      opts,
+      predicate,
+    );
+  }
+
+  late final __objc_msgSend_362Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_362 = __objc_msgSend_362Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_set1 = _registerName1("set");
+  late final _sel_setWithObject_1 = _registerName1("setWithObject:");
+  late final _sel_setWithObjects_count_1 =
+      _registerName1("setWithObjects:count:");
+  late final _sel_setWithObjects_1 = _registerName1("setWithObjects:");
+  late final _sel_setWithSet_1 = _registerName1("setWithSet:");
+  instancetype _objc_msgSend_363(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> set1,
+  ) {
+    return __objc_msgSend_363(
+      obj,
+      sel,
+      set1,
+    );
+  }
+
+  late final __objc_msgSend_363Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_363 = __objc_msgSend_363Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_setWithArray_1 = _registerName1("setWithArray:");
+  late final _sel_initWithSet_1 = _registerName1("initWithSet:");
+  late final _sel_initWithSet_copyItems_1 =
+      _registerName1("initWithSet:copyItems:");
+  instancetype _objc_msgSend_364(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> set1,
+    bool flag,
+  ) {
+    return __objc_msgSend_364(
+      obj,
+      sel,
+      set1,
+      flag,
+    );
+  }
+
+  late final __objc_msgSend_364Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_364 = __objc_msgSend_364Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, bool)>();
+
+  late final _sel_filteredSetUsingPredicate_1 =
+      _registerName1("filteredSetUsingPredicate:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_365(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> predicate,
+  ) {
+    return __objc_msgSend_365(
+      obj,
+      sel,
+      predicate,
+    );
+  }
+
+  late final __objc_msgSend_365Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_365 = __objc_msgSend_365Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_invocationWithMethodSignature_1 =
+      _registerName1("invocationWithMethodSignature:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_366(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> sig,
+  ) {
+    return __objc_msgSend_366(
+      obj,
+      sel,
+      sig,
+    );
+  }
+
+  late final __objc_msgSend_366Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_366 = __objc_msgSend_366Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_methodSignature1 = _registerName1("methodSignature");
+  ffi.Pointer<ObjCObject> _objc_msgSend_367(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_367(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_367Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_367 = __objc_msgSend_367Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_retainArguments1 = _registerName1("retainArguments");
+  late final _sel_argumentsRetained1 = _registerName1("argumentsRetained");
+  late final _sel_target1 = _registerName1("target");
+  late final _sel_setTarget_1 = _registerName1("setTarget:");
+  void _objc_msgSend_368(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_368(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_368Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_368 = __objc_msgSend_368Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_selector1 = _registerName1("selector");
+  ffi.Pointer<ObjCSel> _objc_msgSend_369(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_369(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_369Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCSel> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_369 = __objc_msgSend_369Ptr.asFunction<
+      ffi.Pointer<ObjCSel> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setSelector_1 = _registerName1("setSelector:");
+  void _objc_msgSend_370(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCSel> value,
+  ) {
+    return __objc_msgSend_370(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_370Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_370 = __objc_msgSend_370Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_getReturnValue_1 = _registerName1("getReturnValue:");
+  late final _sel_setReturnValue_1 = _registerName1("setReturnValue:");
+  late final _sel_getArgument_atIndex_1 =
+      _registerName1("getArgument:atIndex:");
+  void _objc_msgSend_371(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Void> argumentLocation,
+    int idx,
+  ) {
+    return __objc_msgSend_371(
+      obj,
+      sel,
+      argumentLocation,
+      idx,
+    );
+  }
+
+  late final __objc_msgSend_371Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Void>, NSInteger)>>('objc_msgSend');
+  late final __objc_msgSend_371 = __objc_msgSend_371Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Void>, int)>();
+
+  late final _sel_setArgument_atIndex_1 =
+      _registerName1("setArgument:atIndex:");
+  late final _sel_invoke1 = _registerName1("invoke");
+  late final _sel_invokeWithTarget_1 = _registerName1("invokeWithTarget:");
+  late final _sel_forwardInvocation_1 = _registerName1("forwardInvocation:");
+  void _objc_msgSend_372(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> anInvocation,
+  ) {
+    return __objc_msgSend_372(
+      obj,
+      sel,
+      anInvocation,
+    );
+  }
+
+  late final __objc_msgSend_372Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_372 = __objc_msgSend_372Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_methodSignatureForSelector_1 =
+      _registerName1("methodSignatureForSelector:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_373(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCSel> aSelector,
+  ) {
+    return __objc_msgSend_373(
+      obj,
+      sel,
+      aSelector,
+    );
+  }
+
+  late final __objc_msgSend_373Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_373 = __objc_msgSend_373Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_instanceMethodSignatureForSelector_1 =
+      _registerName1("instanceMethodSignatureForSelector:");
+  late final _sel_allowsWeakReference1 = _registerName1("allowsWeakReference");
+  late final _sel_retainWeakReference1 = _registerName1("retainWeakReference");
+  late final _sel_isSubclassOfClass_1 = _registerName1("isSubclassOfClass:");
+  late final _sel_resolveClassMethod_1 = _registerName1("resolveClassMethod:");
+  late final _sel_resolveInstanceMethod_1 =
+      _registerName1("resolveInstanceMethod:");
+  late final _sel_superclass1 = _registerName1("superclass");
+  late final _sel_class1 = _registerName1("class");
+  late final _sel_debugDescription1 = _registerName1("debugDescription");
+  late final _sel_version1 = _registerName1("version");
+  late final _sel_setVersion_1 = _registerName1("setVersion:");
+  void _objc_msgSend_374(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int aVersion,
+  ) {
+    return __objc_msgSend_374(
+      obj,
+      sel,
+      aVersion,
+    );
+  }
+
+  late final __objc_msgSend_374Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSInteger)>>('objc_msgSend');
+  late final __objc_msgSend_374 = __objc_msgSend_374Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_classForCoder1 = _registerName1("classForCoder");
+  late final _sel_replacementObjectForCoder_1 =
+      _registerName1("replacementObjectForCoder:");
+  late final _sel_awakeAfterUsingCoder_1 =
+      _registerName1("awakeAfterUsingCoder:");
+  late final _sel_poseAsClass_1 = _registerName1("poseAsClass:");
+  late final _sel_autoContentAccessingProxy1 =
+      _registerName1("autoContentAccessingProxy");
+  late final _sel_attemptRecoveryFromError_optionIndex_delegate_didRecoverSelector_contextInfo_1 =
+      _registerName1(
+          "attemptRecoveryFromError:optionIndex:delegate:didRecoverSelector:contextInfo:");
+  void _objc_msgSend_375(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> error,
+    int recoveryOptionIndex,
+    ffi.Pointer<ObjCObject> delegate,
+    ffi.Pointer<ObjCSel> didRecoverSelector,
+    ffi.Pointer<ffi.Void> contextInfo,
+  ) {
+    return __objc_msgSend_375(
+      obj,
+      sel,
+      error,
+      recoveryOptionIndex,
+      delegate,
+      didRecoverSelector,
+      contextInfo,
+    );
+  }
+
+  late final __objc_msgSend_375Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSUInteger,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Void>)>>('objc_msgSend');
+  late final __objc_msgSend_375 = __objc_msgSend_375Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Void>)>();
+
+  late final _sel_attemptRecoveryFromError_optionIndex_1 =
+      _registerName1("attemptRecoveryFromError:optionIndex:");
+  bool _objc_msgSend_376(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> error,
+    int recoveryOptionIndex,
+  ) {
+    return __objc_msgSend_376(
+      obj,
+      sel,
+      error,
+      recoveryOptionIndex,
+    );
+  }
+
+  late final __objc_msgSend_376Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_376 = __objc_msgSend_376Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_performSelector_withObject_afterDelay_inModes_1 =
+      _registerName1("performSelector:withObject:afterDelay:inModes:");
+  void _objc_msgSend_377(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCSel> aSelector,
+    ffi.Pointer<ObjCObject> anArgument,
+    double delay,
+    ffi.Pointer<ObjCObject> modes,
+  ) {
+    return __objc_msgSend_377(
+      obj,
+      sel,
+      aSelector,
+      anArgument,
+      delay,
+      modes,
+    );
+  }
+
+  late final __objc_msgSend_377Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSTimeInterval,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_377 = __objc_msgSend_377Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          double,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_performSelector_withObject_afterDelay_1 =
+      _registerName1("performSelector:withObject:afterDelay:");
+  void _objc_msgSend_378(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCSel> aSelector,
+    ffi.Pointer<ObjCObject> anArgument,
+    double delay,
+  ) {
+    return __objc_msgSend_378(
+      obj,
+      sel,
+      aSelector,
+      anArgument,
+      delay,
+    );
+  }
+
+  late final __objc_msgSend_378Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSTimeInterval)>>('objc_msgSend');
+  late final __objc_msgSend_378 = __objc_msgSend_378Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>, double)>();
+
+  late final _sel_URL_resourceDataDidBecomeAvailable_1 =
+      _registerName1("URL:resourceDataDidBecomeAvailable:");
+  void _objc_msgSend_379(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> sender,
+    ffi.Pointer<ObjCObject> newBytes,
+  ) {
+    return __objc_msgSend_379(
+      obj,
+      sel,
+      sender,
+      newBytes,
+    );
+  }
+
+  late final __objc_msgSend_379Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_379 = __objc_msgSend_379Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_URLResourceDidFinishLoading_1 =
+      _registerName1("URLResourceDidFinishLoading:");
+  void _objc_msgSend_380(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> sender,
+  ) {
+    return __objc_msgSend_380(
+      obj,
+      sel,
+      sender,
+    );
+  }
+
+  late final __objc_msgSend_380Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_380 = __objc_msgSend_380Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_URLResourceDidCancelLoading_1 =
+      _registerName1("URLResourceDidCancelLoading:");
+  late final _sel_URL_resourceDidFailLoadingWithReason_1 =
+      _registerName1("URL:resourceDidFailLoadingWithReason:");
+  void _objc_msgSend_381(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> sender,
+    ffi.Pointer<ObjCObject> reason,
+  ) {
+    return __objc_msgSend_381(
+      obj,
+      sel,
+      sender,
+      reason,
+    );
+  }
+
+  late final __objc_msgSend_381Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_381 = __objc_msgSend_381Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSFileManager1 = _getClass1("NSFileManager");
+  late final _sel_defaultManager1 = _registerName1("defaultManager");
+  ffi.Pointer<ObjCObject> _objc_msgSend_382(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_382(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_382Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_382 = __objc_msgSend_382Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_mountedVolumeURLsIncludingResourceValuesForKeys_options_1 =
+      _registerName1(
+          "mountedVolumeURLsIncludingResourceValuesForKeys:options:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_383(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> propertyKeys,
+    int options,
+  ) {
+    return __objc_msgSend_383(
+      obj,
+      sel,
+      propertyKeys,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_383Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_383 = __objc_msgSend_383Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_unmountVolumeAtURL_options_completionHandler_1 =
+      _registerName1("unmountVolumeAtURL:options:completionHandler:");
+  void _objc_msgSend_384(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    int mask,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_384(
+      obj,
+      sel,
+      url,
+      mask,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_384Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_384 = __objc_msgSend_384Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_contentsOfDirectoryAtURL_includingPropertiesForKeys_options_error_1 =
+      _registerName1(
+          "contentsOfDirectoryAtURL:includingPropertiesForKeys:options:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_385(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    ffi.Pointer<ObjCObject> keys,
+    int mask,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_385(
+      obj,
+      sel,
+      url,
+      keys,
+      mask,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_385Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_385 = __objc_msgSend_385Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_URLsForDirectory_inDomains_1 =
+      _registerName1("URLsForDirectory:inDomains:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_386(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int directory,
+    int domainMask,
+  ) {
+    return __objc_msgSend_386(
+      obj,
+      sel,
+      directory,
+      domainMask,
+    );
+  }
+
+  late final __objc_msgSend_386Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Int32, ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_386 = __objc_msgSend_386Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int, int)>();
+
+  late final _sel_URLForDirectory_inDomain_appropriateForURL_create_error_1 =
+      _registerName1(
+          "URLForDirectory:inDomain:appropriateForURL:create:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_387(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int directory,
+    int domain,
+    ffi.Pointer<ObjCObject> url,
+    bool shouldCreate,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_387(
+      obj,
+      sel,
+      directory,
+      domain,
+      url,
+      shouldCreate,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_387Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Int32,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_387 = __objc_msgSend_387Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          int,
+          int,
+          ffi.Pointer<ObjCObject>,
+          bool,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_getRelationship_ofDirectoryAtURL_toItemAtURL_error_1 =
+      _registerName1("getRelationship:ofDirectoryAtURL:toItemAtURL:error:");
+  bool _objc_msgSend_388(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Int32> outRelationship,
+    ffi.Pointer<ObjCObject> directoryURL,
+    ffi.Pointer<ObjCObject> otherURL,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_388(
+      obj,
+      sel,
+      outRelationship,
+      directoryURL,
+      otherURL,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_388Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Int32>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_388 = __objc_msgSend_388Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Int32>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_getRelationship_ofDirectory_inDomain_toItemAtURL_error_1 =
+      _registerName1("getRelationship:ofDirectory:inDomain:toItemAtURL:error:");
+  bool _objc_msgSend_389(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Int32> outRelationship,
+    int directory,
+    int domainMask,
+    ffi.Pointer<ObjCObject> url,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_389(
+      obj,
+      sel,
+      outRelationship,
+      directory,
+      domainMask,
+      url,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_389Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Int32>,
+              ffi.Int32,
+              ffi.Int32,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_389 = __objc_msgSend_389Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Int32>,
+          int,
+          int,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_createDirectoryAtURL_withIntermediateDirectories_attributes_error_1 =
+      _registerName1(
+          "createDirectoryAtURL:withIntermediateDirectories:attributes:error:");
+  bool _objc_msgSend_390(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    bool createIntermediates,
+    ffi.Pointer<ObjCObject> attributes,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_390(
+      obj,
+      sel,
+      url,
+      createIntermediates,
+      attributes,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_390Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_390 = __objc_msgSend_390Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          bool,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_createSymbolicLinkAtURL_withDestinationURL_error_1 =
+      _registerName1("createSymbolicLinkAtURL:withDestinationURL:error:");
+  bool _objc_msgSend_391(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    ffi.Pointer<ObjCObject> destURL,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_391(
+      obj,
+      sel,
+      url,
+      destURL,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_391Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_391 = __objc_msgSend_391Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_delegate1 = _registerName1("delegate");
+  late final _sel_setDelegate_1 = _registerName1("setDelegate:");
+  late final _sel_setAttributes_ofItemAtPath_error_1 =
+      _registerName1("setAttributes:ofItemAtPath:error:");
+  bool _objc_msgSend_392(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> attributes,
+    ffi.Pointer<ObjCObject> path,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_392(
+      obj,
+      sel,
+      attributes,
+      path,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_392Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_392 = __objc_msgSend_392Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_createDirectoryAtPath_withIntermediateDirectories_attributes_error_1 =
+      _registerName1(
+          "createDirectoryAtPath:withIntermediateDirectories:attributes:error:");
+  bool _objc_msgSend_393(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    bool createIntermediates,
+    ffi.Pointer<ObjCObject> attributes,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_393(
+      obj,
+      sel,
+      path,
+      createIntermediates,
+      attributes,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_393Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_393 = __objc_msgSend_393Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          bool,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_contentsOfDirectoryAtPath_error_1 =
+      _registerName1("contentsOfDirectoryAtPath:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_394(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_394(
+      obj,
+      sel,
+      path,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_394Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_394 = __objc_msgSend_394Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_subpathsOfDirectoryAtPath_error_1 =
+      _registerName1("subpathsOfDirectoryAtPath:error:");
+  late final _sel_attributesOfItemAtPath_error_1 =
+      _registerName1("attributesOfItemAtPath:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_395(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_395(
+      obj,
+      sel,
+      path,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_395Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_395 = __objc_msgSend_395Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_attributesOfFileSystemForPath_error_1 =
+      _registerName1("attributesOfFileSystemForPath:error:");
+  late final _sel_createSymbolicLinkAtPath_withDestinationPath_error_1 =
+      _registerName1("createSymbolicLinkAtPath:withDestinationPath:error:");
+  bool _objc_msgSend_396(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    ffi.Pointer<ObjCObject> destPath,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_396(
+      obj,
+      sel,
+      path,
+      destPath,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_396Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_396 = __objc_msgSend_396Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_destinationOfSymbolicLinkAtPath_error_1 =
+      _registerName1("destinationOfSymbolicLinkAtPath:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_397(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_397(
+      obj,
+      sel,
+      path,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_397Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_397 = __objc_msgSend_397Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_copyItemAtPath_toPath_error_1 =
+      _registerName1("copyItemAtPath:toPath:error:");
+  late final _sel_moveItemAtPath_toPath_error_1 =
+      _registerName1("moveItemAtPath:toPath:error:");
+  late final _sel_linkItemAtPath_toPath_error_1 =
+      _registerName1("linkItemAtPath:toPath:error:");
+  late final _sel_removeItemAtPath_error_1 =
+      _registerName1("removeItemAtPath:error:");
+  bool _objc_msgSend_398(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_398(
+      obj,
+      sel,
+      path,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_398Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_398 = __objc_msgSend_398Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_copyItemAtURL_toURL_error_1 =
+      _registerName1("copyItemAtURL:toURL:error:");
+  late final _sel_moveItemAtURL_toURL_error_1 =
+      _registerName1("moveItemAtURL:toURL:error:");
+  late final _sel_linkItemAtURL_toURL_error_1 =
+      _registerName1("linkItemAtURL:toURL:error:");
+  late final _sel_removeItemAtURL_error_1 =
+      _registerName1("removeItemAtURL:error:");
+  late final _sel_trashItemAtURL_resultingItemURL_error_1 =
+      _registerName1("trashItemAtURL:resultingItemURL:error:");
+  bool _objc_msgSend_399(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outResultingURL,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_399(
+      obj,
+      sel,
+      url,
+      outResultingURL,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_399Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_399 = __objc_msgSend_399Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_fileAttributesAtPath_traverseLink_1 =
+      _registerName1("fileAttributesAtPath:traverseLink:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_400(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    bool yorn,
+  ) {
+    return __objc_msgSend_400(
+      obj,
+      sel,
+      path,
+      yorn,
+    );
+  }
+
+  late final __objc_msgSend_400Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_400 = __objc_msgSend_400Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>, bool)>();
+
+  late final _sel_changeFileAttributes_atPath_1 =
+      _registerName1("changeFileAttributes:atPath:");
+  bool _objc_msgSend_401(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> attributes,
+    ffi.Pointer<ObjCObject> path,
+  ) {
+    return __objc_msgSend_401(
+      obj,
+      sel,
+      attributes,
+      path,
+    );
+  }
+
+  late final __objc_msgSend_401Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_401 = __objc_msgSend_401Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_directoryContentsAtPath_1 =
+      _registerName1("directoryContentsAtPath:");
+  late final _sel_fileSystemAttributesAtPath_1 =
+      _registerName1("fileSystemAttributesAtPath:");
+  late final _sel_pathContentOfSymbolicLinkAtPath_1 =
+      _registerName1("pathContentOfSymbolicLinkAtPath:");
+  late final _sel_createSymbolicLinkAtPath_pathContent_1 =
+      _registerName1("createSymbolicLinkAtPath:pathContent:");
+  bool _objc_msgSend_402(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    ffi.Pointer<ObjCObject> otherpath,
+  ) {
+    return __objc_msgSend_402(
+      obj,
+      sel,
+      path,
+      otherpath,
+    );
+  }
+
+  late final __objc_msgSend_402Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_402 = __objc_msgSend_402Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_createDirectoryAtPath_attributes_1 =
+      _registerName1("createDirectoryAtPath:attributes:");
+  bool _objc_msgSend_403(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    ffi.Pointer<ObjCObject> attributes,
+  ) {
+    return __objc_msgSend_403(
+      obj,
+      sel,
+      path,
+      attributes,
+    );
+  }
+
+  late final __objc_msgSend_403Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_403 = __objc_msgSend_403Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_linkPath_toPath_handler_1 =
+      _registerName1("linkPath:toPath:handler:");
+  bool _objc_msgSend_404(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> src,
+    ffi.Pointer<ObjCObject> dest,
+    ffi.Pointer<ObjCObject> handler,
+  ) {
+    return __objc_msgSend_404(
+      obj,
+      sel,
+      src,
+      dest,
+      handler,
+    );
+  }
+
+  late final __objc_msgSend_404Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_404 = __objc_msgSend_404Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_copyPath_toPath_handler_1 =
+      _registerName1("copyPath:toPath:handler:");
+  late final _sel_movePath_toPath_handler_1 =
+      _registerName1("movePath:toPath:handler:");
+  late final _sel_removeFileAtPath_handler_1 =
+      _registerName1("removeFileAtPath:handler:");
+  bool _objc_msgSend_405(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    ffi.Pointer<ObjCObject> handler,
+  ) {
+    return __objc_msgSend_405(
+      obj,
+      sel,
+      path,
+      handler,
+    );
+  }
+
+  late final __objc_msgSend_405Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_405 = __objc_msgSend_405Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_currentDirectoryPath1 =
+      _registerName1("currentDirectoryPath");
+  late final _sel_changeCurrentDirectoryPath_1 =
+      _registerName1("changeCurrentDirectoryPath:");
+  late final _sel_fileExistsAtPath_1 = _registerName1("fileExistsAtPath:");
+  late final _sel_fileExistsAtPath_isDirectory_1 =
+      _registerName1("fileExistsAtPath:isDirectory:");
+  bool _objc_msgSend_406(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    ffi.Pointer<ffi.Bool> isDirectory,
+  ) {
+    return __objc_msgSend_406(
+      obj,
+      sel,
+      path,
+      isDirectory,
+    );
+  }
+
+  late final __objc_msgSend_406Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Bool>)>>('objc_msgSend');
+  late final __objc_msgSend_406 = __objc_msgSend_406Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Bool>)>();
+
+  late final _sel_isReadableFileAtPath_1 =
+      _registerName1("isReadableFileAtPath:");
+  late final _sel_isWritableFileAtPath_1 =
+      _registerName1("isWritableFileAtPath:");
+  late final _sel_isExecutableFileAtPath_1 =
+      _registerName1("isExecutableFileAtPath:");
+  late final _sel_isDeletableFileAtPath_1 =
+      _registerName1("isDeletableFileAtPath:");
+  late final _sel_contentsEqualAtPath_andPath_1 =
+      _registerName1("contentsEqualAtPath:andPath:");
+  late final _sel_displayNameAtPath_1 = _registerName1("displayNameAtPath:");
+  late final _sel_componentsToDisplayForPath_1 =
+      _registerName1("componentsToDisplayForPath:");
+  late final _sel_homeDirectoryForCurrentUser1 =
+      _registerName1("homeDirectoryForCurrentUser");
+  late final _sel_temporaryDirectory1 = _registerName1("temporaryDirectory");
+  late final _sel_homeDirectoryForUser_1 =
+      _registerName1("homeDirectoryForUser:");
+  late final _sel_fileManager_shouldProceedAfterError_1 =
+      _registerName1("fileManager:shouldProceedAfterError:");
+  bool _objc_msgSend_407(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> fm,
+    ffi.Pointer<ObjCObject> errorInfo,
+  ) {
+    return __objc_msgSend_407(
+      obj,
+      sel,
+      fm,
+      errorInfo,
+    );
+  }
+
+  late final __objc_msgSend_407Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_407 = __objc_msgSend_407Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_fileManager_willProcessPath_1 =
+      _registerName1("fileManager:willProcessPath:");
+  void _objc_msgSend_408(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> fm,
+    ffi.Pointer<ObjCObject> path,
+  ) {
+    return __objc_msgSend_408(
+      obj,
+      sel,
+      fm,
+      path,
+    );
+  }
+
+  late final __objc_msgSend_408Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_408 = __objc_msgSend_408Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_validateValue_forKey_error_1 =
+      _registerName1("validateValue:forKey:error:");
+  late final _class_NSMutableArray1 = _getClass1("NSMutableArray");
+  late final _sel_addObject_1 = _registerName1("addObject:");
+  late final _sel_insertObject_atIndex_1 =
+      _registerName1("insertObject:atIndex:");
+  void _objc_msgSend_409(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> anObject,
+    int index,
+  ) {
+    return __objc_msgSend_409(
+      obj,
+      sel,
+      anObject,
+      index,
+    );
+  }
+
+  late final __objc_msgSend_409Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_409 = __objc_msgSend_409Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_removeLastObject1 = _registerName1("removeLastObject");
+  late final _sel_removeObjectAtIndex_1 =
+      _registerName1("removeObjectAtIndex:");
+  void _objc_msgSend_410(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int index,
+  ) {
+    return __objc_msgSend_410(
+      obj,
+      sel,
+      index,
+    );
+  }
+
+  late final __objc_msgSend_410Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_410 = __objc_msgSend_410Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_replaceObjectAtIndex_withObject_1 =
+      _registerName1("replaceObjectAtIndex:withObject:");
+  void _objc_msgSend_411(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int index,
+    ffi.Pointer<ObjCObject> anObject,
+  ) {
+    return __objc_msgSend_411(
+      obj,
+      sel,
+      index,
+      anObject,
+    );
+  }
+
+  late final __objc_msgSend_411Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSUInteger, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_411 = __objc_msgSend_411Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithCapacity_1 = _registerName1("initWithCapacity:");
+  late final _sel_addObjectsFromArray_1 =
+      _registerName1("addObjectsFromArray:");
+  void _objc_msgSend_412(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> otherArray,
+  ) {
+    return __objc_msgSend_412(
+      obj,
+      sel,
+      otherArray,
+    );
+  }
+
+  late final __objc_msgSend_412Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_412 = __objc_msgSend_412Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_exchangeObjectAtIndex_withObjectAtIndex_1 =
+      _registerName1("exchangeObjectAtIndex:withObjectAtIndex:");
+  void _objc_msgSend_413(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int idx1,
+    int idx2,
+  ) {
+    return __objc_msgSend_413(
+      obj,
+      sel,
+      idx1,
+      idx2,
+    );
+  }
+
+  late final __objc_msgSend_413Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSUInteger, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_413 = __objc_msgSend_413Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int, int)>();
+
+  late final _sel_removeAllObjects1 = _registerName1("removeAllObjects");
+  late final _sel_removeObject_inRange_1 =
+      _registerName1("removeObject:inRange:");
+  void _objc_msgSend_414(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> anObject,
+    NSRange range,
+  ) {
+    return __objc_msgSend_414(
+      obj,
+      sel,
+      anObject,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_414Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_414 = __objc_msgSend_414Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, NSRange)>();
+
+  late final _sel_removeObject_1 = _registerName1("removeObject:");
+  late final _sel_removeObjectIdenticalTo_inRange_1 =
+      _registerName1("removeObjectIdenticalTo:inRange:");
+  late final _sel_removeObjectIdenticalTo_1 =
+      _registerName1("removeObjectIdenticalTo:");
+  late final _sel_removeObjectsFromIndices_numIndices_1 =
+      _registerName1("removeObjectsFromIndices:numIndices:");
+  void _objc_msgSend_415(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<NSUInteger> indices,
+    int cnt,
+  ) {
+    return __objc_msgSend_415(
+      obj,
+      sel,
+      indices,
+      cnt,
+    );
+  }
+
+  late final __objc_msgSend_415Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<NSUInteger>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_415 = __objc_msgSend_415Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<NSUInteger>, int)>();
+
+  late final _sel_removeObjectsInArray_1 =
+      _registerName1("removeObjectsInArray:");
+  late final _sel_removeObjectsInRange_1 =
+      _registerName1("removeObjectsInRange:");
+  void _objc_msgSend_416(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+  ) {
+    return __objc_msgSend_416(
+      obj,
+      sel,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_416Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_416 = __objc_msgSend_416Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange)>();
+
+  late final _sel_replaceObjectsInRange_withObjectsFromArray_range_1 =
+      _registerName1("replaceObjectsInRange:withObjectsFromArray:range:");
+  void _objc_msgSend_417(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    ffi.Pointer<ObjCObject> otherArray,
+    NSRange otherRange,
+  ) {
+    return __objc_msgSend_417(
+      obj,
+      sel,
+      range,
+      otherArray,
+      otherRange,
+    );
+  }
+
+  late final __objc_msgSend_417Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRange, ffi.Pointer<ObjCObject>, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_417 = __objc_msgSend_417Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange,
+          ffi.Pointer<ObjCObject>, NSRange)>();
+
+  late final _sel_replaceObjectsInRange_withObjectsFromArray_1 =
+      _registerName1("replaceObjectsInRange:withObjectsFromArray:");
+  void _objc_msgSend_418(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    ffi.Pointer<ObjCObject> otherArray,
+  ) {
+    return __objc_msgSend_418(
+      obj,
+      sel,
+      range,
+      otherArray,
+    );
+  }
+
+  late final __objc_msgSend_418Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRange, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_418 = __objc_msgSend_418Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_setArray_1 = _registerName1("setArray:");
+  late final _sel_sortUsingFunction_context_1 =
+      _registerName1("sortUsingFunction:context:");
+  void _objc_msgSend_419(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<
+            ffi.NativeFunction<
+                NSInteger Function(ffi.Pointer<ObjCObject>,
+                    ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Void>)>>
+        compare,
+    ffi.Pointer<ffi.Void> context,
+  ) {
+    return __objc_msgSend_419(
+      obj,
+      sel,
+      compare,
+      context,
+    );
+  }
+
+  late final __objc_msgSend_419Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<
+                  ffi.NativeFunction<
+                      NSInteger Function(ffi.Pointer<ObjCObject>,
+                          ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Void>)>>,
+              ffi.Pointer<ffi.Void>)>>('objc_msgSend');
+  late final __objc_msgSend_419 = __objc_msgSend_419Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<
+              ffi.NativeFunction<
+                  NSInteger Function(ffi.Pointer<ObjCObject>,
+                      ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Void>)>>,
+          ffi.Pointer<ffi.Void>)>();
+
+  late final _sel_sortUsingSelector_1 = _registerName1("sortUsingSelector:");
+  late final _sel_insertObjects_atIndexes_1 =
+      _registerName1("insertObjects:atIndexes:");
+  void _objc_msgSend_420(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> objects,
+    ffi.Pointer<ObjCObject> indexes,
+  ) {
+    return __objc_msgSend_420(
+      obj,
+      sel,
+      objects,
+      indexes,
+    );
+  }
+
+  late final __objc_msgSend_420Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_420 = __objc_msgSend_420Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_removeObjectsAtIndexes_1 =
+      _registerName1("removeObjectsAtIndexes:");
+  void _objc_msgSend_421(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> indexes,
+  ) {
+    return __objc_msgSend_421(
+      obj,
+      sel,
+      indexes,
+    );
+  }
+
+  late final __objc_msgSend_421Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_421 = __objc_msgSend_421Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_replaceObjectsAtIndexes_withObjects_1 =
+      _registerName1("replaceObjectsAtIndexes:withObjects:");
+  void _objc_msgSend_422(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> indexes,
+    ffi.Pointer<ObjCObject> objects,
+  ) {
+    return __objc_msgSend_422(
+      obj,
+      sel,
+      indexes,
+      objects,
+    );
+  }
+
+  late final __objc_msgSend_422Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_422 = __objc_msgSend_422Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_setObject_atIndexedSubscript_1 =
+      _registerName1("setObject:atIndexedSubscript:");
+  late final _sel_sortUsingComparator_1 =
+      _registerName1("sortUsingComparator:");
+  void _objc_msgSend_423(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSComparator cmptr,
+  ) {
+    return __objc_msgSend_423(
+      obj,
+      sel,
+      cmptr,
+    );
+  }
+
+  late final __objc_msgSend_423Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSComparator)>>('objc_msgSend');
+  late final __objc_msgSend_423 = __objc_msgSend_423Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSComparator)>();
+
+  late final _sel_sortWithOptions_usingComparator_1 =
+      _registerName1("sortWithOptions:usingComparator:");
+  void _objc_msgSend_424(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int opts,
+    NSComparator cmptr,
+  ) {
+    return __objc_msgSend_424(
+      obj,
+      sel,
+      opts,
+      cmptr,
+    );
+  }
+
+  late final __objc_msgSend_424Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32, NSComparator)>>('objc_msgSend');
+  late final __objc_msgSend_424 = __objc_msgSend_424Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int, NSComparator)>();
+
+  late final _sel_arrayWithCapacity_1 = _registerName1("arrayWithCapacity:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_425(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+  ) {
+    return __objc_msgSend_425(
+      obj,
+      sel,
+      path,
+    );
+  }
+
+  late final __objc_msgSend_425Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_425 = __objc_msgSend_425Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  ffi.Pointer<ObjCObject> _objc_msgSend_426(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+  ) {
+    return __objc_msgSend_426(
+      obj,
+      sel,
+      url,
+    );
+  }
+
+  late final __objc_msgSend_426Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_426 = __objc_msgSend_426Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_applyDifference_1 = _registerName1("applyDifference:");
+  late final _sel_sortUsingDescriptors_1 =
+      _registerName1("sortUsingDescriptors:");
+  late final _sel_filterUsingPredicate_1 =
+      _registerName1("filterUsingPredicate:");
+  void _objc_msgSend_427(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> predicate,
+  ) {
+    return __objc_msgSend_427(
+      obj,
+      sel,
+      predicate,
+    );
+  }
+
+  late final __objc_msgSend_427Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_427 = __objc_msgSend_427Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_mutableArrayValueForKey_1 =
+      _registerName1("mutableArrayValueForKey:");
+  late final _class_NSMutableOrderedSet1 = _getClass1("NSMutableOrderedSet");
+  late final _class_NSOrderedSet1 = _getClass1("NSOrderedSet");
+  late final _sel_isEqualToOrderedSet_1 =
+      _registerName1("isEqualToOrderedSet:");
+  bool _objc_msgSend_428(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> other,
+  ) {
+    return __objc_msgSend_428(
+      obj,
+      sel,
+      other,
+    );
+  }
+
+  late final __objc_msgSend_428Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_428 = __objc_msgSend_428Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_intersectsOrderedSet_1 =
+      _registerName1("intersectsOrderedSet:");
+  late final _sel_isSubsetOfOrderedSet_1 =
+      _registerName1("isSubsetOfOrderedSet:");
+  late final _sel_reversedOrderedSet1 = _registerName1("reversedOrderedSet");
+  ffi.Pointer<ObjCObject> _objc_msgSend_429(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_429(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_429Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_429 = __objc_msgSend_429Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_orderedSet1 = _registerName1("orderedSet");
+  late final _sel_orderedSetWithObject_1 =
+      _registerName1("orderedSetWithObject:");
+  late final _sel_orderedSetWithObjects_count_1 =
+      _registerName1("orderedSetWithObjects:count:");
+  late final _sel_orderedSetWithObjects_1 =
+      _registerName1("orderedSetWithObjects:");
+  late final _sel_orderedSetWithOrderedSet_1 =
+      _registerName1("orderedSetWithOrderedSet:");
+  instancetype _objc_msgSend_430(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> set1,
+  ) {
+    return __objc_msgSend_430(
+      obj,
+      sel,
+      set1,
+    );
+  }
+
+  late final __objc_msgSend_430Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_430 = __objc_msgSend_430Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_orderedSetWithOrderedSet_range_copyItems_1 =
+      _registerName1("orderedSetWithOrderedSet:range:copyItems:");
+  instancetype _objc_msgSend_431(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> set1,
+    NSRange range,
+    bool flag,
+  ) {
+    return __objc_msgSend_431(
+      obj,
+      sel,
+      set1,
+      range,
+      flag,
+    );
+  }
+
+  late final __objc_msgSend_431Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, NSRange, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_431 = __objc_msgSend_431Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, NSRange, bool)>();
+
+  late final _sel_orderedSetWithArray_1 =
+      _registerName1("orderedSetWithArray:");
+  late final _sel_orderedSetWithArray_range_copyItems_1 =
+      _registerName1("orderedSetWithArray:range:copyItems:");
+  instancetype _objc_msgSend_432(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> array,
+    NSRange range,
+    bool flag,
+  ) {
+    return __objc_msgSend_432(
+      obj,
+      sel,
+      array,
+      range,
+      flag,
+    );
+  }
+
+  late final __objc_msgSend_432Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, NSRange, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_432 = __objc_msgSend_432Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, NSRange, bool)>();
+
+  late final _sel_orderedSetWithSet_1 = _registerName1("orderedSetWithSet:");
+  late final _sel_orderedSetWithSet_copyItems_1 =
+      _registerName1("orderedSetWithSet:copyItems:");
+  late final _sel_initWithObject_1 = _registerName1("initWithObject:");
+  late final _sel_initWithOrderedSet_1 = _registerName1("initWithOrderedSet:");
+  late final _sel_initWithOrderedSet_copyItems_1 =
+      _registerName1("initWithOrderedSet:copyItems:");
+  instancetype _objc_msgSend_433(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> set1,
+    bool flag,
+  ) {
+    return __objc_msgSend_433(
+      obj,
+      sel,
+      set1,
+      flag,
+    );
+  }
+
+  late final __objc_msgSend_433Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_433 = __objc_msgSend_433Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, bool)>();
+
+  late final _sel_initWithOrderedSet_range_copyItems_1 =
+      _registerName1("initWithOrderedSet:range:copyItems:");
+  late final _sel_initWithArray_range_copyItems_1 =
+      _registerName1("initWithArray:range:copyItems:");
+  late final _sel_filteredOrderedSetUsingPredicate_1 =
+      _registerName1("filteredOrderedSetUsingPredicate:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_434(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> p,
+  ) {
+    return __objc_msgSend_434(
+      obj,
+      sel,
+      p,
+    );
+  }
+
+  late final __objc_msgSend_434Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_434 = __objc_msgSend_434Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_addObjects_count_1 = _registerName1("addObjects:count:");
+  void _objc_msgSend_435(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> objects,
+    int count,
+  ) {
+    return __objc_msgSend_435(
+      obj,
+      sel,
+      objects,
+      count,
+    );
+  }
+
+  late final __objc_msgSend_435Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_435 = __objc_msgSend_435Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>, int)>();
+
+  late final _sel_moveObjectsAtIndexes_toIndex_1 =
+      _registerName1("moveObjectsAtIndexes:toIndex:");
+  void _objc_msgSend_436(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> indexes,
+    int idx,
+  ) {
+    return __objc_msgSend_436(
+      obj,
+      sel,
+      indexes,
+      idx,
+    );
+  }
+
+  late final __objc_msgSend_436Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_436 = __objc_msgSend_436Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_setObject_atIndex_1 = _registerName1("setObject:atIndex:");
+  late final _sel_replaceObjectsInRange_withObjects_count_1 =
+      _registerName1("replaceObjectsInRange:withObjects:count:");
+  void _objc_msgSend_437(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> objects,
+    int count,
+  ) {
+    return __objc_msgSend_437(
+      obj,
+      sel,
+      range,
+      objects,
+      count,
+    );
+  }
+
+  late final __objc_msgSend_437Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSRange,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_437 = __objc_msgSend_437Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>, int)>();
+
+  late final _sel_intersectOrderedSet_1 =
+      _registerName1("intersectOrderedSet:");
+  void _objc_msgSend_438(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> other,
+  ) {
+    return __objc_msgSend_438(
+      obj,
+      sel,
+      other,
+    );
+  }
+
+  late final __objc_msgSend_438Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_438 = __objc_msgSend_438Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_minusOrderedSet_1 = _registerName1("minusOrderedSet:");
+  late final _sel_unionOrderedSet_1 = _registerName1("unionOrderedSet:");
+  late final _sel_intersectSet_1 = _registerName1("intersectSet:");
+  void _objc_msgSend_439(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> other,
+  ) {
+    return __objc_msgSend_439(
+      obj,
+      sel,
+      other,
+    );
+  }
+
+  late final __objc_msgSend_439Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_439 = __objc_msgSend_439Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_minusSet_1 = _registerName1("minusSet:");
+  late final _sel_unionSet_1 = _registerName1("unionSet:");
+  late final _sel_sortRange_options_usingComparator_1 =
+      _registerName1("sortRange:options:usingComparator:");
+  void _objc_msgSend_440(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    int opts,
+    NSComparator cmptr,
+  ) {
+    return __objc_msgSend_440(
+      obj,
+      sel,
+      range,
+      opts,
+      cmptr,
+    );
+  }
+
+  late final __objc_msgSend_440Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRange, ffi.Int32, NSComparator)>>('objc_msgSend');
+  late final __objc_msgSend_440 = __objc_msgSend_440Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange, int,
+          NSComparator)>();
+
+  late final _sel_orderedSetWithCapacity_1 =
+      _registerName1("orderedSetWithCapacity:");
+  late final _sel_mutableOrderedSetValueForKey_1 =
+      _registerName1("mutableOrderedSetValueForKey:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_441(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_441(
+      obj,
+      sel,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_441Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_441 = __objc_msgSend_441Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSMutableSet1 = _getClass1("NSMutableSet");
+  late final _sel_setSet_1 = _registerName1("setSet:");
+  late final _sel_setWithCapacity_1 = _registerName1("setWithCapacity:");
+  late final _sel_mutableSetValueForKey_1 =
+      _registerName1("mutableSetValueForKey:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_442(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_442(
+      obj,
+      sel,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_442Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_442 = __objc_msgSend_442Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_valueForKeyPath_1 = _registerName1("valueForKeyPath:");
+  late final _sel_setValue_forKeyPath_1 =
+      _registerName1("setValue:forKeyPath:");
+  late final _sel_validateValue_forKeyPath_error_1 =
+      _registerName1("validateValue:forKeyPath:error:");
+  late final _sel_mutableArrayValueForKeyPath_1 =
+      _registerName1("mutableArrayValueForKeyPath:");
+  late final _sel_mutableOrderedSetValueForKeyPath_1 =
+      _registerName1("mutableOrderedSetValueForKeyPath:");
+  late final _sel_mutableSetValueForKeyPath_1 =
+      _registerName1("mutableSetValueForKeyPath:");
+  late final _sel_valueForUndefinedKey_1 =
+      _registerName1("valueForUndefinedKey:");
+  late final _sel_setValue_forUndefinedKey_1 =
+      _registerName1("setValue:forUndefinedKey:");
+  late final _sel_setNilValueForKey_1 = _registerName1("setNilValueForKey:");
+  late final _sel_dictionaryWithValuesForKeys_1 =
+      _registerName1("dictionaryWithValuesForKeys:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_443(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> keys,
+  ) {
+    return __objc_msgSend_443(
+      obj,
+      sel,
+      keys,
+    );
+  }
+
+  late final __objc_msgSend_443Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_443 = __objc_msgSend_443Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_setValuesForKeysWithDictionary_1 =
+      _registerName1("setValuesForKeysWithDictionary:");
+  void _objc_msgSend_444(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> keyedValues,
+  ) {
+    return __objc_msgSend_444(
+      obj,
+      sel,
+      keyedValues,
+    );
+  }
+
+  late final __objc_msgSend_444Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_444 = __objc_msgSend_444Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_storedValueForKey_1 = _registerName1("storedValueForKey:");
+  late final _sel_takeStoredValue_forKey_1 =
+      _registerName1("takeStoredValue:forKey:");
+  late final _sel_takeValue_forKey_1 = _registerName1("takeValue:forKey:");
+  late final _sel_takeValue_forKeyPath_1 =
+      _registerName1("takeValue:forKeyPath:");
+  late final _sel_handleQueryWithUnboundKey_1 =
+      _registerName1("handleQueryWithUnboundKey:");
+  late final _sel_handleTakeValue_forUnboundKey_1 =
+      _registerName1("handleTakeValue:forUnboundKey:");
+  late final _sel_unableToSetNilForKey_1 =
+      _registerName1("unableToSetNilForKey:");
+  late final _sel_valuesForKeys_1 = _registerName1("valuesForKeys:");
+  late final _sel_takeValuesFromDictionary_1 =
+      _registerName1("takeValuesFromDictionary:");
+  late final _sel_observeValueForKeyPath_ofObject_change_context_1 =
+      _registerName1("observeValueForKeyPath:ofObject:change:context:");
+  void _objc_msgSend_445(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> keyPath,
+    ffi.Pointer<ObjCObject> object,
+    ffi.Pointer<ObjCObject> change,
+    ffi.Pointer<ffi.Void> context,
+  ) {
+    return __objc_msgSend_445(
+      obj,
+      sel,
+      keyPath,
+      object,
+      change,
+      context,
+    );
+  }
+
+  late final __objc_msgSend_445Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Void>)>>('objc_msgSend');
+  late final __objc_msgSend_445 = __objc_msgSend_445Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Void>)>();
+
+  late final _sel_willChangeValueForKey_1 =
+      _registerName1("willChangeValueForKey:");
+  late final _sel_didChangeValueForKey_1 =
+      _registerName1("didChangeValueForKey:");
+  late final _sel_willChange_valuesAtIndexes_forKey_1 =
+      _registerName1("willChange:valuesAtIndexes:forKey:");
+  void _objc_msgSend_446(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int changeKind,
+    ffi.Pointer<ObjCObject> indexes,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_446(
+      obj,
+      sel,
+      changeKind,
+      indexes,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_446Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_446 = __objc_msgSend_446Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_didChange_valuesAtIndexes_forKey_1 =
+      _registerName1("didChange:valuesAtIndexes:forKey:");
+  late final _sel_willChangeValueForKey_withSetMutation_usingObjects_1 =
+      _registerName1("willChangeValueForKey:withSetMutation:usingObjects:");
+  void _objc_msgSend_447(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+    int mutationKind,
+    ffi.Pointer<ObjCObject> objects,
+  ) {
+    return __objc_msgSend_447(
+      obj,
+      sel,
+      key,
+      mutationKind,
+      objects,
+    );
+  }
+
+  late final __objc_msgSend_447Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_447 = __objc_msgSend_447Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_didChangeValueForKey_withSetMutation_usingObjects_1 =
+      _registerName1("didChangeValueForKey:withSetMutation:usingObjects:");
+  late final _sel_observationInfo1 = _registerName1("observationInfo");
+  late final _sel_setObservationInfo_1 = _registerName1("setObservationInfo:");
+  void _objc_msgSend_448(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Void> value,
+  ) {
+    return __objc_msgSend_448(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_448Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Void>)>>('objc_msgSend');
+  late final __objc_msgSend_448 = __objc_msgSend_448Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Void>)>();
+
+  late final _sel_classForKeyedArchiver1 =
+      _registerName1("classForKeyedArchiver");
+  late final _class_NSKeyedArchiver1 = _getClass1("NSKeyedArchiver");
+  late final _sel_initRequiringSecureCoding_1 =
+      _registerName1("initRequiringSecureCoding:");
+  instancetype _objc_msgSend_449(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    bool requiresSecureCoding,
+  ) {
+    return __objc_msgSend_449(
+      obj,
+      sel,
+      requiresSecureCoding,
+    );
+  }
+
+  late final __objc_msgSend_449Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_449 = __objc_msgSend_449Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, bool)>();
+
+  late final _sel_archivedDataWithRootObject_requiringSecureCoding_error_1 =
+      _registerName1("archivedDataWithRootObject:requiringSecureCoding:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_450(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> object,
+    bool requiresSecureCoding,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_450(
+      obj,
+      sel,
+      object,
+      requiresSecureCoding,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_450Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_450 = __objc_msgSend_450Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          bool,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _class_NSMutableData1 = _getClass1("NSMutableData");
+  late final _sel_mutableBytes1 = _registerName1("mutableBytes");
+  late final _sel_setLength_1 = _registerName1("setLength:");
+  void _objc_msgSend_451(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_451(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_451Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_451 = __objc_msgSend_451Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_appendBytes_length_1 = _registerName1("appendBytes:length:");
+  late final _sel_appendData_1 = _registerName1("appendData:");
+  late final _sel_increaseLengthBy_1 = _registerName1("increaseLengthBy:");
+  late final _sel_replaceBytesInRange_withBytes_1 =
+      _registerName1("replaceBytesInRange:withBytes:");
+  void _objc_msgSend_452(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    ffi.Pointer<ffi.Void> bytes,
+  ) {
+    return __objc_msgSend_452(
+      obj,
+      sel,
+      range,
+      bytes,
+    );
+  }
+
+  late final __objc_msgSend_452Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRange, ffi.Pointer<ffi.Void>)>>('objc_msgSend');
+  late final __objc_msgSend_452 = __objc_msgSend_452Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange,
+          ffi.Pointer<ffi.Void>)>();
+
+  late final _sel_resetBytesInRange_1 = _registerName1("resetBytesInRange:");
+  late final _sel_setData_1 = _registerName1("setData:");
+  late final _sel_replaceBytesInRange_withBytes_length_1 =
+      _registerName1("replaceBytesInRange:withBytes:length:");
+  void _objc_msgSend_453(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    ffi.Pointer<ffi.Void> replacementBytes,
+    int replacementLength,
+  ) {
+    return __objc_msgSend_453(
+      obj,
+      sel,
+      range,
+      replacementBytes,
+      replacementLength,
+    );
+  }
+
+  late final __objc_msgSend_453Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRange, ffi.Pointer<ffi.Void>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_453 = __objc_msgSend_453Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange,
+          ffi.Pointer<ffi.Void>, int)>();
+
+  late final _sel_dataWithCapacity_1 = _registerName1("dataWithCapacity:");
+  late final _sel_dataWithLength_1 = _registerName1("dataWithLength:");
+  late final _sel_initWithLength_1 = _registerName1("initWithLength:");
+  late final _sel_decompressUsingAlgorithm_error_1 =
+      _registerName1("decompressUsingAlgorithm:error:");
+  bool _objc_msgSend_454(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int algorithm,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_454(
+      obj,
+      sel,
+      algorithm,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_454Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_454 = __objc_msgSend_454Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_compressUsingAlgorithm_error_1 =
+      _registerName1("compressUsingAlgorithm:error:");
+  late final _sel_initForWritingWithMutableData_1 =
+      _registerName1("initForWritingWithMutableData:");
+  instancetype _objc_msgSend_455(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> data,
+  ) {
+    return __objc_msgSend_455(
+      obj,
+      sel,
+      data,
+    );
+  }
+
+  late final __objc_msgSend_455Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_455 = __objc_msgSend_455Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_archivedDataWithRootObject_1 =
+      _registerName1("archivedDataWithRootObject:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_456(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> rootObject,
+  ) {
+    return __objc_msgSend_456(
+      obj,
+      sel,
+      rootObject,
+    );
+  }
+
+  late final __objc_msgSend_456Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_456 = __objc_msgSend_456Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_archiveRootObject_toFile_1 =
+      _registerName1("archiveRootObject:toFile:");
+  late final _sel_outputFormat1 = _registerName1("outputFormat");
+  int _objc_msgSend_457(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_457(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_457Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_457 = __objc_msgSend_457Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setOutputFormat_1 = _registerName1("setOutputFormat:");
+  void _objc_msgSend_458(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_458(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_458Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_458 = __objc_msgSend_458Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_encodedData1 = _registerName1("encodedData");
+  late final _sel_finishEncoding1 = _registerName1("finishEncoding");
+  late final _sel_setClassName_forClass_1 =
+      _registerName1("setClassName:forClass:");
+  void _objc_msgSend_459(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> codedName,
+    ffi.Pointer<ObjCObject> cls,
+  ) {
+    return __objc_msgSend_459(
+      obj,
+      sel,
+      codedName,
+      cls,
+    );
+  }
+
+  late final __objc_msgSend_459Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_459 = __objc_msgSend_459Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_classNameForClass_1 = _registerName1("classNameForClass:");
+  late final _sel_setRequiresSecureCoding_1 =
+      _registerName1("setRequiresSecureCoding:");
+  void _objc_msgSend_460(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    bool value,
+  ) {
+    return __objc_msgSend_460(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_460Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_460 = __objc_msgSend_460Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, bool)>();
+
+  late final _sel_replacementObjectForKeyedArchiver_1 =
+      _registerName1("replacementObjectForKeyedArchiver:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_461(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> archiver,
+  ) {
+    return __objc_msgSend_461(
+      obj,
+      sel,
+      archiver,
+    );
+  }
+
+  late final __objc_msgSend_461Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_461 = __objc_msgSend_461Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_performSelectorOnMainThread_withObject_waitUntilDone_modes_1 =
+      _registerName1(
+          "performSelectorOnMainThread:withObject:waitUntilDone:modes:");
+  void _objc_msgSend_462(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCSel> aSelector,
+    ffi.Pointer<ObjCObject> arg,
+    bool wait,
+    ffi.Pointer<ObjCObject> array,
+  ) {
+    return __objc_msgSend_462(
+      obj,
+      sel,
+      aSelector,
+      arg,
+      wait,
+      array,
+    );
+  }
+
+  late final __objc_msgSend_462Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_462 = __objc_msgSend_462Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          bool,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_performSelectorOnMainThread_withObject_waitUntilDone_1 =
+      _registerName1("performSelectorOnMainThread:withObject:waitUntilDone:");
+  void _objc_msgSend_463(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCSel> aSelector,
+    ffi.Pointer<ObjCObject> arg,
+    bool wait,
+  ) {
+    return __objc_msgSend_463(
+      obj,
+      sel,
+      aSelector,
+      arg,
+      wait,
+    );
+  }
+
+  late final __objc_msgSend_463Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_463 = __objc_msgSend_463Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>, bool)>();
+
+  late final _class_NSThread1 = _getClass1("NSThread");
+  late final _sel_currentThread1 = _registerName1("currentThread");
+  ffi.Pointer<ObjCObject> _objc_msgSend_464(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_464(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_464Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_464 = __objc_msgSend_464Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_detachNewThreadWithBlock_1 =
+      _registerName1("detachNewThreadWithBlock:");
+  void _objc_msgSend_465(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_465(
+      obj,
+      sel,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_465Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_465 = __objc_msgSend_465Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_detachNewThreadSelector_toTarget_withObject_1 =
+      _registerName1("detachNewThreadSelector:toTarget:withObject:");
+  void _objc_msgSend_466(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCSel> selector,
+    ffi.Pointer<ObjCObject> target,
+    ffi.Pointer<ObjCObject> argument,
+  ) {
+    return __objc_msgSend_466(
+      obj,
+      sel,
+      selector,
+      target,
+      argument,
+    );
+  }
+
+  late final __objc_msgSend_466Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_466 = __objc_msgSend_466Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_isMultiThreaded1 = _registerName1("isMultiThreaded");
+  late final _class_NSMutableDictionary1 = _getClass1("NSMutableDictionary");
+  late final _sel_removeObjectForKey_1 = _registerName1("removeObjectForKey:");
+  late final _sel_setObject_forKey_1 = _registerName1("setObject:forKey:");
+  void _objc_msgSend_467(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> anObject,
+    ffi.Pointer<ObjCObject> aKey,
+  ) {
+    return __objc_msgSend_467(
+      obj,
+      sel,
+      anObject,
+      aKey,
+    );
+  }
+
+  late final __objc_msgSend_467Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_467 = __objc_msgSend_467Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_addEntriesFromDictionary_1 =
+      _registerName1("addEntriesFromDictionary:");
+  late final _sel_removeObjectsForKeys_1 =
+      _registerName1("removeObjectsForKeys:");
+  late final _sel_setDictionary_1 = _registerName1("setDictionary:");
+  late final _sel_setObject_forKeyedSubscript_1 =
+      _registerName1("setObject:forKeyedSubscript:");
+  late final _sel_dictionaryWithCapacity_1 =
+      _registerName1("dictionaryWithCapacity:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_468(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+  ) {
+    return __objc_msgSend_468(
+      obj,
+      sel,
+      path,
+    );
+  }
+
+  late final __objc_msgSend_468Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_468 = __objc_msgSend_468Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  ffi.Pointer<ObjCObject> _objc_msgSend_469(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+  ) {
+    return __objc_msgSend_469(
+      obj,
+      sel,
+      url,
+    );
+  }
+
+  late final __objc_msgSend_469Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_469 = __objc_msgSend_469Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dictionaryWithSharedKeySet_1 =
+      _registerName1("dictionaryWithSharedKeySet:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_470(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> keyset,
+  ) {
+    return __objc_msgSend_470(
+      obj,
+      sel,
+      keyset,
+    );
+  }
+
+  late final __objc_msgSend_470Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_470 = __objc_msgSend_470Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_threadDictionary1 = _registerName1("threadDictionary");
+  ffi.Pointer<ObjCObject> _objc_msgSend_471(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_471(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_471Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_471 = __objc_msgSend_471Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_sleepUntilDate_1 = _registerName1("sleepUntilDate:");
+  void _objc_msgSend_472(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> date,
+  ) {
+    return __objc_msgSend_472(
+      obj,
+      sel,
+      date,
+    );
+  }
+
+  late final __objc_msgSend_472Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_472 = __objc_msgSend_472Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_sleepForTimeInterval_1 =
+      _registerName1("sleepForTimeInterval:");
+  void _objc_msgSend_473(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    double ti,
+  ) {
+    return __objc_msgSend_473(
+      obj,
+      sel,
+      ti,
+    );
+  }
+
+  late final __objc_msgSend_473Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSTimeInterval)>>('objc_msgSend');
+  late final __objc_msgSend_473 = __objc_msgSend_473Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, double)>();
+
+  late final _sel_exit1 = _registerName1("exit");
+  late final _sel_threadPriority1 = _registerName1("threadPriority");
+  late final _sel_setThreadPriority_1 = _registerName1("setThreadPriority:");
+  void _objc_msgSend_474(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    double value,
+  ) {
+    return __objc_msgSend_474(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_474Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Double)>>('objc_msgSend');
+  late final __objc_msgSend_474 = __objc_msgSend_474Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, double)>();
+
+  late final _sel_qualityOfService1 = _registerName1("qualityOfService");
+  int _objc_msgSend_475(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_475(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_475Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_475 = __objc_msgSend_475Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setQualityOfService_1 =
+      _registerName1("setQualityOfService:");
+  void _objc_msgSend_476(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_476(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_476Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_476 = __objc_msgSend_476Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_callStackReturnAddresses1 =
+      _registerName1("callStackReturnAddresses");
+  late final _sel_callStackSymbols1 = _registerName1("callStackSymbols");
+  late final _sel_setName_1 = _registerName1("setName:");
+  void _objc_msgSend_477(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_477(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_477Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_477 = __objc_msgSend_477Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_stackSize1 = _registerName1("stackSize");
+  late final _sel_setStackSize_1 = _registerName1("setStackSize:");
+  late final _sel_isMainThread1 = _registerName1("isMainThread");
+  late final _sel_mainThread1 = _registerName1("mainThread");
+  late final _sel_initWithTarget_selector_object_1 =
+      _registerName1("initWithTarget:selector:object:");
+  instancetype _objc_msgSend_478(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> target,
+    ffi.Pointer<ObjCSel> selector,
+    ffi.Pointer<ObjCObject> argument,
+  ) {
+    return __objc_msgSend_478(
+      obj,
+      sel,
+      target,
+      selector,
+      argument,
+    );
+  }
+
+  late final __objc_msgSend_478Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_478 = __objc_msgSend_478Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithBlock_1 = _registerName1("initWithBlock:");
+  instancetype _objc_msgSend_479(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_479(
+      obj,
+      sel,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_479Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_479 = __objc_msgSend_479Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_isExecuting1 = _registerName1("isExecuting");
+  late final _sel_isFinished1 = _registerName1("isFinished");
+  late final _sel_isCancelled1 = _registerName1("isCancelled");
+  late final _sel_cancel1 = _registerName1("cancel");
+  late final _sel_start1 = _registerName1("start");
+  late final _sel_main1 = _registerName1("main");
+  late final _sel_performSelector_onThread_withObject_waitUntilDone_modes_1 =
+      _registerName1(
+          "performSelector:onThread:withObject:waitUntilDone:modes:");
+  void _objc_msgSend_480(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCSel> aSelector,
+    ffi.Pointer<ObjCObject> thr,
+    ffi.Pointer<ObjCObject> arg,
+    bool wait,
+    ffi.Pointer<ObjCObject> array,
+  ) {
+    return __objc_msgSend_480(
+      obj,
+      sel,
+      aSelector,
+      thr,
+      arg,
+      wait,
+      array,
+    );
+  }
+
+  late final __objc_msgSend_480Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_480 = __objc_msgSend_480Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          bool,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_performSelector_onThread_withObject_waitUntilDone_1 =
+      _registerName1("performSelector:onThread:withObject:waitUntilDone:");
+  void _objc_msgSend_481(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCSel> aSelector,
+    ffi.Pointer<ObjCObject> thr,
+    ffi.Pointer<ObjCObject> arg,
+    bool wait,
+  ) {
+    return __objc_msgSend_481(
+      obj,
+      sel,
+      aSelector,
+      thr,
+      arg,
+      wait,
+    );
+  }
+
+  late final __objc_msgSend_481Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_481 = __objc_msgSend_481Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          bool)>();
+
+  late final _sel_performSelectorInBackground_withObject_1 =
+      _registerName1("performSelectorInBackground:withObject:");
+  late final _sel_classForArchiver1 = _registerName1("classForArchiver");
+  late final _class_NSArchiver1 = _getClass1("NSArchiver");
+  late final _sel_archiverData1 = _registerName1("archiverData");
+  ffi.Pointer<ObjCObject> _objc_msgSend_482(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_482(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_482Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_482 = __objc_msgSend_482Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_encodeClassName_intoClassName_1 =
+      _registerName1("encodeClassName:intoClassName:");
+  void _objc_msgSend_483(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> trueName,
+    ffi.Pointer<ObjCObject> inArchiveName,
+  ) {
+    return __objc_msgSend_483(
+      obj,
+      sel,
+      trueName,
+      inArchiveName,
+    );
+  }
+
+  late final __objc_msgSend_483Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_483 = __objc_msgSend_483Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_classNameEncodedForTrueClassName_1 =
+      _registerName1("classNameEncodedForTrueClassName:");
+  late final _sel_replaceObject_withObject_1 =
+      _registerName1("replaceObject:withObject:");
+  late final _sel_replacementObjectForArchiver_1 =
+      _registerName1("replacementObjectForArchiver:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_484(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> archiver,
+  ) {
+    return __objc_msgSend_484(
+      obj,
+      sel,
+      archiver,
+    );
+  }
+
+  late final __objc_msgSend_484Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_484 = __objc_msgSend_484Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_classForPortCoder1 = _registerName1("classForPortCoder");
+  late final _class_NSPortCoder1 = _getClass1("NSPortCoder");
+  late final _sel_isBycopy1 = _registerName1("isBycopy");
+  late final _sel_isByref1 = _registerName1("isByref");
+  late final _class_NSPort1 = _getClass1("NSPort");
+  ffi.Pointer<ObjCObject> _objc_msgSend_485(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_485(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_485Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_485 = __objc_msgSend_485Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_invalidate1 = _registerName1("invalidate");
+  late final _sel_isValid1 = _registerName1("isValid");
+  late final _class_NSRunLoop1 = _getClass1("NSRunLoop");
+  late final _sel_currentRunLoop1 = _registerName1("currentRunLoop");
+  ffi.Pointer<ObjCObject> _objc_msgSend_486(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_486(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_486Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_486 = __objc_msgSend_486Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_mainRunLoop1 = _registerName1("mainRunLoop");
+  late final _sel_currentMode1 = _registerName1("currentMode");
+  late final _sel_getCFRunLoop1 = _registerName1("getCFRunLoop");
+  CFRunLoopRef _objc_msgSend_487(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_487(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_487Ptr = _lookup<
+      ffi.NativeFunction<
+          CFRunLoopRef Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_487 = __objc_msgSend_487Ptr.asFunction<
+      CFRunLoopRef Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _class_NSTimer1 = _getClass1("NSTimer");
+  late final _sel_timerWithTimeInterval_invocation_repeats_1 =
+      _registerName1("timerWithTimeInterval:invocation:repeats:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_488(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    double ti,
+    ffi.Pointer<ObjCObject> invocation,
+    bool yesOrNo,
+  ) {
+    return __objc_msgSend_488(
+      obj,
+      sel,
+      ti,
+      invocation,
+      yesOrNo,
+    );
+  }
+
+  late final __objc_msgSend_488Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSTimeInterval,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_488 = __objc_msgSend_488Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, double, ffi.Pointer<ObjCObject>, bool)>();
+
+  late final _sel_scheduledTimerWithTimeInterval_invocation_repeats_1 =
+      _registerName1("scheduledTimerWithTimeInterval:invocation:repeats:");
+  late final _sel_timerWithTimeInterval_target_selector_userInfo_repeats_1 =
+      _registerName1("timerWithTimeInterval:target:selector:userInfo:repeats:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_489(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    double ti,
+    ffi.Pointer<ObjCObject> aTarget,
+    ffi.Pointer<ObjCSel> aSelector,
+    ffi.Pointer<ObjCObject> userInfo,
+    bool yesOrNo,
+  ) {
+    return __objc_msgSend_489(
+      obj,
+      sel,
+      ti,
+      aTarget,
+      aSelector,
+      userInfo,
+      yesOrNo,
+    );
+  }
+
+  late final __objc_msgSend_489Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSTimeInterval,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_489 = __objc_msgSend_489Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          double,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          bool)>();
+
+  late final _sel_scheduledTimerWithTimeInterval_target_selector_userInfo_repeats_1 =
+      _registerName1(
+          "scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:");
+  late final _sel_timerWithTimeInterval_repeats_block_1 =
+      _registerName1("timerWithTimeInterval:repeats:block:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_490(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    double interval,
+    bool repeats,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_490(
+      obj,
+      sel,
+      interval,
+      repeats,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_490Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSTimeInterval,
+              ffi.Bool,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_490 = __objc_msgSend_490Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, double, bool, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_scheduledTimerWithTimeInterval_repeats_block_1 =
+      _registerName1("scheduledTimerWithTimeInterval:repeats:block:");
+  late final _sel_initWithFireDate_interval_repeats_block_1 =
+      _registerName1("initWithFireDate:interval:repeats:block:");
+  instancetype _objc_msgSend_491(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> date,
+    double interval,
+    bool repeats,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_491(
+      obj,
+      sel,
+      date,
+      interval,
+      repeats,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_491Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSTimeInterval,
+              ffi.Bool,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_491 = __objc_msgSend_491Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, double, bool, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_initWithFireDate_interval_target_selector_userInfo_repeats_1 =
+      _registerName1(
+          "initWithFireDate:interval:target:selector:userInfo:repeats:");
+  instancetype _objc_msgSend_492(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> date,
+    double ti,
+    ffi.Pointer<ObjCObject> t,
+    ffi.Pointer<ObjCSel> s,
+    ffi.Pointer<ObjCObject> ui,
+    bool rep,
+  ) {
+    return __objc_msgSend_492(
+      obj,
+      sel,
+      date,
+      ti,
+      t,
+      s,
+      ui,
+      rep,
+    );
+  }
+
+  late final __objc_msgSend_492Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSTimeInterval,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_492 = __objc_msgSend_492Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          double,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          bool)>();
+
+  late final _sel_fire1 = _registerName1("fire");
+  late final _sel_fireDate1 = _registerName1("fireDate");
+  late final _sel_setFireDate_1 = _registerName1("setFireDate:");
+  void _objc_msgSend_493(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_493(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_493Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_493 = __objc_msgSend_493Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_timeInterval1 = _registerName1("timeInterval");
+  late final _sel_tolerance1 = _registerName1("tolerance");
+  late final _sel_setTolerance_1 = _registerName1("setTolerance:");
+  late final _sel_userInfo1 = _registerName1("userInfo");
+  late final _sel_addTimer_forMode_1 = _registerName1("addTimer:forMode:");
+  void _objc_msgSend_494(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> timer,
+    NSRunLoopMode mode,
+  ) {
+    return __objc_msgSend_494(
+      obj,
+      sel,
+      timer,
+      mode,
+    );
+  }
+
+  late final __objc_msgSend_494Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, NSRunLoopMode)>>('objc_msgSend');
+  late final __objc_msgSend_494 = __objc_msgSend_494Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, NSRunLoopMode)>();
+
+  late final _sel_addPort_forMode_1 = _registerName1("addPort:forMode:");
+  void _objc_msgSend_495(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> aPort,
+    NSRunLoopMode mode,
+  ) {
+    return __objc_msgSend_495(
+      obj,
+      sel,
+      aPort,
+      mode,
+    );
+  }
+
+  late final __objc_msgSend_495Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, NSRunLoopMode)>>('objc_msgSend');
+  late final __objc_msgSend_495 = __objc_msgSend_495Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, NSRunLoopMode)>();
+
+  late final _sel_removePort_forMode_1 = _registerName1("removePort:forMode:");
+  late final _sel_limitDateForMode_1 = _registerName1("limitDateForMode:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_496(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRunLoopMode mode,
+  ) {
+    return __objc_msgSend_496(
+      obj,
+      sel,
+      mode,
+    );
+  }
+
+  late final __objc_msgSend_496Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSRunLoopMode)>>('objc_msgSend');
+  late final __objc_msgSend_496 = __objc_msgSend_496Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRunLoopMode)>();
+
+  late final _sel_acceptInputForMode_beforeDate_1 =
+      _registerName1("acceptInputForMode:beforeDate:");
+  void _objc_msgSend_497(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRunLoopMode mode,
+    ffi.Pointer<ObjCObject> limitDate,
+  ) {
+    return __objc_msgSend_497(
+      obj,
+      sel,
+      mode,
+      limitDate,
+    );
+  }
+
+  late final __objc_msgSend_497Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRunLoopMode, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_497 = __objc_msgSend_497Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          NSRunLoopMode, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_run1 = _registerName1("run");
+  late final _sel_runUntilDate_1 = _registerName1("runUntilDate:");
+  late final _sel_runMode_beforeDate_1 = _registerName1("runMode:beforeDate:");
+  bool _objc_msgSend_498(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRunLoopMode mode,
+    ffi.Pointer<ObjCObject> limitDate,
+  ) {
+    return __objc_msgSend_498(
+      obj,
+      sel,
+      mode,
+      limitDate,
+    );
+  }
+
+  late final __objc_msgSend_498Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRunLoopMode, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_498 = __objc_msgSend_498Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          NSRunLoopMode, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_configureAsServer1 = _registerName1("configureAsServer");
+  late final _sel_performInModes_block_1 =
+      _registerName1("performInModes:block:");
+  void _objc_msgSend_499(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> modes,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_499(
+      obj,
+      sel,
+      modes,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_499Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_499 = __objc_msgSend_499Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_performBlock_1 = _registerName1("performBlock:");
+  late final _sel_performSelector_target_argument_order_modes_1 =
+      _registerName1("performSelector:target:argument:order:modes:");
+  void _objc_msgSend_500(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCSel> aSelector,
+    ffi.Pointer<ObjCObject> target,
+    ffi.Pointer<ObjCObject> arg,
+    int order,
+    ffi.Pointer<ObjCObject> modes,
+  ) {
+    return __objc_msgSend_500(
+      obj,
+      sel,
+      aSelector,
+      target,
+      arg,
+      order,
+      modes,
+    );
+  }
+
+  late final __objc_msgSend_500Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              NSUInteger,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_500 = __objc_msgSend_500Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_cancelPerformSelector_target_argument_1 =
+      _registerName1("cancelPerformSelector:target:argument:");
+  late final _sel_cancelPerformSelectorsWithTarget_1 =
+      _registerName1("cancelPerformSelectorsWithTarget:");
+  late final _sel_scheduleInRunLoop_forMode_1 =
+      _registerName1("scheduleInRunLoop:forMode:");
+  void _objc_msgSend_501(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> runLoop,
+    NSRunLoopMode mode,
+  ) {
+    return __objc_msgSend_501(
+      obj,
+      sel,
+      runLoop,
+      mode,
+    );
+  }
+
+  late final __objc_msgSend_501Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, NSRunLoopMode)>>('objc_msgSend');
+  late final __objc_msgSend_501 = __objc_msgSend_501Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, NSRunLoopMode)>();
+
+  late final _sel_removeFromRunLoop_forMode_1 =
+      _registerName1("removeFromRunLoop:forMode:");
+  late final _sel_reservedSpaceLength1 = _registerName1("reservedSpaceLength");
+  late final _sel_sendBeforeDate_components_from_reserved_1 =
+      _registerName1("sendBeforeDate:components:from:reserved:");
+  bool _objc_msgSend_502(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> limitDate,
+    ffi.Pointer<ObjCObject> components,
+    ffi.Pointer<ObjCObject> receivePort,
+    int headerSpaceReserved,
+  ) {
+    return __objc_msgSend_502(
+      obj,
+      sel,
+      limitDate,
+      components,
+      receivePort,
+      headerSpaceReserved,
+    );
+  }
+
+  late final __objc_msgSend_502Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_502 = __objc_msgSend_502Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          int)>();
+
+  late final _sel_sendBeforeDate_msgid_components_from_reserved_1 =
+      _registerName1("sendBeforeDate:msgid:components:from:reserved:");
+  bool _objc_msgSend_503(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> limitDate,
+    int msgID,
+    ffi.Pointer<ObjCObject> components,
+    ffi.Pointer<ObjCObject> receivePort,
+    int headerSpaceReserved,
+  ) {
+    return __objc_msgSend_503(
+      obj,
+      sel,
+      limitDate,
+      msgID,
+      components,
+      receivePort,
+      headerSpaceReserved,
+    );
+  }
+
+  late final __objc_msgSend_503Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSUInteger,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_503 = __objc_msgSend_503Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          int)>();
+
+  late final _class_NSConnection1 = _getClass1("NSConnection");
+  late final _sel_statistics1 = _registerName1("statistics");
+  late final _sel_allConnections1 = _registerName1("allConnections");
+  late final _sel_defaultConnection1 = _registerName1("defaultConnection");
+  ffi.Pointer<ObjCObject> _objc_msgSend_504(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_504(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_504Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_504 = __objc_msgSend_504Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_connectionWithRegisteredName_host_1 =
+      _registerName1("connectionWithRegisteredName:host:");
+  late final _class_NSPortNameServer1 = _getClass1("NSPortNameServer");
+  late final _sel_systemDefaultPortNameServer1 =
+      _registerName1("systemDefaultPortNameServer");
+  ffi.Pointer<ObjCObject> _objc_msgSend_505(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_505(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_505Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_505 = __objc_msgSend_505Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_portForName_1 = _registerName1("portForName:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_506(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> name,
+  ) {
+    return __objc_msgSend_506(
+      obj,
+      sel,
+      name,
+    );
+  }
+
+  late final __objc_msgSend_506Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_506 = __objc_msgSend_506Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_portForName_host_1 = _registerName1("portForName:host:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_507(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> name,
+    ffi.Pointer<ObjCObject> host,
+  ) {
+    return __objc_msgSend_507(
+      obj,
+      sel,
+      name,
+      host,
+    );
+  }
+
+  late final __objc_msgSend_507Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_507 = __objc_msgSend_507Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_registerPort_name_1 = _registerName1("registerPort:name:");
+  bool _objc_msgSend_508(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> port,
+    ffi.Pointer<ObjCObject> name,
+  ) {
+    return __objc_msgSend_508(
+      obj,
+      sel,
+      port,
+      name,
+    );
+  }
+
+  late final __objc_msgSend_508Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_508 = __objc_msgSend_508Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_removePortForName_1 = _registerName1("removePortForName:");
+  late final _sel_connectionWithRegisteredName_host_usingNameServer_1 =
+      _registerName1("connectionWithRegisteredName:host:usingNameServer:");
+  instancetype _objc_msgSend_509(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> name,
+    ffi.Pointer<ObjCObject> hostName,
+    ffi.Pointer<ObjCObject> server,
+  ) {
+    return __objc_msgSend_509(
+      obj,
+      sel,
+      name,
+      hostName,
+      server,
+    );
+  }
+
+  late final __objc_msgSend_509Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_509 = __objc_msgSend_509Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSDistantObject1 = _getClass1("NSDistantObject");
+  late final _class_NSProxy1 = _getClass1("NSProxy");
+  late final _sel_respondsToSelector_1 = _registerName1("respondsToSelector:");
+  late final _sel_proxyWithTarget_connection_1 =
+      _registerName1("proxyWithTarget:connection:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_510(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> target,
+    ffi.Pointer<ObjCObject> connection,
+  ) {
+    return __objc_msgSend_510(
+      obj,
+      sel,
+      target,
+      connection,
+    );
+  }
+
+  late final __objc_msgSend_510Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_510 = __objc_msgSend_510Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithTarget_connection_1 =
+      _registerName1("initWithTarget:connection:");
+  late final _sel_proxyWithLocal_connection_1 =
+      _registerName1("proxyWithLocal:connection:");
+  late final _sel_initWithLocal_connection_1 =
+      _registerName1("initWithLocal:connection:");
+  late final _sel_setProtocolForProxy_1 =
+      _registerName1("setProtocolForProxy:");
+  void _objc_msgSend_511(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> proto,
+  ) {
+    return __objc_msgSend_511(
+      obj,
+      sel,
+      proto,
+    );
+  }
+
+  late final __objc_msgSend_511Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_511 = __objc_msgSend_511Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_connectionForProxy1 = _registerName1("connectionForProxy");
+  late final _sel_rootProxyForConnectionWithRegisteredName_host_1 =
+      _registerName1("rootProxyForConnectionWithRegisteredName:host:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_512(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> name,
+    ffi.Pointer<ObjCObject> hostName,
+  ) {
+    return __objc_msgSend_512(
+      obj,
+      sel,
+      name,
+      hostName,
+    );
+  }
+
+  late final __objc_msgSend_512Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_512 = __objc_msgSend_512Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_rootProxyForConnectionWithRegisteredName_host_usingNameServer_1 =
+      _registerName1(
+          "rootProxyForConnectionWithRegisteredName:host:usingNameServer:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_513(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> name,
+    ffi.Pointer<ObjCObject> hostName,
+    ffi.Pointer<ObjCObject> server,
+  ) {
+    return __objc_msgSend_513(
+      obj,
+      sel,
+      name,
+      hostName,
+      server,
+    );
+  }
+
+  late final __objc_msgSend_513Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_513 = __objc_msgSend_513Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_serviceConnectionWithName_rootObject_usingNameServer_1 =
+      _registerName1("serviceConnectionWithName:rootObject:usingNameServer:");
+  instancetype _objc_msgSend_514(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> name,
+    ffi.Pointer<ObjCObject> root,
+    ffi.Pointer<ObjCObject> server,
+  ) {
+    return __objc_msgSend_514(
+      obj,
+      sel,
+      name,
+      root,
+      server,
+    );
+  }
+
+  late final __objc_msgSend_514Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_514 = __objc_msgSend_514Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_serviceConnectionWithName_rootObject_1 =
+      _registerName1("serviceConnectionWithName:rootObject:");
+  late final _sel_requestTimeout1 = _registerName1("requestTimeout");
+  late final _sel_setRequestTimeout_1 = _registerName1("setRequestTimeout:");
+  late final _sel_replyTimeout1 = _registerName1("replyTimeout");
+  late final _sel_setReplyTimeout_1 = _registerName1("setReplyTimeout:");
+  late final _sel_rootObject1 = _registerName1("rootObject");
+  late final _sel_setRootObject_1 = _registerName1("setRootObject:");
+  late final _sel_independentConversationQueueing1 =
+      _registerName1("independentConversationQueueing");
+  late final _sel_setIndependentConversationQueueing_1 =
+      _registerName1("setIndependentConversationQueueing:");
+  late final _sel_rootProxy1 = _registerName1("rootProxy");
+  ffi.Pointer<ObjCObject> _objc_msgSend_515(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_515(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_515Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_515 = __objc_msgSend_515Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_addRequestMode_1 = _registerName1("addRequestMode:");
+  late final _sel_removeRequestMode_1 = _registerName1("removeRequestMode:");
+  late final _sel_requestModes1 = _registerName1("requestModes");
+  late final _sel_registerName_1 = _registerName1("registerName:");
+  late final _sel_registerName_withNameServer_1 =
+      _registerName1("registerName:withNameServer:");
+  bool _objc_msgSend_516(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> name,
+    ffi.Pointer<ObjCObject> server,
+  ) {
+    return __objc_msgSend_516(
+      obj,
+      sel,
+      name,
+      server,
+    );
+  }
+
+  late final __objc_msgSend_516Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_516 = __objc_msgSend_516Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_connectionWithReceivePort_sendPort_1 =
+      _registerName1("connectionWithReceivePort:sendPort:");
+  instancetype _objc_msgSend_517(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> receivePort,
+    ffi.Pointer<ObjCObject> sendPort,
+  ) {
+    return __objc_msgSend_517(
+      obj,
+      sel,
+      receivePort,
+      sendPort,
+    );
+  }
+
+  late final __objc_msgSend_517Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_517 = __objc_msgSend_517Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_currentConversation1 = _registerName1("currentConversation");
+  late final _sel_initWithReceivePort_sendPort_1 =
+      _registerName1("initWithReceivePort:sendPort:");
+  late final _sel_sendPort1 = _registerName1("sendPort");
+  late final _sel_receivePort1 = _registerName1("receivePort");
+  late final _sel_enableMultipleThreads1 =
+      _registerName1("enableMultipleThreads");
+  late final _sel_multipleThreadsEnabled1 =
+      _registerName1("multipleThreadsEnabled");
+  late final _sel_addRunLoop_1 = _registerName1("addRunLoop:");
+  void _objc_msgSend_518(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> runloop,
+  ) {
+    return __objc_msgSend_518(
+      obj,
+      sel,
+      runloop,
+    );
+  }
+
+  late final __objc_msgSend_518Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_518 = __objc_msgSend_518Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_removeRunLoop_1 = _registerName1("removeRunLoop:");
+  late final _sel_runInNewThread1 = _registerName1("runInNewThread");
+  late final _sel_remoteObjects1 = _registerName1("remoteObjects");
+  late final _sel_localObjects1 = _registerName1("localObjects");
+  late final _sel_dispatchWithComponents_1 =
+      _registerName1("dispatchWithComponents:");
+  late final _sel_addConnection_toRunLoop_forMode_1 =
+      _registerName1("addConnection:toRunLoop:forMode:");
+  void _objc_msgSend_519(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> conn,
+    ffi.Pointer<ObjCObject> runLoop,
+    NSRunLoopMode mode,
+  ) {
+    return __objc_msgSend_519(
+      obj,
+      sel,
+      conn,
+      runLoop,
+      mode,
+    );
+  }
+
+  late final __objc_msgSend_519Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              NSRunLoopMode)>>('objc_msgSend');
+  late final __objc_msgSend_519 = __objc_msgSend_519Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>, NSRunLoopMode)>();
+
+  late final _sel_removeConnection_fromRunLoop_forMode_1 =
+      _registerName1("removeConnection:fromRunLoop:forMode:");
+  late final _sel_encodePortObject_1 = _registerName1("encodePortObject:");
+  void _objc_msgSend_520(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> aport,
+  ) {
+    return __objc_msgSend_520(
+      obj,
+      sel,
+      aport,
+    );
+  }
+
+  late final __objc_msgSend_520Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_520 = __objc_msgSend_520Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_decodePortObject1 = _registerName1("decodePortObject");
+  late final _sel_connection1 = _registerName1("connection");
+  late final _sel_portCoderWithReceivePort_sendPort_components_1 =
+      _registerName1("portCoderWithReceivePort:sendPort:components:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_521(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> rcvPort,
+    ffi.Pointer<ObjCObject> sndPort,
+    ffi.Pointer<ObjCObject> comps,
+  ) {
+    return __objc_msgSend_521(
+      obj,
+      sel,
+      rcvPort,
+      sndPort,
+      comps,
+    );
+  }
+
+  late final __objc_msgSend_521Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_521 = __objc_msgSend_521Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithReceivePort_sendPort_components_1 =
+      _registerName1("initWithReceivePort:sendPort:components:");
+  late final _sel_dispatch1 = _registerName1("dispatch");
+  late final _sel_replacementObjectForPortCoder_1 =
+      _registerName1("replacementObjectForPortCoder:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_522(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> coder,
+  ) {
+    return __objc_msgSend_522(
+      obj,
+      sel,
+      coder,
+    );
+  }
+
+  late final __objc_msgSend_522Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_522 = __objc_msgSend_522Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSClassDescription1 = _getClass1("NSClassDescription");
+  late final _sel_registerClassDescription_forClass_1 =
+      _registerName1("registerClassDescription:forClass:");
+  void _objc_msgSend_523(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> description,
+    ffi.Pointer<ObjCObject> aClass,
+  ) {
+    return __objc_msgSend_523(
+      obj,
+      sel,
+      description,
+      aClass,
+    );
+  }
+
+  late final __objc_msgSend_523Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_523 = __objc_msgSend_523Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_invalidateClassDescriptionCache1 =
+      _registerName1("invalidateClassDescriptionCache");
+  late final _sel_classDescriptionForClass_1 =
+      _registerName1("classDescriptionForClass:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_524(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> aClass,
+  ) {
+    return __objc_msgSend_524(
+      obj,
+      sel,
+      aClass,
+    );
+  }
+
+  late final __objc_msgSend_524Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_524 = __objc_msgSend_524Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_attributeKeys1 = _registerName1("attributeKeys");
+  late final _sel_toOneRelationshipKeys1 =
+      _registerName1("toOneRelationshipKeys");
+  late final _sel_toManyRelationshipKeys1 =
+      _registerName1("toManyRelationshipKeys");
+  late final _sel_inverseForRelationshipKey_1 =
+      _registerName1("inverseForRelationshipKey:");
+  late final _sel_classDescription1 = _registerName1("classDescription");
+  ffi.Pointer<ObjCObject> _objc_msgSend_525(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_525(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_525Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_525 = __objc_msgSend_525Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _class_NSScriptObjectSpecifier1 =
+      _getClass1("NSScriptObjectSpecifier");
+  late final _class_NSAppleEventDescriptor1 =
+      _getClass1("NSAppleEventDescriptor");
+  late final _sel_nullDescriptor1 = _registerName1("nullDescriptor");
+  ffi.Pointer<ObjCObject> _objc_msgSend_526(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_526(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_526Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_526 = __objc_msgSend_526Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_descriptorWithDescriptorType_bytes_length_1 =
+      _registerName1("descriptorWithDescriptorType:bytes:length:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_527(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int descriptorType,
+    ffi.Pointer<ffi.Void> bytes,
+    int byteCount,
+  ) {
+    return __objc_msgSend_527(
+      obj,
+      sel,
+      descriptorType,
+      bytes,
+      byteCount,
+    );
+  }
+
+  late final __objc_msgSend_527Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              DescType,
+              ffi.Pointer<ffi.Void>,
+              NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_527 = __objc_msgSend_527Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, ffi.Pointer<ffi.Void>, int)>();
+
+  late final _sel_descriptorWithDescriptorType_data_1 =
+      _registerName1("descriptorWithDescriptorType:data:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_528(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int descriptorType,
+    ffi.Pointer<ObjCObject> data,
+  ) {
+    return __objc_msgSend_528(
+      obj,
+      sel,
+      descriptorType,
+      data,
+    );
+  }
+
+  late final __objc_msgSend_528Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              DescType,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_528 = __objc_msgSend_528Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_descriptorWithBoolean_1 =
+      _registerName1("descriptorWithBoolean:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_529(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int boolean,
+  ) {
+    return __objc_msgSend_529(
+      obj,
+      sel,
+      boolean,
+    );
+  }
+
+  late final __objc_msgSend_529Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, Boolean)>>('objc_msgSend');
+  late final __objc_msgSend_529 = __objc_msgSend_529Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_descriptorWithEnumCode_1 =
+      _registerName1("descriptorWithEnumCode:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_530(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int enumerator,
+  ) {
+    return __objc_msgSend_530(
+      obj,
+      sel,
+      enumerator,
+    );
+  }
+
+  late final __objc_msgSend_530Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, OSType)>>('objc_msgSend');
+  late final __objc_msgSend_530 = __objc_msgSend_530Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_descriptorWithInt32_1 =
+      _registerName1("descriptorWithInt32:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_531(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int signedInt,
+  ) {
+    return __objc_msgSend_531(
+      obj,
+      sel,
+      signedInt,
+    );
+  }
+
+  late final __objc_msgSend_531Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, SInt32)>>('objc_msgSend');
+  late final __objc_msgSend_531 = __objc_msgSend_531Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_descriptorWithDouble_1 =
+      _registerName1("descriptorWithDouble:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_532(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    double doubleValue,
+  ) {
+    return __objc_msgSend_532(
+      obj,
+      sel,
+      doubleValue,
+    );
+  }
+
+  late final __objc_msgSend_532Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Double)>>('objc_msgSend');
+  late final __objc_msgSend_532 = __objc_msgSend_532Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, double)>();
+
+  late final _sel_descriptorWithTypeCode_1 =
+      _registerName1("descriptorWithTypeCode:");
+  late final _sel_descriptorWithString_1 =
+      _registerName1("descriptorWithString:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_533(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> string,
+  ) {
+    return __objc_msgSend_533(
+      obj,
+      sel,
+      string,
+    );
+  }
+
+  late final __objc_msgSend_533Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_533 = __objc_msgSend_533Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_descriptorWithDate_1 = _registerName1("descriptorWithDate:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_534(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> date,
+  ) {
+    return __objc_msgSend_534(
+      obj,
+      sel,
+      date,
+    );
+  }
+
+  late final __objc_msgSend_534Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_534 = __objc_msgSend_534Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_descriptorWithFileURL_1 =
+      _registerName1("descriptorWithFileURL:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_535(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> fileURL,
+  ) {
+    return __objc_msgSend_535(
+      obj,
+      sel,
+      fileURL,
+    );
+  }
+
+  late final __objc_msgSend_535Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_535 = __objc_msgSend_535Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_appleEventWithEventClass_eventID_targetDescriptor_returnID_transactionID_1 =
+      _registerName1(
+          "appleEventWithEventClass:eventID:targetDescriptor:returnID:transactionID:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_536(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int eventClass,
+    int eventID,
+    ffi.Pointer<ObjCObject> targetDescriptor,
+    int returnID,
+    int transactionID,
+  ) {
+    return __objc_msgSend_536(
+      obj,
+      sel,
+      eventClass,
+      eventID,
+      targetDescriptor,
+      returnID,
+      transactionID,
+    );
+  }
+
+  late final __objc_msgSend_536Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              AEEventClass,
+              AEEventID,
+              ffi.Pointer<ObjCObject>,
+              AEReturnID,
+              AETransactionID)>>('objc_msgSend');
+  late final __objc_msgSend_536 = __objc_msgSend_536Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, int, ffi.Pointer<ObjCObject>, int, int)>();
+
+  late final _sel_listDescriptor1 = _registerName1("listDescriptor");
+  late final _sel_recordDescriptor1 = _registerName1("recordDescriptor");
+  late final _sel_currentProcessDescriptor1 =
+      _registerName1("currentProcessDescriptor");
+  late final _sel_descriptorWithProcessIdentifier_1 =
+      _registerName1("descriptorWithProcessIdentifier:");
+  late final _sel_descriptorWithBundleIdentifier_1 =
+      _registerName1("descriptorWithBundleIdentifier:");
+  late final _sel_descriptorWithApplicationURL_1 =
+      _registerName1("descriptorWithApplicationURL:");
+  late final _sel_initWithAEDescNoCopy_1 =
+      _registerName1("initWithAEDescNoCopy:");
+  instancetype _objc_msgSend_537(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<AEDesc> aeDesc,
+  ) {
+    return __objc_msgSend_537(
+      obj,
+      sel,
+      aeDesc,
+    );
+  }
+
+  late final __objc_msgSend_537Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<AEDesc>)>>('objc_msgSend');
+  late final __objc_msgSend_537 = __objc_msgSend_537Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<AEDesc>)>();
+
+  late final _sel_initWithDescriptorType_bytes_length_1 =
+      _registerName1("initWithDescriptorType:bytes:length:");
+  instancetype _objc_msgSend_538(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int descriptorType,
+    ffi.Pointer<ffi.Void> bytes,
+    int byteCount,
+  ) {
+    return __objc_msgSend_538(
+      obj,
+      sel,
+      descriptorType,
+      bytes,
+      byteCount,
+    );
+  }
+
+  late final __objc_msgSend_538Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              DescType, ffi.Pointer<ffi.Void>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_538 = __objc_msgSend_538Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ffi.Void>, int)>();
+
+  late final _sel_initWithDescriptorType_data_1 =
+      _registerName1("initWithDescriptorType:data:");
+  instancetype _objc_msgSend_539(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int descriptorType,
+    ffi.Pointer<ObjCObject> data,
+  ) {
+    return __objc_msgSend_539(
+      obj,
+      sel,
+      descriptorType,
+      data,
+    );
+  }
+
+  late final __objc_msgSend_539Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              DescType, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_539 = __objc_msgSend_539Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithEventClass_eventID_targetDescriptor_returnID_transactionID_1 =
+      _registerName1(
+          "initWithEventClass:eventID:targetDescriptor:returnID:transactionID:");
+  instancetype _objc_msgSend_540(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int eventClass,
+    int eventID,
+    ffi.Pointer<ObjCObject> targetDescriptor,
+    int returnID,
+    int transactionID,
+  ) {
+    return __objc_msgSend_540(
+      obj,
+      sel,
+      eventClass,
+      eventID,
+      targetDescriptor,
+      returnID,
+      transactionID,
+    );
+  }
+
+  late final __objc_msgSend_540Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              AEEventClass,
+              AEEventID,
+              ffi.Pointer<ObjCObject>,
+              AEReturnID,
+              AETransactionID)>>('objc_msgSend');
+  late final __objc_msgSend_540 = __objc_msgSend_540Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          int, ffi.Pointer<ObjCObject>, int, int)>();
+
+  late final _sel_initListDescriptor1 = _registerName1("initListDescriptor");
+  late final _sel_initRecordDescriptor1 =
+      _registerName1("initRecordDescriptor");
+  late final _sel_aeDesc1 = _registerName1("aeDesc");
+  ffi.Pointer<AEDesc> _objc_msgSend_541(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_541(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_541Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<AEDesc> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_541 = __objc_msgSend_541Ptr.asFunction<
+      ffi.Pointer<AEDesc> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_descriptorType1 = _registerName1("descriptorType");
+  late final _sel_booleanValue1 = _registerName1("booleanValue");
+  late final _sel_enumCodeValue1 = _registerName1("enumCodeValue");
+  late final _sel_int32Value1 = _registerName1("int32Value");
+  late final _sel_typeCodeValue1 = _registerName1("typeCodeValue");
+  late final _sel_dateValue1 = _registerName1("dateValue");
+  late final _sel_fileURLValue1 = _registerName1("fileURLValue");
+  late final _sel_eventClass1 = _registerName1("eventClass");
+  late final _sel_eventID1 = _registerName1("eventID");
+  late final _sel_returnID1 = _registerName1("returnID");
+  late final _sel_transactionID1 = _registerName1("transactionID");
+  late final _sel_setParamDescriptor_forKeyword_1 =
+      _registerName1("setParamDescriptor:forKeyword:");
+  void _objc_msgSend_542(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> descriptor,
+    int keyword,
+  ) {
+    return __objc_msgSend_542(
+      obj,
+      sel,
+      descriptor,
+      keyword,
+    );
+  }
+
+  late final __objc_msgSend_542Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, AEKeyword)>>('objc_msgSend');
+  late final __objc_msgSend_542 = __objc_msgSend_542Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_paramDescriptorForKeyword_1 =
+      _registerName1("paramDescriptorForKeyword:");
+  late final _sel_removeParamDescriptorWithKeyword_1 =
+      _registerName1("removeParamDescriptorWithKeyword:");
+  void _objc_msgSend_543(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int keyword,
+  ) {
+    return __objc_msgSend_543(
+      obj,
+      sel,
+      keyword,
+    );
+  }
+
+  late final __objc_msgSend_543Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              AEKeyword)>>('objc_msgSend');
+  late final __objc_msgSend_543 = __objc_msgSend_543Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_setAttributeDescriptor_forKeyword_1 =
+      _registerName1("setAttributeDescriptor:forKeyword:");
+  late final _sel_attributeDescriptorForKeyword_1 =
+      _registerName1("attributeDescriptorForKeyword:");
+  late final _sel_sendEventWithOptions_timeout_error_1 =
+      _registerName1("sendEventWithOptions:timeout:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_544(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int sendOptions,
+    double timeoutInSeconds,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_544(
+      obj,
+      sel,
+      sendOptions,
+      timeoutInSeconds,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_544Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              NSTimeInterval,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_544 = __objc_msgSend_544Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          int,
+          double,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_isRecordDescriptor1 = _registerName1("isRecordDescriptor");
+  late final _sel_numberOfItems1 = _registerName1("numberOfItems");
+  late final _sel_insertDescriptor_atIndex_1 =
+      _registerName1("insertDescriptor:atIndex:");
+  void _objc_msgSend_545(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> descriptor,
+    int index,
+  ) {
+    return __objc_msgSend_545(
+      obj,
+      sel,
+      descriptor,
+      index,
+    );
+  }
+
+  late final __objc_msgSend_545Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, NSInteger)>>('objc_msgSend');
+  late final __objc_msgSend_545 = __objc_msgSend_545Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_descriptorAtIndex_1 = _registerName1("descriptorAtIndex:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_546(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int index,
+  ) {
+    return __objc_msgSend_546(
+      obj,
+      sel,
+      index,
+    );
+  }
+
+  late final __objc_msgSend_546Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSInteger)>>('objc_msgSend');
+  late final __objc_msgSend_546 = __objc_msgSend_546Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_removeDescriptorAtIndex_1 =
+      _registerName1("removeDescriptorAtIndex:");
+  late final _sel_setDescriptor_forKeyword_1 =
+      _registerName1("setDescriptor:forKeyword:");
+  late final _sel_descriptorForKeyword_1 =
+      _registerName1("descriptorForKeyword:");
+  late final _sel_removeDescriptorWithKeyword_1 =
+      _registerName1("removeDescriptorWithKeyword:");
+  late final _sel_keywordForDescriptorAtIndex_1 =
+      _registerName1("keywordForDescriptorAtIndex:");
+  int _objc_msgSend_547(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int index,
+  ) {
+    return __objc_msgSend_547(
+      obj,
+      sel,
+      index,
+    );
+  }
+
+  late final __objc_msgSend_547Ptr = _lookup<
+      ffi.NativeFunction<
+          AEKeyword Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSInteger)>>('objc_msgSend');
+  late final __objc_msgSend_547 = __objc_msgSend_547Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_coerceToDescriptorType_1 =
+      _registerName1("coerceToDescriptorType:");
+  late final _sel_objectSpecifierWithDescriptor_1 =
+      _registerName1("objectSpecifierWithDescriptor:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_548(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> descriptor,
+  ) {
+    return __objc_msgSend_548(
+      obj,
+      sel,
+      descriptor,
+    );
+  }
+
+  late final __objc_msgSend_548Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_548 = __objc_msgSend_548Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithContainerSpecifier_key_1 =
+      _registerName1("initWithContainerSpecifier:key:");
+  instancetype _objc_msgSend_549(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> container,
+    ffi.Pointer<ObjCObject> property,
+  ) {
+    return __objc_msgSend_549(
+      obj,
+      sel,
+      container,
+      property,
+    );
+  }
+
+  late final __objc_msgSend_549Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_549 = __objc_msgSend_549Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSScriptClassDescription1 =
+      _getClass1("NSScriptClassDescription");
+  ffi.Pointer<ObjCObject> _objc_msgSend_550(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> aClass,
+  ) {
+    return __objc_msgSend_550(
+      obj,
+      sel,
+      aClass,
+    );
+  }
+
+  late final __objc_msgSend_550Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_550 = __objc_msgSend_550Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithSuiteName_className_dictionary_1 =
+      _registerName1("initWithSuiteName:className:dictionary:");
+  instancetype _objc_msgSend_551(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> suiteName,
+    ffi.Pointer<ObjCObject> className,
+    ffi.Pointer<ObjCObject> classDeclaration,
+  ) {
+    return __objc_msgSend_551(
+      obj,
+      sel,
+      suiteName,
+      className,
+      classDeclaration,
+    );
+  }
+
+  late final __objc_msgSend_551Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_551 = __objc_msgSend_551Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_suiteName1 = _registerName1("suiteName");
+  late final _sel_className1 = _registerName1("className");
+  late final _sel_implementationClassName1 =
+      _registerName1("implementationClassName");
+  late final _sel_superclassDescription1 =
+      _registerName1("superclassDescription");
+  ffi.Pointer<ObjCObject> _objc_msgSend_552(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_552(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_552Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_552 = __objc_msgSend_552Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_appleEventCode1 = _registerName1("appleEventCode");
+  late final _sel_matchesAppleEventCode_1 =
+      _registerName1("matchesAppleEventCode:");
+  late final _class_NSScriptCommandDescription1 =
+      _getClass1("NSScriptCommandDescription");
+  late final _sel_initWithSuiteName_commandName_dictionary_1 =
+      _registerName1("initWithSuiteName:commandName:dictionary:");
+  late final _sel_commandName1 = _registerName1("commandName");
+  late final _sel_appleEventClassCode1 = _registerName1("appleEventClassCode");
+  late final _sel_commandClassName1 = _registerName1("commandClassName");
+  late final _sel_returnType1 = _registerName1("returnType");
+  late final _sel_appleEventCodeForReturnType1 =
+      _registerName1("appleEventCodeForReturnType");
+  late final _sel_argumentNames1 = _registerName1("argumentNames");
+  late final _sel_typeForArgumentWithName_1 =
+      _registerName1("typeForArgumentWithName:");
+  late final _sel_appleEventCodeForArgumentWithName_1 =
+      _registerName1("appleEventCodeForArgumentWithName:");
+  int _objc_msgSend_553(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> argumentName,
+  ) {
+    return __objc_msgSend_553(
+      obj,
+      sel,
+      argumentName,
+    );
+  }
+
+  late final __objc_msgSend_553Ptr = _lookup<
+      ffi.NativeFunction<
+          FourCharCode Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_553 = __objc_msgSend_553Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_isOptionalArgumentWithName_1 =
+      _registerName1("isOptionalArgumentWithName:");
+  late final _class_NSScriptCommand1 = _getClass1("NSScriptCommand");
+  late final _sel_initWithCommandDescription_1 =
+      _registerName1("initWithCommandDescription:");
+  instancetype _objc_msgSend_554(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> commandDef,
+  ) {
+    return __objc_msgSend_554(
+      obj,
+      sel,
+      commandDef,
+    );
+  }
+
+  late final __objc_msgSend_554Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_554 = __objc_msgSend_554Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_commandDescription1 = _registerName1("commandDescription");
+  ffi.Pointer<ObjCObject> _objc_msgSend_555(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_555(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_555Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_555 = __objc_msgSend_555Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_directParameter1 = _registerName1("directParameter");
+  late final _sel_setDirectParameter_1 = _registerName1("setDirectParameter:");
+  late final _sel_receiversSpecifier1 = _registerName1("receiversSpecifier");
+  ffi.Pointer<ObjCObject> _objc_msgSend_556(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_556(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_556Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_556 = __objc_msgSend_556Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setReceiversSpecifier_1 =
+      _registerName1("setReceiversSpecifier:");
+  void _objc_msgSend_557(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_557(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_557Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_557 = __objc_msgSend_557Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_evaluatedReceivers1 = _registerName1("evaluatedReceivers");
+  late final _sel_arguments1 = _registerName1("arguments");
+  late final _sel_setArguments_1 = _registerName1("setArguments:");
+  late final _sel_evaluatedArguments1 = _registerName1("evaluatedArguments");
+  late final _sel_isWellFormed1 = _registerName1("isWellFormed");
+  late final _sel_performDefaultImplementation1 =
+      _registerName1("performDefaultImplementation");
+  late final _sel_executeCommand1 = _registerName1("executeCommand");
+  late final _sel_scriptErrorNumber1 = _registerName1("scriptErrorNumber");
+  late final _sel_setScriptErrorNumber_1 =
+      _registerName1("setScriptErrorNumber:");
+  void _objc_msgSend_558(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_558(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_558Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSInteger)>>('objc_msgSend');
+  late final __objc_msgSend_558 = __objc_msgSend_558Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_scriptErrorOffendingObjectDescriptor1 =
+      _registerName1("scriptErrorOffendingObjectDescriptor");
+  late final _sel_setScriptErrorOffendingObjectDescriptor_1 =
+      _registerName1("setScriptErrorOffendingObjectDescriptor:");
+  void _objc_msgSend_559(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_559(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_559Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_559 = __objc_msgSend_559Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_scriptErrorExpectedTypeDescriptor1 =
+      _registerName1("scriptErrorExpectedTypeDescriptor");
+  late final _sel_setScriptErrorExpectedTypeDescriptor_1 =
+      _registerName1("setScriptErrorExpectedTypeDescriptor:");
+  late final _sel_scriptErrorString1 = _registerName1("scriptErrorString");
+  late final _sel_setScriptErrorString_1 =
+      _registerName1("setScriptErrorString:");
+  late final _sel_currentCommand1 = _registerName1("currentCommand");
+  ffi.Pointer<ObjCObject> _objc_msgSend_560(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_560(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_560Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_560 = __objc_msgSend_560Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_appleEvent1 = _registerName1("appleEvent");
+  late final _sel_suspendExecution1 = _registerName1("suspendExecution");
+  late final _sel_resumeExecutionWithResult_1 =
+      _registerName1("resumeExecutionWithResult:");
+  late final _sel_createCommandInstance1 =
+      _registerName1("createCommandInstance");
+  late final _sel_createCommandInstanceWithZone_1 =
+      _registerName1("createCommandInstanceWithZone:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_561(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<NSZone> zone,
+  ) {
+    return __objc_msgSend_561(
+      obj,
+      sel,
+      zone,
+    );
+  }
+
+  late final __objc_msgSend_561Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<NSZone>)>>('objc_msgSend');
+  late final __objc_msgSend_561 = __objc_msgSend_561Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<NSZone>)>();
+
+  late final _sel_supportsCommand_1 = _registerName1("supportsCommand:");
+  bool _objc_msgSend_562(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> commandDescription,
+  ) {
+    return __objc_msgSend_562(
+      obj,
+      sel,
+      commandDescription,
+    );
+  }
+
+  late final __objc_msgSend_562Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_562 = __objc_msgSend_562Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_selectorForCommand_1 = _registerName1("selectorForCommand:");
+  ffi.Pointer<ObjCSel> _objc_msgSend_563(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> commandDescription,
+  ) {
+    return __objc_msgSend_563(
+      obj,
+      sel,
+      commandDescription,
+    );
+  }
+
+  late final __objc_msgSend_563Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCSel> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_563 = __objc_msgSend_563Ptr.asFunction<
+      ffi.Pointer<ObjCSel> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_typeForKey_1 = _registerName1("typeForKey:");
+  late final _sel_classDescriptionForKey_1 =
+      _registerName1("classDescriptionForKey:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_564(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_564(
+      obj,
+      sel,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_564Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_564 = __objc_msgSend_564Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_appleEventCodeForKey_1 =
+      _registerName1("appleEventCodeForKey:");
+  late final _sel_keyWithAppleEventCode_1 =
+      _registerName1("keyWithAppleEventCode:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_565(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int appleEventCode,
+  ) {
+    return __objc_msgSend_565(
+      obj,
+      sel,
+      appleEventCode,
+    );
+  }
+
+  late final __objc_msgSend_565Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, FourCharCode)>>('objc_msgSend');
+  late final __objc_msgSend_565 = __objc_msgSend_565Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_defaultSubcontainerAttributeKey1 =
+      _registerName1("defaultSubcontainerAttributeKey");
+  late final _sel_isLocationRequiredToCreateForKey_1 =
+      _registerName1("isLocationRequiredToCreateForKey:");
+  late final _sel_hasPropertyForKey_1 = _registerName1("hasPropertyForKey:");
+  late final _sel_hasOrderedToManyRelationshipForKey_1 =
+      _registerName1("hasOrderedToManyRelationshipForKey:");
+  late final _sel_hasReadablePropertyForKey_1 =
+      _registerName1("hasReadablePropertyForKey:");
+  late final _sel_hasWritablePropertyForKey_1 =
+      _registerName1("hasWritablePropertyForKey:");
+  late final _sel_isReadOnlyKey_1 = _registerName1("isReadOnlyKey:");
+  late final _sel_initWithContainerClassDescription_containerSpecifier_key_1 =
+      _registerName1(
+          "initWithContainerClassDescription:containerSpecifier:key:");
+  instancetype _objc_msgSend_566(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> classDesc,
+    ffi.Pointer<ObjCObject> container,
+    ffi.Pointer<ObjCObject> property,
+  ) {
+    return __objc_msgSend_566(
+      obj,
+      sel,
+      classDesc,
+      container,
+      property,
+    );
+  }
+
+  late final __objc_msgSend_566Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_566 = __objc_msgSend_566Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_childSpecifier1 = _registerName1("childSpecifier");
+  late final _sel_setChildSpecifier_1 = _registerName1("setChildSpecifier:");
+  late final _sel_containerSpecifier1 = _registerName1("containerSpecifier");
+  late final _sel_setContainerSpecifier_1 =
+      _registerName1("setContainerSpecifier:");
+  late final _sel_containerIsObjectBeingTested1 =
+      _registerName1("containerIsObjectBeingTested");
+  late final _sel_setContainerIsObjectBeingTested_1 =
+      _registerName1("setContainerIsObjectBeingTested:");
+  late final _sel_containerIsRangeContainerObject1 =
+      _registerName1("containerIsRangeContainerObject");
+  late final _sel_setContainerIsRangeContainerObject_1 =
+      _registerName1("setContainerIsRangeContainerObject:");
+  late final _sel_key1 = _registerName1("key");
+  late final _sel_setKey_1 = _registerName1("setKey:");
+  late final _sel_containerClassDescription1 =
+      _registerName1("containerClassDescription");
+  late final _sel_setContainerClassDescription_1 =
+      _registerName1("setContainerClassDescription:");
+  void _objc_msgSend_567(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_567(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_567Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_567 = __objc_msgSend_567Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_keyClassDescription1 = _registerName1("keyClassDescription");
+  late final _sel_indicesOfObjectsByEvaluatingWithContainer_count_1 =
+      _registerName1("indicesOfObjectsByEvaluatingWithContainer:count:");
+  ffi.Pointer<NSInteger> _objc_msgSend_568(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> container,
+    ffi.Pointer<NSInteger> count,
+  ) {
+    return __objc_msgSend_568(
+      obj,
+      sel,
+      container,
+      count,
+    );
+  }
+
+  late final __objc_msgSend_568Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<NSInteger> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<NSInteger>)>>('objc_msgSend');
+  late final __objc_msgSend_568 = __objc_msgSend_568Ptr.asFunction<
+      ffi.Pointer<NSInteger> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<NSInteger>)>();
+
+  late final _sel_objectsByEvaluatingWithContainers_1 =
+      _registerName1("objectsByEvaluatingWithContainers:");
+  late final _sel_objectsByEvaluatingSpecifier1 =
+      _registerName1("objectsByEvaluatingSpecifier");
+  late final _sel_evaluationErrorNumber1 =
+      _registerName1("evaluationErrorNumber");
+  late final _sel_setEvaluationErrorNumber_1 =
+      _registerName1("setEvaluationErrorNumber:");
+  late final _sel_evaluationErrorSpecifier1 =
+      _registerName1("evaluationErrorSpecifier");
+  late final _sel_descriptor1 = _registerName1("descriptor");
+  late final _sel_scriptingValueForSpecifier_1 =
+      _registerName1("scriptingValueForSpecifier:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_569(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> objectSpecifier,
+  ) {
+    return __objc_msgSend_569(
+      obj,
+      sel,
+      objectSpecifier,
+    );
+  }
+
+  late final __objc_msgSend_569Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_569 = __objc_msgSend_569Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_scriptingProperties1 = _registerName1("scriptingProperties");
+  late final _sel_setScriptingProperties_1 =
+      _registerName1("setScriptingProperties:");
+  late final _sel_copyScriptingValue_forKey_withProperties_1 =
+      _registerName1("copyScriptingValue:forKey:withProperties:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_570(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+    ffi.Pointer<ObjCObject> key,
+    ffi.Pointer<ObjCObject> properties,
+  ) {
+    return __objc_msgSend_570(
+      obj,
+      sel,
+      value,
+      key,
+      properties,
+    );
+  }
+
+  late final __objc_msgSend_570Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_570 = __objc_msgSend_570Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_newScriptingObjectOfClass_forValueForKey_withContentsValue_properties_1 =
+      _registerName1(
+          "newScriptingObjectOfClass:forValueForKey:withContentsValue:properties:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_571(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> objectClass,
+    ffi.Pointer<ObjCObject> key,
+    ffi.Pointer<ObjCObject> contentsValue,
+    ffi.Pointer<ObjCObject> properties,
+  ) {
+    return __objc_msgSend_571(
+      obj,
+      sel,
+      objectClass,
+      key,
+      contentsValue,
+      properties,
+    );
+  }
+
+  late final __objc_msgSend_571Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_571 = __objc_msgSend_571Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_classCode1 = _registerName1("classCode");
+  late final _sel_valueAtIndex_inPropertyWithKey_1 =
+      _registerName1("valueAtIndex:inPropertyWithKey:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_572(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int index,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_572(
+      obj,
+      sel,
+      index,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_572Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSUInteger,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_572 = __objc_msgSend_572Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_valueWithName_inPropertyWithKey_1 =
+      _registerName1("valueWithName:inPropertyWithKey:");
+  late final _sel_valueWithUniqueID_inPropertyWithKey_1 =
+      _registerName1("valueWithUniqueID:inPropertyWithKey:");
+  late final _sel_insertValue_atIndex_inPropertyWithKey_1 =
+      _registerName1("insertValue:atIndex:inPropertyWithKey:");
+  void _objc_msgSend_573(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+    int index,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_573(
+      obj,
+      sel,
+      value,
+      index,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_573Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSUInteger,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_573 = __objc_msgSend_573Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_removeValueAtIndex_fromPropertyWithKey_1 =
+      _registerName1("removeValueAtIndex:fromPropertyWithKey:");
+  void _objc_msgSend_574(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int index,
+    ffi.Pointer<ObjCObject> key,
+  ) {
+    return __objc_msgSend_574(
+      obj,
+      sel,
+      index,
+      key,
+    );
+  }
+
+  late final __objc_msgSend_574Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSUInteger, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_574 = __objc_msgSend_574Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_replaceValueAtIndex_inPropertyWithKey_withValue_1 =
+      _registerName1("replaceValueAtIndex:inPropertyWithKey:withValue:");
+  void _objc_msgSend_575(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int index,
+    ffi.Pointer<ObjCObject> key,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_575(
+      obj,
+      sel,
+      index,
+      key,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_575Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSUInteger,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_575 = __objc_msgSend_575Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_insertValue_inPropertyWithKey_1 =
+      _registerName1("insertValue:inPropertyWithKey:");
+  late final _sel_coerceValue_forKey_1 = _registerName1("coerceValue:forKey:");
+  late final _sel_objectSpecifier1 = _registerName1("objectSpecifier");
+  late final _sel_indicesOfObjectsByEvaluatingObjectSpecifier_1 =
+      _registerName1("indicesOfObjectsByEvaluatingObjectSpecifier:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_576(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> specifier,
+  ) {
+    return __objc_msgSend_576(
+      obj,
+      sel,
+      specifier,
+    );
+  }
+
+  late final __objc_msgSend_576Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_576 = __objc_msgSend_576Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_isEqualTo_1 = _registerName1("isEqualTo:");
+  late final _sel_isLessThanOrEqualTo_1 =
+      _registerName1("isLessThanOrEqualTo:");
+  late final _sel_isLessThan_1 = _registerName1("isLessThan:");
+  late final _sel_isGreaterThanOrEqualTo_1 =
+      _registerName1("isGreaterThanOrEqualTo:");
+  late final _sel_isGreaterThan_1 = _registerName1("isGreaterThan:");
+  late final _sel_isNotEqualTo_1 = _registerName1("isNotEqualTo:");
+  late final _sel_doesContain_1 = _registerName1("doesContain:");
+  late final _sel_isLike_1 = _registerName1("isLike:");
+  late final _sel_isCaseInsensitiveLike_1 =
+      _registerName1("isCaseInsensitiveLike:");
+  late final _sel_scriptingIsEqualTo_1 = _registerName1("scriptingIsEqualTo:");
+  late final _sel_scriptingIsLessThanOrEqualTo_1 =
+      _registerName1("scriptingIsLessThanOrEqualTo:");
+  late final _sel_scriptingIsLessThan_1 =
+      _registerName1("scriptingIsLessThan:");
+  late final _sel_scriptingIsGreaterThanOrEqualTo_1 =
+      _registerName1("scriptingIsGreaterThanOrEqualTo:");
+  late final _sel_scriptingIsGreaterThan_1 =
+      _registerName1("scriptingIsGreaterThan:");
+  late final _sel_scriptingBeginsWith_1 =
+      _registerName1("scriptingBeginsWith:");
+  late final _sel_scriptingEndsWith_1 = _registerName1("scriptingEndsWith:");
+  late final _sel_scriptingContains_1 = _registerName1("scriptingContains:");
+  late final _class_NSItemProvider1 = _getClass1("NSItemProvider");
+  late final _class_NSProgress1 = _getClass1("NSProgress");
+  late final _sel_currentProgress1 = _registerName1("currentProgress");
+  ffi.Pointer<ObjCObject> _objc_msgSend_577(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_577(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_577Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_577 = __objc_msgSend_577Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_progressWithTotalUnitCount_1 =
+      _registerName1("progressWithTotalUnitCount:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_578(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int unitCount,
+  ) {
+    return __objc_msgSend_578(
+      obj,
+      sel,
+      unitCount,
+    );
+  }
+
+  late final __objc_msgSend_578Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Int64)>>('objc_msgSend');
+  late final __objc_msgSend_578 = __objc_msgSend_578Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_discreteProgressWithTotalUnitCount_1 =
+      _registerName1("discreteProgressWithTotalUnitCount:");
+  late final _sel_progressWithTotalUnitCount_parent_pendingUnitCount_1 =
+      _registerName1("progressWithTotalUnitCount:parent:pendingUnitCount:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_579(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int unitCount,
+    ffi.Pointer<ObjCObject> parent,
+    int portionOfParentTotalUnitCount,
+  ) {
+    return __objc_msgSend_579(
+      obj,
+      sel,
+      unitCount,
+      parent,
+      portionOfParentTotalUnitCount,
+    );
+  }
+
+  late final __objc_msgSend_579Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int64,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int64)>>('objc_msgSend');
+  late final __objc_msgSend_579 = __objc_msgSend_579Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_initWithParent_userInfo_1 =
+      _registerName1("initWithParent:userInfo:");
+  instancetype _objc_msgSend_580(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> parentProgressOrNil,
+  ) {
+    return __objc_msgSend_580(
+      obj,
+      sel,
+      parentProgressOrNil,
+    );
+  }
+
+  late final __objc_msgSend_580Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_580 = __objc_msgSend_580Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_becomeCurrentWithPendingUnitCount_1 =
+      _registerName1("becomeCurrentWithPendingUnitCount:");
+  void _objc_msgSend_581(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int unitCount,
+  ) {
+    return __objc_msgSend_581(
+      obj,
+      sel,
+      unitCount,
+    );
+  }
+
+  late final __objc_msgSend_581Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int64)>>('objc_msgSend');
+  late final __objc_msgSend_581 = __objc_msgSend_581Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_performAsCurrentWithPendingUnitCount_usingBlock_1 =
+      _registerName1("performAsCurrentWithPendingUnitCount:usingBlock:");
+  void _objc_msgSend_582(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int unitCount,
+    ffi.Pointer<_ObjCBlock> work,
+  ) {
+    return __objc_msgSend_582(
+      obj,
+      sel,
+      unitCount,
+      work,
+    );
+  }
+
+  late final __objc_msgSend_582Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int64, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_582 = __objc_msgSend_582Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_resignCurrent1 = _registerName1("resignCurrent");
+  late final _sel_addChild_withPendingUnitCount_1 =
+      _registerName1("addChild:withPendingUnitCount:");
+  void _objc_msgSend_583(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> child,
+    int inUnitCount,
+  ) {
+    return __objc_msgSend_583(
+      obj,
+      sel,
+      child,
+      inUnitCount,
+    );
+  }
+
+  late final __objc_msgSend_583Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Int64)>>('objc_msgSend');
+  late final __objc_msgSend_583 = __objc_msgSend_583Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_totalUnitCount1 = _registerName1("totalUnitCount");
+  int _objc_msgSend_584(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_584(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_584Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int64 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_584 = __objc_msgSend_584Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setTotalUnitCount_1 = _registerName1("setTotalUnitCount:");
+  void _objc_msgSend_585(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_585(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_585Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int64)>>('objc_msgSend');
+  late final __objc_msgSend_585 = __objc_msgSend_585Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_completedUnitCount1 = _registerName1("completedUnitCount");
+  late final _sel_setCompletedUnitCount_1 =
+      _registerName1("setCompletedUnitCount:");
+  late final _sel_localizedDescription1 =
+      _registerName1("localizedDescription");
+  late final _sel_setLocalizedDescription_1 =
+      _registerName1("setLocalizedDescription:");
+  late final _sel_localizedAdditionalDescription1 =
+      _registerName1("localizedAdditionalDescription");
+  late final _sel_setLocalizedAdditionalDescription_1 =
+      _registerName1("setLocalizedAdditionalDescription:");
+  late final _sel_isCancellable1 = _registerName1("isCancellable");
+  late final _sel_setCancellable_1 = _registerName1("setCancellable:");
+  late final _sel_isPausable1 = _registerName1("isPausable");
+  late final _sel_setPausable_1 = _registerName1("setPausable:");
+  late final _sel_isPaused1 = _registerName1("isPaused");
+  late final _sel_cancellationHandler1 = _registerName1("cancellationHandler");
+  ffi.Pointer<_ObjCBlock> _objc_msgSend_586(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_586(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_586Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<_ObjCBlock> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_586 = __objc_msgSend_586Ptr.asFunction<
+      ffi.Pointer<_ObjCBlock> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setCancellationHandler_1 =
+      _registerName1("setCancellationHandler:");
+  void _objc_msgSend_587(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> value,
+  ) {
+    return __objc_msgSend_587(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_587Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_587 = __objc_msgSend_587Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_pausingHandler1 = _registerName1("pausingHandler");
+  late final _sel_setPausingHandler_1 = _registerName1("setPausingHandler:");
+  late final _sel_resumingHandler1 = _registerName1("resumingHandler");
+  late final _sel_setResumingHandler_1 = _registerName1("setResumingHandler:");
+  late final _sel_setUserInfoObject_forKey_1 =
+      _registerName1("setUserInfoObject:forKey:");
+  late final _sel_isIndeterminate1 = _registerName1("isIndeterminate");
+  late final _sel_fractionCompleted1 = _registerName1("fractionCompleted");
+  late final _sel_pause1 = _registerName1("pause");
+  late final _sel_resume1 = _registerName1("resume");
+  late final _sel_registerDataRepresentationForTypeIdentifier_visibility_loadHandler_1 =
+      _registerName1(
+          "registerDataRepresentationForTypeIdentifier:visibility:loadHandler:");
+  void _objc_msgSend_588(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> typeIdentifier,
+    int visibility,
+    ffi.Pointer<_ObjCBlock> loadHandler,
+  ) {
+    return __objc_msgSend_588(
+      obj,
+      sel,
+      typeIdentifier,
+      visibility,
+      loadHandler,
+    );
+  }
+
+  late final __objc_msgSend_588Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_588 = __objc_msgSend_588Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_registerFileRepresentationForTypeIdentifier_fileOptions_visibility_loadHandler_1 =
+      _registerName1(
+          "registerFileRepresentationForTypeIdentifier:fileOptions:visibility:loadHandler:");
+  void _objc_msgSend_589(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> typeIdentifier,
+    int fileOptions,
+    int visibility,
+    ffi.Pointer<_ObjCBlock> loadHandler,
+  ) {
+    return __objc_msgSend_589(
+      obj,
+      sel,
+      typeIdentifier,
+      fileOptions,
+      visibility,
+      loadHandler,
+    );
+  }
+
+  late final __objc_msgSend_589Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Int32,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_589 = __objc_msgSend_589Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, int, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_registeredTypeIdentifiers1 =
+      _registerName1("registeredTypeIdentifiers");
+  late final _sel_registeredTypeIdentifiersWithFileOptions_1 =
+      _registerName1("registeredTypeIdentifiersWithFileOptions:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_590(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int fileOptions,
+  ) {
+    return __objc_msgSend_590(
+      obj,
+      sel,
+      fileOptions,
+    );
+  }
+
+  late final __objc_msgSend_590Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_590 = __objc_msgSend_590Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_hasItemConformingToTypeIdentifier_1 =
+      _registerName1("hasItemConformingToTypeIdentifier:");
+  late final _sel_hasRepresentationConformingToTypeIdentifier_fileOptions_1 =
+      _registerName1(
+          "hasRepresentationConformingToTypeIdentifier:fileOptions:");
+  bool _objc_msgSend_591(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> typeIdentifier,
+    int fileOptions,
+  ) {
+    return __objc_msgSend_591(
+      obj,
+      sel,
+      typeIdentifier,
+      fileOptions,
+    );
+  }
+
+  late final __objc_msgSend_591Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_591 = __objc_msgSend_591Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_loadDataRepresentationForTypeIdentifier_completionHandler_1 =
+      _registerName1(
+          "loadDataRepresentationForTypeIdentifier:completionHandler:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_592(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> typeIdentifier,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_592(
+      obj,
+      sel,
+      typeIdentifier,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_592Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_592 = __objc_msgSend_592Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_loadFileRepresentationForTypeIdentifier_completionHandler_1 =
+      _registerName1(
+          "loadFileRepresentationForTypeIdentifier:completionHandler:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_593(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> typeIdentifier,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_593(
+      obj,
+      sel,
+      typeIdentifier,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_593Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_593 = __objc_msgSend_593Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_loadInPlaceFileRepresentationForTypeIdentifier_completionHandler_1 =
+      _registerName1(
+          "loadInPlaceFileRepresentationForTypeIdentifier:completionHandler:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_594(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> typeIdentifier,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_594(
+      obj,
+      sel,
+      typeIdentifier,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_594Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_594 = __objc_msgSend_594Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_suggestedName1 = _registerName1("suggestedName");
+  late final _sel_setSuggestedName_1 = _registerName1("setSuggestedName:");
+  late final _sel_registerObject_visibility_1 =
+      _registerName1("registerObject:visibility:");
+  void _objc_msgSend_595(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> object,
+    int visibility,
+  ) {
+    return __objc_msgSend_595(
+      obj,
+      sel,
+      object,
+      visibility,
+    );
+  }
+
+  late final __objc_msgSend_595Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_595 = __objc_msgSend_595Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_registerObjectOfClass_visibility_loadHandler_1 =
+      _registerName1("registerObjectOfClass:visibility:loadHandler:");
+  void _objc_msgSend_596(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> aClass,
+    int visibility,
+    ffi.Pointer<_ObjCBlock> loadHandler,
+  ) {
+    return __objc_msgSend_596(
+      obj,
+      sel,
+      aClass,
+      visibility,
+      loadHandler,
+    );
+  }
+
+  late final __objc_msgSend_596Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_596 = __objc_msgSend_596Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_canLoadObjectOfClass_1 =
+      _registerName1("canLoadObjectOfClass:");
+  late final _sel_loadObjectOfClass_completionHandler_1 =
+      _registerName1("loadObjectOfClass:completionHandler:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_597(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> aClass,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_597(
+      obj,
+      sel,
+      aClass,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_597Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_597 = __objc_msgSend_597Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_initWithItem_typeIdentifier_1 =
+      _registerName1("initWithItem:typeIdentifier:");
+  late final _sel_registerItemForTypeIdentifier_loadHandler_1 =
+      _registerName1("registerItemForTypeIdentifier:loadHandler:");
+  void _objc_msgSend_598(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> typeIdentifier,
+    NSItemProviderLoadHandler loadHandler,
+  ) {
+    return __objc_msgSend_598(
+      obj,
+      sel,
+      typeIdentifier,
+      loadHandler,
+    );
+  }
+
+  late final __objc_msgSend_598Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSItemProviderLoadHandler)>>('objc_msgSend');
+  late final __objc_msgSend_598 = __objc_msgSend_598Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, NSItemProviderLoadHandler)>();
+
+  late final _sel_loadItemForTypeIdentifier_options_completionHandler_1 =
+      _registerName1("loadItemForTypeIdentifier:options:completionHandler:");
+  void _objc_msgSend_599(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> typeIdentifier,
+    ffi.Pointer<ObjCObject> options,
+    NSItemProviderCompletionHandler completionHandler,
+  ) {
+    return __objc_msgSend_599(
+      obj,
+      sel,
+      typeIdentifier,
+      options,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_599Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              NSItemProviderCompletionHandler)>>('objc_msgSend');
+  late final __objc_msgSend_599 = __objc_msgSend_599Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          NSItemProviderCompletionHandler)>();
+
+  late final _sel_previewImageHandler1 = _registerName1("previewImageHandler");
+  NSItemProviderLoadHandler _objc_msgSend_600(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_600(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_600Ptr = _lookup<
+      ffi.NativeFunction<
+          NSItemProviderLoadHandler Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_600 = __objc_msgSend_600Ptr.asFunction<
+      NSItemProviderLoadHandler Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setPreviewImageHandler_1 =
+      _registerName1("setPreviewImageHandler:");
+  void _objc_msgSend_601(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSItemProviderLoadHandler value,
+  ) {
+    return __objc_msgSend_601(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_601Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSItemProviderLoadHandler)>>('objc_msgSend');
+  late final __objc_msgSend_601 = __objc_msgSend_601Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          NSItemProviderLoadHandler)>();
+
+  late final _sel_loadPreviewImageWithOptions_completionHandler_1 =
+      _registerName1("loadPreviewImageWithOptions:completionHandler:");
+  void _objc_msgSend_602(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> options,
+    NSItemProviderCompletionHandler completionHandler,
+  ) {
+    return __objc_msgSend_602(
+      obj,
+      sel,
+      options,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_602Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSItemProviderCompletionHandler)>>('objc_msgSend');
+  late final __objc_msgSend_602 = __objc_msgSend_602Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, NSItemProviderCompletionHandler)>();
+
+  late final _class_NSMutableString1 = _getClass1("NSMutableString");
+  late final _sel_replaceCharactersInRange_withString_1 =
+      _registerName1("replaceCharactersInRange:withString:");
+  void _objc_msgSend_603(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    ffi.Pointer<ObjCObject> aString,
+  ) {
+    return __objc_msgSend_603(
+      obj,
+      sel,
+      range,
+      aString,
+    );
+  }
+
+  late final __objc_msgSend_603Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRange, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_603 = __objc_msgSend_603Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_insertString_atIndex_1 =
+      _registerName1("insertString:atIndex:");
+  void _objc_msgSend_604(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> aString,
+    int loc,
+  ) {
+    return __objc_msgSend_604(
+      obj,
+      sel,
+      aString,
+      loc,
+    );
+  }
+
+  late final __objc_msgSend_604Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_604 = __objc_msgSend_604Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_deleteCharactersInRange_1 =
+      _registerName1("deleteCharactersInRange:");
+  late final _sel_appendString_1 = _registerName1("appendString:");
+  late final _sel_appendFormat_1 = _registerName1("appendFormat:");
+  late final _sel_setString_1 = _registerName1("setString:");
+  late final _sel_replaceOccurrencesOfString_withString_options_range_1 =
+      _registerName1("replaceOccurrencesOfString:withString:options:range:");
+  int _objc_msgSend_605(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> target,
+    ffi.Pointer<ObjCObject> replacement,
+    int options,
+    NSRange searchRange,
+  ) {
+    return __objc_msgSend_605(
+      obj,
+      sel,
+      target,
+      replacement,
+      options,
+      searchRange,
+    );
+  }
+
+  late final __objc_msgSend_605Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_605 = __objc_msgSend_605Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>, int, NSRange)>();
+
+  late final _sel_applyTransform_reverse_range_updatedRange_1 =
+      _registerName1("applyTransform:reverse:range:updatedRange:");
+  bool _objc_msgSend_606(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSStringTransform transform,
+    bool reverse,
+    NSRange range,
+    NSRangePointer resultingRange,
+  ) {
+    return __objc_msgSend_606(
+      obj,
+      sel,
+      transform,
+      reverse,
+      range,
+      resultingRange,
+    );
+  }
+
+  late final __objc_msgSend_606Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSStringTransform,
+              ffi.Bool,
+              NSRange,
+              NSRangePointer)>>('objc_msgSend');
+  late final __objc_msgSend_606 = __objc_msgSend_606Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          NSStringTransform, bool, NSRange, NSRangePointer)>();
+
+  ffi.Pointer<ObjCObject> _objc_msgSend_607(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int capacity,
+  ) {
+    return __objc_msgSend_607(
+      obj,
+      sel,
+      capacity,
+    );
+  }
+
+  late final __objc_msgSend_607Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_607 = __objc_msgSend_607Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_stringWithCapacity_1 = _registerName1("stringWithCapacity:");
+  late final _class_NSNotification1 = _getClass1("NSNotification");
+  late final _sel_object1 = _registerName1("object");
+  late final _sel_initWithName_object_userInfo_1 =
+      _registerName1("initWithName:object:userInfo:");
+  instancetype _objc_msgSend_608(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSNotificationName name,
+    ffi.Pointer<ObjCObject> object,
+    ffi.Pointer<ObjCObject> userInfo,
+  ) {
+    return __objc_msgSend_608(
+      obj,
+      sel,
+      name,
+      object,
+      userInfo,
+    );
+  }
+
+  late final __objc_msgSend_608Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSNotificationName,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_608 = __objc_msgSend_608Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          NSNotificationName,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_notificationWithName_object_1 =
+      _registerName1("notificationWithName:object:");
+  late final _sel_notificationWithName_object_userInfo_1 =
+      _registerName1("notificationWithName:object:userInfo:");
+  late final _class_NSBundle1 = _getClass1("NSBundle");
+  late final _sel_mainBundle1 = _registerName1("mainBundle");
+  ffi.Pointer<ObjCObject> _objc_msgSend_609(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_609(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_609Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_609 = __objc_msgSend_609Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_bundleWithPath_1 = _registerName1("bundleWithPath:");
+  late final _sel_initWithPath_1 = _registerName1("initWithPath:");
+  late final _sel_bundleWithURL_1 = _registerName1("bundleWithURL:");
+  late final _sel_initWithURL_1 = _registerName1("initWithURL:");
+  late final _sel_bundleForClass_1 = _registerName1("bundleForClass:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_610(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> aClass,
+  ) {
+    return __objc_msgSend_610(
+      obj,
+      sel,
+      aClass,
+    );
+  }
+
+  late final __objc_msgSend_610Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_610 = __objc_msgSend_610Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_bundleWithIdentifier_1 =
+      _registerName1("bundleWithIdentifier:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_611(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> identifier,
+  ) {
+    return __objc_msgSend_611(
+      obj,
+      sel,
+      identifier,
+    );
+  }
+
+  late final __objc_msgSend_611Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_611 = __objc_msgSend_611Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_allBundles1 = _registerName1("allBundles");
+  late final _sel_allFrameworks1 = _registerName1("allFrameworks");
+  late final _sel_isLoaded1 = _registerName1("isLoaded");
+  late final _sel_unload1 = _registerName1("unload");
+  late final _sel_preflightAndReturnError_1 =
+      _registerName1("preflightAndReturnError:");
+  late final _sel_loadAndReturnError_1 = _registerName1("loadAndReturnError:");
+  late final _sel_bundleURL1 = _registerName1("bundleURL");
+  late final _sel_resourceURL1 = _registerName1("resourceURL");
+  late final _sel_executableURL1 = _registerName1("executableURL");
+  late final _sel_URLForAuxiliaryExecutable_1 =
+      _registerName1("URLForAuxiliaryExecutable:");
+  late final _sel_privateFrameworksURL1 =
+      _registerName1("privateFrameworksURL");
+  late final _sel_sharedFrameworksURL1 = _registerName1("sharedFrameworksURL");
+  late final _sel_sharedSupportURL1 = _registerName1("sharedSupportURL");
+  late final _sel_builtInPlugInsURL1 = _registerName1("builtInPlugInsURL");
+  late final _sel_appStoreReceiptURL1 = _registerName1("appStoreReceiptURL");
+  late final _sel_bundlePath1 = _registerName1("bundlePath");
+  late final _sel_resourcePath1 = _registerName1("resourcePath");
+  late final _sel_executablePath1 = _registerName1("executablePath");
+  late final _sel_pathForAuxiliaryExecutable_1 =
+      _registerName1("pathForAuxiliaryExecutable:");
+  late final _sel_privateFrameworksPath1 =
+      _registerName1("privateFrameworksPath");
+  late final _sel_sharedFrameworksPath1 =
+      _registerName1("sharedFrameworksPath");
+  late final _sel_sharedSupportPath1 = _registerName1("sharedSupportPath");
+  late final _sel_builtInPlugInsPath1 = _registerName1("builtInPlugInsPath");
+  late final _sel_URLForResource_withExtension_subdirectory_inBundleWithURL_1 =
+      _registerName1(
+          "URLForResource:withExtension:subdirectory:inBundleWithURL:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_612(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> name,
+    ffi.Pointer<ObjCObject> ext,
+    ffi.Pointer<ObjCObject> subpath,
+    ffi.Pointer<ObjCObject> bundleURL,
+  ) {
+    return __objc_msgSend_612(
+      obj,
+      sel,
+      name,
+      ext,
+      subpath,
+      bundleURL,
+    );
+  }
+
+  late final __objc_msgSend_612Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_612 = __objc_msgSend_612Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_URLsForResourcesWithExtension_subdirectory_inBundleWithURL_1 =
+      _registerName1(
+          "URLsForResourcesWithExtension:subdirectory:inBundleWithURL:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_613(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> ext,
+    ffi.Pointer<ObjCObject> subpath,
+    ffi.Pointer<ObjCObject> bundleURL,
+  ) {
+    return __objc_msgSend_613(
+      obj,
+      sel,
+      ext,
+      subpath,
+      bundleURL,
+    );
+  }
+
+  late final __objc_msgSend_613Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_613 = __objc_msgSend_613Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_URLForResource_withExtension_1 =
+      _registerName1("URLForResource:withExtension:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_614(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> name,
+    ffi.Pointer<ObjCObject> ext,
+  ) {
+    return __objc_msgSend_614(
+      obj,
+      sel,
+      name,
+      ext,
+    );
+  }
+
+  late final __objc_msgSend_614Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_614 = __objc_msgSend_614Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_URLForResource_withExtension_subdirectory_1 =
+      _registerName1("URLForResource:withExtension:subdirectory:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_615(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> name,
+    ffi.Pointer<ObjCObject> ext,
+    ffi.Pointer<ObjCObject> subpath,
+  ) {
+    return __objc_msgSend_615(
+      obj,
+      sel,
+      name,
+      ext,
+      subpath,
+    );
+  }
+
+  late final __objc_msgSend_615Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_615 = __objc_msgSend_615Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_URLForResource_withExtension_subdirectory_localization_1 =
+      _registerName1("URLForResource:withExtension:subdirectory:localization:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_616(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> name,
+    ffi.Pointer<ObjCObject> ext,
+    ffi.Pointer<ObjCObject> subpath,
+    ffi.Pointer<ObjCObject> localizationName,
+  ) {
+    return __objc_msgSend_616(
+      obj,
+      sel,
+      name,
+      ext,
+      subpath,
+      localizationName,
+    );
+  }
+
+  late final __objc_msgSend_616Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_616 = __objc_msgSend_616Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_URLsForResourcesWithExtension_subdirectory_1 =
+      _registerName1("URLsForResourcesWithExtension:subdirectory:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_617(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> ext,
+    ffi.Pointer<ObjCObject> subpath,
+  ) {
+    return __objc_msgSend_617(
+      obj,
+      sel,
+      ext,
+      subpath,
+    );
+  }
+
+  late final __objc_msgSend_617Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_617 = __objc_msgSend_617Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_URLsForResourcesWithExtension_subdirectory_localization_1 =
+      _registerName1(
+          "URLsForResourcesWithExtension:subdirectory:localization:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_618(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> ext,
+    ffi.Pointer<ObjCObject> subpath,
+    ffi.Pointer<ObjCObject> localizationName,
+  ) {
+    return __objc_msgSend_618(
+      obj,
+      sel,
+      ext,
+      subpath,
+      localizationName,
+    );
+  }
+
+  late final __objc_msgSend_618Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_618 = __objc_msgSend_618Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_pathForResource_ofType_inDirectory_1 =
+      _registerName1("pathForResource:ofType:inDirectory:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_619(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> name,
+    ffi.Pointer<ObjCObject> ext,
+    ffi.Pointer<ObjCObject> bundlePath,
+  ) {
+    return __objc_msgSend_619(
+      obj,
+      sel,
+      name,
+      ext,
+      bundlePath,
+    );
+  }
+
+  late final __objc_msgSend_619Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_619 = __objc_msgSend_619Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_pathsForResourcesOfType_inDirectory_1 =
+      _registerName1("pathsForResourcesOfType:inDirectory:");
+  late final _sel_pathForResource_ofType_1 =
+      _registerName1("pathForResource:ofType:");
+  late final _sel_pathForResource_ofType_inDirectory_forLocalization_1 =
+      _registerName1("pathForResource:ofType:inDirectory:forLocalization:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_620(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> name,
+    ffi.Pointer<ObjCObject> ext,
+    ffi.Pointer<ObjCObject> subpath,
+    ffi.Pointer<ObjCObject> localizationName,
+  ) {
+    return __objc_msgSend_620(
+      obj,
+      sel,
+      name,
+      ext,
+      subpath,
+      localizationName,
+    );
+  }
+
+  late final __objc_msgSend_620Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_620 = __objc_msgSend_620Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_pathsForResourcesOfType_inDirectory_forLocalization_1 =
+      _registerName1("pathsForResourcesOfType:inDirectory:forLocalization:");
+  late final _sel_localizedStringForKey_value_table_1 =
+      _registerName1("localizedStringForKey:value:table:");
+  late final _class_NSAttributedString1 = _getClass1("NSAttributedString");
+  late final _sel_attributesAtIndex_effectiveRange_1 =
+      _registerName1("attributesAtIndex:effectiveRange:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_621(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int location,
+    NSRangePointer range,
+  ) {
+    return __objc_msgSend_621(
+      obj,
+      sel,
+      location,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_621Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSUInteger,
+              NSRangePointer)>>('objc_msgSend');
+  late final __objc_msgSend_621 = __objc_msgSend_621Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, NSRangePointer)>();
+
+  late final _sel_attribute_atIndex_effectiveRange_1 =
+      _registerName1("attribute:atIndex:effectiveRange:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_622(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSAttributedStringKey attrName,
+    int location,
+    NSRangePointer range,
+  ) {
+    return __objc_msgSend_622(
+      obj,
+      sel,
+      attrName,
+      location,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_622Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSAttributedStringKey,
+              NSUInteger,
+              NSRangePointer)>>('objc_msgSend');
+  late final __objc_msgSend_622 = __objc_msgSend_622Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, NSAttributedStringKey, int, NSRangePointer)>();
+
+  late final _sel_attributedSubstringFromRange_1 =
+      _registerName1("attributedSubstringFromRange:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_623(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+  ) {
+    return __objc_msgSend_623(
+      obj,
+      sel,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_623Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_623 = __objc_msgSend_623Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange)>();
+
+  late final _sel_attributesAtIndex_longestEffectiveRange_inRange_1 =
+      _registerName1("attributesAtIndex:longestEffectiveRange:inRange:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_624(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int location,
+    NSRangePointer range,
+    NSRange rangeLimit,
+  ) {
+    return __objc_msgSend_624(
+      obj,
+      sel,
+      location,
+      range,
+      rangeLimit,
+    );
+  }
+
+  late final __objc_msgSend_624Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSUInteger,
+              NSRangePointer,
+              NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_624 = __objc_msgSend_624Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, NSRangePointer, NSRange)>();
+
+  late final _sel_attribute_atIndex_longestEffectiveRange_inRange_1 =
+      _registerName1("attribute:atIndex:longestEffectiveRange:inRange:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_625(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSAttributedStringKey attrName,
+    int location,
+    NSRangePointer range,
+    NSRange rangeLimit,
+  ) {
+    return __objc_msgSend_625(
+      obj,
+      sel,
+      attrName,
+      location,
+      range,
+      rangeLimit,
+    );
+  }
+
+  late final __objc_msgSend_625Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSAttributedStringKey,
+              NSUInteger,
+              NSRangePointer,
+              NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_625 = __objc_msgSend_625Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          NSAttributedStringKey,
+          int,
+          NSRangePointer,
+          NSRange)>();
+
+  late final _sel_isEqualToAttributedString_1 =
+      _registerName1("isEqualToAttributedString:");
+  bool _objc_msgSend_626(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> other,
+  ) {
+    return __objc_msgSend_626(
+      obj,
+      sel,
+      other,
+    );
+  }
+
+  late final __objc_msgSend_626Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_626 = __objc_msgSend_626Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithString_attributes_1 =
+      _registerName1("initWithString:attributes:");
+  late final _sel_initWithAttributedString_1 =
+      _registerName1("initWithAttributedString:");
+  instancetype _objc_msgSend_627(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> attrStr,
+  ) {
+    return __objc_msgSend_627(
+      obj,
+      sel,
+      attrStr,
+    );
+  }
+
+  late final __objc_msgSend_627Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_627 = __objc_msgSend_627Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_enumerateAttributesInRange_options_usingBlock_1 =
+      _registerName1("enumerateAttributesInRange:options:usingBlock:");
+  void _objc_msgSend_628(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange enumerationRange,
+    int opts,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_628(
+      obj,
+      sel,
+      enumerationRange,
+      opts,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_628Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRange, ffi.Int32, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_628 = __objc_msgSend_628Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange, int,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_enumerateAttribute_inRange_options_usingBlock_1 =
+      _registerName1("enumerateAttribute:inRange:options:usingBlock:");
+  void _objc_msgSend_629(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSAttributedStringKey attrName,
+    NSRange enumerationRange,
+    int opts,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_629(
+      obj,
+      sel,
+      attrName,
+      enumerationRange,
+      opts,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_629Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSAttributedStringKey,
+              NSRange,
+              ffi.Int32,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_629 = __objc_msgSend_629Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          NSAttributedStringKey, NSRange, int, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _class_NSAttributedStringMarkdownParsingOptions1 =
+      _getClass1("NSAttributedStringMarkdownParsingOptions");
+  late final _sel_allowsExtendedAttributes1 =
+      _registerName1("allowsExtendedAttributes");
+  late final _sel_setAllowsExtendedAttributes_1 =
+      _registerName1("setAllowsExtendedAttributes:");
+  late final _sel_interpretedSyntax1 = _registerName1("interpretedSyntax");
+  int _objc_msgSend_630(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_630(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_630Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_630 = __objc_msgSend_630Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setInterpretedSyntax_1 =
+      _registerName1("setInterpretedSyntax:");
+  void _objc_msgSend_631(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_631(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_631Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_631 = __objc_msgSend_631Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_failurePolicy1 = _registerName1("failurePolicy");
+  int _objc_msgSend_632(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_632(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_632Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_632 = __objc_msgSend_632Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setFailurePolicy_1 = _registerName1("setFailurePolicy:");
+  void _objc_msgSend_633(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_633(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_633Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_633 = __objc_msgSend_633Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_setLanguageCode_1 = _registerName1("setLanguageCode:");
+  late final _sel_initWithContentsOfMarkdownFileAtURL_options_baseURL_error_1 =
+      _registerName1(
+          "initWithContentsOfMarkdownFileAtURL:options:baseURL:error:");
+  instancetype _objc_msgSend_634(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> markdownFile,
+    ffi.Pointer<ObjCObject> options,
+    ffi.Pointer<ObjCObject> baseURL,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_634(
+      obj,
+      sel,
+      markdownFile,
+      options,
+      baseURL,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_634Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_634 = __objc_msgSend_634Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_initWithMarkdown_options_baseURL_error_1 =
+      _registerName1("initWithMarkdown:options:baseURL:error:");
+  instancetype _objc_msgSend_635(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> markdown,
+    ffi.Pointer<ObjCObject> options,
+    ffi.Pointer<ObjCObject> baseURL,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_635(
+      obj,
+      sel,
+      markdown,
+      options,
+      baseURL,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_635Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_635 = __objc_msgSend_635Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_initWithMarkdownString_options_baseURL_error_1 =
+      _registerName1("initWithMarkdownString:options:baseURL:error:");
+  instancetype _objc_msgSend_636(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> markdownString,
+    ffi.Pointer<ObjCObject> options,
+    ffi.Pointer<ObjCObject> baseURL,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_636(
+      obj,
+      sel,
+      markdownString,
+      options,
+      baseURL,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_636Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_636 = __objc_msgSend_636Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_initWithFormat_options_locale_1 =
+      _registerName1("initWithFormat:options:locale:");
+  instancetype _objc_msgSend_637(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> format,
+    int options,
+    ffi.Pointer<ObjCObject> locale,
+  ) {
+    return __objc_msgSend_637(
+      obj,
+      sel,
+      format,
+      options,
+      locale,
+    );
+  }
+
+  late final __objc_msgSend_637Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_637 = __objc_msgSend_637Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithFormat_options_locale_arguments_1 =
+      _registerName1("initWithFormat:options:locale:arguments:");
+  instancetype _objc_msgSend_638(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> format,
+    int options,
+    ffi.Pointer<ObjCObject> locale,
+    ffi.Pointer<__va_list_tag> arguments,
+  ) {
+    return __objc_msgSend_638(
+      obj,
+      sel,
+      format,
+      options,
+      locale,
+      arguments,
+    );
+  }
+
+  late final __objc_msgSend_638Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<__va_list_tag>)>>('objc_msgSend');
+  late final __objc_msgSend_638 = __objc_msgSend_638Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<__va_list_tag>)>();
+
+  late final _sel_localizedAttributedStringWithFormat_1 =
+      _registerName1("localizedAttributedStringWithFormat:");
+  late final _sel_localizedAttributedStringWithFormat_options_1 =
+      _registerName1("localizedAttributedStringWithFormat:options:");
+  instancetype _objc_msgSend_639(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> format,
+    int options,
+  ) {
+    return __objc_msgSend_639(
+      obj,
+      sel,
+      format,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_639Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_639 = __objc_msgSend_639Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_attributedStringByInflectingString1 =
+      _registerName1("attributedStringByInflectingString");
+  ffi.Pointer<ObjCObject> _objc_msgSend_640(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_640(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_640Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_640 = __objc_msgSend_640Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_localizedAttributedStringForKey_value_table_1 =
+      _registerName1("localizedAttributedStringForKey:value:table:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_641(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+    ffi.Pointer<ObjCObject> value,
+    ffi.Pointer<ObjCObject> tableName,
+  ) {
+    return __objc_msgSend_641(
+      obj,
+      sel,
+      key,
+      value,
+      tableName,
+    );
+  }
+
+  late final __objc_msgSend_641Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_641 = __objc_msgSend_641Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_bundleIdentifier1 = _registerName1("bundleIdentifier");
+  late final _sel_infoDictionary1 = _registerName1("infoDictionary");
+  late final _sel_localizedInfoDictionary1 =
+      _registerName1("localizedInfoDictionary");
+  late final _sel_objectForInfoDictionaryKey_1 =
+      _registerName1("objectForInfoDictionaryKey:");
+  late final _sel_classNamed_1 = _registerName1("classNamed:");
+  late final _sel_principalClass1 = _registerName1("principalClass");
+  late final _sel_preferredLocalizations1 =
+      _registerName1("preferredLocalizations");
+  late final _sel_localizations1 = _registerName1("localizations");
+  late final _sel_developmentLocalization1 =
+      _registerName1("developmentLocalization");
+  late final _sel_preferredLocalizationsFromArray_1 =
+      _registerName1("preferredLocalizationsFromArray:");
+  late final _sel_preferredLocalizationsFromArray_forPreferences_1 =
+      _registerName1("preferredLocalizationsFromArray:forPreferences:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_642(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> localizationsArray,
+    ffi.Pointer<ObjCObject> preferencesArray,
+  ) {
+    return __objc_msgSend_642(
+      obj,
+      sel,
+      localizationsArray,
+      preferencesArray,
+    );
+  }
+
+  late final __objc_msgSend_642Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_642 = __objc_msgSend_642Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_executableArchitectures1 =
+      _registerName1("executableArchitectures");
+  late final _sel_setPreservationPriority_forTags_1 =
+      _registerName1("setPreservationPriority:forTags:");
+  void _objc_msgSend_643(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    double priority,
+    ffi.Pointer<ObjCObject> tags,
+  ) {
+    return __objc_msgSend_643(
+      obj,
+      sel,
+      priority,
+      tags,
+    );
+  }
+
+  late final __objc_msgSend_643Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Double, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_643 = __objc_msgSend_643Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, double,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_preservationPriorityForTag_1 =
+      _registerName1("preservationPriorityForTag:");
+  late final _class_NSMutableAttributedString1 =
+      _getClass1("NSMutableAttributedString");
+  late final _sel_setAttributes_range_1 =
+      _registerName1("setAttributes:range:");
+  void _objc_msgSend_644(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> attrs,
+    NSRange range,
+  ) {
+    return __objc_msgSend_644(
+      obj,
+      sel,
+      attrs,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_644Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_644 = __objc_msgSend_644Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, NSRange)>();
+
+  late final _sel_mutableString1 = _registerName1("mutableString");
+  ffi.Pointer<ObjCObject> _objc_msgSend_645(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_645(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_645Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_645 = __objc_msgSend_645Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_addAttribute_value_range_1 =
+      _registerName1("addAttribute:value:range:");
+  void _objc_msgSend_646(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSAttributedStringKey name,
+    ffi.Pointer<ObjCObject> value,
+    NSRange range,
+  ) {
+    return __objc_msgSend_646(
+      obj,
+      sel,
+      name,
+      value,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_646Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSAttributedStringKey,
+              ffi.Pointer<ObjCObject>,
+              NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_646 = __objc_msgSend_646Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          NSAttributedStringKey, ffi.Pointer<ObjCObject>, NSRange)>();
+
+  late final _sel_addAttributes_range_1 =
+      _registerName1("addAttributes:range:");
+  late final _sel_removeAttribute_range_1 =
+      _registerName1("removeAttribute:range:");
+  void _objc_msgSend_647(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSAttributedStringKey name,
+    NSRange range,
+  ) {
+    return __objc_msgSend_647(
+      obj,
+      sel,
+      name,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_647Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSAttributedStringKey, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_647 = __objc_msgSend_647Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          NSAttributedStringKey, NSRange)>();
+
+  late final _sel_replaceCharactersInRange_withAttributedString_1 =
+      _registerName1("replaceCharactersInRange:withAttributedString:");
+  void _objc_msgSend_648(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    ffi.Pointer<ObjCObject> attrString,
+  ) {
+    return __objc_msgSend_648(
+      obj,
+      sel,
+      range,
+      attrString,
+    );
+  }
+
+  late final __objc_msgSend_648Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSRange, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_648 = __objc_msgSend_648Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_insertAttributedString_atIndex_1 =
+      _registerName1("insertAttributedString:atIndex:");
+  void _objc_msgSend_649(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> attrString,
+    int loc,
+  ) {
+    return __objc_msgSend_649(
+      obj,
+      sel,
+      attrString,
+      loc,
+    );
+  }
+
+  late final __objc_msgSend_649Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_649 = __objc_msgSend_649Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_appendAttributedString_1 =
+      _registerName1("appendAttributedString:");
+  void _objc_msgSend_650(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> attrString,
+  ) {
+    return __objc_msgSend_650(
+      obj,
+      sel,
+      attrString,
+    );
+  }
+
+  late final __objc_msgSend_650Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_650 = __objc_msgSend_650Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_setAttributedString_1 =
+      _registerName1("setAttributedString:");
+  late final _sel_beginEditing1 = _registerName1("beginEditing");
+  late final _sel_endEditing1 = _registerName1("endEditing");
+  late final _sel_appendLocalizedFormat_1 =
+      _registerName1("appendLocalizedFormat:");
+  late final _class_NSDateFormatter1 = _getClass1("NSDateFormatter");
+  late final _class_NSFormatter1 = _getClass1("NSFormatter");
+  late final _sel_stringForObjectValue_1 =
+      _registerName1("stringForObjectValue:");
+  late final _sel_attributedStringForObjectValue_withDefaultAttributes_1 =
+      _registerName1("attributedStringForObjectValue:withDefaultAttributes:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_651(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> obj1,
+    ffi.Pointer<ObjCObject> attrs,
+  ) {
+    return __objc_msgSend_651(
+      obj,
+      sel,
+      obj1,
+      attrs,
+    );
+  }
+
+  late final __objc_msgSend_651Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_651 = __objc_msgSend_651Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_editingStringForObjectValue_1 =
+      _registerName1("editingStringForObjectValue:");
+  late final _sel_getObjectValue_forString_errorDescription_1 =
+      _registerName1("getObjectValue:forString:errorDescription:");
+  bool _objc_msgSend_652(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> obj1,
+    ffi.Pointer<ObjCObject> string,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_652(
+      obj,
+      sel,
+      obj1,
+      string,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_652Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_652 = __objc_msgSend_652Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_isPartialStringValid_newEditingString_errorDescription_1 =
+      _registerName1("isPartialStringValid:newEditingString:errorDescription:");
+  bool _objc_msgSend_653(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> partialString,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> newString,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_653(
+      obj,
+      sel,
+      partialString,
+      newString,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_653Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_653 = __objc_msgSend_653Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_isPartialStringValid_proposedSelectedRange_originalString_originalSelectedRange_errorDescription_1 =
+      _registerName1(
+          "isPartialStringValid:proposedSelectedRange:originalString:originalSelectedRange:errorDescription:");
+  bool _objc_msgSend_654(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> partialStringPtr,
+    NSRangePointer proposedSelRangePtr,
+    ffi.Pointer<ObjCObject> origString,
+    NSRange origSelRange,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_654(
+      obj,
+      sel,
+      partialStringPtr,
+      proposedSelRangePtr,
+      origString,
+      origSelRange,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_654Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              NSRangePointer,
+              ffi.Pointer<ObjCObject>,
+              NSRange,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_654 = __objc_msgSend_654Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          NSRangePointer,
+          ffi.Pointer<ObjCObject>,
+          NSRange,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_formattingContext1 = _registerName1("formattingContext");
+  int _objc_msgSend_655(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_655(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_655Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_655 = __objc_msgSend_655Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setFormattingContext_1 =
+      _registerName1("setFormattingContext:");
+  void _objc_msgSend_656(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_656(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_656Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_656 = __objc_msgSend_656Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_getObjectValue_forString_range_error_1 =
+      _registerName1("getObjectValue:forString:range:error:");
+  bool _objc_msgSend_657(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> obj1,
+    ffi.Pointer<ObjCObject> string,
+    ffi.Pointer<NSRange> rangep,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_657(
+      obj,
+      sel,
+      obj1,
+      string,
+      rangep,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_657Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<NSRange>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_657 = __objc_msgSend_657Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<NSRange>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_stringFromDate_1 = _registerName1("stringFromDate:");
+  late final _sel_dateFromString_1 = _registerName1("dateFromString:");
+  late final _sel_localizedStringFromDate_dateStyle_timeStyle_1 =
+      _registerName1("localizedStringFromDate:dateStyle:timeStyle:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_658(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> date,
+    int dstyle,
+    int tstyle,
+  ) {
+    return __objc_msgSend_658(
+      obj,
+      sel,
+      date,
+      dstyle,
+      tstyle,
+    );
+  }
+
+  late final __objc_msgSend_658Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_658 = __objc_msgSend_658Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>, int, int)>();
+
+  late final _sel_dateFormatFromTemplate_options_locale_1 =
+      _registerName1("dateFormatFromTemplate:options:locale:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_659(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> tmplate,
+    int opts,
+    ffi.Pointer<ObjCObject> locale,
+  ) {
+    return __objc_msgSend_659(
+      obj,
+      sel,
+      tmplate,
+      opts,
+      locale,
+    );
+  }
+
+  late final __objc_msgSend_659Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSUInteger,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_659 = __objc_msgSend_659Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_defaultFormatterBehavior1 =
+      _registerName1("defaultFormatterBehavior");
+  int _objc_msgSend_660(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_660(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_660Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_660 = __objc_msgSend_660Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setDefaultFormatterBehavior_1 =
+      _registerName1("setDefaultFormatterBehavior:");
+  void _objc_msgSend_661(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_661(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_661Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_661 = __objc_msgSend_661Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_setLocalizedDateFormatFromTemplate_1 =
+      _registerName1("setLocalizedDateFormatFromTemplate:");
+  late final _sel_dateFormat1 = _registerName1("dateFormat");
+  late final _sel_setDateFormat_1 = _registerName1("setDateFormat:");
+  late final _sel_dateStyle1 = _registerName1("dateStyle");
+  int _objc_msgSend_662(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_662(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_662Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_662 = __objc_msgSend_662Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setDateStyle_1 = _registerName1("setDateStyle:");
+  void _objc_msgSend_663(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_663(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_663Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_663 = __objc_msgSend_663Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_timeStyle1 = _registerName1("timeStyle");
+  late final _sel_setTimeStyle_1 = _registerName1("setTimeStyle:");
+  late final _sel_locale1 = _registerName1("locale");
+  late final _sel_setLocale_1 = _registerName1("setLocale:");
+  void _objc_msgSend_664(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_664(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_664Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_664 = __objc_msgSend_664Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_generatesCalendarDates1 =
+      _registerName1("generatesCalendarDates");
+  late final _sel_setGeneratesCalendarDates_1 =
+      _registerName1("setGeneratesCalendarDates:");
+  late final _sel_formatterBehavior1 = _registerName1("formatterBehavior");
+  late final _sel_setFormatterBehavior_1 =
+      _registerName1("setFormatterBehavior:");
+  late final _class_NSCalendar1 = _getClass1("NSCalendar");
+  late final _sel_currentCalendar1 = _registerName1("currentCalendar");
+  ffi.Pointer<ObjCObject> _objc_msgSend_665(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_665(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_665Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_665 = __objc_msgSend_665Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_autoupdatingCurrentCalendar1 =
+      _registerName1("autoupdatingCurrentCalendar");
+  late final _sel_calendarWithIdentifier_1 =
+      _registerName1("calendarWithIdentifier:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_666(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSCalendarIdentifier calendarIdentifierConstant,
+  ) {
+    return __objc_msgSend_666(
+      obj,
+      sel,
+      calendarIdentifierConstant,
+    );
+  }
+
+  late final __objc_msgSend_666Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSCalendarIdentifier)>>('objc_msgSend');
+  late final __objc_msgSend_666 = __objc_msgSend_666Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, NSCalendarIdentifier)>();
+
+  late final _sel_initWithCalendarIdentifier_1 =
+      _registerName1("initWithCalendarIdentifier:");
+  late final _sel_firstWeekday1 = _registerName1("firstWeekday");
+  late final _sel_setFirstWeekday_1 = _registerName1("setFirstWeekday:");
+  late final _sel_minimumDaysInFirstWeek1 =
+      _registerName1("minimumDaysInFirstWeek");
+  late final _sel_setMinimumDaysInFirstWeek_1 =
+      _registerName1("setMinimumDaysInFirstWeek:");
+  late final _sel_eraSymbols1 = _registerName1("eraSymbols");
+  late final _sel_longEraSymbols1 = _registerName1("longEraSymbols");
+  late final _sel_monthSymbols1 = _registerName1("monthSymbols");
+  late final _sel_shortMonthSymbols1 = _registerName1("shortMonthSymbols");
+  late final _sel_veryShortMonthSymbols1 =
+      _registerName1("veryShortMonthSymbols");
+  late final _sel_standaloneMonthSymbols1 =
+      _registerName1("standaloneMonthSymbols");
+  late final _sel_shortStandaloneMonthSymbols1 =
+      _registerName1("shortStandaloneMonthSymbols");
+  late final _sel_veryShortStandaloneMonthSymbols1 =
+      _registerName1("veryShortStandaloneMonthSymbols");
+  late final _sel_weekdaySymbols1 = _registerName1("weekdaySymbols");
+  late final _sel_shortWeekdaySymbols1 = _registerName1("shortWeekdaySymbols");
+  late final _sel_veryShortWeekdaySymbols1 =
+      _registerName1("veryShortWeekdaySymbols");
+  late final _sel_standaloneWeekdaySymbols1 =
+      _registerName1("standaloneWeekdaySymbols");
+  late final _sel_shortStandaloneWeekdaySymbols1 =
+      _registerName1("shortStandaloneWeekdaySymbols");
+  late final _sel_veryShortStandaloneWeekdaySymbols1 =
+      _registerName1("veryShortStandaloneWeekdaySymbols");
+  late final _sel_quarterSymbols1 = _registerName1("quarterSymbols");
+  late final _sel_shortQuarterSymbols1 = _registerName1("shortQuarterSymbols");
+  late final _sel_standaloneQuarterSymbols1 =
+      _registerName1("standaloneQuarterSymbols");
+  late final _sel_shortStandaloneQuarterSymbols1 =
+      _registerName1("shortStandaloneQuarterSymbols");
+  late final _sel_AMSymbol1 = _registerName1("AMSymbol");
+  late final _sel_PMSymbol1 = _registerName1("PMSymbol");
+  late final _sel_minimumRangeOfUnit_1 = _registerName1("minimumRangeOfUnit:");
+  NSRange _objc_msgSend_667(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int unit,
+  ) {
+    return __objc_msgSend_667(
+      obj,
+      sel,
+      unit,
+    );
+  }
+
+  late final __objc_msgSend_667Ptr = _lookup<
+      ffi.NativeFunction<
+          NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_667 = __objc_msgSend_667Ptr.asFunction<
+      NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_maximumRangeOfUnit_1 = _registerName1("maximumRangeOfUnit:");
+  late final _sel_rangeOfUnit_inUnit_forDate_1 =
+      _registerName1("rangeOfUnit:inUnit:forDate:");
+  NSRange _objc_msgSend_668(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int smaller,
+    int larger,
+    ffi.Pointer<ObjCObject> date,
+  ) {
+    return __objc_msgSend_668(
+      obj,
+      sel,
+      smaller,
+      larger,
+      date,
+    );
+  }
+
+  late final __objc_msgSend_668Ptr = _lookup<
+      ffi.NativeFunction<
+          NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32, ffi.Int32, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_668 = __objc_msgSend_668Ptr.asFunction<
+      NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int, int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_ordinalityOfUnit_inUnit_forDate_1 =
+      _registerName1("ordinalityOfUnit:inUnit:forDate:");
+  int _objc_msgSend_669(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int smaller,
+    int larger,
+    ffi.Pointer<ObjCObject> date,
+  ) {
+    return __objc_msgSend_669(
+      obj,
+      sel,
+      smaller,
+      larger,
+      date,
+    );
+  }
+
+  late final __objc_msgSend_669Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32, ffi.Int32, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_669 = __objc_msgSend_669Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int, int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_rangeOfUnit_startDate_interval_forDate_1 =
+      _registerName1("rangeOfUnit:startDate:interval:forDate:");
+  bool _objc_msgSend_670(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int unit,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> datep,
+    ffi.Pointer<NSTimeInterval> tip,
+    ffi.Pointer<ObjCObject> date,
+  ) {
+    return __objc_msgSend_670(
+      obj,
+      sel,
+      unit,
+      datep,
+      tip,
+      date,
+    );
+  }
+
+  late final __objc_msgSend_670Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Pointer<NSTimeInterval>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_670 = __objc_msgSend_670Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          ffi.Pointer<NSTimeInterval>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSDateComponents1 = _getClass1("NSDateComponents");
+  late final _sel_calendar1 = _registerName1("calendar");
+  late final _sel_setCalendar_1 = _registerName1("setCalendar:");
+  void _objc_msgSend_671(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_671(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_671Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_671 = __objc_msgSend_671Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_era1 = _registerName1("era");
+  late final _sel_setEra_1 = _registerName1("setEra:");
+  late final _sel_year1 = _registerName1("year");
+  late final _sel_setYear_1 = _registerName1("setYear:");
+  late final _sel_month1 = _registerName1("month");
+  late final _sel_setMonth_1 = _registerName1("setMonth:");
+  late final _sel_day1 = _registerName1("day");
+  late final _sel_setDay_1 = _registerName1("setDay:");
+  late final _sel_hour1 = _registerName1("hour");
+  late final _sel_setHour_1 = _registerName1("setHour:");
+  late final _sel_minute1 = _registerName1("minute");
+  late final _sel_setMinute_1 = _registerName1("setMinute:");
+  late final _sel_second1 = _registerName1("second");
+  late final _sel_setSecond_1 = _registerName1("setSecond:");
+  late final _sel_nanosecond1 = _registerName1("nanosecond");
+  late final _sel_setNanosecond_1 = _registerName1("setNanosecond:");
+  late final _sel_weekday1 = _registerName1("weekday");
+  late final _sel_setWeekday_1 = _registerName1("setWeekday:");
+  late final _sel_weekdayOrdinal1 = _registerName1("weekdayOrdinal");
+  late final _sel_setWeekdayOrdinal_1 = _registerName1("setWeekdayOrdinal:");
+  late final _sel_quarter1 = _registerName1("quarter");
+  late final _sel_setQuarter_1 = _registerName1("setQuarter:");
+  late final _sel_weekOfMonth1 = _registerName1("weekOfMonth");
+  late final _sel_setWeekOfMonth_1 = _registerName1("setWeekOfMonth:");
+  late final _sel_weekOfYear1 = _registerName1("weekOfYear");
+  late final _sel_setWeekOfYear_1 = _registerName1("setWeekOfYear:");
+  late final _sel_yearForWeekOfYear1 = _registerName1("yearForWeekOfYear");
+  late final _sel_setYearForWeekOfYear_1 =
+      _registerName1("setYearForWeekOfYear:");
+  late final _sel_isLeapMonth1 = _registerName1("isLeapMonth");
+  late final _sel_setLeapMonth_1 = _registerName1("setLeapMonth:");
+  late final _sel_week1 = _registerName1("week");
+  late final _sel_setWeek_1 = _registerName1("setWeek:");
+  late final _sel_setValue_forComponent_1 =
+      _registerName1("setValue:forComponent:");
+  void _objc_msgSend_672(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+    int unit,
+  ) {
+    return __objc_msgSend_672(
+      obj,
+      sel,
+      value,
+      unit,
+    );
+  }
+
+  late final __objc_msgSend_672Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSInteger, ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_672 = __objc_msgSend_672Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int, int)>();
+
+  late final _sel_valueForComponent_1 = _registerName1("valueForComponent:");
+  int _objc_msgSend_673(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int unit,
+  ) {
+    return __objc_msgSend_673(
+      obj,
+      sel,
+      unit,
+    );
+  }
+
+  late final __objc_msgSend_673Ptr = _lookup<
+      ffi.NativeFunction<
+          NSInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_673 = __objc_msgSend_673Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_isValidDate1 = _registerName1("isValidDate");
+  late final _sel_isValidDateInCalendar_1 =
+      _registerName1("isValidDateInCalendar:");
+  bool _objc_msgSend_674(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> calendar,
+  ) {
+    return __objc_msgSend_674(
+      obj,
+      sel,
+      calendar,
+    );
+  }
+
+  late final __objc_msgSend_674Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_674 = __objc_msgSend_674Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dateFromComponents_1 = _registerName1("dateFromComponents:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_675(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> comps,
+  ) {
+    return __objc_msgSend_675(
+      obj,
+      sel,
+      comps,
+    );
+  }
+
+  late final __objc_msgSend_675Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_675 = __objc_msgSend_675Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_components_fromDate_1 =
+      _registerName1("components:fromDate:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_676(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int unitFlags,
+    ffi.Pointer<ObjCObject> date,
+  ) {
+    return __objc_msgSend_676(
+      obj,
+      sel,
+      unitFlags,
+      date,
+    );
+  }
+
+  late final __objc_msgSend_676Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_676 = __objc_msgSend_676Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dateByAddingComponents_toDate_options_1 =
+      _registerName1("dateByAddingComponents:toDate:options:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_677(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> comps,
+    ffi.Pointer<ObjCObject> date,
+    int opts,
+  ) {
+    return __objc_msgSend_677(
+      obj,
+      sel,
+      comps,
+      date,
+      opts,
+    );
+  }
+
+  late final __objc_msgSend_677Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_677 = __objc_msgSend_677Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          int)>();
+
+  late final _sel_components_fromDate_toDate_options_1 =
+      _registerName1("components:fromDate:toDate:options:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_678(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int unitFlags,
+    ffi.Pointer<ObjCObject> startingDate,
+    ffi.Pointer<ObjCObject> resultDate,
+    int opts,
+  ) {
+    return __objc_msgSend_678(
+      obj,
+      sel,
+      unitFlags,
+      startingDate,
+      resultDate,
+      opts,
+    );
+  }
+
+  late final __objc_msgSend_678Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_678 = __objc_msgSend_678Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          int,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          int)>();
+
+  late final _sel_getEra_year_month_day_fromDate_1 =
+      _registerName1("getEra:year:month:day:fromDate:");
+  void _objc_msgSend_679(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<NSInteger> eraValuePointer,
+    ffi.Pointer<NSInteger> yearValuePointer,
+    ffi.Pointer<NSInteger> monthValuePointer,
+    ffi.Pointer<NSInteger> dayValuePointer,
+    ffi.Pointer<ObjCObject> date,
+  ) {
+    return __objc_msgSend_679(
+      obj,
+      sel,
+      eraValuePointer,
+      yearValuePointer,
+      monthValuePointer,
+      dayValuePointer,
+      date,
+    );
+  }
+
+  late final __objc_msgSend_679Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<NSInteger>,
+              ffi.Pointer<NSInteger>,
+              ffi.Pointer<NSInteger>,
+              ffi.Pointer<NSInteger>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_679 = __objc_msgSend_679Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<NSInteger>,
+          ffi.Pointer<NSInteger>,
+          ffi.Pointer<NSInteger>,
+          ffi.Pointer<NSInteger>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_getEra_yearForWeekOfYear_weekOfYear_weekday_fromDate_1 =
+      _registerName1("getEra:yearForWeekOfYear:weekOfYear:weekday:fromDate:");
+  late final _sel_getHour_minute_second_nanosecond_fromDate_1 =
+      _registerName1("getHour:minute:second:nanosecond:fromDate:");
+  late final _sel_component_fromDate_1 = _registerName1("component:fromDate:");
+  int _objc_msgSend_680(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int unit,
+    ffi.Pointer<ObjCObject> date,
+  ) {
+    return __objc_msgSend_680(
+      obj,
+      sel,
+      unit,
+      date,
+    );
+  }
+
+  late final __objc_msgSend_680Ptr = _lookup<
+      ffi.NativeFunction<
+          NSInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_680 = __objc_msgSend_680Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dateWithEra_year_month_day_hour_minute_second_nanosecond_1 =
+      _registerName1(
+          "dateWithEra:year:month:day:hour:minute:second:nanosecond:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_681(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int eraValue,
+    int yearValue,
+    int monthValue,
+    int dayValue,
+    int hourValue,
+    int minuteValue,
+    int secondValue,
+    int nanosecondValue,
+  ) {
+    return __objc_msgSend_681(
+      obj,
+      sel,
+      eraValue,
+      yearValue,
+      monthValue,
+      dayValue,
+      hourValue,
+      minuteValue,
+      secondValue,
+      nanosecondValue,
+    );
+  }
+
+  late final __objc_msgSend_681Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSInteger,
+              NSInteger,
+              NSInteger,
+              NSInteger,
+              NSInteger,
+              NSInteger,
+              NSInteger,
+              NSInteger)>>('objc_msgSend');
+  late final __objc_msgSend_681 = __objc_msgSend_681Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, int, int, int, int, int, int, int)>();
+
+  late final _sel_dateWithEra_yearForWeekOfYear_weekOfYear_weekday_hour_minute_second_nanosecond_1 =
+      _registerName1(
+          "dateWithEra:yearForWeekOfYear:weekOfYear:weekday:hour:minute:second:nanosecond:");
+  late final _sel_startOfDayForDate_1 = _registerName1("startOfDayForDate:");
+  late final _sel_componentsInTimeZone_fromDate_1 =
+      _registerName1("componentsInTimeZone:fromDate:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_682(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> timezone,
+    ffi.Pointer<ObjCObject> date,
+  ) {
+    return __objc_msgSend_682(
+      obj,
+      sel,
+      timezone,
+      date,
+    );
+  }
+
+  late final __objc_msgSend_682Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_682 = __objc_msgSend_682Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_compareDate_toDate_toUnitGranularity_1 =
+      _registerName1("compareDate:toDate:toUnitGranularity:");
+  int _objc_msgSend_683(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> date1,
+    ffi.Pointer<ObjCObject> date2,
+    int unit,
+  ) {
+    return __objc_msgSend_683(
+      obj,
+      sel,
+      date1,
+      date2,
+      unit,
+    );
+  }
+
+  late final __objc_msgSend_683Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_683 = __objc_msgSend_683Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_isDate_equalToDate_toUnitGranularity_1 =
+      _registerName1("isDate:equalToDate:toUnitGranularity:");
+  bool _objc_msgSend_684(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> date1,
+    ffi.Pointer<ObjCObject> date2,
+    int unit,
+  ) {
+    return __objc_msgSend_684(
+      obj,
+      sel,
+      date1,
+      date2,
+      unit,
+    );
+  }
+
+  late final __objc_msgSend_684Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_684 = __objc_msgSend_684Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_isDate_inSameDayAsDate_1 =
+      _registerName1("isDate:inSameDayAsDate:");
+  bool _objc_msgSend_685(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> date1,
+    ffi.Pointer<ObjCObject> date2,
+  ) {
+    return __objc_msgSend_685(
+      obj,
+      sel,
+      date1,
+      date2,
+    );
+  }
+
+  late final __objc_msgSend_685Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_685 = __objc_msgSend_685Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_isDateInToday_1 = _registerName1("isDateInToday:");
+  late final _sel_isDateInYesterday_1 = _registerName1("isDateInYesterday:");
+  late final _sel_isDateInTomorrow_1 = _registerName1("isDateInTomorrow:");
+  late final _sel_isDateInWeekend_1 = _registerName1("isDateInWeekend:");
+  late final _sel_rangeOfWeekendStartDate_interval_containingDate_1 =
+      _registerName1("rangeOfWeekendStartDate:interval:containingDate:");
+  bool _objc_msgSend_686(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> datep,
+    ffi.Pointer<NSTimeInterval> tip,
+    ffi.Pointer<ObjCObject> date,
+  ) {
+    return __objc_msgSend_686(
+      obj,
+      sel,
+      datep,
+      tip,
+      date,
+    );
+  }
+
+  late final __objc_msgSend_686Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Pointer<NSTimeInterval>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_686 = __objc_msgSend_686Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          ffi.Pointer<NSTimeInterval>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_nextWeekendStartDate_interval_options_afterDate_1 =
+      _registerName1("nextWeekendStartDate:interval:options:afterDate:");
+  bool _objc_msgSend_687(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> datep,
+    ffi.Pointer<NSTimeInterval> tip,
+    int options,
+    ffi.Pointer<ObjCObject> date,
+  ) {
+    return __objc_msgSend_687(
+      obj,
+      sel,
+      datep,
+      tip,
+      options,
+      date,
+    );
+  }
+
+  late final __objc_msgSend_687Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Pointer<NSTimeInterval>,
+              ffi.Int32,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_687 = __objc_msgSend_687Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          ffi.Pointer<NSTimeInterval>,
+          int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_components_fromDateComponents_toDateComponents_options_1 =
+      _registerName1("components:fromDateComponents:toDateComponents:options:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_688(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int unitFlags,
+    ffi.Pointer<ObjCObject> startingDateComp,
+    ffi.Pointer<ObjCObject> resultDateComp,
+    int options,
+  ) {
+    return __objc_msgSend_688(
+      obj,
+      sel,
+      unitFlags,
+      startingDateComp,
+      resultDateComp,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_688Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_688 = __objc_msgSend_688Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          int,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          int)>();
+
+  late final _sel_dateByAddingUnit_value_toDate_options_1 =
+      _registerName1("dateByAddingUnit:value:toDate:options:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_689(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int unit,
+    int value,
+    ffi.Pointer<ObjCObject> date,
+    int options,
+  ) {
+    return __objc_msgSend_689(
+      obj,
+      sel,
+      unit,
+      value,
+      date,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_689Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              NSInteger,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_689 = __objc_msgSend_689Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, int, ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_enumerateDatesStartingAfterDate_matchingComponents_options_usingBlock_1 =
+      _registerName1(
+          "enumerateDatesStartingAfterDate:matchingComponents:options:usingBlock:");
+  void _objc_msgSend_690(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> start,
+    ffi.Pointer<ObjCObject> comps,
+    int opts,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_690(
+      obj,
+      sel,
+      start,
+      comps,
+      opts,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_690Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_690 = __objc_msgSend_690Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_nextDateAfterDate_matchingComponents_options_1 =
+      _registerName1("nextDateAfterDate:matchingComponents:options:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_691(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> date,
+    ffi.Pointer<ObjCObject> comps,
+    int options,
+  ) {
+    return __objc_msgSend_691(
+      obj,
+      sel,
+      date,
+      comps,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_691Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_691 = __objc_msgSend_691Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          int)>();
+
+  late final _sel_nextDateAfterDate_matchingUnit_value_options_1 =
+      _registerName1("nextDateAfterDate:matchingUnit:value:options:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_692(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> date,
+    int unit,
+    int value,
+    int options,
+  ) {
+    return __objc_msgSend_692(
+      obj,
+      sel,
+      date,
+      unit,
+      value,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_692Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              NSInteger,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_692 = __objc_msgSend_692Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>, int, int, int)>();
+
+  late final _sel_nextDateAfterDate_matchingHour_minute_second_options_1 =
+      _registerName1("nextDateAfterDate:matchingHour:minute:second:options:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_693(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> date,
+    int hourValue,
+    int minuteValue,
+    int secondValue,
+    int options,
+  ) {
+    return __objc_msgSend_693(
+      obj,
+      sel,
+      date,
+      hourValue,
+      minuteValue,
+      secondValue,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_693Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSInteger,
+              NSInteger,
+              NSInteger,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_693 = __objc_msgSend_693Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>, int, int, int, int)>();
+
+  late final _sel_dateBySettingUnit_value_ofDate_options_1 =
+      _registerName1("dateBySettingUnit:value:ofDate:options:");
+  late final _sel_dateBySettingHour_minute_second_ofDate_options_1 =
+      _registerName1("dateBySettingHour:minute:second:ofDate:options:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_694(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int h,
+    int m,
+    int s,
+    ffi.Pointer<ObjCObject> date,
+    int opts,
+  ) {
+    return __objc_msgSend_694(
+      obj,
+      sel,
+      h,
+      m,
+      s,
+      date,
+      opts,
+    );
+  }
+
+  late final __objc_msgSend_694Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSInteger,
+              NSInteger,
+              NSInteger,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_694 = __objc_msgSend_694Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, int, int, ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_date_matchesComponents_1 =
+      _registerName1("date:matchesComponents:");
+  bool _objc_msgSend_695(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> date,
+    ffi.Pointer<ObjCObject> components,
+  ) {
+    return __objc_msgSend_695(
+      obj,
+      sel,
+      date,
+      components,
+    );
+  }
+
+  late final __objc_msgSend_695Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_695 = __objc_msgSend_695Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_isLenient1 = _registerName1("isLenient");
+  late final _sel_setLenient_1 = _registerName1("setLenient:");
+  late final _sel_twoDigitStartDate1 = _registerName1("twoDigitStartDate");
+  late final _sel_setTwoDigitStartDate_1 =
+      _registerName1("setTwoDigitStartDate:");
+  late final _sel_defaultDate1 = _registerName1("defaultDate");
+  late final _sel_setDefaultDate_1 = _registerName1("setDefaultDate:");
+  late final _sel_setEraSymbols_1 = _registerName1("setEraSymbols:");
+  void _objc_msgSend_696(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_696(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_696Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_696 = __objc_msgSend_696Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_setMonthSymbols_1 = _registerName1("setMonthSymbols:");
+  late final _sel_setShortMonthSymbols_1 =
+      _registerName1("setShortMonthSymbols:");
+  late final _sel_setWeekdaySymbols_1 = _registerName1("setWeekdaySymbols:");
+  late final _sel_setShortWeekdaySymbols_1 =
+      _registerName1("setShortWeekdaySymbols:");
+  late final _sel_setAMSymbol_1 = _registerName1("setAMSymbol:");
+  late final _sel_setPMSymbol_1 = _registerName1("setPMSymbol:");
+  late final _sel_setLongEraSymbols_1 = _registerName1("setLongEraSymbols:");
+  late final _sel_setVeryShortMonthSymbols_1 =
+      _registerName1("setVeryShortMonthSymbols:");
+  late final _sel_setStandaloneMonthSymbols_1 =
+      _registerName1("setStandaloneMonthSymbols:");
+  late final _sel_setShortStandaloneMonthSymbols_1 =
+      _registerName1("setShortStandaloneMonthSymbols:");
+  late final _sel_setVeryShortStandaloneMonthSymbols_1 =
+      _registerName1("setVeryShortStandaloneMonthSymbols:");
+  late final _sel_setVeryShortWeekdaySymbols_1 =
+      _registerName1("setVeryShortWeekdaySymbols:");
+  late final _sel_setStandaloneWeekdaySymbols_1 =
+      _registerName1("setStandaloneWeekdaySymbols:");
+  late final _sel_setShortStandaloneWeekdaySymbols_1 =
+      _registerName1("setShortStandaloneWeekdaySymbols:");
+  late final _sel_setVeryShortStandaloneWeekdaySymbols_1 =
+      _registerName1("setVeryShortStandaloneWeekdaySymbols:");
+  late final _sel_setQuarterSymbols_1 = _registerName1("setQuarterSymbols:");
+  late final _sel_setShortQuarterSymbols_1 =
+      _registerName1("setShortQuarterSymbols:");
+  late final _sel_setStandaloneQuarterSymbols_1 =
+      _registerName1("setStandaloneQuarterSymbols:");
+  late final _sel_setShortStandaloneQuarterSymbols_1 =
+      _registerName1("setShortStandaloneQuarterSymbols:");
+  late final _sel_gregorianStartDate1 = _registerName1("gregorianStartDate");
+  late final _sel_setGregorianStartDate_1 =
+      _registerName1("setGregorianStartDate:");
+  late final _sel_doesRelativeDateFormatting1 =
+      _registerName1("doesRelativeDateFormatting");
+  late final _sel_setDoesRelativeDateFormatting_1 =
+      _registerName1("setDoesRelativeDateFormatting:");
+  late final _sel_initWithDateFormat_allowNaturalLanguage_1 =
+      _registerName1("initWithDateFormat:allowNaturalLanguage:");
+  late final _sel_allowsNaturalLanguage1 =
+      _registerName1("allowsNaturalLanguage");
+  late final _class_NSNumberFormatter1 = _getClass1("NSNumberFormatter");
+  late final _sel_stringFromNumber_1 = _registerName1("stringFromNumber:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_697(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> number,
+  ) {
+    return __objc_msgSend_697(
+      obj,
+      sel,
+      number,
+    );
+  }
+
+  late final __objc_msgSend_697Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_697 = __objc_msgSend_697Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_numberFromString_1 = _registerName1("numberFromString:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_698(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> string,
+  ) {
+    return __objc_msgSend_698(
+      obj,
+      sel,
+      string,
+    );
+  }
+
+  late final __objc_msgSend_698Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_698 = __objc_msgSend_698Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_localizedStringFromNumber_numberStyle_1 =
+      _registerName1("localizedStringFromNumber:numberStyle:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_699(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> num,
+    int nstyle,
+  ) {
+    return __objc_msgSend_699(
+      obj,
+      sel,
+      num,
+      nstyle,
+    );
+  }
+
+  late final __objc_msgSend_699Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_699 = __objc_msgSend_699Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>, int)>();
+
+  int _objc_msgSend_700(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_700(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_700Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_700 = __objc_msgSend_700Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  void _objc_msgSend_701(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int behavior,
+  ) {
+    return __objc_msgSend_701(
+      obj,
+      sel,
+      behavior,
+    );
+  }
+
+  late final __objc_msgSend_701Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_701 = __objc_msgSend_701Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_numberStyle1 = _registerName1("numberStyle");
+  int _objc_msgSend_702(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_702(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_702Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_702 = __objc_msgSend_702Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setNumberStyle_1 = _registerName1("setNumberStyle:");
+  void _objc_msgSend_703(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_703(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_703Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_703 = __objc_msgSend_703Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_generatesDecimalNumbers1 =
+      _registerName1("generatesDecimalNumbers");
+  late final _sel_setGeneratesDecimalNumbers_1 =
+      _registerName1("setGeneratesDecimalNumbers:");
+  void _objc_msgSend_704(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_704(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_704Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_704 = __objc_msgSend_704Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_negativeFormat1 = _registerName1("negativeFormat");
+  late final _sel_setNegativeFormat_1 = _registerName1("setNegativeFormat:");
+  late final _sel_textAttributesForNegativeValues1 =
+      _registerName1("textAttributesForNegativeValues");
+  late final _sel_setTextAttributesForNegativeValues_1 =
+      _registerName1("setTextAttributesForNegativeValues:");
+  late final _sel_positiveFormat1 = _registerName1("positiveFormat");
+  late final _sel_setPositiveFormat_1 = _registerName1("setPositiveFormat:");
+  late final _sel_textAttributesForPositiveValues1 =
+      _registerName1("textAttributesForPositiveValues");
+  late final _sel_setTextAttributesForPositiveValues_1 =
+      _registerName1("setTextAttributesForPositiveValues:");
+  late final _sel_allowsFloats1 = _registerName1("allowsFloats");
+  late final _sel_setAllowsFloats_1 = _registerName1("setAllowsFloats:");
+  late final _sel_setDecimalSeparator_1 =
+      _registerName1("setDecimalSeparator:");
+  late final _sel_alwaysShowsDecimalSeparator1 =
+      _registerName1("alwaysShowsDecimalSeparator");
+  late final _sel_setAlwaysShowsDecimalSeparator_1 =
+      _registerName1("setAlwaysShowsDecimalSeparator:");
+  late final _sel_currencyDecimalSeparator1 =
+      _registerName1("currencyDecimalSeparator");
+  late final _sel_setCurrencyDecimalSeparator_1 =
+      _registerName1("setCurrencyDecimalSeparator:");
+  late final _sel_usesGroupingSeparator1 =
+      _registerName1("usesGroupingSeparator");
+  late final _sel_setUsesGroupingSeparator_1 =
+      _registerName1("setUsesGroupingSeparator:");
+  late final _sel_setGroupingSeparator_1 =
+      _registerName1("setGroupingSeparator:");
+  late final _sel_zeroSymbol1 = _registerName1("zeroSymbol");
+  late final _sel_setZeroSymbol_1 = _registerName1("setZeroSymbol:");
+  late final _sel_textAttributesForZero1 =
+      _registerName1("textAttributesForZero");
+  late final _sel_setTextAttributesForZero_1 =
+      _registerName1("setTextAttributesForZero:");
+  late final _sel_nilSymbol1 = _registerName1("nilSymbol");
+  late final _sel_setNilSymbol_1 = _registerName1("setNilSymbol:");
+  late final _sel_textAttributesForNil1 =
+      _registerName1("textAttributesForNil");
+  late final _sel_setTextAttributesForNil_1 =
+      _registerName1("setTextAttributesForNil:");
+  late final _sel_notANumberSymbol1 = _registerName1("notANumberSymbol");
+  late final _sel_setNotANumberSymbol_1 =
+      _registerName1("setNotANumberSymbol:");
+  late final _sel_textAttributesForNotANumber1 =
+      _registerName1("textAttributesForNotANumber");
+  late final _sel_setTextAttributesForNotANumber_1 =
+      _registerName1("setTextAttributesForNotANumber:");
+  late final _sel_positiveInfinitySymbol1 =
+      _registerName1("positiveInfinitySymbol");
+  late final _sel_setPositiveInfinitySymbol_1 =
+      _registerName1("setPositiveInfinitySymbol:");
+  late final _sel_textAttributesForPositiveInfinity1 =
+      _registerName1("textAttributesForPositiveInfinity");
+  late final _sel_setTextAttributesForPositiveInfinity_1 =
+      _registerName1("setTextAttributesForPositiveInfinity:");
+  late final _sel_negativeInfinitySymbol1 =
+      _registerName1("negativeInfinitySymbol");
+  late final _sel_setNegativeInfinitySymbol_1 =
+      _registerName1("setNegativeInfinitySymbol:");
+  late final _sel_textAttributesForNegativeInfinity1 =
+      _registerName1("textAttributesForNegativeInfinity");
+  late final _sel_setTextAttributesForNegativeInfinity_1 =
+      _registerName1("setTextAttributesForNegativeInfinity:");
+  late final _sel_positivePrefix1 = _registerName1("positivePrefix");
+  late final _sel_setPositivePrefix_1 = _registerName1("setPositivePrefix:");
+  late final _sel_positiveSuffix1 = _registerName1("positiveSuffix");
+  late final _sel_setPositiveSuffix_1 = _registerName1("setPositiveSuffix:");
+  late final _sel_negativePrefix1 = _registerName1("negativePrefix");
+  late final _sel_setNegativePrefix_1 = _registerName1("setNegativePrefix:");
+  late final _sel_negativeSuffix1 = _registerName1("negativeSuffix");
+  late final _sel_setNegativeSuffix_1 = _registerName1("setNegativeSuffix:");
+  late final _sel_setCurrencyCode_1 = _registerName1("setCurrencyCode:");
+  late final _sel_setCurrencySymbol_1 = _registerName1("setCurrencySymbol:");
+  late final _sel_internationalCurrencySymbol1 =
+      _registerName1("internationalCurrencySymbol");
+  late final _sel_setInternationalCurrencySymbol_1 =
+      _registerName1("setInternationalCurrencySymbol:");
+  late final _sel_percentSymbol1 = _registerName1("percentSymbol");
+  late final _sel_setPercentSymbol_1 = _registerName1("setPercentSymbol:");
+  late final _sel_perMillSymbol1 = _registerName1("perMillSymbol");
+  late final _sel_setPerMillSymbol_1 = _registerName1("setPerMillSymbol:");
+  late final _sel_minusSign1 = _registerName1("minusSign");
+  late final _sel_setMinusSign_1 = _registerName1("setMinusSign:");
+  late final _sel_plusSign1 = _registerName1("plusSign");
+  late final _sel_setPlusSign_1 = _registerName1("setPlusSign:");
+  late final _sel_exponentSymbol1 = _registerName1("exponentSymbol");
+  late final _sel_setExponentSymbol_1 = _registerName1("setExponentSymbol:");
+  late final _sel_groupingSize1 = _registerName1("groupingSize");
+  late final _sel_setGroupingSize_1 = _registerName1("setGroupingSize:");
+  late final _sel_secondaryGroupingSize1 =
+      _registerName1("secondaryGroupingSize");
+  late final _sel_setSecondaryGroupingSize_1 =
+      _registerName1("setSecondaryGroupingSize:");
+  late final _sel_multiplier1 = _registerName1("multiplier");
+  late final _sel_setMultiplier_1 = _registerName1("setMultiplier:");
+  void _objc_msgSend_705(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_705(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_705Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_705 = __objc_msgSend_705Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_formatWidth1 = _registerName1("formatWidth");
+  late final _sel_setFormatWidth_1 = _registerName1("setFormatWidth:");
+  late final _sel_paddingCharacter1 = _registerName1("paddingCharacter");
+  late final _sel_setPaddingCharacter_1 =
+      _registerName1("setPaddingCharacter:");
+  late final _sel_paddingPosition1 = _registerName1("paddingPosition");
+  int _objc_msgSend_706(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_706(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_706Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_706 = __objc_msgSend_706Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setPaddingPosition_1 = _registerName1("setPaddingPosition:");
+  void _objc_msgSend_707(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_707(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_707Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_707 = __objc_msgSend_707Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_roundingMode1 = _registerName1("roundingMode");
+  int _objc_msgSend_708(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_708(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_708Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_708 = __objc_msgSend_708Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setRoundingMode_1 = _registerName1("setRoundingMode:");
+  void _objc_msgSend_709(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_709(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_709Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_709 = __objc_msgSend_709Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_roundingIncrement1 = _registerName1("roundingIncrement");
+  late final _sel_setRoundingIncrement_1 =
+      _registerName1("setRoundingIncrement:");
+  late final _sel_minimumIntegerDigits1 =
+      _registerName1("minimumIntegerDigits");
+  late final _sel_setMinimumIntegerDigits_1 =
+      _registerName1("setMinimumIntegerDigits:");
+  late final _sel_maximumIntegerDigits1 =
+      _registerName1("maximumIntegerDigits");
+  late final _sel_setMaximumIntegerDigits_1 =
+      _registerName1("setMaximumIntegerDigits:");
+  late final _sel_minimumFractionDigits1 =
+      _registerName1("minimumFractionDigits");
+  late final _sel_setMinimumFractionDigits_1 =
+      _registerName1("setMinimumFractionDigits:");
+  late final _sel_maximumFractionDigits1 =
+      _registerName1("maximumFractionDigits");
+  late final _sel_setMaximumFractionDigits_1 =
+      _registerName1("setMaximumFractionDigits:");
+  late final _sel_minimum1 = _registerName1("minimum");
+  late final _sel_setMinimum_1 = _registerName1("setMinimum:");
+  late final _sel_maximum1 = _registerName1("maximum");
+  late final _sel_setMaximum_1 = _registerName1("setMaximum:");
+  late final _sel_currencyGroupingSeparator1 =
+      _registerName1("currencyGroupingSeparator");
+  late final _sel_setCurrencyGroupingSeparator_1 =
+      _registerName1("setCurrencyGroupingSeparator:");
+  late final _sel_usesSignificantDigits1 =
+      _registerName1("usesSignificantDigits");
+  late final _sel_setUsesSignificantDigits_1 =
+      _registerName1("setUsesSignificantDigits:");
+  late final _sel_minimumSignificantDigits1 =
+      _registerName1("minimumSignificantDigits");
+  late final _sel_setMinimumSignificantDigits_1 =
+      _registerName1("setMinimumSignificantDigits:");
+  late final _sel_maximumSignificantDigits1 =
+      _registerName1("maximumSignificantDigits");
+  late final _sel_setMaximumSignificantDigits_1 =
+      _registerName1("setMaximumSignificantDigits:");
+  late final _sel_isPartialStringValidationEnabled1 =
+      _registerName1("isPartialStringValidationEnabled");
+  late final _sel_setPartialStringValidationEnabled_1 =
+      _registerName1("setPartialStringValidationEnabled:");
+  late final _sel_hasThousandSeparators1 =
+      _registerName1("hasThousandSeparators");
+  late final _sel_setHasThousandSeparators_1 =
+      _registerName1("setHasThousandSeparators:");
+  late final _sel_thousandSeparator1 = _registerName1("thousandSeparator");
+  late final _sel_setThousandSeparator_1 =
+      _registerName1("setThousandSeparator:");
+  late final _sel_localizesFormat1 = _registerName1("localizesFormat");
+  late final _sel_setLocalizesFormat_1 = _registerName1("setLocalizesFormat:");
+  late final _sel_format1 = _registerName1("format");
+  late final _sel_setFormat_1 = _registerName1("setFormat:");
+  late final _sel_attributedStringForZero1 =
+      _registerName1("attributedStringForZero");
+  late final _sel_setAttributedStringForZero_1 =
+      _registerName1("setAttributedStringForZero:");
+  void _objc_msgSend_710(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_710(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_710Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_710 = __objc_msgSend_710Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_attributedStringForNil1 =
+      _registerName1("attributedStringForNil");
+  late final _sel_setAttributedStringForNil_1 =
+      _registerName1("setAttributedStringForNil:");
+  late final _sel_attributedStringForNotANumber1 =
+      _registerName1("attributedStringForNotANumber");
+  late final _sel_setAttributedStringForNotANumber_1 =
+      _registerName1("setAttributedStringForNotANumber:");
+  late final _class_NSDecimalNumberHandler1 =
+      _getClass1("NSDecimalNumberHandler");
+  late final _sel_defaultDecimalNumberHandler1 =
+      _registerName1("defaultDecimalNumberHandler");
+  ffi.Pointer<ObjCObject> _objc_msgSend_711(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_711(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_711Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_711 = __objc_msgSend_711Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_initWithRoundingMode_scale_raiseOnExactness_raiseOnOverflow_raiseOnUnderflow_raiseOnDivideByZero_1 =
+      _registerName1(
+          "initWithRoundingMode:scale:raiseOnExactness:raiseOnOverflow:raiseOnUnderflow:raiseOnDivideByZero:");
+  instancetype _objc_msgSend_712(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int roundingMode,
+    int scale,
+    bool exact,
+    bool overflow,
+    bool underflow,
+    bool divideByZero,
+  ) {
+    return __objc_msgSend_712(
+      obj,
+      sel,
+      roundingMode,
+      scale,
+      exact,
+      overflow,
+      underflow,
+      divideByZero,
+    );
+  }
+
+  late final __objc_msgSend_712Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Short,
+              ffi.Bool,
+              ffi.Bool,
+              ffi.Bool,
+              ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_712 = __objc_msgSend_712Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          int, bool, bool, bool, bool)>();
+
+  late final _sel_decimalNumberHandlerWithRoundingMode_scale_raiseOnExactness_raiseOnOverflow_raiseOnUnderflow_raiseOnDivideByZero_1 =
+      _registerName1(
+          "decimalNumberHandlerWithRoundingMode:scale:raiseOnExactness:raiseOnOverflow:raiseOnUnderflow:raiseOnDivideByZero:");
+  late final _sel_roundingBehavior1 = _registerName1("roundingBehavior");
+  late final _sel_setRoundingBehavior_1 =
+      _registerName1("setRoundingBehavior:");
+  void _objc_msgSend_713(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_713(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_713Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_713 = __objc_msgSend_713Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSScanner1 = _getClass1("NSScanner");
+  late final _sel_scanLocation1 = _registerName1("scanLocation");
+  late final _sel_setScanLocation_1 = _registerName1("setScanLocation:");
+  late final _sel_charactersToBeSkipped1 =
+      _registerName1("charactersToBeSkipped");
+  late final _sel_setCharactersToBeSkipped_1 =
+      _registerName1("setCharactersToBeSkipped:");
+  void _objc_msgSend_714(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_714(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_714Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_714 = __objc_msgSend_714Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_caseSensitive1 = _registerName1("caseSensitive");
+  late final _sel_setCaseSensitive_1 = _registerName1("setCaseSensitive:");
+  late final _sel_scanInt_1 = _registerName1("scanInt:");
+  bool _objc_msgSend_715(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Int> result,
+  ) {
+    return __objc_msgSend_715(
+      obj,
+      sel,
+      result,
+    );
+  }
+
+  late final __objc_msgSend_715Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Int>)>>('objc_msgSend');
+  late final __objc_msgSend_715 = __objc_msgSend_715Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Int>)>();
+
+  late final _sel_scanInteger_1 = _registerName1("scanInteger:");
+  bool _objc_msgSend_716(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<NSInteger> result,
+  ) {
+    return __objc_msgSend_716(
+      obj,
+      sel,
+      result,
+    );
+  }
+
+  late final __objc_msgSend_716Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<NSInteger>)>>('objc_msgSend');
+  late final __objc_msgSend_716 = __objc_msgSend_716Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<NSInteger>)>();
+
+  late final _sel_scanLongLong_1 = _registerName1("scanLongLong:");
+  bool _objc_msgSend_717(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.LongLong> result,
+  ) {
+    return __objc_msgSend_717(
+      obj,
+      sel,
+      result,
+    );
+  }
+
+  late final __objc_msgSend_717Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.LongLong>)>>('objc_msgSend');
+  late final __objc_msgSend_717 = __objc_msgSend_717Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.LongLong>)>();
+
+  late final _sel_scanUnsignedLongLong_1 =
+      _registerName1("scanUnsignedLongLong:");
+  bool _objc_msgSend_718(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.UnsignedLongLong> result,
+  ) {
+    return __objc_msgSend_718(
+      obj,
+      sel,
+      result,
+    );
+  }
+
+  late final __objc_msgSend_718Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.UnsignedLongLong>)>>('objc_msgSend');
+  late final __objc_msgSend_718 = __objc_msgSend_718Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.UnsignedLongLong>)>();
+
+  late final _sel_scanFloat_1 = _registerName1("scanFloat:");
+  bool _objc_msgSend_719(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Float> result,
+  ) {
+    return __objc_msgSend_719(
+      obj,
+      sel,
+      result,
+    );
+  }
+
+  late final __objc_msgSend_719Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Float>)>>('objc_msgSend');
+  late final __objc_msgSend_719 = __objc_msgSend_719Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Float>)>();
+
+  late final _sel_scanDouble_1 = _registerName1("scanDouble:");
+  bool _objc_msgSend_720(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Double> result,
+  ) {
+    return __objc_msgSend_720(
+      obj,
+      sel,
+      result,
+    );
+  }
+
+  late final __objc_msgSend_720Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Double>)>>('objc_msgSend');
+  late final __objc_msgSend_720 = __objc_msgSend_720Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Double>)>();
+
+  late final _sel_scanHexInt_1 = _registerName1("scanHexInt:");
+  bool _objc_msgSend_721(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.UnsignedInt> result,
+  ) {
+    return __objc_msgSend_721(
+      obj,
+      sel,
+      result,
+    );
+  }
+
+  late final __objc_msgSend_721Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.UnsignedInt>)>>('objc_msgSend');
+  late final __objc_msgSend_721 = __objc_msgSend_721Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.UnsignedInt>)>();
+
+  late final _sel_scanHexLongLong_1 = _registerName1("scanHexLongLong:");
+  late final _sel_scanHexFloat_1 = _registerName1("scanHexFloat:");
+  late final _sel_scanHexDouble_1 = _registerName1("scanHexDouble:");
+  late final _sel_scanString_intoString_1 =
+      _registerName1("scanString:intoString:");
+  bool _objc_msgSend_722(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> string,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> result,
+  ) {
+    return __objc_msgSend_722(
+      obj,
+      sel,
+      string,
+      result,
+    );
+  }
+
+  late final __objc_msgSend_722Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_722 = __objc_msgSend_722Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_scanCharactersFromSet_intoString_1 =
+      _registerName1("scanCharactersFromSet:intoString:");
+  bool _objc_msgSend_723(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> set1,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> result,
+  ) {
+    return __objc_msgSend_723(
+      obj,
+      sel,
+      set1,
+      result,
+    );
+  }
+
+  late final __objc_msgSend_723Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_723 = __objc_msgSend_723Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_scanUpToString_intoString_1 =
+      _registerName1("scanUpToString:intoString:");
+  late final _sel_scanUpToCharactersFromSet_intoString_1 =
+      _registerName1("scanUpToCharactersFromSet:intoString:");
+  late final _sel_isAtEnd1 = _registerName1("isAtEnd");
+  late final _sel_scannerWithString_1 = _registerName1("scannerWithString:");
+  late final _sel_localizedScannerWithString_1 =
+      _registerName1("localizedScannerWithString:");
+  late final _sel_scanDecimal_1 = _registerName1("scanDecimal:");
+  bool _objc_msgSend_724(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<NSDecimal> dcm,
+  ) {
+    return __objc_msgSend_724(
+      obj,
+      sel,
+      dcm,
+    );
+  }
+
+  late final __objc_msgSend_724Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<NSDecimal>)>>('objc_msgSend');
+  late final __objc_msgSend_724 = __objc_msgSend_724Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<NSDecimal>)>();
+
+  late final _class_NSException1 = _getClass1("NSException");
+  late final _sel_exceptionWithName_reason_userInfo_1 =
+      _registerName1("exceptionWithName:reason:userInfo:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_725(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSExceptionName name,
+    ffi.Pointer<ObjCObject> reason,
+    ffi.Pointer<ObjCObject> userInfo,
+  ) {
+    return __objc_msgSend_725(
+      obj,
+      sel,
+      name,
+      reason,
+      userInfo,
+    );
+  }
+
+  late final __objc_msgSend_725Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSExceptionName,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_725 = __objc_msgSend_725Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          NSExceptionName,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithName_reason_userInfo_1 =
+      _registerName1("initWithName:reason:userInfo:");
+  late final _sel_reason1 = _registerName1("reason");
+  late final _sel_raise1 = _registerName1("raise");
+  late final _sel_raise_format_1 = _registerName1("raise:format:");
+  late final _sel_raise_format_arguments_1 =
+      _registerName1("raise:format:arguments:");
+  void _objc_msgSend_726(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSExceptionName name,
+    ffi.Pointer<ObjCObject> format,
+    ffi.Pointer<__va_list_tag> argList,
+  ) {
+    return __objc_msgSend_726(
+      obj,
+      sel,
+      name,
+      format,
+      argList,
+    );
+  }
+
+  late final __objc_msgSend_726Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSExceptionName,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<__va_list_tag>)>>('objc_msgSend');
+  late final __objc_msgSend_726 = __objc_msgSend_726Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          NSExceptionName,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<__va_list_tag>)>();
+
+  late final _class_NSFileHandle1 = _getClass1("NSFileHandle");
+  late final _sel_availableData1 = _registerName1("availableData");
+  late final _sel_initWithFileDescriptor_closeOnDealloc_1 =
+      _registerName1("initWithFileDescriptor:closeOnDealloc:");
+  instancetype _objc_msgSend_727(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int fd,
+    bool closeopt,
+  ) {
+    return __objc_msgSend_727(
+      obj,
+      sel,
+      fd,
+      closeopt,
+    );
+  }
+
+  late final __objc_msgSend_727Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_727 = __objc_msgSend_727Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int, bool)>();
+
+  late final _sel_readDataToEndOfFileAndReturnError_1 =
+      _registerName1("readDataToEndOfFileAndReturnError:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_728(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_728(
+      obj,
+      sel,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_728Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_728 = __objc_msgSend_728Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_readDataUpToLength_error_1 =
+      _registerName1("readDataUpToLength:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_729(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int length,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_729(
+      obj,
+      sel,
+      length,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_729Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSUInteger,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_729 = __objc_msgSend_729Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_writeData_error_1 = _registerName1("writeData:error:");
+  bool _objc_msgSend_730(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> data,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_730(
+      obj,
+      sel,
+      data,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_730Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_730 = __objc_msgSend_730Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_getOffset_error_1 = _registerName1("getOffset:error:");
+  bool _objc_msgSend_731(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.UnsignedLongLong> offsetInFile,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_731(
+      obj,
+      sel,
+      offsetInFile,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_731Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.UnsignedLongLong>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_731 = __objc_msgSend_731Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.UnsignedLongLong>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_seekToEndReturningOffset_error_1 =
+      _registerName1("seekToEndReturningOffset:error:");
+  late final _sel_seekToOffset_error_1 = _registerName1("seekToOffset:error:");
+  bool _objc_msgSend_732(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int offset,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_732(
+      obj,
+      sel,
+      offset,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_732Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.UnsignedLongLong,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_732 = __objc_msgSend_732Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_truncateAtOffset_error_1 =
+      _registerName1("truncateAtOffset:error:");
+  late final _sel_synchronizeAndReturnError_1 =
+      _registerName1("synchronizeAndReturnError:");
+  late final _sel_closeAndReturnError_1 =
+      _registerName1("closeAndReturnError:");
+  late final _sel_fileHandleWithStandardInput1 =
+      _registerName1("fileHandleWithStandardInput");
+  ffi.Pointer<ObjCObject> _objc_msgSend_733(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_733(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_733Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_733 = __objc_msgSend_733Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_fileHandleWithStandardOutput1 =
+      _registerName1("fileHandleWithStandardOutput");
+  late final _sel_fileHandleWithStandardError1 =
+      _registerName1("fileHandleWithStandardError");
+  late final _sel_fileHandleWithNullDevice1 =
+      _registerName1("fileHandleWithNullDevice");
+  late final _sel_fileHandleForReadingAtPath_1 =
+      _registerName1("fileHandleForReadingAtPath:");
+  late final _sel_fileHandleForWritingAtPath_1 =
+      _registerName1("fileHandleForWritingAtPath:");
+  late final _sel_fileHandleForUpdatingAtPath_1 =
+      _registerName1("fileHandleForUpdatingAtPath:");
+  late final _sel_fileHandleForReadingFromURL_error_1 =
+      _registerName1("fileHandleForReadingFromURL:error:");
+  instancetype _objc_msgSend_734(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_734(
+      obj,
+      sel,
+      url,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_734Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_734 = __objc_msgSend_734Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_fileHandleForWritingToURL_error_1 =
+      _registerName1("fileHandleForWritingToURL:error:");
+  late final _sel_fileHandleForUpdatingURL_error_1 =
+      _registerName1("fileHandleForUpdatingURL:error:");
+  late final _sel_readInBackgroundAndNotifyForModes_1 =
+      _registerName1("readInBackgroundAndNotifyForModes:");
+  late final _sel_readInBackgroundAndNotify1 =
+      _registerName1("readInBackgroundAndNotify");
+  late final _sel_readToEndOfFileInBackgroundAndNotifyForModes_1 =
+      _registerName1("readToEndOfFileInBackgroundAndNotifyForModes:");
+  late final _sel_readToEndOfFileInBackgroundAndNotify1 =
+      _registerName1("readToEndOfFileInBackgroundAndNotify");
+  late final _sel_acceptConnectionInBackgroundAndNotifyForModes_1 =
+      _registerName1("acceptConnectionInBackgroundAndNotifyForModes:");
+  late final _sel_acceptConnectionInBackgroundAndNotify1 =
+      _registerName1("acceptConnectionInBackgroundAndNotify");
+  late final _sel_waitForDataInBackgroundAndNotifyForModes_1 =
+      _registerName1("waitForDataInBackgroundAndNotifyForModes:");
+  late final _sel_waitForDataInBackgroundAndNotify1 =
+      _registerName1("waitForDataInBackgroundAndNotify");
+  late final _sel_readabilityHandler1 = _registerName1("readabilityHandler");
+  ffi.Pointer<_ObjCBlock> _objc_msgSend_735(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_735(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_735Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<_ObjCBlock> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_735 = __objc_msgSend_735Ptr.asFunction<
+      ffi.Pointer<_ObjCBlock> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setReadabilityHandler_1 =
+      _registerName1("setReadabilityHandler:");
+  void _objc_msgSend_736(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> value,
+  ) {
+    return __objc_msgSend_736(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_736Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_736 = __objc_msgSend_736Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_writeabilityHandler1 = _registerName1("writeabilityHandler");
+  late final _sel_setWriteabilityHandler_1 =
+      _registerName1("setWriteabilityHandler:");
+  late final _sel_initWithFileDescriptor_1 =
+      _registerName1("initWithFileDescriptor:");
+  instancetype _objc_msgSend_737(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int fd,
+  ) {
+    return __objc_msgSend_737(
+      obj,
+      sel,
+      fd,
+    );
+  }
+
+  late final __objc_msgSend_737Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int)>>('objc_msgSend');
+  late final __objc_msgSend_737 = __objc_msgSend_737Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_fileDescriptor1 = _registerName1("fileDescriptor");
+  late final _sel_readDataToEndOfFile1 = _registerName1("readDataToEndOfFile");
+  late final _sel_readDataOfLength_1 = _registerName1("readDataOfLength:");
+  late final _sel_offsetInFile1 = _registerName1("offsetInFile");
+  late final _sel_seekToEndOfFile1 = _registerName1("seekToEndOfFile");
+  late final _sel_seekToFileOffset_1 = _registerName1("seekToFileOffset:");
+  void _objc_msgSend_738(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int offset,
+  ) {
+    return __objc_msgSend_738(
+      obj,
+      sel,
+      offset,
+    );
+  }
+
+  late final __objc_msgSend_738Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.UnsignedLongLong)>>('objc_msgSend');
+  late final __objc_msgSend_738 = __objc_msgSend_738Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_truncateFileAtOffset_1 =
+      _registerName1("truncateFileAtOffset:");
+  late final _sel_synchronizeFile1 = _registerName1("synchronizeFile");
+  late final _sel_closeFile1 = _registerName1("closeFile");
+  late final _class_NSHTTPCookieStorage1 = _getClass1("NSHTTPCookieStorage");
+  late final _sel_sharedHTTPCookieStorage1 =
+      _registerName1("sharedHTTPCookieStorage");
+  ffi.Pointer<ObjCObject> _objc_msgSend_739(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_739(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_739Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_739 = __objc_msgSend_739Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_sharedCookieStorageForGroupContainerIdentifier_1 =
+      _registerName1("sharedCookieStorageForGroupContainerIdentifier:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_740(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> identifier,
+  ) {
+    return __objc_msgSend_740(
+      obj,
+      sel,
+      identifier,
+    );
+  }
+
+  late final __objc_msgSend_740Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_740 = __objc_msgSend_740Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_cookies1 = _registerName1("cookies");
+  late final _class_NSHTTPCookie1 = _getClass1("NSHTTPCookie");
+  late final _sel_initWithProperties_1 = _registerName1("initWithProperties:");
+  late final _sel_cookieWithProperties_1 =
+      _registerName1("cookieWithProperties:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_741(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> properties,
+  ) {
+    return __objc_msgSend_741(
+      obj,
+      sel,
+      properties,
+    );
+  }
+
+  late final __objc_msgSend_741Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_741 = __objc_msgSend_741Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_requestHeaderFieldsWithCookies_1 =
+      _registerName1("requestHeaderFieldsWithCookies:");
+  late final _sel_cookiesWithResponseHeaderFields_forURL_1 =
+      _registerName1("cookiesWithResponseHeaderFields:forURL:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_742(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> headerFields,
+    ffi.Pointer<ObjCObject> URL,
+  ) {
+    return __objc_msgSend_742(
+      obj,
+      sel,
+      headerFields,
+      URL,
+    );
+  }
+
+  late final __objc_msgSend_742Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_742 = __objc_msgSend_742Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_properties1 = _registerName1("properties");
+  late final _sel_value1 = _registerName1("value");
+  late final _sel_expiresDate1 = _registerName1("expiresDate");
+  late final _sel_isSessionOnly1 = _registerName1("isSessionOnly");
+  late final _sel_isSecure1 = _registerName1("isSecure");
+  late final _sel_isHTTPOnly1 = _registerName1("isHTTPOnly");
+  late final _sel_comment1 = _registerName1("comment");
+  late final _sel_commentURL1 = _registerName1("commentURL");
+  late final _sel_portList1 = _registerName1("portList");
+  late final _sel_sameSitePolicy1 = _registerName1("sameSitePolicy");
+  late final _sel_setCookie_1 = _registerName1("setCookie:");
+  void _objc_msgSend_743(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> cookie,
+  ) {
+    return __objc_msgSend_743(
+      obj,
+      sel,
+      cookie,
+    );
+  }
+
+  late final __objc_msgSend_743Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_743 = __objc_msgSend_743Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_deleteCookie_1 = _registerName1("deleteCookie:");
+  late final _sel_removeCookiesSinceDate_1 =
+      _registerName1("removeCookiesSinceDate:");
+  late final _sel_cookiesForURL_1 = _registerName1("cookiesForURL:");
+  late final _sel_setCookies_forURL_mainDocumentURL_1 =
+      _registerName1("setCookies:forURL:mainDocumentURL:");
+  void _objc_msgSend_744(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> cookies,
+    ffi.Pointer<ObjCObject> URL,
+    ffi.Pointer<ObjCObject> mainDocumentURL,
+  ) {
+    return __objc_msgSend_744(
+      obj,
+      sel,
+      cookies,
+      URL,
+      mainDocumentURL,
+    );
+  }
+
+  late final __objc_msgSend_744Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_744 = __objc_msgSend_744Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_cookieAcceptPolicy1 = _registerName1("cookieAcceptPolicy");
+  int _objc_msgSend_745(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_745(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_745Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_745 = __objc_msgSend_745Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setCookieAcceptPolicy_1 =
+      _registerName1("setCookieAcceptPolicy:");
+  void _objc_msgSend_746(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_746(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_746Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_746 = __objc_msgSend_746Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_sortedCookiesUsingDescriptors_1 =
+      _registerName1("sortedCookiesUsingDescriptors:");
+  late final _class_NSURLSessionTask1 = _getClass1("NSURLSessionTask");
+  late final _sel_taskIdentifier1 = _registerName1("taskIdentifier");
+  late final _class_NSURLRequest1 = _getClass1("NSURLRequest");
+  late final _sel_requestWithURL_1 = _registerName1("requestWithURL:");
+  late final _sel_supportsSecureCoding1 =
+      _registerName1("supportsSecureCoding");
+  late final _sel_requestWithURL_cachePolicy_timeoutInterval_1 =
+      _registerName1("requestWithURL:cachePolicy:timeoutInterval:");
+  instancetype _objc_msgSend_747(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> URL,
+    int cachePolicy,
+    double timeoutInterval,
+  ) {
+    return __objc_msgSend_747(
+      obj,
+      sel,
+      URL,
+      cachePolicy,
+      timeoutInterval,
+    );
+  }
+
+  late final __objc_msgSend_747Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              NSTimeInterval)>>('objc_msgSend');
+  late final __objc_msgSend_747 = __objc_msgSend_747Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, double)>();
+
+  late final _sel_initWithURL_cachePolicy_timeoutInterval_1 =
+      _registerName1("initWithURL:cachePolicy:timeoutInterval:");
+  late final _sel_URL1 = _registerName1("URL");
+  late final _sel_cachePolicy1 = _registerName1("cachePolicy");
+  int _objc_msgSend_748(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_748(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_748Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_748 = __objc_msgSend_748Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_timeoutInterval1 = _registerName1("timeoutInterval");
+  late final _sel_mainDocumentURL1 = _registerName1("mainDocumentURL");
+  late final _sel_networkServiceType1 = _registerName1("networkServiceType");
+  int _objc_msgSend_749(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_749(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_749Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_749 = __objc_msgSend_749Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_allowsCellularAccess1 =
+      _registerName1("allowsCellularAccess");
+  late final _sel_allowsExpensiveNetworkAccess1 =
+      _registerName1("allowsExpensiveNetworkAccess");
+  late final _sel_allowsConstrainedNetworkAccess1 =
+      _registerName1("allowsConstrainedNetworkAccess");
+  late final _sel_assumesHTTP3Capable1 = _registerName1("assumesHTTP3Capable");
+  late final _sel_attribution1 = _registerName1("attribution");
+  int _objc_msgSend_750(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_750(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_750Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_750 = __objc_msgSend_750Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_HTTPMethod1 = _registerName1("HTTPMethod");
+  late final _sel_allHTTPHeaderFields1 = _registerName1("allHTTPHeaderFields");
+  late final _sel_valueForHTTPHeaderField_1 =
+      _registerName1("valueForHTTPHeaderField:");
+  late final _sel_HTTPBody1 = _registerName1("HTTPBody");
+  late final _class_NSInputStream1 = _getClass1("NSInputStream");
+  late final _class_NSStream1 = _getClass1("NSStream");
+  late final _sel_open1 = _registerName1("open");
+  late final _sel_close1 = _registerName1("close");
+  late final _sel_streamStatus1 = _registerName1("streamStatus");
+  int _objc_msgSend_751(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_751(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_751Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_751 = __objc_msgSend_751Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_streamError1 = _registerName1("streamError");
+  late final _class_NSOutputStream1 = _getClass1("NSOutputStream");
+  late final _sel_write_maxLength_1 = _registerName1("write:maxLength:");
+  int _objc_msgSend_752(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Uint8> buffer,
+    int len,
+  ) {
+    return __objc_msgSend_752(
+      obj,
+      sel,
+      buffer,
+      len,
+    );
+  }
+
+  late final __objc_msgSend_752Ptr = _lookup<
+      ffi.NativeFunction<
+          NSInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Uint8>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_752 = __objc_msgSend_752Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Uint8>, int)>();
+
+  late final _sel_hasSpaceAvailable1 = _registerName1("hasSpaceAvailable");
+  late final _sel_initToMemory1 = _registerName1("initToMemory");
+  late final _sel_initToBuffer_capacity_1 =
+      _registerName1("initToBuffer:capacity:");
+  instancetype _objc_msgSend_753(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Uint8> buffer,
+    int capacity,
+  ) {
+    return __objc_msgSend_753(
+      obj,
+      sel,
+      buffer,
+      capacity,
+    );
+  }
+
+  late final __objc_msgSend_753Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Uint8>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_753 = __objc_msgSend_753Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Uint8>, int)>();
+
+  late final _sel_initWithURL_append_1 = _registerName1("initWithURL:append:");
+  late final _sel_initToFileAtPath_append_1 =
+      _registerName1("initToFileAtPath:append:");
+  late final _sel_outputStreamToMemory1 =
+      _registerName1("outputStreamToMemory");
+  late final _sel_outputStreamToBuffer_capacity_1 =
+      _registerName1("outputStreamToBuffer:capacity:");
+  late final _sel_outputStreamToFileAtPath_append_1 =
+      _registerName1("outputStreamToFileAtPath:append:");
+  late final _sel_outputStreamWithURL_append_1 =
+      _registerName1("outputStreamWithURL:append:");
+  late final _sel_getStreamsToHostWithName_port_inputStream_outputStream_1 =
+      _registerName1("getStreamsToHostWithName:port:inputStream:outputStream:");
+  void _objc_msgSend_754(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> hostname,
+    int port,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> inputStream,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outputStream,
+  ) {
+    return __objc_msgSend_754(
+      obj,
+      sel,
+      hostname,
+      port,
+      inputStream,
+      outputStream,
+    );
+  }
+
+  late final __objc_msgSend_754Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSInteger,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_754 = __objc_msgSend_754Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _class_NSHost1 = _getClass1("NSHost");
+  late final _sel_currentHost1 = _registerName1("currentHost");
+  late final _sel_hostWithName_1 = _registerName1("hostWithName:");
+  late final _sel_hostWithAddress_1 = _registerName1("hostWithAddress:");
+  late final _sel_isEqualToHost_1 = _registerName1("isEqualToHost:");
+  bool _objc_msgSend_755(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> aHost,
+  ) {
+    return __objc_msgSend_755(
+      obj,
+      sel,
+      aHost,
+    );
+  }
+
+  late final __objc_msgSend_755Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_755 = __objc_msgSend_755Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_names1 = _registerName1("names");
+  late final _sel_address1 = _registerName1("address");
+  late final _sel_addresses1 = _registerName1("addresses");
+  late final _sel_localizedName1 = _registerName1("localizedName");
+  late final _sel_setHostCacheEnabled_1 =
+      _registerName1("setHostCacheEnabled:");
+  void _objc_msgSend_756(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    bool flag,
+  ) {
+    return __objc_msgSend_756(
+      obj,
+      sel,
+      flag,
+    );
+  }
+
+  late final __objc_msgSend_756Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_756 = __objc_msgSend_756Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, bool)>();
+
+  late final _sel_isHostCacheEnabled1 = _registerName1("isHostCacheEnabled");
+  late final _sel_flushHostCache1 = _registerName1("flushHostCache");
+  late final _sel_getStreamsToHost_port_inputStream_outputStream_1 =
+      _registerName1("getStreamsToHost:port:inputStream:outputStream:");
+  void _objc_msgSend_757(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> host,
+    int port,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> inputStream,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outputStream,
+  ) {
+    return __objc_msgSend_757(
+      obj,
+      sel,
+      host,
+      port,
+      inputStream,
+      outputStream,
+    );
+  }
+
+  late final __objc_msgSend_757Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSInteger,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_757 = __objc_msgSend_757Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_getBoundStreamsWithBufferSize_inputStream_outputStream_1 =
+      _registerName1("getBoundStreamsWithBufferSize:inputStream:outputStream:");
+  void _objc_msgSend_758(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int bufferSize,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> inputStream,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outputStream,
+  ) {
+    return __objc_msgSend_758(
+      obj,
+      sel,
+      bufferSize,
+      inputStream,
+      outputStream,
+    );
+  }
+
+  late final __objc_msgSend_758Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSUInteger,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_758 = __objc_msgSend_758Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_read_maxLength_1 = _registerName1("read:maxLength:");
+  late final _sel_getBuffer_length_1 = _registerName1("getBuffer:length:");
+  bool _objc_msgSend_759(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ffi.Uint8>> buffer,
+    ffi.Pointer<NSUInteger> len,
+  ) {
+    return __objc_msgSend_759(
+      obj,
+      sel,
+      buffer,
+      len,
+    );
+  }
+
+  late final __objc_msgSend_759Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ffi.Uint8>>,
+              ffi.Pointer<NSUInteger>)>>('objc_msgSend');
+  late final __objc_msgSend_759 = __objc_msgSend_759Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Pointer<ffi.Uint8>>, ffi.Pointer<NSUInteger>)>();
+
+  late final _sel_hasBytesAvailable1 = _registerName1("hasBytesAvailable");
+  late final _sel_initWithFileAtPath_1 = _registerName1("initWithFileAtPath:");
+  late final _sel_inputStreamWithData_1 =
+      _registerName1("inputStreamWithData:");
+  late final _sel_inputStreamWithFileAtPath_1 =
+      _registerName1("inputStreamWithFileAtPath:");
+  late final _sel_inputStreamWithURL_1 = _registerName1("inputStreamWithURL:");
+  late final _sel_HTTPBodyStream1 = _registerName1("HTTPBodyStream");
+  ffi.Pointer<ObjCObject> _objc_msgSend_760(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_760(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_760Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_760 = __objc_msgSend_760Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_HTTPShouldHandleCookies1 =
+      _registerName1("HTTPShouldHandleCookies");
+  late final _sel_HTTPShouldUsePipelining1 =
+      _registerName1("HTTPShouldUsePipelining");
+  late final _sel_originalRequest1 = _registerName1("originalRequest");
+  ffi.Pointer<ObjCObject> _objc_msgSend_761(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_761(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_761Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_761 = __objc_msgSend_761Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_currentRequest1 = _registerName1("currentRequest");
+  late final _class_NSURLResponse1 = _getClass1("NSURLResponse");
+  late final _sel_initWithURL_MIMEType_expectedContentLength_textEncodingName_1 =
+      _registerName1(
+          "initWithURL:MIMEType:expectedContentLength:textEncodingName:");
+  instancetype _objc_msgSend_762(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> URL,
+    ffi.Pointer<ObjCObject> MIMEType,
+    int length,
+    ffi.Pointer<ObjCObject> name,
+  ) {
+    return __objc_msgSend_762(
+      obj,
+      sel,
+      URL,
+      MIMEType,
+      length,
+      name,
+    );
+  }
+
+  late final __objc_msgSend_762Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              NSInteger,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_762 = __objc_msgSend_762Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_MIMEType1 = _registerName1("MIMEType");
+  late final _sel_expectedContentLength1 =
+      _registerName1("expectedContentLength");
+  late final _sel_textEncodingName1 = _registerName1("textEncodingName");
+  late final _sel_suggestedFilename1 = _registerName1("suggestedFilename");
+  late final _sel_response1 = _registerName1("response");
+  ffi.Pointer<ObjCObject> _objc_msgSend_763(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_763(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_763Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_763 = __objc_msgSend_763Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_progress1 = _registerName1("progress");
+  late final _sel_earliestBeginDate1 = _registerName1("earliestBeginDate");
+  late final _sel_setEarliestBeginDate_1 =
+      _registerName1("setEarliestBeginDate:");
+  late final _sel_countOfBytesClientExpectsToSend1 =
+      _registerName1("countOfBytesClientExpectsToSend");
+  late final _sel_setCountOfBytesClientExpectsToSend_1 =
+      _registerName1("setCountOfBytesClientExpectsToSend:");
+  late final _sel_countOfBytesClientExpectsToReceive1 =
+      _registerName1("countOfBytesClientExpectsToReceive");
+  late final _sel_setCountOfBytesClientExpectsToReceive_1 =
+      _registerName1("setCountOfBytesClientExpectsToReceive:");
+  late final _sel_countOfBytesSent1 = _registerName1("countOfBytesSent");
+  late final _sel_countOfBytesReceived1 =
+      _registerName1("countOfBytesReceived");
+  late final _sel_countOfBytesExpectedToSend1 =
+      _registerName1("countOfBytesExpectedToSend");
+  late final _sel_countOfBytesExpectedToReceive1 =
+      _registerName1("countOfBytesExpectedToReceive");
+  late final _sel_taskDescription1 = _registerName1("taskDescription");
+  late final _sel_setTaskDescription_1 = _registerName1("setTaskDescription:");
+  late final _sel_state1 = _registerName1("state");
+  int _objc_msgSend_764(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_764(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_764Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_764 = __objc_msgSend_764Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_suspend1 = _registerName1("suspend");
+  late final _sel_priority1 = _registerName1("priority");
+  late final _sel_setPriority_1 = _registerName1("setPriority:");
+  void _objc_msgSend_765(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    double value,
+  ) {
+    return __objc_msgSend_765(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_765Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Float)>>('objc_msgSend');
+  late final __objc_msgSend_765 = __objc_msgSend_765Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, double)>();
+
+  late final _sel_prefersIncrementalDelivery1 =
+      _registerName1("prefersIncrementalDelivery");
+  late final _sel_setPrefersIncrementalDelivery_1 =
+      _registerName1("setPrefersIncrementalDelivery:");
+  late final _sel_storeCookies_forTask_1 =
+      _registerName1("storeCookies:forTask:");
+  void _objc_msgSend_766(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> cookies,
+    ffi.Pointer<ObjCObject> task,
+  ) {
+    return __objc_msgSend_766(
+      obj,
+      sel,
+      cookies,
+      task,
+    );
+  }
+
+  late final __objc_msgSend_766Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_766 = __objc_msgSend_766Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_getCookiesForTask_completionHandler_1 =
+      _registerName1("getCookiesForTask:completionHandler:");
+  void _objc_msgSend_767(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> task,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_767(
+      obj,
+      sel,
+      task,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_767Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_767 = __objc_msgSend_767Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _class_NSIndexPath1 = _getClass1("NSIndexPath");
+  late final _sel_indexPathWithIndex_1 = _registerName1("indexPathWithIndex:");
+  late final _sel_indexPathWithIndexes_length_1 =
+      _registerName1("indexPathWithIndexes:length:");
+  instancetype _objc_msgSend_768(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<NSUInteger> indexes,
+    int length,
+  ) {
+    return __objc_msgSend_768(
+      obj,
+      sel,
+      indexes,
+      length,
+    );
+  }
+
+  late final __objc_msgSend_768Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<NSUInteger>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_768 = __objc_msgSend_768Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<NSUInteger>, int)>();
+
+  late final _sel_initWithIndexes_length_1 =
+      _registerName1("initWithIndexes:length:");
+  late final _sel_indexPathByAddingIndex_1 =
+      _registerName1("indexPathByAddingIndex:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_769(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int index,
+  ) {
+    return __objc_msgSend_769(
+      obj,
+      sel,
+      index,
+    );
+  }
+
+  late final __objc_msgSend_769Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_769 = __objc_msgSend_769Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_indexPathByRemovingLastIndex1 =
+      _registerName1("indexPathByRemovingLastIndex");
+  ffi.Pointer<ObjCObject> _objc_msgSend_770(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_770(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_770Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_770 = __objc_msgSend_770Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_indexAtPosition_1 = _registerName1("indexAtPosition:");
+  late final _sel_getIndexes_range_1 = _registerName1("getIndexes:range:");
+  void _objc_msgSend_771(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<NSUInteger> indexes,
+    NSRange positionRange,
+  ) {
+    return __objc_msgSend_771(
+      obj,
+      sel,
+      indexes,
+      positionRange,
+    );
+  }
+
+  late final __objc_msgSend_771Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<NSUInteger>, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_771 = __objc_msgSend_771Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<NSUInteger>, NSRange)>();
+
+  int _objc_msgSend_772(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> otherObject,
+  ) {
+    return __objc_msgSend_772(
+      obj,
+      sel,
+      otherObject,
+    );
+  }
+
+  late final __objc_msgSend_772Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_772 = __objc_msgSend_772Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_getIndexes_1 = _registerName1("getIndexes:");
+  void _objc_msgSend_773(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<NSUInteger> indexes,
+  ) {
+    return __objc_msgSend_773(
+      obj,
+      sel,
+      indexes,
+    );
+  }
+
+  late final __objc_msgSend_773Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<NSUInteger>)>>('objc_msgSend');
+  late final __objc_msgSend_773 = __objc_msgSend_773Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<NSUInteger>)>();
+
+  late final _class_NSInflectionRule1 = _getClass1("NSInflectionRule");
+  late final _sel_automaticRule1 = _registerName1("automaticRule");
+  ffi.Pointer<ObjCObject> _objc_msgSend_774(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_774(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_774Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_774 = __objc_msgSend_774Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_canInflectLanguage_1 = _registerName1("canInflectLanguage:");
+  late final _sel_canInflectPreferredLocalization1 =
+      _registerName1("canInflectPreferredLocalization");
+  late final _class_NSMorphology1 = _getClass1("NSMorphology");
+  late final _sel_grammaticalGender1 = _registerName1("grammaticalGender");
+  int _objc_msgSend_775(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_775(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_775Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_775 = __objc_msgSend_775Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setGrammaticalGender_1 =
+      _registerName1("setGrammaticalGender:");
+  void _objc_msgSend_776(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_776(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_776Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_776 = __objc_msgSend_776Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_partOfSpeech1 = _registerName1("partOfSpeech");
+  int _objc_msgSend_777(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_777(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_777Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_777 = __objc_msgSend_777Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setPartOfSpeech_1 = _registerName1("setPartOfSpeech:");
+  void _objc_msgSend_778(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_778(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_778Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_778 = __objc_msgSend_778Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_number1 = _registerName1("number");
+  int _objc_msgSend_779(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_779(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_779Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_779 = __objc_msgSend_779Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setNumber_1 = _registerName1("setNumber:");
+  void _objc_msgSend_780(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_780(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_780Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_780 = __objc_msgSend_780Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _class_NSMorphologyCustomPronoun1 =
+      _getClass1("NSMorphologyCustomPronoun");
+  late final _sel_isSupportedForLanguage_1 =
+      _registerName1("isSupportedForLanguage:");
+  late final _sel_requiredKeysForLanguage_1 =
+      _registerName1("requiredKeysForLanguage:");
+  late final _sel_subjectForm1 = _registerName1("subjectForm");
+  late final _sel_setSubjectForm_1 = _registerName1("setSubjectForm:");
+  late final _sel_objectForm1 = _registerName1("objectForm");
+  late final _sel_setObjectForm_1 = _registerName1("setObjectForm:");
+  late final _sel_possessiveForm1 = _registerName1("possessiveForm");
+  late final _sel_setPossessiveForm_1 = _registerName1("setPossessiveForm:");
+  late final _sel_possessiveAdjectiveForm1 =
+      _registerName1("possessiveAdjectiveForm");
+  late final _sel_setPossessiveAdjectiveForm_1 =
+      _registerName1("setPossessiveAdjectiveForm:");
+  late final _sel_reflexiveForm1 = _registerName1("reflexiveForm");
+  late final _sel_setReflexiveForm_1 = _registerName1("setReflexiveForm:");
+  late final _sel_customPronounForLanguage_1 =
+      _registerName1("customPronounForLanguage:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_781(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> language,
+  ) {
+    return __objc_msgSend_781(
+      obj,
+      sel,
+      language,
+    );
+  }
+
+  late final __objc_msgSend_781Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_781 = __objc_msgSend_781Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_setCustomPronoun_forLanguage_error_1 =
+      _registerName1("setCustomPronoun:forLanguage:error:");
+  bool _objc_msgSend_782(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> features,
+    ffi.Pointer<ObjCObject> language,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_782(
+      obj,
+      sel,
+      features,
+      language,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_782Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_782 = __objc_msgSend_782Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_isUnspecified1 = _registerName1("isUnspecified");
+  late final _sel_userMorphology1 = _registerName1("userMorphology");
+  ffi.Pointer<ObjCObject> _objc_msgSend_783(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_783(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_783Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_783 = __objc_msgSend_783Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _class_NSOperationQueue1 = _getClass1("NSOperationQueue");
+  late final _class_NSOperation1 = _getClass1("NSOperation");
+  late final _sel_isConcurrent1 = _registerName1("isConcurrent");
+  late final _sel_isAsynchronous1 = _registerName1("isAsynchronous");
+  late final _sel_isReady1 = _registerName1("isReady");
+  late final _sel_addDependency_1 = _registerName1("addDependency:");
+  void _objc_msgSend_784(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> op,
+  ) {
+    return __objc_msgSend_784(
+      obj,
+      sel,
+      op,
+    );
+  }
+
+  late final __objc_msgSend_784Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_784 = __objc_msgSend_784Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_removeDependency_1 = _registerName1("removeDependency:");
+  late final _sel_dependencies1 = _registerName1("dependencies");
+  late final _sel_queuePriority1 = _registerName1("queuePriority");
+  int _objc_msgSend_785(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_785(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_785Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_785 = __objc_msgSend_785Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setQueuePriority_1 = _registerName1("setQueuePriority:");
+  void _objc_msgSend_786(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_786(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_786Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_786 = __objc_msgSend_786Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_completionBlock1 = _registerName1("completionBlock");
+  late final _sel_setCompletionBlock_1 = _registerName1("setCompletionBlock:");
+  late final _sel_waitUntilFinished1 = _registerName1("waitUntilFinished");
+  late final _sel_addOperation_1 = _registerName1("addOperation:");
+  late final _sel_addOperations_waitUntilFinished_1 =
+      _registerName1("addOperations:waitUntilFinished:");
+  void _objc_msgSend_787(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> ops,
+    bool wait,
+  ) {
+    return __objc_msgSend_787(
+      obj,
+      sel,
+      ops,
+      wait,
+    );
+  }
+
+  late final __objc_msgSend_787Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_787 = __objc_msgSend_787Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, bool)>();
+
+  late final _sel_addOperationWithBlock_1 =
+      _registerName1("addOperationWithBlock:");
+  late final _sel_addBarrierBlock_1 = _registerName1("addBarrierBlock:");
+  late final _sel_maxConcurrentOperationCount1 =
+      _registerName1("maxConcurrentOperationCount");
+  late final _sel_setMaxConcurrentOperationCount_1 =
+      _registerName1("setMaxConcurrentOperationCount:");
+  late final _sel_isSuspended1 = _registerName1("isSuspended");
+  late final _sel_setSuspended_1 = _registerName1("setSuspended:");
+  late final _sel_underlyingQueue1 = _registerName1("underlyingQueue");
+  dispatch_queue_t _objc_msgSend_788(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_788(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_788Ptr = _lookup<
+      ffi.NativeFunction<
+          dispatch_queue_t Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_788 = __objc_msgSend_788Ptr.asFunction<
+      dispatch_queue_t Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setUnderlyingQueue_1 = _registerName1("setUnderlyingQueue:");
+  void _objc_msgSend_789(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    dispatch_queue_t value,
+  ) {
+    return __objc_msgSend_789(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_789Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              dispatch_queue_t)>>('objc_msgSend');
+  late final __objc_msgSend_789 = __objc_msgSend_789Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, dispatch_queue_t)>();
+
+  late final _sel_cancelAllOperations1 = _registerName1("cancelAllOperations");
+  late final _sel_waitUntilAllOperationsAreFinished1 =
+      _registerName1("waitUntilAllOperationsAreFinished");
+  late final _sel_currentQueue1 = _registerName1("currentQueue");
+  ffi.Pointer<ObjCObject> _objc_msgSend_790(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_790(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_790Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_790 = __objc_msgSend_790Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_mainQueue1 = _registerName1("mainQueue");
+  late final _sel_operations1 = _registerName1("operations");
+  late final _sel_operationCount1 = _registerName1("operationCount");
+  late final _class_NSPointerArray1 = _getClass1("NSPointerArray");
+  late final _sel_initWithOptions_1 = _registerName1("initWithOptions:");
+  instancetype _objc_msgSend_791(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int options,
+  ) {
+    return __objc_msgSend_791(
+      obj,
+      sel,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_791Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_791 = __objc_msgSend_791Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _class_NSPointerFunctions1 = _getClass1("NSPointerFunctions");
+  late final _sel_pointerFunctionsWithOptions_1 =
+      _registerName1("pointerFunctionsWithOptions:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_792(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int options,
+  ) {
+    return __objc_msgSend_792(
+      obj,
+      sel,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_792Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_792 = __objc_msgSend_792Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_hashFunction1 = _registerName1("hashFunction");
+  ffi.Pointer<
+          ffi.NativeFunction<
+              NSUInteger Function(
+                  ffi.Pointer<ffi.Void>,
+                  ffi.Pointer<
+                      ffi.NativeFunction<
+                          NSUInteger Function(ffi.Pointer<ffi.Void>)>>)>>
+      _objc_msgSend_793(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_793(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_793Ptr = _lookup<
+          ffi.NativeFunction<
+              ffi.Pointer<
+                      ffi.NativeFunction<
+                          NSUInteger Function(
+                              ffi.Pointer<ffi.Void>,
+                              ffi.Pointer<
+                                  ffi.NativeFunction<
+                                      NSUInteger Function(
+                                          ffi.Pointer<ffi.Void>)>>)>>
+                  Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>(
+      'objc_msgSend');
+  late final __objc_msgSend_793 = __objc_msgSend_793Ptr.asFunction<
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  NSUInteger Function(
+                      ffi.Pointer<ffi.Void>,
+                      ffi.Pointer<
+                          ffi.NativeFunction<
+                              NSUInteger Function(ffi.Pointer<ffi.Void>)>>)>>
+          Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setHashFunction_1 = _registerName1("setHashFunction:");
+  void _objc_msgSend_794(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<
+            ffi.NativeFunction<
+                NSUInteger Function(
+                    ffi.Pointer<ffi.Void>,
+                    ffi.Pointer<
+                        ffi.NativeFunction<
+                            NSUInteger Function(ffi.Pointer<ffi.Void>)>>)>>
+        value,
+  ) {
+    return __objc_msgSend_794(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_794Ptr = _lookup<
+          ffi.NativeFunction<
+              ffi.Void Function(
+                  ffi.Pointer<ObjCObject>,
+                  ffi.Pointer<ObjCSel>,
+                  ffi.Pointer<
+                      ffi.NativeFunction<
+                          NSUInteger Function(
+                              ffi.Pointer<ffi.Void>,
+                              ffi.Pointer<
+                                  ffi.NativeFunction<
+                                      NSUInteger Function(
+                                          ffi.Pointer<ffi.Void>)>>)>>)>>(
+      'objc_msgSend');
+  late final __objc_msgSend_794 = __objc_msgSend_794Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<
+              ffi.NativeFunction<
+                  NSUInteger Function(
+                      ffi.Pointer<ffi.Void>,
+                      ffi.Pointer<
+                          ffi.NativeFunction<
+                              NSUInteger Function(
+                                  ffi.Pointer<ffi.Void>)>>)>>)>();
+
+  late final _sel_isEqualFunction1 = _registerName1("isEqualFunction");
+  ffi.Pointer<
+          ffi.NativeFunction<
+              ffi.Bool Function(
+                  ffi.Pointer<ffi.Void>,
+                  ffi.Pointer<ffi.Void>,
+                  ffi.Pointer<
+                      ffi.NativeFunction<
+                          NSUInteger Function(ffi.Pointer<ffi.Void>)>>)>>
+      _objc_msgSend_795(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_795(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_795Ptr = _lookup<
+          ffi.NativeFunction<
+              ffi.Pointer<
+                      ffi.NativeFunction<
+                          ffi.Bool Function(
+                              ffi.Pointer<ffi.Void>,
+                              ffi.Pointer<ffi.Void>,
+                              ffi.Pointer<
+                                  ffi.NativeFunction<
+                                      NSUInteger Function(
+                                          ffi.Pointer<ffi.Void>)>>)>>
+                  Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>(
+      'objc_msgSend');
+  late final __objc_msgSend_795 = __objc_msgSend_795Ptr.asFunction<
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Bool Function(
+                      ffi.Pointer<ffi.Void>,
+                      ffi.Pointer<ffi.Void>,
+                      ffi.Pointer<
+                          ffi.NativeFunction<
+                              NSUInteger Function(ffi.Pointer<ffi.Void>)>>)>>
+          Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setIsEqualFunction_1 = _registerName1("setIsEqualFunction:");
+  void _objc_msgSend_796(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<
+            ffi.NativeFunction<
+                ffi.Bool Function(
+                    ffi.Pointer<ffi.Void>,
+                    ffi.Pointer<ffi.Void>,
+                    ffi.Pointer<
+                        ffi.NativeFunction<
+                            NSUInteger Function(ffi.Pointer<ffi.Void>)>>)>>
+        value,
+  ) {
+    return __objc_msgSend_796(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_796Ptr = _lookup<
+          ffi.NativeFunction<
+              ffi.Void Function(
+                  ffi.Pointer<ObjCObject>,
+                  ffi.Pointer<ObjCSel>,
+                  ffi.Pointer<
+                      ffi.NativeFunction<
+                          ffi.Bool Function(
+                              ffi.Pointer<ffi.Void>,
+                              ffi.Pointer<ffi.Void>,
+                              ffi.Pointer<
+                                  ffi.NativeFunction<
+                                      NSUInteger Function(
+                                          ffi.Pointer<ffi.Void>)>>)>>)>>(
+      'objc_msgSend');
+  late final __objc_msgSend_796 = __objc_msgSend_796Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Bool Function(
+                      ffi.Pointer<ffi.Void>,
+                      ffi.Pointer<ffi.Void>,
+                      ffi.Pointer<
+                          ffi.NativeFunction<
+                              NSUInteger Function(
+                                  ffi.Pointer<ffi.Void>)>>)>>)>();
+
+  late final _sel_sizeFunction1 = _registerName1("sizeFunction");
+  ffi.Pointer<ffi.NativeFunction<NSUInteger Function(ffi.Pointer<ffi.Void>)>>
+      _objc_msgSend_797(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_797(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_797Ptr = _lookup<
+          ffi.NativeFunction<
+              ffi.Pointer<
+                      ffi.NativeFunction<
+                          NSUInteger Function(ffi.Pointer<ffi.Void>)>>
+                  Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>(
+      'objc_msgSend');
+  late final __objc_msgSend_797 = __objc_msgSend_797Ptr.asFunction<
+      ffi.Pointer<
+              ffi.NativeFunction<NSUInteger Function(ffi.Pointer<ffi.Void>)>>
+          Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setSizeFunction_1 = _registerName1("setSizeFunction:");
+  void _objc_msgSend_798(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.NativeFunction<NSUInteger Function(ffi.Pointer<ffi.Void>)>>
+        value,
+  ) {
+    return __objc_msgSend_798(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_798Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<
+                  ffi.NativeFunction<
+                      NSUInteger Function(
+                          ffi.Pointer<ffi.Void>)>>)>>('objc_msgSend');
+  late final __objc_msgSend_798 = __objc_msgSend_798Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<
+              ffi.NativeFunction<
+                  NSUInteger Function(ffi.Pointer<ffi.Void>)>>)>();
+
+  late final _sel_descriptionFunction1 = _registerName1("descriptionFunction");
+  ffi.Pointer<
+          ffi.NativeFunction<
+              ffi.Pointer<ObjCObject> Function(ffi.Pointer<ffi.Void>)>>
+      _objc_msgSend_799(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_799(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_799Ptr =
+      _lookup<
+              ffi.NativeFunction<
+                  ffi.Pointer<
+                          ffi.NativeFunction<
+                              ffi.Pointer<ObjCObject> Function(
+                                  ffi.Pointer<ffi.Void>)>>
+                      Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>(
+          'objc_msgSend');
+  late final __objc_msgSend_799 = __objc_msgSend_799Ptr.asFunction<
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Pointer<ObjCObject> Function(ffi.Pointer<ffi.Void>)>>
+          Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setDescriptionFunction_1 =
+      _registerName1("setDescriptionFunction:");
+  void _objc_msgSend_800(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<
+            ffi.NativeFunction<
+                ffi.Pointer<ObjCObject> Function(ffi.Pointer<ffi.Void>)>>
+        value,
+  ) {
+    return __objc_msgSend_800(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_800Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<
+                  ffi.NativeFunction<
+                      ffi.Pointer<ObjCObject> Function(
+                          ffi.Pointer<ffi.Void>)>>)>>('objc_msgSend');
+  late final __objc_msgSend_800 = __objc_msgSend_800Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Pointer<ObjCObject> Function(ffi.Pointer<ffi.Void>)>>)>();
+
+  late final _sel_relinquishFunction1 = _registerName1("relinquishFunction");
+  ffi.Pointer<
+          ffi.NativeFunction<
+              ffi.Void Function(
+                  ffi.Pointer<ffi.Void>,
+                  ffi.Pointer<
+                      ffi.NativeFunction<
+                          NSUInteger Function(ffi.Pointer<ffi.Void>)>>)>>
+      _objc_msgSend_801(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_801(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_801Ptr = _lookup<
+          ffi.NativeFunction<
+              ffi.Pointer<
+                      ffi.NativeFunction<
+                          ffi.Void Function(
+                              ffi.Pointer<ffi.Void>,
+                              ffi.Pointer<
+                                  ffi.NativeFunction<
+                                      NSUInteger Function(
+                                          ffi.Pointer<ffi.Void>)>>)>>
+                  Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>(
+      'objc_msgSend');
+  late final __objc_msgSend_801 = __objc_msgSend_801Ptr.asFunction<
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(
+                      ffi.Pointer<ffi.Void>,
+                      ffi.Pointer<
+                          ffi.NativeFunction<
+                              NSUInteger Function(ffi.Pointer<ffi.Void>)>>)>>
+          Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setRelinquishFunction_1 =
+      _registerName1("setRelinquishFunction:");
+  void _objc_msgSend_802(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<ffi.Void>,
+                    ffi.Pointer<
+                        ffi.NativeFunction<
+                            NSUInteger Function(ffi.Pointer<ffi.Void>)>>)>>
+        value,
+  ) {
+    return __objc_msgSend_802(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_802Ptr = _lookup<
+          ffi.NativeFunction<
+              ffi.Void Function(
+                  ffi.Pointer<ObjCObject>,
+                  ffi.Pointer<ObjCSel>,
+                  ffi.Pointer<
+                      ffi.NativeFunction<
+                          ffi.Void Function(
+                              ffi.Pointer<ffi.Void>,
+                              ffi.Pointer<
+                                  ffi.NativeFunction<
+                                      NSUInteger Function(
+                                          ffi.Pointer<ffi.Void>)>>)>>)>>(
+      'objc_msgSend');
+  late final __objc_msgSend_802 = __objc_msgSend_802Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(
+                      ffi.Pointer<ffi.Void>,
+                      ffi.Pointer<
+                          ffi.NativeFunction<
+                              NSUInteger Function(
+                                  ffi.Pointer<ffi.Void>)>>)>>)>();
+
+  late final _sel_acquireFunction1 = _registerName1("acquireFunction");
+  ffi.Pointer<
+      ffi.NativeFunction<
+          ffi.Pointer<ffi.Void> Function(
+              ffi.Pointer<ffi.Void>,
+              ffi.Pointer<
+                  ffi.NativeFunction<
+                      NSUInteger Function(ffi.Pointer<ffi.Void>)>>,
+              ffi.Bool)>> _objc_msgSend_803(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_803(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_803Ptr =
+      _lookup<
+              ffi.NativeFunction<
+                  ffi.Pointer<
+                          ffi.NativeFunction<
+                              ffi.Pointer<ffi.Void> Function(
+                                  ffi.Pointer<ffi.Void>,
+                                  ffi.Pointer<
+                                      ffi.NativeFunction<
+                                          NSUInteger Function(
+                                              ffi.Pointer<ffi.Void>)>>,
+                                  ffi.Bool)>>
+                      Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>(
+          'objc_msgSend');
+  late final __objc_msgSend_803 = __objc_msgSend_803Ptr.asFunction<
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Pointer<ffi.Void> Function(
+                      ffi.Pointer<ffi.Void>,
+                      ffi.Pointer<
+                          ffi.NativeFunction<
+                              NSUInteger Function(ffi.Pointer<ffi.Void>)>>,
+                      ffi.Bool)>>
+          Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setAcquireFunction_1 = _registerName1("setAcquireFunction:");
+  void _objc_msgSend_804(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<
+            ffi.NativeFunction<
+                ffi.Pointer<ffi.Void> Function(
+                    ffi.Pointer<ffi.Void>,
+                    ffi.Pointer<
+                        ffi.NativeFunction<
+                            NSUInteger Function(ffi.Pointer<ffi.Void>)>>,
+                    ffi.Bool)>>
+        value,
+  ) {
+    return __objc_msgSend_804(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_804Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<
+                  ffi.NativeFunction<
+                      ffi.Pointer<ffi.Void> Function(
+                          ffi.Pointer<ffi.Void>,
+                          ffi.Pointer<
+                              ffi.NativeFunction<
+                                  NSUInteger Function(ffi.Pointer<ffi.Void>)>>,
+                          ffi.Bool)>>)>>('objc_msgSend');
+  late final __objc_msgSend_804 = __objc_msgSend_804Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Pointer<ffi.Void> Function(
+                      ffi.Pointer<ffi.Void>,
+                      ffi.Pointer<
+                          ffi.NativeFunction<
+                              NSUInteger Function(ffi.Pointer<ffi.Void>)>>,
+                      ffi.Bool)>>)>();
+
+  late final _sel_usesStrongWriteBarrier1 =
+      _registerName1("usesStrongWriteBarrier");
+  late final _sel_setUsesStrongWriteBarrier_1 =
+      _registerName1("setUsesStrongWriteBarrier:");
+  late final _sel_usesWeakReadAndWriteBarriers1 =
+      _registerName1("usesWeakReadAndWriteBarriers");
+  late final _sel_setUsesWeakReadAndWriteBarriers_1 =
+      _registerName1("setUsesWeakReadAndWriteBarriers:");
+  late final _sel_initWithPointerFunctions_1 =
+      _registerName1("initWithPointerFunctions:");
+  instancetype _objc_msgSend_805(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> functions,
+  ) {
+    return __objc_msgSend_805(
+      obj,
+      sel,
+      functions,
+    );
+  }
+
+  late final __objc_msgSend_805Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_805 = __objc_msgSend_805Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_pointerArrayWithOptions_1 =
+      _registerName1("pointerArrayWithOptions:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_806(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int options,
+  ) {
+    return __objc_msgSend_806(
+      obj,
+      sel,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_806Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_806 = __objc_msgSend_806Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_pointerArrayWithPointerFunctions_1 =
+      _registerName1("pointerArrayWithPointerFunctions:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_807(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> functions,
+  ) {
+    return __objc_msgSend_807(
+      obj,
+      sel,
+      functions,
+    );
+  }
+
+  late final __objc_msgSend_807Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_807 = __objc_msgSend_807Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_pointerFunctions1 = _registerName1("pointerFunctions");
+  ffi.Pointer<ObjCObject> _objc_msgSend_808(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_808(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_808Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_808 = __objc_msgSend_808Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_pointerAtIndex_1 = _registerName1("pointerAtIndex:");
+  ffi.Pointer<ffi.Void> _objc_msgSend_809(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int index,
+  ) {
+    return __objc_msgSend_809(
+      obj,
+      sel,
+      index,
+    );
+  }
+
+  late final __objc_msgSend_809Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ffi.Void> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_809 = __objc_msgSend_809Ptr.asFunction<
+      ffi.Pointer<ffi.Void> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_addPointer_1 = _registerName1("addPointer:");
+  late final _sel_removePointerAtIndex_1 =
+      _registerName1("removePointerAtIndex:");
+  late final _sel_insertPointer_atIndex_1 =
+      _registerName1("insertPointer:atIndex:");
+  late final _sel_replacePointerAtIndex_withPointer_1 =
+      _registerName1("replacePointerAtIndex:withPointer:");
+  void _objc_msgSend_810(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int index,
+    ffi.Pointer<ffi.Void> item,
+  ) {
+    return __objc_msgSend_810(
+      obj,
+      sel,
+      index,
+      item,
+    );
+  }
+
+  late final __objc_msgSend_810Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSUInteger, ffi.Pointer<ffi.Void>)>>('objc_msgSend');
+  late final __objc_msgSend_810 = __objc_msgSend_810Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ffi.Void>)>();
+
+  late final _sel_compact1 = _registerName1("compact");
+  late final _sel_setCount_1 = _registerName1("setCount:");
+  late final _sel_pointerArrayWithStrongObjects1 =
+      _registerName1("pointerArrayWithStrongObjects");
+  late final _sel_pointerArrayWithWeakObjects1 =
+      _registerName1("pointerArrayWithWeakObjects");
+  late final _sel_strongObjectsPointerArray1 =
+      _registerName1("strongObjectsPointerArray");
+  ffi.Pointer<ObjCObject> _objc_msgSend_811(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_811(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_811Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_811 = __objc_msgSend_811Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_weakObjectsPointerArray1 =
+      _registerName1("weakObjectsPointerArray");
+  late final _class_NSProcessInfo1 = _getClass1("NSProcessInfo");
+  late final _sel_processInfo1 = _registerName1("processInfo");
+  ffi.Pointer<ObjCObject> _objc_msgSend_812(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_812(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_812Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_812 = __objc_msgSend_812Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_environment1 = _registerName1("environment");
+  late final _sel_hostName1 = _registerName1("hostName");
+  late final _sel_processName1 = _registerName1("processName");
+  late final _sel_setProcessName_1 = _registerName1("setProcessName:");
+  late final _sel_processIdentifier1 = _registerName1("processIdentifier");
+  late final _sel_globallyUniqueString1 =
+      _registerName1("globallyUniqueString");
+  late final _sel_operatingSystem1 = _registerName1("operatingSystem");
+  late final _sel_operatingSystemName1 = _registerName1("operatingSystemName");
+  late final _sel_operatingSystemVersionString1 =
+      _registerName1("operatingSystemVersionString");
+  late final _sel_operatingSystemVersion1 =
+      _registerName1("operatingSystemVersion");
+  NSOperatingSystemVersion _objc_msgSend_813(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_813(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_813Ptr = _lookup<
+      ffi.NativeFunction<
+          NSOperatingSystemVersion Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_813 = __objc_msgSend_813Ptr.asFunction<
+      NSOperatingSystemVersion Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_processorCount1 = _registerName1("processorCount");
+  late final _sel_activeProcessorCount1 =
+      _registerName1("activeProcessorCount");
+  late final _sel_physicalMemory1 = _registerName1("physicalMemory");
+  late final _sel_isOperatingSystemAtLeastVersion_1 =
+      _registerName1("isOperatingSystemAtLeastVersion:");
+  bool _objc_msgSend_814(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSOperatingSystemVersion version,
+  ) {
+    return __objc_msgSend_814(
+      obj,
+      sel,
+      version,
+    );
+  }
+
+  late final __objc_msgSend_814Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSOperatingSystemVersion)>>('objc_msgSend');
+  late final __objc_msgSend_814 = __objc_msgSend_814Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          NSOperatingSystemVersion)>();
+
+  late final _sel_systemUptime1 = _registerName1("systemUptime");
+  late final _sel_disableSuddenTermination1 =
+      _registerName1("disableSuddenTermination");
+  late final _sel_enableSuddenTermination1 =
+      _registerName1("enableSuddenTermination");
+  late final _sel_disableAutomaticTermination_1 =
+      _registerName1("disableAutomaticTermination:");
+  late final _sel_enableAutomaticTermination_1 =
+      _registerName1("enableAutomaticTermination:");
+  late final _sel_automaticTerminationSupportEnabled1 =
+      _registerName1("automaticTerminationSupportEnabled");
+  late final _sel_setAutomaticTerminationSupportEnabled_1 =
+      _registerName1("setAutomaticTerminationSupportEnabled:");
+  late final _sel_beginActivityWithOptions_reason_1 =
+      _registerName1("beginActivityWithOptions:reason:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_815(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int options,
+    ffi.Pointer<ObjCObject> reason,
+  ) {
+    return __objc_msgSend_815(
+      obj,
+      sel,
+      options,
+      reason,
+    );
+  }
+
+  late final __objc_msgSend_815Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_815 = __objc_msgSend_815Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, int, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_endActivity_1 = _registerName1("endActivity:");
+  late final _sel_performActivityWithOptions_reason_usingBlock_1 =
+      _registerName1("performActivityWithOptions:reason:usingBlock:");
+  void _objc_msgSend_816(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int options,
+    ffi.Pointer<ObjCObject> reason,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_816(
+      obj,
+      sel,
+      options,
+      reason,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_816Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Int32,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_816 = __objc_msgSend_816Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_performExpiringActivityWithReason_usingBlock_1 =
+      _registerName1("performExpiringActivityWithReason:usingBlock:");
+  void _objc_msgSend_817(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> reason,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_817(
+      obj,
+      sel,
+      reason,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_817Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_817 = __objc_msgSend_817Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_userName1 = _registerName1("userName");
+  late final _sel_fullUserName1 = _registerName1("fullUserName");
+  late final _sel_thermalState1 = _registerName1("thermalState");
+  int _objc_msgSend_818(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_818(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_818Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_818 = __objc_msgSend_818Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_isLowPowerModeEnabled1 =
+      _registerName1("isLowPowerModeEnabled");
+  late final _sel_isMacCatalystApp1 = _registerName1("isMacCatalystApp");
+  late final _sel_isiOSAppOnMac1 = _registerName1("isiOSAppOnMac");
+  late final _class_NSTextCheckingResult1 = _getClass1("NSTextCheckingResult");
+  late final _sel_resultType1 = _registerName1("resultType");
+  int _objc_msgSend_819(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_819(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_819Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_819 = __objc_msgSend_819Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_range1 = _registerName1("range");
+  late final _sel_orthography1 = _registerName1("orthography");
+  ffi.Pointer<ObjCObject> _objc_msgSend_820(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_820(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_820Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_820 = __objc_msgSend_820Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_grammarDetails1 = _registerName1("grammarDetails");
+  late final _sel_duration1 = _registerName1("duration");
+  late final _sel_components1 = _registerName1("components");
+  late final _sel_replacementString1 = _registerName1("replacementString");
+  late final _sel_alternativeStrings1 = _registerName1("alternativeStrings");
+  late final _class_NSRegularExpression1 = _getClass1("NSRegularExpression");
+  late final _sel_regularExpressionWithPattern_options_error_1 =
+      _registerName1("regularExpressionWithPattern:options:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_821(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> pattern,
+    int options,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_821(
+      obj,
+      sel,
+      pattern,
+      options,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_821Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_821 = __objc_msgSend_821Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_initWithPattern_options_error_1 =
+      _registerName1("initWithPattern:options:error:");
+  instancetype _objc_msgSend_822(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> pattern,
+    int options,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_822(
+      obj,
+      sel,
+      pattern,
+      options,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_822Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_822 = __objc_msgSend_822Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_pattern1 = _registerName1("pattern");
+  late final _sel_options1 = _registerName1("options");
+  int _objc_msgSend_823(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_823(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_823Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_823 = __objc_msgSend_823Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_numberOfCaptureGroups1 =
+      _registerName1("numberOfCaptureGroups");
+  late final _sel_escapedPatternForString_1 =
+      _registerName1("escapedPatternForString:");
+  late final _sel_enumerateMatchesInString_options_range_usingBlock_1 =
+      _registerName1("enumerateMatchesInString:options:range:usingBlock:");
+  void _objc_msgSend_824(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> string,
+    int options,
+    NSRange range,
+    ffi.Pointer<_ObjCBlock> block,
+  ) {
+    return __objc_msgSend_824(
+      obj,
+      sel,
+      string,
+      options,
+      range,
+      block,
+    );
+  }
+
+  late final __objc_msgSend_824Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              NSRange,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_824 = __objc_msgSend_824Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, NSRange, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_matchesInString_options_range_1 =
+      _registerName1("matchesInString:options:range:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_825(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> string,
+    int options,
+    NSRange range,
+  ) {
+    return __objc_msgSend_825(
+      obj,
+      sel,
+      string,
+      options,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_825Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_825 = __objc_msgSend_825Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>, int, NSRange)>();
+
+  late final _sel_numberOfMatchesInString_options_range_1 =
+      _registerName1("numberOfMatchesInString:options:range:");
+  int _objc_msgSend_826(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> string,
+    int options,
+    NSRange range,
+  ) {
+    return __objc_msgSend_826(
+      obj,
+      sel,
+      string,
+      options,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_826Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Int32, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_826 = __objc_msgSend_826Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, NSRange)>();
+
+  late final _sel_firstMatchInString_options_range_1 =
+      _registerName1("firstMatchInString:options:range:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_827(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> string,
+    int options,
+    NSRange range,
+  ) {
+    return __objc_msgSend_827(
+      obj,
+      sel,
+      string,
+      options,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_827Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_827 = __objc_msgSend_827Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>, int, NSRange)>();
+
+  late final _sel_rangeOfFirstMatchInString_options_range_1 =
+      _registerName1("rangeOfFirstMatchInString:options:range:");
+  NSRange _objc_msgSend_828(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> string,
+    int options,
+    NSRange range,
+  ) {
+    return __objc_msgSend_828(
+      obj,
+      sel,
+      string,
+      options,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_828Ptr = _lookup<
+      ffi.NativeFunction<
+          NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Int32, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_828 = __objc_msgSend_828Ptr.asFunction<
+      NSRange Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, NSRange)>();
+
+  late final _sel_stringByReplacingMatchesInString_options_range_withTemplate_1 =
+      _registerName1(
+          "stringByReplacingMatchesInString:options:range:withTemplate:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_829(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> string,
+    int options,
+    NSRange range,
+    ffi.Pointer<ObjCObject> templ,
+  ) {
+    return __objc_msgSend_829(
+      obj,
+      sel,
+      string,
+      options,
+      range,
+      templ,
+    );
+  }
+
+  late final __objc_msgSend_829Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              NSRange,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_829 = __objc_msgSend_829Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          NSRange,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_replaceMatchesInString_options_range_withTemplate_1 =
+      _registerName1("replaceMatchesInString:options:range:withTemplate:");
+  int _objc_msgSend_830(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> string,
+    int options,
+    NSRange range,
+    ffi.Pointer<ObjCObject> templ,
+  ) {
+    return __objc_msgSend_830(
+      obj,
+      sel,
+      string,
+      options,
+      range,
+      templ,
+    );
+  }
+
+  late final __objc_msgSend_830Ptr = _lookup<
+      ffi.NativeFunction<
+          NSUInteger Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              NSRange,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_830 = __objc_msgSend_830Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int, NSRange, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_replacementStringForResult_inString_offset_template_1 =
+      _registerName1("replacementStringForResult:inString:offset:template:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_831(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> result,
+    ffi.Pointer<ObjCObject> string,
+    int offset,
+    ffi.Pointer<ObjCObject> templ,
+  ) {
+    return __objc_msgSend_831(
+      obj,
+      sel,
+      result,
+      string,
+      offset,
+      templ,
+    );
+  }
+
+  late final __objc_msgSend_831Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              NSInteger,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_831 = __objc_msgSend_831Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_escapedTemplateForString_1 =
+      _registerName1("escapedTemplateForString:");
+  late final _sel_regularExpression1 = _registerName1("regularExpression");
+  ffi.Pointer<ObjCObject> _objc_msgSend_832(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_832(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_832Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_832 = __objc_msgSend_832Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_phoneNumber1 = _registerName1("phoneNumber");
+  late final _sel_numberOfRanges1 = _registerName1("numberOfRanges");
+  late final _sel_rangeAtIndex_1 = _registerName1("rangeAtIndex:");
+  late final _sel_rangeWithName_1 = _registerName1("rangeWithName:");
+  late final _sel_resultByAdjustingRangesWithOffset_1 =
+      _registerName1("resultByAdjustingRangesWithOffset:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_833(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int offset,
+  ) {
+    return __objc_msgSend_833(
+      obj,
+      sel,
+      offset,
+    );
+  }
+
+  late final __objc_msgSend_833Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSInteger)>>('objc_msgSend');
+  late final __objc_msgSend_833 = __objc_msgSend_833Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_addressComponents1 = _registerName1("addressComponents");
+  late final _sel_orthographyCheckingResultWithRange_orthography_1 =
+      _registerName1("orthographyCheckingResultWithRange:orthography:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_834(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    ffi.Pointer<ObjCObject> orthography,
+  ) {
+    return __objc_msgSend_834(
+      obj,
+      sel,
+      range,
+      orthography,
+    );
+  }
+
+  late final __objc_msgSend_834Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSRange,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_834 = __objc_msgSend_834Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, NSRange, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_spellCheckingResultWithRange_1 =
+      _registerName1("spellCheckingResultWithRange:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_835(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+  ) {
+    return __objc_msgSend_835(
+      obj,
+      sel,
+      range,
+    );
+  }
+
+  late final __objc_msgSend_835Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSRange)>>('objc_msgSend');
+  late final __objc_msgSend_835 = __objc_msgSend_835Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange)>();
+
+  late final _sel_grammarCheckingResultWithRange_details_1 =
+      _registerName1("grammarCheckingResultWithRange:details:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_836(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    ffi.Pointer<ObjCObject> details,
+  ) {
+    return __objc_msgSend_836(
+      obj,
+      sel,
+      range,
+      details,
+    );
+  }
+
+  late final __objc_msgSend_836Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSRange,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_836 = __objc_msgSend_836Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, NSRange, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dateCheckingResultWithRange_date_1 =
+      _registerName1("dateCheckingResultWithRange:date:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_837(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    ffi.Pointer<ObjCObject> date,
+  ) {
+    return __objc_msgSend_837(
+      obj,
+      sel,
+      range,
+      date,
+    );
+  }
+
+  late final __objc_msgSend_837Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSRange,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_837 = __objc_msgSend_837Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, NSRange, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dateCheckingResultWithRange_date_timeZone_duration_1 =
+      _registerName1("dateCheckingResultWithRange:date:timeZone:duration:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_838(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    ffi.Pointer<ObjCObject> date,
+    ffi.Pointer<ObjCObject> timeZone,
+    double duration,
+  ) {
+    return __objc_msgSend_838(
+      obj,
+      sel,
+      range,
+      date,
+      timeZone,
+      duration,
+    );
+  }
+
+  late final __objc_msgSend_838Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSRange,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              NSTimeInterval)>>('objc_msgSend');
+  late final __objc_msgSend_838 = __objc_msgSend_838Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          NSRange,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          double)>();
+
+  late final _sel_addressCheckingResultWithRange_components_1 =
+      _registerName1("addressCheckingResultWithRange:components:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_839(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    ffi.Pointer<ObjCObject> components,
+  ) {
+    return __objc_msgSend_839(
+      obj,
+      sel,
+      range,
+      components,
+    );
+  }
+
+  late final __objc_msgSend_839Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSRange,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_839 = __objc_msgSend_839Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, NSRange, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_linkCheckingResultWithRange_URL_1 =
+      _registerName1("linkCheckingResultWithRange:URL:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_840(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    ffi.Pointer<ObjCObject> url,
+  ) {
+    return __objc_msgSend_840(
+      obj,
+      sel,
+      range,
+      url,
+    );
+  }
+
+  late final __objc_msgSend_840Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSRange,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_840 = __objc_msgSend_840Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, NSRange, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_quoteCheckingResultWithRange_replacementString_1 =
+      _registerName1("quoteCheckingResultWithRange:replacementString:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_841(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    ffi.Pointer<ObjCObject> replacementString,
+  ) {
+    return __objc_msgSend_841(
+      obj,
+      sel,
+      range,
+      replacementString,
+    );
+  }
+
+  late final __objc_msgSend_841Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSRange,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_841 = __objc_msgSend_841Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, NSRange, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dashCheckingResultWithRange_replacementString_1 =
+      _registerName1("dashCheckingResultWithRange:replacementString:");
+  late final _sel_replacementCheckingResultWithRange_replacementString_1 =
+      _registerName1("replacementCheckingResultWithRange:replacementString:");
+  late final _sel_correctionCheckingResultWithRange_replacementString_1 =
+      _registerName1("correctionCheckingResultWithRange:replacementString:");
+  late final _sel_correctionCheckingResultWithRange_replacementString_alternativeStrings_1 =
+      _registerName1(
+          "correctionCheckingResultWithRange:replacementString:alternativeStrings:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_842(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRange range,
+    ffi.Pointer<ObjCObject> replacementString,
+    ffi.Pointer<ObjCObject> alternativeStrings,
+  ) {
+    return __objc_msgSend_842(
+      obj,
+      sel,
+      range,
+      replacementString,
+      alternativeStrings,
+    );
+  }
+
+  late final __objc_msgSend_842Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSRange,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_842 = __objc_msgSend_842Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          NSRange,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_regularExpressionCheckingResultWithRanges_count_regularExpression_1 =
+      _registerName1(
+          "regularExpressionCheckingResultWithRanges:count:regularExpression:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_843(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    NSRangePointer ranges,
+    int count,
+    ffi.Pointer<ObjCObject> regularExpression,
+  ) {
+    return __objc_msgSend_843(
+      obj,
+      sel,
+      ranges,
+      count,
+      regularExpression,
+    );
+  }
+
+  late final __objc_msgSend_843Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSRangePointer,
+              NSUInteger,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_843 = __objc_msgSend_843Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          NSRangePointer,
+          int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_phoneNumberCheckingResultWithRange_phoneNumber_1 =
+      _registerName1("phoneNumberCheckingResultWithRange:phoneNumber:");
+  late final _sel_transitInformationCheckingResultWithRange_components_1 =
+      _registerName1("transitInformationCheckingResultWithRange:components:");
+  late final _class_NSURLCache1 = _getClass1("NSURLCache");
+  late final _sel_sharedURLCache1 = _registerName1("sharedURLCache");
+  ffi.Pointer<ObjCObject> _objc_msgSend_844(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_844(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_844Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_844 = __objc_msgSend_844Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setSharedURLCache_1 = _registerName1("setSharedURLCache:");
+  void _objc_msgSend_845(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_845(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_845Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_845 = __objc_msgSend_845Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithMemoryCapacity_diskCapacity_diskPath_1 =
+      _registerName1("initWithMemoryCapacity:diskCapacity:diskPath:");
+  instancetype _objc_msgSend_846(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int memoryCapacity,
+    int diskCapacity,
+    ffi.Pointer<ObjCObject> path,
+  ) {
+    return __objc_msgSend_846(
+      obj,
+      sel,
+      memoryCapacity,
+      diskCapacity,
+      path,
+    );
+  }
+
+  late final __objc_msgSend_846Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSUInteger,
+              NSUInteger,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_846 = __objc_msgSend_846Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          int, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithMemoryCapacity_diskCapacity_directoryURL_1 =
+      _registerName1("initWithMemoryCapacity:diskCapacity:directoryURL:");
+  instancetype _objc_msgSend_847(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int memoryCapacity,
+    int diskCapacity,
+    ffi.Pointer<ObjCObject> directoryURL,
+  ) {
+    return __objc_msgSend_847(
+      obj,
+      sel,
+      memoryCapacity,
+      diskCapacity,
+      directoryURL,
+    );
+  }
+
+  late final __objc_msgSend_847Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSUInteger,
+              NSUInteger,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_847 = __objc_msgSend_847Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          int, ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSCachedURLResponse1 = _getClass1("NSCachedURLResponse");
+  late final _sel_initWithResponse_data_1 =
+      _registerName1("initWithResponse:data:");
+  instancetype _objc_msgSend_848(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> response,
+    ffi.Pointer<ObjCObject> data,
+  ) {
+    return __objc_msgSend_848(
+      obj,
+      sel,
+      response,
+      data,
+    );
+  }
+
+  late final __objc_msgSend_848Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_848 = __objc_msgSend_848Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithResponse_data_userInfo_storagePolicy_1 =
+      _registerName1("initWithResponse:data:userInfo:storagePolicy:");
+  instancetype _objc_msgSend_849(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> response,
+    ffi.Pointer<ObjCObject> data,
+    ffi.Pointer<ObjCObject> userInfo,
+    int storagePolicy,
+  ) {
+    return __objc_msgSend_849(
+      obj,
+      sel,
+      response,
+      data,
+      userInfo,
+      storagePolicy,
+    );
+  }
+
+  late final __objc_msgSend_849Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_849 = __objc_msgSend_849Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          int)>();
+
+  late final _sel_storagePolicy1 = _registerName1("storagePolicy");
+  int _objc_msgSend_850(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_850(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_850Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_850 = __objc_msgSend_850Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_cachedResponseForRequest_1 =
+      _registerName1("cachedResponseForRequest:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_851(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+  ) {
+    return __objc_msgSend_851(
+      obj,
+      sel,
+      request,
+    );
+  }
+
+  late final __objc_msgSend_851Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_851 = __objc_msgSend_851Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_storeCachedResponse_forRequest_1 =
+      _registerName1("storeCachedResponse:forRequest:");
+  void _objc_msgSend_852(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> cachedResponse,
+    ffi.Pointer<ObjCObject> request,
+  ) {
+    return __objc_msgSend_852(
+      obj,
+      sel,
+      cachedResponse,
+      request,
+    );
+  }
+
+  late final __objc_msgSend_852Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_852 = __objc_msgSend_852Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_removeCachedResponseForRequest_1 =
+      _registerName1("removeCachedResponseForRequest:");
+  void _objc_msgSend_853(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+  ) {
+    return __objc_msgSend_853(
+      obj,
+      sel,
+      request,
+    );
+  }
+
+  late final __objc_msgSend_853Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_853 = __objc_msgSend_853Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_removeAllCachedResponses1 =
+      _registerName1("removeAllCachedResponses");
+  late final _sel_removeCachedResponsesSinceDate_1 =
+      _registerName1("removeCachedResponsesSinceDate:");
+  late final _sel_memoryCapacity1 = _registerName1("memoryCapacity");
+  late final _sel_setMemoryCapacity_1 = _registerName1("setMemoryCapacity:");
+  late final _sel_diskCapacity1 = _registerName1("diskCapacity");
+  late final _sel_setDiskCapacity_1 = _registerName1("setDiskCapacity:");
+  late final _sel_currentMemoryUsage1 = _registerName1("currentMemoryUsage");
+  late final _sel_currentDiskUsage1 = _registerName1("currentDiskUsage");
+  late final _class_NSURLSessionDataTask1 = _getClass1("NSURLSessionDataTask");
+  late final _sel_storeCachedResponse_forDataTask_1 =
+      _registerName1("storeCachedResponse:forDataTask:");
+  void _objc_msgSend_854(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> cachedResponse,
+    ffi.Pointer<ObjCObject> dataTask,
+  ) {
+    return __objc_msgSend_854(
+      obj,
+      sel,
+      cachedResponse,
+      dataTask,
+    );
+  }
+
+  late final __objc_msgSend_854Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_854 = __objc_msgSend_854Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_getCachedResponseForDataTask_completionHandler_1 =
+      _registerName1("getCachedResponseForDataTask:completionHandler:");
+  void _objc_msgSend_855(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> dataTask,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_855(
+      obj,
+      sel,
+      dataTask,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_855Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_855 = __objc_msgSend_855Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_removeCachedResponseForDataTask_1 =
+      _registerName1("removeCachedResponseForDataTask:");
+  void _objc_msgSend_856(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> dataTask,
+  ) {
+    return __objc_msgSend_856(
+      obj,
+      sel,
+      dataTask,
+    );
+  }
+
+  late final __objc_msgSend_856Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_856 = __objc_msgSend_856Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSURLConnection1 = _getClass1("NSURLConnection");
+  late final _sel_initWithRequest_delegate_startImmediately_1 =
+      _registerName1("initWithRequest:delegate:startImmediately:");
+  instancetype _objc_msgSend_857(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+    ffi.Pointer<ObjCObject> delegate,
+    bool startImmediately,
+  ) {
+    return __objc_msgSend_857(
+      obj,
+      sel,
+      request,
+      delegate,
+      startImmediately,
+    );
+  }
+
+  late final __objc_msgSend_857Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_857 = __objc_msgSend_857Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>, bool)>();
+
+  late final _sel_initWithRequest_delegate_1 =
+      _registerName1("initWithRequest:delegate:");
+  instancetype _objc_msgSend_858(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+    ffi.Pointer<ObjCObject> delegate,
+  ) {
+    return __objc_msgSend_858(
+      obj,
+      sel,
+      request,
+      delegate,
+    );
+  }
+
+  late final __objc_msgSend_858Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_858 = __objc_msgSend_858Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_connectionWithRequest_delegate_1 =
+      _registerName1("connectionWithRequest:delegate:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_859(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+    ffi.Pointer<ObjCObject> delegate,
+  ) {
+    return __objc_msgSend_859(
+      obj,
+      sel,
+      request,
+      delegate,
+    );
+  }
+
+  late final __objc_msgSend_859Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_859 = __objc_msgSend_859Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_unscheduleFromRunLoop_forMode_1 =
+      _registerName1("unscheduleFromRunLoop:forMode:");
+  late final _sel_setDelegateQueue_1 = _registerName1("setDelegateQueue:");
+  void _objc_msgSend_860(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> queue,
+  ) {
+    return __objc_msgSend_860(
+      obj,
+      sel,
+      queue,
+    );
+  }
+
+  late final __objc_msgSend_860Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_860 = __objc_msgSend_860Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_canHandleRequest_1 = _registerName1("canHandleRequest:");
+  bool _objc_msgSend_861(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+  ) {
+    return __objc_msgSend_861(
+      obj,
+      sel,
+      request,
+    );
+  }
+
+  late final __objc_msgSend_861Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_861 = __objc_msgSend_861Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_sendSynchronousRequest_returningResponse_error_1 =
+      _registerName1("sendSynchronousRequest:returningResponse:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_862(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> response,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_862(
+      obj,
+      sel,
+      request,
+      response,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_862Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_862 = __objc_msgSend_862Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_sendAsynchronousRequest_queue_completionHandler_1 =
+      _registerName1("sendAsynchronousRequest:queue:completionHandler:");
+  void _objc_msgSend_863(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+    ffi.Pointer<ObjCObject> queue,
+    ffi.Pointer<_ObjCBlock> handler,
+  ) {
+    return __objc_msgSend_863(
+      obj,
+      sel,
+      request,
+      queue,
+      handler,
+    );
+  }
+
+  late final __objc_msgSend_863Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_863 = __objc_msgSend_863Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _class_NSURLCredential1 = _getClass1("NSURLCredential");
+  late final _sel_persistence1 = _registerName1("persistence");
+  int _objc_msgSend_864(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_864(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_864Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_864 = __objc_msgSend_864Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_initWithUser_password_persistence_1 =
+      _registerName1("initWithUser:password:persistence:");
+  instancetype _objc_msgSend_865(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> user,
+    ffi.Pointer<ObjCObject> password,
+    int persistence,
+  ) {
+    return __objc_msgSend_865(
+      obj,
+      sel,
+      user,
+      password,
+      persistence,
+    );
+  }
+
+  late final __objc_msgSend_865Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_865 = __objc_msgSend_865Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_credentialWithUser_password_persistence_1 =
+      _registerName1("credentialWithUser:password:persistence:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_866(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> user,
+    ffi.Pointer<ObjCObject> password,
+    int persistence,
+  ) {
+    return __objc_msgSend_866(
+      obj,
+      sel,
+      user,
+      password,
+      persistence,
+    );
+  }
+
+  late final __objc_msgSend_866Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_866 = __objc_msgSend_866Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          int)>();
+
+  late final _sel_hasPassword1 = _registerName1("hasPassword");
+  late final _sel_initWithIdentity_certificates_persistence_1 =
+      _registerName1("initWithIdentity:certificates:persistence:");
+  instancetype _objc_msgSend_867(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    SecIdentityRef identity,
+    ffi.Pointer<ObjCObject> certArray,
+    int persistence,
+  ) {
+    return __objc_msgSend_867(
+      obj,
+      sel,
+      identity,
+      certArray,
+      persistence,
+    );
+  }
+
+  late final __objc_msgSend_867Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              SecIdentityRef,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_867 = __objc_msgSend_867Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          SecIdentityRef, ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_credentialWithIdentity_certificates_persistence_1 =
+      _registerName1("credentialWithIdentity:certificates:persistence:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_868(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    SecIdentityRef identity,
+    ffi.Pointer<ObjCObject> certArray,
+    int persistence,
+  ) {
+    return __objc_msgSend_868(
+      obj,
+      sel,
+      identity,
+      certArray,
+      persistence,
+    );
+  }
+
+  late final __objc_msgSend_868Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              SecIdentityRef,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_868 = __objc_msgSend_868Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          SecIdentityRef,
+          ffi.Pointer<ObjCObject>,
+          int)>();
+
+  late final _sel_identity1 = _registerName1("identity");
+  SecIdentityRef _objc_msgSend_869(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_869(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_869Ptr = _lookup<
+      ffi.NativeFunction<
+          SecIdentityRef Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_869 = __objc_msgSend_869Ptr.asFunction<
+      SecIdentityRef Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_certificates1 = _registerName1("certificates");
+  late final _sel_initWithTrust_1 = _registerName1("initWithTrust:");
+  instancetype _objc_msgSend_870(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    SecTrustRef trust,
+  ) {
+    return __objc_msgSend_870(
+      obj,
+      sel,
+      trust,
+    );
+  }
+
+  late final __objc_msgSend_870Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              SecTrustRef)>>('objc_msgSend');
+  late final __objc_msgSend_870 = __objc_msgSend_870Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, SecTrustRef)>();
+
+  late final _sel_credentialForTrust_1 = _registerName1("credentialForTrust:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_871(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    SecTrustRef trust,
+  ) {
+    return __objc_msgSend_871(
+      obj,
+      sel,
+      trust,
+    );
+  }
+
+  late final __objc_msgSend_871Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, SecTrustRef)>>('objc_msgSend');
+  late final __objc_msgSend_871 = __objc_msgSend_871Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, SecTrustRef)>();
+
+  late final _class_NSURLProtectionSpace1 = _getClass1("NSURLProtectionSpace");
+  late final _sel_initWithHost_port_protocol_realm_authenticationMethod_1 =
+      _registerName1("initWithHost:port:protocol:realm:authenticationMethod:");
+  instancetype _objc_msgSend_872(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> host,
+    int port,
+    ffi.Pointer<ObjCObject> protocol,
+    ffi.Pointer<ObjCObject> realm,
+    ffi.Pointer<ObjCObject> authenticationMethod,
+  ) {
+    return __objc_msgSend_872(
+      obj,
+      sel,
+      host,
+      port,
+      protocol,
+      realm,
+      authenticationMethod,
+    );
+  }
+
+  late final __objc_msgSend_872Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSInteger,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_872 = __objc_msgSend_872Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithProxyHost_port_type_realm_authenticationMethod_1 =
+      _registerName1("initWithProxyHost:port:type:realm:authenticationMethod:");
+  late final _sel_realm1 = _registerName1("realm");
+  late final _sel_receivesCredentialSecurely1 =
+      _registerName1("receivesCredentialSecurely");
+  late final _sel_isProxy1 = _registerName1("isProxy");
+  late final _sel_proxyType1 = _registerName1("proxyType");
+  late final _sel_protocol1 = _registerName1("protocol");
+  late final _sel_authenticationMethod1 =
+      _registerName1("authenticationMethod");
+  late final _sel_distinguishedNames1 = _registerName1("distinguishedNames");
+  late final _sel_serverTrust1 = _registerName1("serverTrust");
+  SecTrustRef _objc_msgSend_873(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_873(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_873Ptr = _lookup<
+      ffi.NativeFunction<
+          SecTrustRef Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_873 = __objc_msgSend_873Ptr.asFunction<
+      SecTrustRef Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _class_NSURLCredentialStorage1 =
+      _getClass1("NSURLCredentialStorage");
+  late final _sel_sharedCredentialStorage1 =
+      _registerName1("sharedCredentialStorage");
+  ffi.Pointer<ObjCObject> _objc_msgSend_874(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_874(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_874Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_874 = __objc_msgSend_874Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_credentialsForProtectionSpace_1 =
+      _registerName1("credentialsForProtectionSpace:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_875(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> space,
+  ) {
+    return __objc_msgSend_875(
+      obj,
+      sel,
+      space,
+    );
+  }
+
+  late final __objc_msgSend_875Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_875 = __objc_msgSend_875Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_allCredentials1 = _registerName1("allCredentials");
+  late final _sel_setCredential_forProtectionSpace_1 =
+      _registerName1("setCredential:forProtectionSpace:");
+  void _objc_msgSend_876(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> credential,
+    ffi.Pointer<ObjCObject> space,
+  ) {
+    return __objc_msgSend_876(
+      obj,
+      sel,
+      credential,
+      space,
+    );
+  }
+
+  late final __objc_msgSend_876Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_876 = __objc_msgSend_876Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_removeCredential_forProtectionSpace_1 =
+      _registerName1("removeCredential:forProtectionSpace:");
+  late final _sel_removeCredential_forProtectionSpace_options_1 =
+      _registerName1("removeCredential:forProtectionSpace:options:");
+  void _objc_msgSend_877(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> credential,
+    ffi.Pointer<ObjCObject> space,
+    ffi.Pointer<ObjCObject> options,
+  ) {
+    return __objc_msgSend_877(
+      obj,
+      sel,
+      credential,
+      space,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_877Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_877 = __objc_msgSend_877Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_defaultCredentialForProtectionSpace_1 =
+      _registerName1("defaultCredentialForProtectionSpace:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_878(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> space,
+  ) {
+    return __objc_msgSend_878(
+      obj,
+      sel,
+      space,
+    );
+  }
+
+  late final __objc_msgSend_878Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_878 = __objc_msgSend_878Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_setDefaultCredential_forProtectionSpace_1 =
+      _registerName1("setDefaultCredential:forProtectionSpace:");
+  late final _sel_getCredentialsForProtectionSpace_task_completionHandler_1 =
+      _registerName1(
+          "getCredentialsForProtectionSpace:task:completionHandler:");
+  void _objc_msgSend_879(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> protectionSpace,
+    ffi.Pointer<ObjCObject> task,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_879(
+      obj,
+      sel,
+      protectionSpace,
+      task,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_879Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_879 = __objc_msgSend_879Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_setCredential_forProtectionSpace_task_1 =
+      _registerName1("setCredential:forProtectionSpace:task:");
+  void _objc_msgSend_880(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> credential,
+    ffi.Pointer<ObjCObject> protectionSpace,
+    ffi.Pointer<ObjCObject> task,
+  ) {
+    return __objc_msgSend_880(
+      obj,
+      sel,
+      credential,
+      protectionSpace,
+      task,
+    );
+  }
+
+  late final __objc_msgSend_880Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_880 = __objc_msgSend_880Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_removeCredential_forProtectionSpace_options_task_1 =
+      _registerName1("removeCredential:forProtectionSpace:options:task:");
+  void _objc_msgSend_881(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> credential,
+    ffi.Pointer<ObjCObject> protectionSpace,
+    ffi.Pointer<ObjCObject> options,
+    ffi.Pointer<ObjCObject> task,
+  ) {
+    return __objc_msgSend_881(
+      obj,
+      sel,
+      credential,
+      protectionSpace,
+      options,
+      task,
+    );
+  }
+
+  late final __objc_msgSend_881Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_881 = __objc_msgSend_881Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_getDefaultCredentialForProtectionSpace_task_completionHandler_1 =
+      _registerName1(
+          "getDefaultCredentialForProtectionSpace:task:completionHandler:");
+  void _objc_msgSend_882(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> space,
+    ffi.Pointer<ObjCObject> task,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_882(
+      obj,
+      sel,
+      space,
+      task,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_882Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_882 = __objc_msgSend_882Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_setDefaultCredential_forProtectionSpace_task_1 =
+      _registerName1("setDefaultCredential:forProtectionSpace:task:");
+  late final _class_NSURLProtocol1 = _getClass1("NSURLProtocol");
+  late final _sel_initWithRequest_cachedResponse_client_1 =
+      _registerName1("initWithRequest:cachedResponse:client:");
+  instancetype _objc_msgSend_883(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+    ffi.Pointer<ObjCObject> cachedResponse,
+    ffi.Pointer<ObjCObject> client,
+  ) {
+    return __objc_msgSend_883(
+      obj,
+      sel,
+      request,
+      cachedResponse,
+      client,
+    );
+  }
+
+  late final __objc_msgSend_883Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_883 = __objc_msgSend_883Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_client1 = _registerName1("client");
+  late final _sel_request1 = _registerName1("request");
+  late final _sel_cachedResponse1 = _registerName1("cachedResponse");
+  ffi.Pointer<ObjCObject> _objc_msgSend_884(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_884(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_884Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_884 = __objc_msgSend_884Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_canInitWithRequest_1 = _registerName1("canInitWithRequest:");
+  late final _sel_canonicalRequestForRequest_1 =
+      _registerName1("canonicalRequestForRequest:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_885(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+  ) {
+    return __objc_msgSend_885(
+      obj,
+      sel,
+      request,
+    );
+  }
+
+  late final __objc_msgSend_885Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_885 = __objc_msgSend_885Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_requestIsCacheEquivalent_toRequest_1 =
+      _registerName1("requestIsCacheEquivalent:toRequest:");
+  bool _objc_msgSend_886(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> a,
+    ffi.Pointer<ObjCObject> b,
+  ) {
+    return __objc_msgSend_886(
+      obj,
+      sel,
+      a,
+      b,
+    );
+  }
+
+  late final __objc_msgSend_886Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_886 = __objc_msgSend_886Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_startLoading1 = _registerName1("startLoading");
+  late final _sel_stopLoading1 = _registerName1("stopLoading");
+  late final _sel_propertyForKey_inRequest_1 =
+      _registerName1("propertyForKey:inRequest:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_887(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+    ffi.Pointer<ObjCObject> request,
+  ) {
+    return __objc_msgSend_887(
+      obj,
+      sel,
+      key,
+      request,
+    );
+  }
+
+  late final __objc_msgSend_887Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_887 = __objc_msgSend_887Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSMutableURLRequest1 = _getClass1("NSMutableURLRequest");
+  late final _sel_setURL_1 = _registerName1("setURL:");
+  void _objc_msgSend_888(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_888(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_888Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_888 = __objc_msgSend_888Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_setCachePolicy_1 = _registerName1("setCachePolicy:");
+  void _objc_msgSend_889(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_889(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_889Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_889 = __objc_msgSend_889Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_setTimeoutInterval_1 = _registerName1("setTimeoutInterval:");
+  late final _sel_setMainDocumentURL_1 = _registerName1("setMainDocumentURL:");
+  late final _sel_setNetworkServiceType_1 =
+      _registerName1("setNetworkServiceType:");
+  void _objc_msgSend_890(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_890(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_890Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_890 = __objc_msgSend_890Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_setAllowsCellularAccess_1 =
+      _registerName1("setAllowsCellularAccess:");
+  late final _sel_setAllowsExpensiveNetworkAccess_1 =
+      _registerName1("setAllowsExpensiveNetworkAccess:");
+  late final _sel_setAllowsConstrainedNetworkAccess_1 =
+      _registerName1("setAllowsConstrainedNetworkAccess:");
+  late final _sel_setAssumesHTTP3Capable_1 =
+      _registerName1("setAssumesHTTP3Capable:");
+  late final _sel_setAttribution_1 = _registerName1("setAttribution:");
+  void _objc_msgSend_891(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_891(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_891Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_891 = __objc_msgSend_891Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_setHTTPMethod_1 = _registerName1("setHTTPMethod:");
+  late final _sel_setAllHTTPHeaderFields_1 =
+      _registerName1("setAllHTTPHeaderFields:");
+  late final _sel_setValue_forHTTPHeaderField_1 =
+      _registerName1("setValue:forHTTPHeaderField:");
+  late final _sel_addValue_forHTTPHeaderField_1 =
+      _registerName1("addValue:forHTTPHeaderField:");
+  late final _sel_setHTTPBody_1 = _registerName1("setHTTPBody:");
+  void _objc_msgSend_892(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_892(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_892Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_892 = __objc_msgSend_892Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_setHTTPBodyStream_1 = _registerName1("setHTTPBodyStream:");
+  void _objc_msgSend_893(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_893(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_893Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_893 = __objc_msgSend_893Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_setHTTPShouldHandleCookies_1 =
+      _registerName1("setHTTPShouldHandleCookies:");
+  late final _sel_setHTTPShouldUsePipelining_1 =
+      _registerName1("setHTTPShouldUsePipelining:");
+  late final _sel_setProperty_forKey_inRequest_1 =
+      _registerName1("setProperty:forKey:inRequest:");
+  void _objc_msgSend_894(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+    ffi.Pointer<ObjCObject> key,
+    ffi.Pointer<ObjCObject> request,
+  ) {
+    return __objc_msgSend_894(
+      obj,
+      sel,
+      value,
+      key,
+      request,
+    );
+  }
+
+  late final __objc_msgSend_894Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_894 = __objc_msgSend_894Ptr.asFunction<
+      void Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_removePropertyForKey_inRequest_1 =
+      _registerName1("removePropertyForKey:inRequest:");
+  void _objc_msgSend_895(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> key,
+    ffi.Pointer<ObjCObject> request,
+  ) {
+    return __objc_msgSend_895(
+      obj,
+      sel,
+      key,
+      request,
+    );
+  }
+
+  late final __objc_msgSend_895Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_895 = __objc_msgSend_895Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_registerClass_1 = _registerName1("registerClass:");
+  late final _sel_unregisterClass_1 = _registerName1("unregisterClass:");
+  late final _sel_canInitWithTask_1 = _registerName1("canInitWithTask:");
+  bool _objc_msgSend_896(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> task,
+  ) {
+    return __objc_msgSend_896(
+      obj,
+      sel,
+      task,
+    );
+  }
+
+  late final __objc_msgSend_896Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_896 = __objc_msgSend_896Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithTask_cachedResponse_client_1 =
+      _registerName1("initWithTask:cachedResponse:client:");
+  instancetype _objc_msgSend_897(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> task,
+    ffi.Pointer<ObjCObject> cachedResponse,
+    ffi.Pointer<ObjCObject> client,
+  ) {
+    return __objc_msgSend_897(
+      obj,
+      sel,
+      task,
+      cachedResponse,
+      client,
+    );
+  }
+
+  late final __objc_msgSend_897Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_897 = __objc_msgSend_897Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_task1 = _registerName1("task");
+  ffi.Pointer<ObjCObject> _objc_msgSend_898(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_898(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_898Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_898 = __objc_msgSend_898Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _class_NSXMLParser1 = _getClass1("NSXMLParser");
+  late final _sel_initWithStream_1 = _registerName1("initWithStream:");
+  instancetype _objc_msgSend_899(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> stream,
+  ) {
+    return __objc_msgSend_899(
+      obj,
+      sel,
+      stream,
+    );
+  }
+
+  late final __objc_msgSend_899Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_899 = __objc_msgSend_899Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_shouldProcessNamespaces1 =
+      _registerName1("shouldProcessNamespaces");
+  late final _sel_setShouldProcessNamespaces_1 =
+      _registerName1("setShouldProcessNamespaces:");
+  late final _sel_shouldReportNamespacePrefixes1 =
+      _registerName1("shouldReportNamespacePrefixes");
+  late final _sel_setShouldReportNamespacePrefixes_1 =
+      _registerName1("setShouldReportNamespacePrefixes:");
+  late final _sel_externalEntityResolvingPolicy1 =
+      _registerName1("externalEntityResolvingPolicy");
+  int _objc_msgSend_900(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_900(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_900Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_900 = __objc_msgSend_900Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setExternalEntityResolvingPolicy_1 =
+      _registerName1("setExternalEntityResolvingPolicy:");
+  void _objc_msgSend_901(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_901(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_901Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_901 = __objc_msgSend_901Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_allowedExternalEntityURLs1 =
+      _registerName1("allowedExternalEntityURLs");
+  late final _sel_setAllowedExternalEntityURLs_1 =
+      _registerName1("setAllowedExternalEntityURLs:");
+  void _objc_msgSend_902(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_902(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_902Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_902 = __objc_msgSend_902Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_parse1 = _registerName1("parse");
+  late final _sel_abortParsing1 = _registerName1("abortParsing");
+  late final _sel_parserError1 = _registerName1("parserError");
+  late final _sel_shouldResolveExternalEntities1 =
+      _registerName1("shouldResolveExternalEntities");
+  late final _sel_setShouldResolveExternalEntities_1 =
+      _registerName1("setShouldResolveExternalEntities:");
+  late final _sel_publicID1 = _registerName1("publicID");
+  late final _sel_systemID1 = _registerName1("systemID");
+  late final _sel_lineNumber1 = _registerName1("lineNumber");
+  late final _sel_columnNumber1 = _registerName1("columnNumber");
+  late final _class_NSFileWrapper1 = _getClass1("NSFileWrapper");
+  late final _sel_initWithURL_options_error_1 =
+      _registerName1("initWithURL:options:error:");
+  instancetype _objc_msgSend_903(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    int options,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outError,
+  ) {
+    return __objc_msgSend_903(
+      obj,
+      sel,
+      url,
+      options,
+      outError,
+    );
+  }
+
+  late final __objc_msgSend_903Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_903 = __objc_msgSend_903Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_initDirectoryWithFileWrappers_1 =
+      _registerName1("initDirectoryWithFileWrappers:");
+  late final _sel_initRegularFileWithContents_1 =
+      _registerName1("initRegularFileWithContents:");
+  late final _sel_initSymbolicLinkWithDestinationURL_1 =
+      _registerName1("initSymbolicLinkWithDestinationURL:");
+  late final _sel_initWithSerializedRepresentation_1 =
+      _registerName1("initWithSerializedRepresentation:");
+  late final _sel_isDirectory1 = _registerName1("isDirectory");
+  late final _sel_isRegularFile1 = _registerName1("isRegularFile");
+  late final _sel_isSymbolicLink1 = _registerName1("isSymbolicLink");
+  late final _sel_preferredFilename1 = _registerName1("preferredFilename");
+  late final _sel_setPreferredFilename_1 =
+      _registerName1("setPreferredFilename:");
+  late final _sel_filename1 = _registerName1("filename");
+  late final _sel_setFilename_1 = _registerName1("setFilename:");
+  late final _sel_fileAttributes1 = _registerName1("fileAttributes");
+  late final _sel_setFileAttributes_1 = _registerName1("setFileAttributes:");
+  late final _sel_matchesContentsOfURL_1 =
+      _registerName1("matchesContentsOfURL:");
+  late final _sel_readFromURL_options_error_1 =
+      _registerName1("readFromURL:options:error:");
+  bool _objc_msgSend_904(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    int options,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outError,
+  ) {
+    return __objc_msgSend_904(
+      obj,
+      sel,
+      url,
+      options,
+      outError,
+    );
+  }
+
+  late final __objc_msgSend_904Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_904 = __objc_msgSend_904Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_writeToURL_options_originalContentsURL_error_1 =
+      _registerName1("writeToURL:options:originalContentsURL:error:");
+  bool _objc_msgSend_905(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    int options,
+    ffi.Pointer<ObjCObject> originalContentsURL,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outError,
+  ) {
+    return __objc_msgSend_905(
+      obj,
+      sel,
+      url,
+      options,
+      originalContentsURL,
+      outError,
+    );
+  }
+
+  late final __objc_msgSend_905Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_905 = __objc_msgSend_905Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_serializedRepresentation1 =
+      _registerName1("serializedRepresentation");
+  late final _sel_addFileWrapper_1 = _registerName1("addFileWrapper:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_906(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> child,
+  ) {
+    return __objc_msgSend_906(
+      obj,
+      sel,
+      child,
+    );
+  }
+
+  late final __objc_msgSend_906Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_906 = __objc_msgSend_906Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_addRegularFileWithContents_preferredFilename_1 =
+      _registerName1("addRegularFileWithContents:preferredFilename:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_907(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> data,
+    ffi.Pointer<ObjCObject> fileName,
+  ) {
+    return __objc_msgSend_907(
+      obj,
+      sel,
+      data,
+      fileName,
+    );
+  }
+
+  late final __objc_msgSend_907Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_907 = __objc_msgSend_907Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_removeFileWrapper_1 = _registerName1("removeFileWrapper:");
+  void _objc_msgSend_908(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> child,
+  ) {
+    return __objc_msgSend_908(
+      obj,
+      sel,
+      child,
+    );
+  }
+
+  late final __objc_msgSend_908Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_908 = __objc_msgSend_908Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_fileWrappers1 = _registerName1("fileWrappers");
+  late final _sel_keyForFileWrapper_1 = _registerName1("keyForFileWrapper:");
+  late final _sel_regularFileContents1 = _registerName1("regularFileContents");
+  late final _sel_symbolicLinkDestinationURL1 =
+      _registerName1("symbolicLinkDestinationURL");
+  late final _sel_initSymbolicLinkWithDestination_1 =
+      _registerName1("initSymbolicLinkWithDestination:");
+  late final _sel_needsToBeUpdatedFromPath_1 =
+      _registerName1("needsToBeUpdatedFromPath:");
+  late final _sel_updateFromPath_1 = _registerName1("updateFromPath:");
+  late final _sel_writeToFile_atomically_updateFilenames_1 =
+      _registerName1("writeToFile:atomically:updateFilenames:");
+  bool _objc_msgSend_909(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    bool atomicFlag,
+    bool updateFilenamesFlag,
+  ) {
+    return __objc_msgSend_909(
+      obj,
+      sel,
+      path,
+      atomicFlag,
+      updateFilenamesFlag,
+    );
+  }
+
+  late final __objc_msgSend_909Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Bool, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_909 = __objc_msgSend_909Ptr.asFunction<
+      bool Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, bool, bool)>();
+
+  late final _sel_addFileWithPath_1 = _registerName1("addFileWithPath:");
+  late final _sel_addSymbolicLinkWithDestination_preferredFilename_1 =
+      _registerName1("addSymbolicLinkWithDestination:preferredFilename:");
+  late final _sel_symbolicLinkDestination1 =
+      _registerName1("symbolicLinkDestination");
+  late final _class_NSURLSession1 = _getClass1("NSURLSession");
+  late final _sel_sharedSession1 = _registerName1("sharedSession");
+  ffi.Pointer<ObjCObject> _objc_msgSend_910(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_910(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_910Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_910 = __objc_msgSend_910Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _class_NSURLSessionConfiguration1 =
+      _getClass1("NSURLSessionConfiguration");
+  late final _sel_defaultSessionConfiguration1 =
+      _registerName1("defaultSessionConfiguration");
+  ffi.Pointer<ObjCObject> _objc_msgSend_911(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_911(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_911Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_911 = __objc_msgSend_911Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_ephemeralSessionConfiguration1 =
+      _registerName1("ephemeralSessionConfiguration");
+  late final _sel_backgroundSessionConfigurationWithIdentifier_1 =
+      _registerName1("backgroundSessionConfigurationWithIdentifier:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_912(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> identifier,
+  ) {
+    return __objc_msgSend_912(
+      obj,
+      sel,
+      identifier,
+    );
+  }
+
+  late final __objc_msgSend_912Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_912 = __objc_msgSend_912Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_identifier1 = _registerName1("identifier");
+  late final _sel_requestCachePolicy1 = _registerName1("requestCachePolicy");
+  late final _sel_setRequestCachePolicy_1 =
+      _registerName1("setRequestCachePolicy:");
+  late final _sel_timeoutIntervalForRequest1 =
+      _registerName1("timeoutIntervalForRequest");
+  late final _sel_setTimeoutIntervalForRequest_1 =
+      _registerName1("setTimeoutIntervalForRequest:");
+  late final _sel_timeoutIntervalForResource1 =
+      _registerName1("timeoutIntervalForResource");
+  late final _sel_setTimeoutIntervalForResource_1 =
+      _registerName1("setTimeoutIntervalForResource:");
+  late final _sel_waitsForConnectivity1 =
+      _registerName1("waitsForConnectivity");
+  late final _sel_setWaitsForConnectivity_1 =
+      _registerName1("setWaitsForConnectivity:");
+  late final _sel_isDiscretionary1 = _registerName1("isDiscretionary");
+  late final _sel_setDiscretionary_1 = _registerName1("setDiscretionary:");
+  late final _sel_sharedContainerIdentifier1 =
+      _registerName1("sharedContainerIdentifier");
+  late final _sel_setSharedContainerIdentifier_1 =
+      _registerName1("setSharedContainerIdentifier:");
+  late final _sel_sessionSendsLaunchEvents1 =
+      _registerName1("sessionSendsLaunchEvents");
+  late final _sel_setSessionSendsLaunchEvents_1 =
+      _registerName1("setSessionSendsLaunchEvents:");
+  late final _sel_connectionProxyDictionary1 =
+      _registerName1("connectionProxyDictionary");
+  late final _sel_setConnectionProxyDictionary_1 =
+      _registerName1("setConnectionProxyDictionary:");
+  late final _sel_TLSMinimumSupportedProtocol1 =
+      _registerName1("TLSMinimumSupportedProtocol");
+  int _objc_msgSend_913(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_913(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_913Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_913 = __objc_msgSend_913Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setTLSMinimumSupportedProtocol_1 =
+      _registerName1("setTLSMinimumSupportedProtocol:");
+  void _objc_msgSend_914(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_914(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_914Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_914 = __objc_msgSend_914Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_TLSMaximumSupportedProtocol1 =
+      _registerName1("TLSMaximumSupportedProtocol");
+  late final _sel_setTLSMaximumSupportedProtocol_1 =
+      _registerName1("setTLSMaximumSupportedProtocol:");
+  late final _sel_TLSMinimumSupportedProtocolVersion1 =
+      _registerName1("TLSMinimumSupportedProtocolVersion");
+  int _objc_msgSend_915(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_915(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_915Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_915 = __objc_msgSend_915Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setTLSMinimumSupportedProtocolVersion_1 =
+      _registerName1("setTLSMinimumSupportedProtocolVersion:");
+  void _objc_msgSend_916(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_916(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_916Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_916 = __objc_msgSend_916Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_TLSMaximumSupportedProtocolVersion1 =
+      _registerName1("TLSMaximumSupportedProtocolVersion");
+  late final _sel_setTLSMaximumSupportedProtocolVersion_1 =
+      _registerName1("setTLSMaximumSupportedProtocolVersion:");
+  late final _sel_HTTPShouldSetCookies1 =
+      _registerName1("HTTPShouldSetCookies");
+  late final _sel_setHTTPShouldSetCookies_1 =
+      _registerName1("setHTTPShouldSetCookies:");
+  late final _sel_HTTPCookieAcceptPolicy1 =
+      _registerName1("HTTPCookieAcceptPolicy");
+  late final _sel_setHTTPCookieAcceptPolicy_1 =
+      _registerName1("setHTTPCookieAcceptPolicy:");
+  late final _sel_HTTPAdditionalHeaders1 =
+      _registerName1("HTTPAdditionalHeaders");
+  late final _sel_setHTTPAdditionalHeaders_1 =
+      _registerName1("setHTTPAdditionalHeaders:");
+  late final _sel_HTTPMaximumConnectionsPerHost1 =
+      _registerName1("HTTPMaximumConnectionsPerHost");
+  late final _sel_setHTTPMaximumConnectionsPerHost_1 =
+      _registerName1("setHTTPMaximumConnectionsPerHost:");
+  late final _sel_HTTPCookieStorage1 = _registerName1("HTTPCookieStorage");
+  late final _sel_setHTTPCookieStorage_1 =
+      _registerName1("setHTTPCookieStorage:");
+  void _objc_msgSend_917(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_917(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_917Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_917 = __objc_msgSend_917Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_URLCredentialStorage1 =
+      _registerName1("URLCredentialStorage");
+  late final _sel_setURLCredentialStorage_1 =
+      _registerName1("setURLCredentialStorage:");
+  void _objc_msgSend_918(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_918(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_918Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_918 = __objc_msgSend_918Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_URLCache1 = _registerName1("URLCache");
+  late final _sel_setURLCache_1 = _registerName1("setURLCache:");
+  late final _sel_shouldUseExtendedBackgroundIdleMode1 =
+      _registerName1("shouldUseExtendedBackgroundIdleMode");
+  late final _sel_setShouldUseExtendedBackgroundIdleMode_1 =
+      _registerName1("setShouldUseExtendedBackgroundIdleMode:");
+  late final _sel_protocolClasses1 = _registerName1("protocolClasses");
+  late final _sel_setProtocolClasses_1 = _registerName1("setProtocolClasses:");
+  late final _sel_multipathServiceType1 =
+      _registerName1("multipathServiceType");
+  int _objc_msgSend_919(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_919(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_919Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_919 = __objc_msgSend_919Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setMultipathServiceType_1 =
+      _registerName1("setMultipathServiceType:");
+  void _objc_msgSend_920(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_920(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_920Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_920 = __objc_msgSend_920Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_backgroundSessionConfiguration_1 =
+      _registerName1("backgroundSessionConfiguration:");
+  late final _sel_sessionWithConfiguration_1 =
+      _registerName1("sessionWithConfiguration:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_921(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> configuration,
+  ) {
+    return __objc_msgSend_921(
+      obj,
+      sel,
+      configuration,
+    );
+  }
+
+  late final __objc_msgSend_921Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_921 = __objc_msgSend_921Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_sessionWithConfiguration_delegate_delegateQueue_1 =
+      _registerName1("sessionWithConfiguration:delegate:delegateQueue:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_922(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> configuration,
+    ffi.Pointer<ObjCObject> delegate,
+    ffi.Pointer<ObjCObject> queue,
+  ) {
+    return __objc_msgSend_922(
+      obj,
+      sel,
+      configuration,
+      delegate,
+      queue,
+    );
+  }
+
+  late final __objc_msgSend_922Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_922 = __objc_msgSend_922Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_delegateQueue1 = _registerName1("delegateQueue");
+  late final _sel_configuration1 = _registerName1("configuration");
+  late final _sel_sessionDescription1 = _registerName1("sessionDescription");
+  late final _sel_setSessionDescription_1 =
+      _registerName1("setSessionDescription:");
+  late final _sel_finishTasksAndInvalidate1 =
+      _registerName1("finishTasksAndInvalidate");
+  late final _sel_invalidateAndCancel1 = _registerName1("invalidateAndCancel");
+  late final _sel_resetWithCompletionHandler_1 =
+      _registerName1("resetWithCompletionHandler:");
+  late final _sel_flushWithCompletionHandler_1 =
+      _registerName1("flushWithCompletionHandler:");
+  late final _sel_getTasksWithCompletionHandler_1 =
+      _registerName1("getTasksWithCompletionHandler:");
+  void _objc_msgSend_923(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_923(
+      obj,
+      sel,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_923Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_923 = __objc_msgSend_923Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_getAllTasksWithCompletionHandler_1 =
+      _registerName1("getAllTasksWithCompletionHandler:");
+  void _objc_msgSend_924(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_924(
+      obj,
+      sel,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_924Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_924 = __objc_msgSend_924Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_dataTaskWithRequest_1 =
+      _registerName1("dataTaskWithRequest:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_925(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+  ) {
+    return __objc_msgSend_925(
+      obj,
+      sel,
+      request,
+    );
+  }
+
+  late final __objc_msgSend_925Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_925 = __objc_msgSend_925Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dataTaskWithURL_1 = _registerName1("dataTaskWithURL:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_926(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+  ) {
+    return __objc_msgSend_926(
+      obj,
+      sel,
+      url,
+    );
+  }
+
+  late final __objc_msgSend_926Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_926 = __objc_msgSend_926Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSURLSessionUploadTask1 =
+      _getClass1("NSURLSessionUploadTask");
+  late final _sel_uploadTaskWithRequest_fromFile_1 =
+      _registerName1("uploadTaskWithRequest:fromFile:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_927(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+    ffi.Pointer<ObjCObject> fileURL,
+  ) {
+    return __objc_msgSend_927(
+      obj,
+      sel,
+      request,
+      fileURL,
+    );
+  }
+
+  late final __objc_msgSend_927Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_927 = __objc_msgSend_927Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_uploadTaskWithRequest_fromData_1 =
+      _registerName1("uploadTaskWithRequest:fromData:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_928(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+    ffi.Pointer<ObjCObject> bodyData,
+  ) {
+    return __objc_msgSend_928(
+      obj,
+      sel,
+      request,
+      bodyData,
+    );
+  }
+
+  late final __objc_msgSend_928Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_928 = __objc_msgSend_928Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_uploadTaskWithStreamedRequest_1 =
+      _registerName1("uploadTaskWithStreamedRequest:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_929(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+  ) {
+    return __objc_msgSend_929(
+      obj,
+      sel,
+      request,
+    );
+  }
+
+  late final __objc_msgSend_929Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_929 = __objc_msgSend_929Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSURLSessionDownloadTask1 =
+      _getClass1("NSURLSessionDownloadTask");
+  late final _sel_cancelByProducingResumeData_1 =
+      _registerName1("cancelByProducingResumeData:");
+  void _objc_msgSend_930(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_930(
+      obj,
+      sel,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_930Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_930 = __objc_msgSend_930Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_downloadTaskWithRequest_1 =
+      _registerName1("downloadTaskWithRequest:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_931(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+  ) {
+    return __objc_msgSend_931(
+      obj,
+      sel,
+      request,
+    );
+  }
+
+  late final __objc_msgSend_931Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_931 = __objc_msgSend_931Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_downloadTaskWithURL_1 =
+      _registerName1("downloadTaskWithURL:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_932(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+  ) {
+    return __objc_msgSend_932(
+      obj,
+      sel,
+      url,
+    );
+  }
+
+  late final __objc_msgSend_932Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_932 = __objc_msgSend_932Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_downloadTaskWithResumeData_1 =
+      _registerName1("downloadTaskWithResumeData:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_933(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> resumeData,
+  ) {
+    return __objc_msgSend_933(
+      obj,
+      sel,
+      resumeData,
+    );
+  }
+
+  late final __objc_msgSend_933Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_933 = __objc_msgSend_933Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSURLSessionStreamTask1 =
+      _getClass1("NSURLSessionStreamTask");
+  late final _sel_readDataOfMinLength_maxLength_timeout_completionHandler_1 =
+      _registerName1(
+          "readDataOfMinLength:maxLength:timeout:completionHandler:");
+  void _objc_msgSend_934(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int minBytes,
+    int maxBytes,
+    double timeout,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_934(
+      obj,
+      sel,
+      minBytes,
+      maxBytes,
+      timeout,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_934Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              NSUInteger,
+              NSUInteger,
+              NSTimeInterval,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_934 = __objc_msgSend_934Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int, int,
+          double, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_writeData_timeout_completionHandler_1 =
+      _registerName1("writeData:timeout:completionHandler:");
+  void _objc_msgSend_935(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> data,
+    double timeout,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_935(
+      obj,
+      sel,
+      data,
+      timeout,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_935Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSTimeInterval,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_935 = __objc_msgSend_935Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, double, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_captureStreams1 = _registerName1("captureStreams");
+  late final _sel_closeWrite1 = _registerName1("closeWrite");
+  late final _sel_closeRead1 = _registerName1("closeRead");
+  late final _sel_startSecureConnection1 =
+      _registerName1("startSecureConnection");
+  late final _sel_stopSecureConnection1 =
+      _registerName1("stopSecureConnection");
+  late final _sel_streamTaskWithHostName_port_1 =
+      _registerName1("streamTaskWithHostName:port:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_936(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> hostname,
+    int port,
+  ) {
+    return __objc_msgSend_936(
+      obj,
+      sel,
+      hostname,
+      port,
+    );
+  }
+
+  late final __objc_msgSend_936Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              NSInteger)>>('objc_msgSend');
+  late final __objc_msgSend_936 = __objc_msgSend_936Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>, int)>();
+
+  late final _class_NSNetService1 = _getClass1("NSNetService");
+  late final _sel_initWithDomain_type_name_port_1 =
+      _registerName1("initWithDomain:type:name:port:");
+  instancetype _objc_msgSend_937(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> domain,
+    ffi.Pointer<ObjCObject> type,
+    ffi.Pointer<ObjCObject> name,
+    int port,
+  ) {
+    return __objc_msgSend_937(
+      obj,
+      sel,
+      domain,
+      type,
+      name,
+      port,
+    );
+  }
+
+  late final __objc_msgSend_937Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int)>>('objc_msgSend');
+  late final __objc_msgSend_937 = __objc_msgSend_937Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          int)>();
+
+  late final _sel_initWithDomain_type_name_1 =
+      _registerName1("initWithDomain:type:name:");
+  late final _sel_includesPeerToPeer1 = _registerName1("includesPeerToPeer");
+  late final _sel_setIncludesPeerToPeer_1 =
+      _registerName1("setIncludesPeerToPeer:");
+  late final _sel_type1 = _registerName1("type");
+  late final _sel_publish1 = _registerName1("publish");
+  late final _sel_publishWithOptions_1 = _registerName1("publishWithOptions:");
+  void _objc_msgSend_938(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int options,
+  ) {
+    return __objc_msgSend_938(
+      obj,
+      sel,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_938Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_938 = __objc_msgSend_938Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_resolve1 = _registerName1("resolve");
+  late final _sel_stop1 = _registerName1("stop");
+  late final _sel_dictionaryFromTXTRecordData_1 =
+      _registerName1("dictionaryFromTXTRecordData:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_939(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> txtData,
+  ) {
+    return __objc_msgSend_939(
+      obj,
+      sel,
+      txtData,
+    );
+  }
+
+  late final __objc_msgSend_939Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_939 = __objc_msgSend_939Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dataFromTXTRecordDictionary_1 =
+      _registerName1("dataFromTXTRecordDictionary:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_940(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> txtDictionary,
+  ) {
+    return __objc_msgSend_940(
+      obj,
+      sel,
+      txtDictionary,
+    );
+  }
+
+  late final __objc_msgSend_940Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_940 = __objc_msgSend_940Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_resolveWithTimeout_1 = _registerName1("resolveWithTimeout:");
+  late final _sel_getInputStream_outputStream_1 =
+      _registerName1("getInputStream:outputStream:");
+  bool _objc_msgSend_941(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> inputStream,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> outputStream,
+  ) {
+    return __objc_msgSend_941(
+      obj,
+      sel,
+      inputStream,
+      outputStream,
+    );
+  }
+
+  late final __objc_msgSend_941Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Bool Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_941 = __objc_msgSend_941Ptr.asFunction<
+      bool Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_setTXTRecordData_1 = _registerName1("setTXTRecordData:");
+  late final _sel_TXTRecordData1 = _registerName1("TXTRecordData");
+  late final _sel_startMonitoring1 = _registerName1("startMonitoring");
+  late final _sel_stopMonitoring1 = _registerName1("stopMonitoring");
+  late final _sel_streamTaskWithNetService_1 =
+      _registerName1("streamTaskWithNetService:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_942(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> service,
+  ) {
+    return __objc_msgSend_942(
+      obj,
+      sel,
+      service,
+    );
+  }
+
+  late final __objc_msgSend_942Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_942 = __objc_msgSend_942Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSURLSessionWebSocketTask1 =
+      _getClass1("NSURLSessionWebSocketTask");
+  late final _class_NSURLSessionWebSocketMessage1 =
+      _getClass1("NSURLSessionWebSocketMessage");
+  int _objc_msgSend_943(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_943(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_943Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_943 = __objc_msgSend_943Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_sendMessage_completionHandler_1 =
+      _registerName1("sendMessage:completionHandler:");
+  void _objc_msgSend_944(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> message,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_944(
+      obj,
+      sel,
+      message,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_944Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_944 = __objc_msgSend_944Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_receiveMessageWithCompletionHandler_1 =
+      _registerName1("receiveMessageWithCompletionHandler:");
+  void _objc_msgSend_945(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_945(
+      obj,
+      sel,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_945Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_945 = __objc_msgSend_945Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_sendPingWithPongReceiveHandler_1 =
+      _registerName1("sendPingWithPongReceiveHandler:");
+  void _objc_msgSend_946(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> pongReceiveHandler,
+  ) {
+    return __objc_msgSend_946(
+      obj,
+      sel,
+      pongReceiveHandler,
+    );
+  }
+
+  late final __objc_msgSend_946Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_946 = __objc_msgSend_946Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_cancelWithCloseCode_reason_1 =
+      _registerName1("cancelWithCloseCode:reason:");
+  void _objc_msgSend_947(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int closeCode,
+    ffi.Pointer<ObjCObject> reason,
+  ) {
+    return __objc_msgSend_947(
+      obj,
+      sel,
+      closeCode,
+      reason,
+    );
+  }
+
+  late final __objc_msgSend_947Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_947 = __objc_msgSend_947Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_maximumMessageSize1 = _registerName1("maximumMessageSize");
+  late final _sel_setMaximumMessageSize_1 =
+      _registerName1("setMaximumMessageSize:");
+  late final _sel_closeCode1 = _registerName1("closeCode");
+  int _objc_msgSend_948(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_948(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_948Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_948 = __objc_msgSend_948Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_closeReason1 = _registerName1("closeReason");
+  late final _sel_webSocketTaskWithURL_1 =
+      _registerName1("webSocketTaskWithURL:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_949(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+  ) {
+    return __objc_msgSend_949(
+      obj,
+      sel,
+      url,
+    );
+  }
+
+  late final __objc_msgSend_949Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_949 = __objc_msgSend_949Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_webSocketTaskWithURL_protocols_1 =
+      _registerName1("webSocketTaskWithURL:protocols:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_950(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    ffi.Pointer<ObjCObject> protocols,
+  ) {
+    return __objc_msgSend_950(
+      obj,
+      sel,
+      url,
+      protocols,
+    );
+  }
+
+  late final __objc_msgSend_950Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_950 = __objc_msgSend_950Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_webSocketTaskWithRequest_1 =
+      _registerName1("webSocketTaskWithRequest:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_951(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+  ) {
+    return __objc_msgSend_951(
+      obj,
+      sel,
+      request,
+    );
+  }
+
+  late final __objc_msgSend_951Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_951 = __objc_msgSend_951Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_dataTaskWithRequest_completionHandler_1 =
+      _registerName1("dataTaskWithRequest:completionHandler:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_952(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_952(
+      obj,
+      sel,
+      request,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_952Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_952 = __objc_msgSend_952Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_dataTaskWithURL_completionHandler_1 =
+      _registerName1("dataTaskWithURL:completionHandler:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_953(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_953(
+      obj,
+      sel,
+      url,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_953Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_953 = __objc_msgSend_953Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_uploadTaskWithRequest_fromFile_completionHandler_1 =
+      _registerName1("uploadTaskWithRequest:fromFile:completionHandler:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_954(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+    ffi.Pointer<ObjCObject> fileURL,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_954(
+      obj,
+      sel,
+      request,
+      fileURL,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_954Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_954 = __objc_msgSend_954Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_uploadTaskWithRequest_fromData_completionHandler_1 =
+      _registerName1("uploadTaskWithRequest:fromData:completionHandler:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_955(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+    ffi.Pointer<ObjCObject> bodyData,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_955(
+      obj,
+      sel,
+      request,
+      bodyData,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_955Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_955 = __objc_msgSend_955Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_downloadTaskWithRequest_completionHandler_1 =
+      _registerName1("downloadTaskWithRequest:completionHandler:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_956(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> request,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_956(
+      obj,
+      sel,
+      request,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_956Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_956 = __objc_msgSend_956Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_downloadTaskWithURL_completionHandler_1 =
+      _registerName1("downloadTaskWithURL:completionHandler:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_957(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_957(
+      obj,
+      sel,
+      url,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_957Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_957 = __objc_msgSend_957Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_downloadTaskWithResumeData_completionHandler_1 =
+      _registerName1("downloadTaskWithResumeData:completionHandler:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_958(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> resumeData,
+    ffi.Pointer<_ObjCBlock> completionHandler,
+  ) {
+    return __objc_msgSend_958(
+      obj,
+      sel,
+      resumeData,
+      completionHandler,
+    );
+  }
+
+  late final __objc_msgSend_958Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_958 = __objc_msgSend_958Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _class_NSProtocolChecker1 = _getClass1("NSProtocolChecker");
+  ffi.Pointer<ObjCObject> _objc_msgSend_959(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_959(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_959Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_959 = __objc_msgSend_959Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_protocolCheckerWithTarget_protocol_1 =
+      _registerName1("protocolCheckerWithTarget:protocol:");
+  instancetype _objc_msgSend_960(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> anObject,
+    ffi.Pointer<ObjCObject> aProtocol,
+  ) {
+    return __objc_msgSend_960(
+      obj,
+      sel,
+      anObject,
+      aProtocol,
+    );
+  }
+
+  late final __objc_msgSend_960Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_960 = __objc_msgSend_960Ptr.asFunction<
+      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_initWithTarget_protocol_1 =
+      _registerName1("initWithTarget:protocol:");
+  late final _class_NSTask1 = _getClass1("NSTask");
+  late final _sel_setExecutableURL_1 = _registerName1("setExecutableURL:");
+  late final _sel_setEnvironment_1 = _registerName1("setEnvironment:");
+  late final _sel_currentDirectoryURL1 = _registerName1("currentDirectoryURL");
+  late final _sel_setCurrentDirectoryURL_1 =
+      _registerName1("setCurrentDirectoryURL:");
+  late final _sel_standardInput1 = _registerName1("standardInput");
+  late final _sel_setStandardInput_1 = _registerName1("setStandardInput:");
+  late final _sel_standardOutput1 = _registerName1("standardOutput");
+  late final _sel_setStandardOutput_1 = _registerName1("setStandardOutput:");
+  late final _sel_standardError1 = _registerName1("standardError");
+  late final _sel_setStandardError_1 = _registerName1("setStandardError:");
+  late final _sel_launchAndReturnError_1 =
+      _registerName1("launchAndReturnError:");
+  late final _sel_interrupt1 = _registerName1("interrupt");
+  late final _sel_terminate1 = _registerName1("terminate");
+  late final _sel_isRunning1 = _registerName1("isRunning");
+  late final _sel_terminationStatus1 = _registerName1("terminationStatus");
+  late final _sel_terminationReason1 = _registerName1("terminationReason");
+  int _objc_msgSend_961(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_961(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_961Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_961 = __objc_msgSend_961Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_terminationHandler1 = _registerName1("terminationHandler");
+  ffi.Pointer<_ObjCBlock> _objc_msgSend_962(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_962(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_962Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<_ObjCBlock> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_962 = __objc_msgSend_962Ptr.asFunction<
+      ffi.Pointer<_ObjCBlock> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setTerminationHandler_1 =
+      _registerName1("setTerminationHandler:");
+  void _objc_msgSend_963(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<_ObjCBlock> value,
+  ) {
+    return __objc_msgSend_963(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_963Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_963 = __objc_msgSend_963Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_launchedTaskWithExecutableURL_arguments_error_terminationHandler_1 =
+      _registerName1(
+          "launchedTaskWithExecutableURL:arguments:error:terminationHandler:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_964(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    ffi.Pointer<ObjCObject> arguments,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+    ffi.Pointer<_ObjCBlock> terminationHandler,
+  ) {
+    return __objc_msgSend_964(
+      obj,
+      sel,
+      url,
+      arguments,
+      error,
+      terminationHandler,
+    );
+  }
+
+  late final __objc_msgSend_964Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>,
+              ffi.Pointer<_ObjCBlock>)>>('objc_msgSend');
+  late final __objc_msgSend_964 = __objc_msgSend_964Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>,
+          ffi.Pointer<_ObjCBlock>)>();
+
+  late final _sel_waitUntilExit1 = _registerName1("waitUntilExit");
+  late final _sel_launchPath1 = _registerName1("launchPath");
+  late final _sel_setLaunchPath_1 = _registerName1("setLaunchPath:");
+  late final _sel_setCurrentDirectoryPath_1 =
+      _registerName1("setCurrentDirectoryPath:");
+  late final _sel_launch1 = _registerName1("launch");
+  late final _sel_launchedTaskWithLaunchPath_arguments_1 =
+      _registerName1("launchedTaskWithLaunchPath:arguments:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_965(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> path,
+    ffi.Pointer<ObjCObject> arguments,
+  ) {
+    return __objc_msgSend_965(
+      obj,
+      sel,
+      path,
+      arguments,
+    );
+  }
+
+  late final __objc_msgSend_965Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_965 = __objc_msgSend_965Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSXMLElement1 = _getClass1("NSXMLElement");
+  late final _class_NSXMLNode1 = _getClass1("NSXMLNode");
+  late final _sel_initWithKind_1 = _registerName1("initWithKind:");
+  instancetype _objc_msgSend_966(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int kind,
+  ) {
+    return __objc_msgSend_966(
+      obj,
+      sel,
+      kind,
+    );
+  }
+
+  late final __objc_msgSend_966Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_966 = __objc_msgSend_966Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_initWithKind_options_1 =
+      _registerName1("initWithKind:options:");
+  instancetype _objc_msgSend_967(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int kind,
+    int options,
+  ) {
+    return __objc_msgSend_967(
+      obj,
+      sel,
+      kind,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_967Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32, ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_967 = __objc_msgSend_967Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int, int)>();
+
+  late final _sel_document1 = _registerName1("document");
+  late final _sel_documentWithRootElement_1 =
+      _registerName1("documentWithRootElement:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_968(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> element,
+  ) {
+    return __objc_msgSend_968(
+      obj,
+      sel,
+      element,
+    );
+  }
+
+  late final __objc_msgSend_968Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_968 = __objc_msgSend_968Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_elementWithName_1 = _registerName1("elementWithName:");
+  late final _sel_elementWithName_URI_1 =
+      _registerName1("elementWithName:URI:");
+  late final _sel_elementWithName_stringValue_1 =
+      _registerName1("elementWithName:stringValue:");
+  late final _sel_elementWithName_children_attributes_1 =
+      _registerName1("elementWithName:children:attributes:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_969(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> name,
+    ffi.Pointer<ObjCObject> children,
+    ffi.Pointer<ObjCObject> attributes,
+  ) {
+    return __objc_msgSend_969(
+      obj,
+      sel,
+      name,
+      children,
+      attributes,
+    );
+  }
+
+  late final __objc_msgSend_969Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_969 = __objc_msgSend_969Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_attributeWithName_stringValue_1 =
+      _registerName1("attributeWithName:stringValue:");
+  late final _sel_attributeWithName_URI_stringValue_1 =
+      _registerName1("attributeWithName:URI:stringValue:");
+  late final _sel_namespaceWithName_stringValue_1 =
+      _registerName1("namespaceWithName:stringValue:");
+  late final _sel_processingInstructionWithName_stringValue_1 =
+      _registerName1("processingInstructionWithName:stringValue:");
+  late final _sel_commentWithStringValue_1 =
+      _registerName1("commentWithStringValue:");
+  late final _sel_textWithStringValue_1 =
+      _registerName1("textWithStringValue:");
+  late final _sel_DTDNodeWithXMLString_1 =
+      _registerName1("DTDNodeWithXMLString:");
+  late final _sel_kind1 = _registerName1("kind");
+  int _objc_msgSend_970(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_970(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_970Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_970 = __objc_msgSend_970Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_objectValue1 = _registerName1("objectValue");
+  late final _sel_setObjectValue_1 = _registerName1("setObjectValue:");
+  late final _sel_setStringValue_1 = _registerName1("setStringValue:");
+  late final _sel_setStringValue_resolvingEntities_1 =
+      _registerName1("setStringValue:resolvingEntities:");
+  void _objc_msgSend_971(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> string,
+    bool resolve,
+  ) {
+    return __objc_msgSend_971(
+      obj,
+      sel,
+      string,
+      resolve,
+    );
+  }
+
+  late final __objc_msgSend_971Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_971 = __objc_msgSend_971Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, bool)>();
+
+  late final _sel_index1 = _registerName1("index");
+  late final _sel_level1 = _registerName1("level");
+  late final _class_NSXMLDocument1 = _getClass1("NSXMLDocument");
+  late final _sel_initWithXMLString_options_error_1 =
+      _registerName1("initWithXMLString:options:error:");
+  instancetype _objc_msgSend_972(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> string,
+    int mask,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_972(
+      obj,
+      sel,
+      string,
+      mask,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_972Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_972 = __objc_msgSend_972Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  instancetype _objc_msgSend_973(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> url,
+    int mask,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_973(
+      obj,
+      sel,
+      url,
+      mask,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_973Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_973 = __objc_msgSend_973Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_initWithData_options_error_1 =
+      _registerName1("initWithData:options:error:");
+  instancetype _objc_msgSend_974(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> data,
+    int mask,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_974(
+      obj,
+      sel,
+      data,
+      mask,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_974Ptr = _lookup<
+      ffi.NativeFunction<
+          instancetype Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_974 = __objc_msgSend_974Ptr.asFunction<
+      instancetype Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          int,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_initWithRootElement_1 =
+      _registerName1("initWithRootElement:");
+  late final _sel_replacementClassForClass_1 =
+      _registerName1("replacementClassForClass:");
+  late final _sel_characterEncoding1 = _registerName1("characterEncoding");
+  late final _sel_setCharacterEncoding_1 =
+      _registerName1("setCharacterEncoding:");
+  late final _sel_isStandalone1 = _registerName1("isStandalone");
+  late final _sel_setStandalone_1 = _registerName1("setStandalone:");
+  late final _sel_documentContentKind1 = _registerName1("documentContentKind");
+  int _objc_msgSend_975(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_975(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_975Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_975 = __objc_msgSend_975Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setDocumentContentKind_1 =
+      _registerName1("setDocumentContentKind:");
+  void _objc_msgSend_976(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_976(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_976Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_976 = __objc_msgSend_976Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_setMIMEType_1 = _registerName1("setMIMEType:");
+  late final _class_NSXMLDTD1 = _getClass1("NSXMLDTD");
+  late final _sel_setPublicID_1 = _registerName1("setPublicID:");
+  late final _sel_setSystemID_1 = _registerName1("setSystemID:");
+  late final _sel_insertChild_atIndex_1 =
+      _registerName1("insertChild:atIndex:");
+  void _objc_msgSend_977(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> child,
+    int index,
+  ) {
+    return __objc_msgSend_977(
+      obj,
+      sel,
+      child,
+      index,
+    );
+  }
+
+  late final __objc_msgSend_977Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_977 = __objc_msgSend_977Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_insertChildren_atIndex_1 =
+      _registerName1("insertChildren:atIndex:");
+  void _objc_msgSend_978(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> children,
+    int index,
+  ) {
+    return __objc_msgSend_978(
+      obj,
+      sel,
+      children,
+      index,
+    );
+  }
+
+  late final __objc_msgSend_978Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_978 = __objc_msgSend_978Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>, int)>();
+
+  late final _sel_removeChildAtIndex_1 = _registerName1("removeChildAtIndex:");
+  late final _sel_setChildren_1 = _registerName1("setChildren:");
+  late final _sel_addChild_1 = _registerName1("addChild:");
+  void _objc_msgSend_979(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> child,
+  ) {
+    return __objc_msgSend_979(
+      obj,
+      sel,
+      child,
+    );
+  }
+
+  late final __objc_msgSend_979Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_979 = __objc_msgSend_979Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_replaceChildAtIndex_withNode_1 =
+      _registerName1("replaceChildAtIndex:withNode:");
+  void _objc_msgSend_980(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int index,
+    ffi.Pointer<ObjCObject> node,
+  ) {
+    return __objc_msgSend_980(
+      obj,
+      sel,
+      index,
+      node,
+    );
+  }
+
+  late final __objc_msgSend_980Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              NSUInteger, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_980 = __objc_msgSend_980Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _class_NSXMLDTDNode1 = _getClass1("NSXMLDTDNode");
+  late final _sel_initWithXMLString_1 = _registerName1("initWithXMLString:");
+  late final _sel_DTDKind1 = _registerName1("DTDKind");
+  int _objc_msgSend_981(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_981(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_981Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_981 = __objc_msgSend_981Ptr.asFunction<
+      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setDTDKind_1 = _registerName1("setDTDKind:");
+  void _objc_msgSend_982(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int value,
+  ) {
+    return __objc_msgSend_982(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_982Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_982 = __objc_msgSend_982Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_isExternal1 = _registerName1("isExternal");
+  late final _sel_notationName1 = _registerName1("notationName");
+  late final _sel_setNotationName_1 = _registerName1("setNotationName:");
+  late final _sel_localNameForName_1 = _registerName1("localNameForName:");
+  late final _sel_prefixForName_1 = _registerName1("prefixForName:");
+  late final _sel_predefinedNamespaceForPrefix_1 =
+      _registerName1("predefinedNamespaceForPrefix:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_983(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> name,
+  ) {
+    return __objc_msgSend_983(
+      obj,
+      sel,
+      name,
+    );
+  }
+
+  late final __objc_msgSend_983Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_983 = __objc_msgSend_983Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_entityDeclarationForName_1 =
+      _registerName1("entityDeclarationForName:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_984(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> name,
+  ) {
+    return __objc_msgSend_984(
+      obj,
+      sel,
+      name,
+    );
+  }
+
+  late final __objc_msgSend_984Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_984 = __objc_msgSend_984Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_notationDeclarationForName_1 =
+      _registerName1("notationDeclarationForName:");
+  late final _sel_elementDeclarationForName_1 =
+      _registerName1("elementDeclarationForName:");
+  late final _sel_attributeDeclarationForName_elementName_1 =
+      _registerName1("attributeDeclarationForName:elementName:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_985(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> name,
+    ffi.Pointer<ObjCObject> elementName,
+  ) {
+    return __objc_msgSend_985(
+      obj,
+      sel,
+      name,
+      elementName,
+    );
+  }
+
+  late final __objc_msgSend_985Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_985 = __objc_msgSend_985Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_predefinedEntityDeclarationForName_1 =
+      _registerName1("predefinedEntityDeclarationForName:");
+  late final _sel_DTD1 = _registerName1("DTD");
+  ffi.Pointer<ObjCObject> _objc_msgSend_986(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_986(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_986Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_986 = __objc_msgSend_986Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_setDTD_1 = _registerName1("setDTD:");
+  void _objc_msgSend_987(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> value,
+  ) {
+    return __objc_msgSend_987(
+      obj,
+      sel,
+      value,
+    );
+  }
+
+  late final __objc_msgSend_987Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_987 = __objc_msgSend_987Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_setRootElement_1 = _registerName1("setRootElement:");
+  void _objc_msgSend_988(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> root,
+  ) {
+    return __objc_msgSend_988(
+      obj,
+      sel,
+      root,
+    );
+  }
+
+  late final __objc_msgSend_988Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_988 = __objc_msgSend_988Ptr.asFunction<
+      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_rootElement1 = _registerName1("rootElement");
+  ffi.Pointer<ObjCObject> _objc_msgSend_989(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_989(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_989Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_989 = __objc_msgSend_989Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_XMLData1 = _registerName1("XMLData");
+  late final _sel_XMLDataWithOptions_1 = _registerName1("XMLDataWithOptions:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_990(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int options,
+  ) {
+    return __objc_msgSend_990(
+      obj,
+      sel,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_990Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_990 = __objc_msgSend_990Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_objectByApplyingXSLT_arguments_error_1 =
+      _registerName1("objectByApplyingXSLT:arguments:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_991(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> xslt,
+    ffi.Pointer<ObjCObject> arguments,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_991(
+      obj,
+      sel,
+      xslt,
+      arguments,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_991Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_991 = __objc_msgSend_991Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_objectByApplyingXSLTString_arguments_error_1 =
+      _registerName1("objectByApplyingXSLTString:arguments:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_992(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> xslt,
+    ffi.Pointer<ObjCObject> arguments,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_992(
+      obj,
+      sel,
+      xslt,
+      arguments,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_992Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_992 = __objc_msgSend_992Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_objectByApplyingXSLTAtURL_arguments_error_1 =
+      _registerName1("objectByApplyingXSLTAtURL:arguments:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_993(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> xsltURL,
+    ffi.Pointer<ObjCObject> argument,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_993(
+      obj,
+      sel,
+      xsltURL,
+      argument,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_993Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_993 = __objc_msgSend_993Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_validateAndReturnError_1 =
+      _registerName1("validateAndReturnError:");
+  late final _sel_rootDocument1 = _registerName1("rootDocument");
+  ffi.Pointer<ObjCObject> _objc_msgSend_994(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_994(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_994Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_994 = __objc_msgSend_994Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_parent1 = _registerName1("parent");
+  ffi.Pointer<ObjCObject> _objc_msgSend_995(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+  ) {
+    return __objc_msgSend_995(
+      obj,
+      sel,
+    );
+  }
+
+  late final __objc_msgSend_995Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
+  late final __objc_msgSend_995 = __objc_msgSend_995Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();
+
+  late final _sel_childCount1 = _registerName1("childCount");
+  late final _sel_children1 = _registerName1("children");
+  late final _sel_childAtIndex_1 = _registerName1("childAtIndex:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_996(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int index,
+  ) {
+    return __objc_msgSend_996(
+      obj,
+      sel,
+      index,
+    );
+  }
+
+  late final __objc_msgSend_996Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, NSUInteger)>>('objc_msgSend');
+  late final __objc_msgSend_996 = __objc_msgSend_996Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_previousSibling1 = _registerName1("previousSibling");
+  late final _sel_nextSibling1 = _registerName1("nextSibling");
+  late final _sel_previousNode1 = _registerName1("previousNode");
+  late final _sel_nextNode1 = _registerName1("nextNode");
+  late final _sel_detach1 = _registerName1("detach");
+  late final _sel_XPath1 = _registerName1("XPath");
+  late final _sel_localName1 = _registerName1("localName");
+  late final _sel_prefix1 = _registerName1("prefix");
+  late final _sel_URI1 = _registerName1("URI");
+  late final _sel_setURI_1 = _registerName1("setURI:");
+  late final _sel_XMLString1 = _registerName1("XMLString");
+  late final _sel_XMLStringWithOptions_1 =
+      _registerName1("XMLStringWithOptions:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_997(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    int options,
+  ) {
+    return __objc_msgSend_997(
+      obj,
+      sel,
+      options,
+    );
+  }
+
+  late final __objc_msgSend_997Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Int32)>>('objc_msgSend');
+  late final __objc_msgSend_997 = __objc_msgSend_997Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();
+
+  late final _sel_canonicalXMLStringPreservingComments_1 =
+      _registerName1("canonicalXMLStringPreservingComments:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_998(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    bool comments,
+  ) {
+    return __objc_msgSend_998(
+      obj,
+      sel,
+      comments,
+    );
+  }
+
+  late final __objc_msgSend_998Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>, ffi.Bool)>>('objc_msgSend');
+  late final __objc_msgSend_998 = __objc_msgSend_998Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, bool)>();
+
+  late final _sel_nodesForXPath_error_1 =
+      _registerName1("nodesForXPath:error:");
+  late final _sel_objectsForXQuery_constants_error_1 =
+      _registerName1("objectsForXQuery:constants:error:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_999(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> xquery,
+    ffi.Pointer<ObjCObject> constants,
+    ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+  ) {
+    return __objc_msgSend_999(
+      obj,
+      sel,
+      xquery,
+      constants,
+      error,
+    );
+  }
+
+  late final __objc_msgSend_999Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ffi.Pointer<ObjCObject>>)>>('objc_msgSend');
+  late final __objc_msgSend_999 = __objc_msgSend_999Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ffi.Pointer<ObjCObject>>)>();
+
+  late final _sel_objectsForXQuery_error_1 =
+      _registerName1("objectsForXQuery:error:");
+  late final _sel_initWithName_URI_1 = _registerName1("initWithName:URI:");
+  late final _sel_initWithName_stringValue_1 =
+      _registerName1("initWithName:stringValue:");
+  late final _sel_initWithXMLString_error_1 =
+      _registerName1("initWithXMLString:error:");
+  late final _sel_elementsForName_1 = _registerName1("elementsForName:");
+  late final _sel_elementsForLocalName_URI_1 =
+      _registerName1("elementsForLocalName:URI:");
+  late final _sel_addAttribute_1 = _registerName1("addAttribute:");
+  late final _sel_removeAttributeForName_1 =
+      _registerName1("removeAttributeForName:");
+  late final _sel_attributes1 = _registerName1("attributes");
+  late final _sel_setAttributes_1 = _registerName1("setAttributes:");
+  late final _sel_setAttributesWithDictionary_1 =
+      _registerName1("setAttributesWithDictionary:");
+  late final _sel_attributeForName_1 = _registerName1("attributeForName:");
+  late final _sel_attributeForLocalName_URI_1 =
+      _registerName1("attributeForLocalName:URI:");
+  ffi.Pointer<ObjCObject> _objc_msgSend_1000(
+    ffi.Pointer<ObjCObject> obj,
+    ffi.Pointer<ObjCSel> sel,
+    ffi.Pointer<ObjCObject> localName,
+    ffi.Pointer<ObjCObject> URI,
+  ) {
+    return __objc_msgSend_1000(
+      obj,
+      sel,
+      localName,
+      URI,
+    );
+  }
+
+  late final __objc_msgSend_1000Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCSel>,
+              ffi.Pointer<ObjCObject>,
+              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
+  late final __objc_msgSend_1000 = __objc_msgSend_1000Ptr.asFunction<
+      ffi.Pointer<ObjCObject> Function(
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCSel>,
+          ffi.Pointer<ObjCObject>,
+          ffi.Pointer<ObjCObject>)>();
+
+  late final _sel_addNamespace_1 = _registerName1("addNamespace:");
+  late final _sel_removeNamespaceForPrefix_1 =
+      _registerName1("removeNamespaceForPrefix:");
+  late final _sel_namespaces1 = _registerName1("namespaces");
+  late final _sel_setNamespaces_1 = _registerName1("setNamespaces:");
+  late final _sel_namespaceForPrefix_1 = _registerName1("namespaceForPrefix:");
+  late final _sel_resolveNamespaceForName_1 =
+      _registerName1("resolveNamespaceForName:");
+  late final _sel_resolvePrefixForNamespaceURI_1 =
+      _registerName1("resolvePrefixForNamespaceURI:");
+  late final _sel_normalizeAdjacentTextNodesPreservingCDATA_1 =
+      _registerName1("normalizeAdjacentTextNodesPreservingCDATA:");
+  late final _sel_setAttributesAsDictionary_1 =
+      _registerName1("setAttributesAsDictionary:");
+  late final _class_SwiftClass1 = _getClass1("swift_module.SwiftClass");
+  late final _sel_sayHello1 = _registerName1("sayHello");
+  late final _sel_someField1 = _registerName1("someField");
+  late final _sel_setSomeField_1 = _registerName1("setSomeField:");
+}
+
+class _ObjCWrapper implements ffi.Finalizable {
+  final ffi.Pointer<ObjCObject> _id;
+  final SwiftLibrary _lib;
+  bool _pendingRelease;
+
+  _ObjCWrapper._(this._id, this._lib,
+      {bool retain = false, bool release = false})
+      : _pendingRelease = release {
+    if (retain) {
+      _lib._objc_retain(_id.cast());
+    }
+    if (release) {
+      _lib._objc_releaseFinalizer2.attach(this, _id.cast(), detach: this);
+    }
+  }
+
+  /// Releases the reference to the underlying ObjC object held by this wrapper.
+  /// Throws a StateError if this wrapper doesn't currently hold a reference.
+  void release() {
+    if (_pendingRelease) {
+      _pendingRelease = false;
+      _lib._objc_release(_id.cast());
+      _lib._objc_releaseFinalizer2.detach(this);
+    } else {
+      throw StateError(
+          'Released an ObjC object that was unowned or already released.');
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    return other is _ObjCWrapper && _id == other._id;
+  }
+
+  @override
+  int get hashCode => _id.hashCode;
+}
+
+class NSObject extends _ObjCWrapper {
+  NSObject._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSObject] that points to the same underlying object as [other].
+  static NSObject castFrom<T extends _ObjCWrapper>(T other) {
+    return NSObject._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSObject] that wraps the given raw object pointer.
+  static NSObject castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSObject._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSObject].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSObject1);
+  }
+
+  static void load(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_1(_lib._class_NSObject1, _lib._sel_load1);
+  }
+
+  static void initialize(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_1(_lib._class_NSObject1, _lib._sel_initialize1);
+  }
+
+  NSObject init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSObject1, _lib._sel_new1);
+    return NSObject._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSObject allocWithZone_(SwiftLibrary _lib, ffi.Pointer<_NSZone> zone) {
+    final _ret = _lib._objc_msgSend_3(
+        _lib._class_NSObject1, _lib._sel_allocWithZone_1, zone);
+    return NSObject._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSObject alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSObject1, _lib._sel_alloc1);
+    return NSObject._(_ret, _lib, retain: false, release: true);
+  }
+
+  void dealloc() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_dealloc1);
+  }
+
+  void finalize() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_finalize1);
+  }
+
+  NSObject copy() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_copy1);
+    return NSObject._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSObject mutableCopy() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_mutableCopy1);
+    return NSObject._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSObject copyWithZone_(SwiftLibrary _lib, ffi.Pointer<_NSZone> zone) {
+    final _ret = _lib._objc_msgSend_3(
+        _lib._class_NSObject1, _lib._sel_copyWithZone_1, zone);
+    return NSObject._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSObject mutableCopyWithZone_(
+      SwiftLibrary _lib, ffi.Pointer<_NSZone> zone) {
+    final _ret = _lib._objc_msgSend_3(
+        _lib._class_NSObject1, _lib._sel_mutableCopyWithZone_1, zone);
+    return NSObject._(_ret, _lib, retain: false, release: true);
+  }
+
+  static bool instancesRespondToSelector_(
+      SwiftLibrary _lib, ffi.Pointer<ObjCSel> aSelector) {
+    return _lib._objc_msgSend_4(_lib._class_NSObject1,
+        _lib._sel_instancesRespondToSelector_1, aSelector);
+  }
+
+  static bool conformsToProtocol_(SwiftLibrary _lib, Protocol? protocol) {
+    return _lib._objc_msgSend_5(_lib._class_NSObject1,
+        _lib._sel_conformsToProtocol_1, protocol?._id ?? ffi.nullptr);
+  }
+
+  IMP methodForSelector_(ffi.Pointer<ObjCSel> aSelector) {
+    return _lib._objc_msgSend_6(_id, _lib._sel_methodForSelector_1, aSelector);
+  }
+
+  static IMP instanceMethodForSelector_(
+      SwiftLibrary _lib, ffi.Pointer<ObjCSel> aSelector) {
+    return _lib._objc_msgSend_6(_lib._class_NSObject1,
+        _lib._sel_instanceMethodForSelector_1, aSelector);
+  }
+
+  void doesNotRecognizeSelector_(ffi.Pointer<ObjCSel> aSelector) {
+    return _lib._objc_msgSend_7(
+        _id, _lib._sel_doesNotRecognizeSelector_1, aSelector);
+  }
+
+  NSObject forwardingTargetForSelector_(ffi.Pointer<ObjCSel> aSelector) {
+    final _ret = _lib._objc_msgSend_8(
+        _id, _lib._sel_forwardingTargetForSelector_1, aSelector);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void forwardInvocation_(NSInvocation? anInvocation) {
+    return _lib._objc_msgSend_372(
+        _id, _lib._sel_forwardInvocation_1, anInvocation?._id ?? ffi.nullptr);
+  }
+
+  NSMethodSignature methodSignatureForSelector_(
+      ffi.Pointer<ObjCSel> aSelector) {
+    final _ret = _lib._objc_msgSend_373(
+        _id, _lib._sel_methodSignatureForSelector_1, aSelector);
+    return NSMethodSignature._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMethodSignature instanceMethodSignatureForSelector_(
+      SwiftLibrary _lib, ffi.Pointer<ObjCSel> aSelector) {
+    final _ret = _lib._objc_msgSend_373(_lib._class_NSObject1,
+        _lib._sel_instanceMethodSignatureForSelector_1, aSelector);
+    return NSMethodSignature._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool allowsWeakReference() {
+    return _lib._objc_msgSend_12(_id, _lib._sel_allowsWeakReference1);
+  }
+
+  bool retainWeakReference() {
+    return _lib._objc_msgSend_12(_id, _lib._sel_retainWeakReference1);
+  }
+
+  static bool isSubclassOfClass_(SwiftLibrary _lib, NSObject aClass) {
+    return _lib._objc_msgSend_0(
+        _lib._class_NSObject1, _lib._sel_isSubclassOfClass_1, aClass._id);
+  }
+
+  static bool resolveClassMethod_(SwiftLibrary _lib, ffi.Pointer<ObjCSel> sel) {
+    return _lib._objc_msgSend_4(
+        _lib._class_NSObject1, _lib._sel_resolveClassMethod_1, sel);
+  }
+
+  static bool resolveInstanceMethod_(
+      SwiftLibrary _lib, ffi.Pointer<ObjCSel> sel) {
+    return _lib._objc_msgSend_4(
+        _lib._class_NSObject1, _lib._sel_resolveInstanceMethod_1, sel);
+  }
+
+  static int hash(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_10(_lib._class_NSObject1, _lib._sel_hash1);
+  }
+
+  static NSObject superclass(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSObject1, _lib._sel_superclass1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject class1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSObject1, _lib._sel_class1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString description(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_20(_lib._class_NSObject1, _lib._sel_description1);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString debugDescription(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_20(
+        _lib._class_NSObject1, _lib._sel_debugDescription1);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static int version(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_78(_lib._class_NSObject1, _lib._sel_version1);
+  }
+
+  static void setVersion_(SwiftLibrary _lib, int aVersion) {
+    return _lib._objc_msgSend_374(
+        _lib._class_NSObject1, _lib._sel_setVersion_1, aVersion);
+  }
+
+  NSObject get classForCoder {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_classForCoder1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject replacementObjectForCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_replacementObjectForCoder_1, coder?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject awakeAfterUsingCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_awakeAfterUsingCoder_1, coder?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void poseAsClass_(SwiftLibrary _lib, NSObject aClass) {
+    return _lib._objc_msgSend_15(
+        _lib._class_NSObject1, _lib._sel_poseAsClass_1, aClass._id);
+  }
+
+  NSObject get autoContentAccessingProxy {
+    final _ret =
+        _lib._objc_msgSend_2(_id, _lib._sel_autoContentAccessingProxy1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void
+      attemptRecoveryFromError_optionIndex_delegate_didRecoverSelector_contextInfo_(
+          NSError? error,
+          int recoveryOptionIndex,
+          NSObject delegate,
+          ffi.Pointer<ObjCSel> didRecoverSelector,
+          ffi.Pointer<ffi.Void> contextInfo) {
+    return _lib._objc_msgSend_375(
+        _id,
+        _lib._sel_attemptRecoveryFromError_optionIndex_delegate_didRecoverSelector_contextInfo_1,
+        error?._id ?? ffi.nullptr,
+        recoveryOptionIndex,
+        delegate._id,
+        didRecoverSelector,
+        contextInfo);
+  }
+
+  bool attemptRecoveryFromError_optionIndex_(
+      NSError? error, int recoveryOptionIndex) {
+    return _lib._objc_msgSend_376(
+        _id,
+        _lib._sel_attemptRecoveryFromError_optionIndex_1,
+        error?._id ?? ffi.nullptr,
+        recoveryOptionIndex);
+  }
+
+  void performSelector_withObject_afterDelay_inModes_(
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument,
+      double delay,
+      NSArray? modes) {
+    return _lib._objc_msgSend_377(
+        _id,
+        _lib._sel_performSelector_withObject_afterDelay_inModes_1,
+        aSelector,
+        anArgument._id,
+        delay,
+        modes?._id ?? ffi.nullptr);
+  }
+
+  void performSelector_withObject_afterDelay_(
+      ffi.Pointer<ObjCSel> aSelector, NSObject anArgument, double delay) {
+    return _lib._objc_msgSend_378(
+        _id,
+        _lib._sel_performSelector_withObject_afterDelay_1,
+        aSelector,
+        anArgument._id,
+        delay);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSObject1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSObject1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  void URL_resourceDataDidBecomeAvailable_(NSURL? sender, NSData? newBytes) {
+    return _lib._objc_msgSend_379(
+        _id,
+        _lib._sel_URL_resourceDataDidBecomeAvailable_1,
+        sender?._id ?? ffi.nullptr,
+        newBytes?._id ?? ffi.nullptr);
+  }
+
+  void URLResourceDidFinishLoading_(NSURL? sender) {
+    return _lib._objc_msgSend_380(_id, _lib._sel_URLResourceDidFinishLoading_1,
+        sender?._id ?? ffi.nullptr);
+  }
+
+  void URLResourceDidCancelLoading_(NSURL? sender) {
+    return _lib._objc_msgSend_380(_id, _lib._sel_URLResourceDidCancelLoading_1,
+        sender?._id ?? ffi.nullptr);
+  }
+
+  void URL_resourceDidFailLoadingWithReason_(NSURL? sender, NSString? reason) {
+    return _lib._objc_msgSend_381(
+        _id,
+        _lib._sel_URL_resourceDidFailLoadingWithReason_1,
+        sender?._id ?? ffi.nullptr,
+        reason?._id ?? ffi.nullptr);
+  }
+
+  bool fileManager_shouldProceedAfterError_(
+      NSFileManager? fm, NSDictionary? errorInfo) {
+    return _lib._objc_msgSend_407(
+        _id,
+        _lib._sel_fileManager_shouldProceedAfterError_1,
+        fm?._id ?? ffi.nullptr,
+        errorInfo?._id ?? ffi.nullptr);
+  }
+
+  void fileManager_willProcessPath_(NSFileManager? fm, NSString? path) {
+    return _lib._objc_msgSend_408(_id, _lib._sel_fileManager_willProcessPath_1,
+        fm?._id ?? ffi.nullptr, path?._id ?? ffi.nullptr);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSObject1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  NSObject valueForKey_(NSString? key) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_valueForKey_1, key?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void setValue_forKey_(NSObject value, NSString? key) {
+    return _lib._objc_msgSend_122(
+        _id, _lib._sel_setValue_forKey_1, value._id, key?._id ?? ffi.nullptr);
+  }
+
+  bool validateValue_forKey_error_(ffi.Pointer<ffi.Pointer<ObjCObject>> ioValue,
+      NSString? inKey, ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    return _lib._objc_msgSend_220(_id, _lib._sel_validateValue_forKey_error_1,
+        ioValue, inKey?._id ?? ffi.nullptr, outError);
+  }
+
+  NSMutableArray mutableArrayValueForKey_(NSString? key) {
+    final _ret = _lib._objc_msgSend_425(
+        _id, _lib._sel_mutableArrayValueForKey_1, key?._id ?? ffi.nullptr);
+    return NSMutableArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSMutableOrderedSet mutableOrderedSetValueForKey_(NSString? key) {
+    final _ret = _lib._objc_msgSend_441(
+        _id, _lib._sel_mutableOrderedSetValueForKey_1, key?._id ?? ffi.nullptr);
+    return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSMutableSet mutableSetValueForKey_(NSString? key) {
+    final _ret = _lib._objc_msgSend_442(
+        _id, _lib._sel_mutableSetValueForKey_1, key?._id ?? ffi.nullptr);
+    return NSMutableSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject valueForKeyPath_(NSString? keyPath) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_valueForKeyPath_1, keyPath?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void setValue_forKeyPath_(NSObject value, NSString? keyPath) {
+    return _lib._objc_msgSend_122(_id, _lib._sel_setValue_forKeyPath_1,
+        value._id, keyPath?._id ?? ffi.nullptr);
+  }
+
+  bool validateValue_forKeyPath_error_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> ioValue,
+      NSString? inKeyPath,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    return _lib._objc_msgSend_220(
+        _id,
+        _lib._sel_validateValue_forKeyPath_error_1,
+        ioValue,
+        inKeyPath?._id ?? ffi.nullptr,
+        outError);
+  }
+
+  NSMutableArray mutableArrayValueForKeyPath_(NSString? keyPath) {
+    final _ret = _lib._objc_msgSend_425(_id,
+        _lib._sel_mutableArrayValueForKeyPath_1, keyPath?._id ?? ffi.nullptr);
+    return NSMutableArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSMutableOrderedSet mutableOrderedSetValueForKeyPath_(NSString? keyPath) {
+    final _ret = _lib._objc_msgSend_441(
+        _id,
+        _lib._sel_mutableOrderedSetValueForKeyPath_1,
+        keyPath?._id ?? ffi.nullptr);
+    return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSMutableSet mutableSetValueForKeyPath_(NSString? keyPath) {
+    final _ret = _lib._objc_msgSend_442(_id,
+        _lib._sel_mutableSetValueForKeyPath_1, keyPath?._id ?? ffi.nullptr);
+    return NSMutableSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject valueForUndefinedKey_(NSString? key) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_valueForUndefinedKey_1, key?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void setValue_forUndefinedKey_(NSObject value, NSString? key) {
+    return _lib._objc_msgSend_122(_id, _lib._sel_setValue_forUndefinedKey_1,
+        value._id, key?._id ?? ffi.nullptr);
+  }
+
+  void setNilValueForKey_(NSString? key) {
+    return _lib._objc_msgSend_186(
+        _id, _lib._sel_setNilValueForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  NSDictionary dictionaryWithValuesForKeys_(NSArray? keys) {
+    final _ret = _lib._objc_msgSend_443(
+        _id, _lib._sel_dictionaryWithValuesForKeys_1, keys?._id ?? ffi.nullptr);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  void setValuesForKeysWithDictionary_(NSDictionary? keyedValues) {
+    return _lib._objc_msgSend_444(
+        _id,
+        _lib._sel_setValuesForKeysWithDictionary_1,
+        keyedValues?._id ?? ffi.nullptr);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSObject1, _lib._sel_useStoredAccessor1);
+  }
+
+  NSObject storedValueForKey_(NSString? key) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_storedValueForKey_1, key?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void takeStoredValue_forKey_(NSObject value, NSString? key) {
+    return _lib._objc_msgSend_122(_id, _lib._sel_takeStoredValue_forKey_1,
+        value._id, key?._id ?? ffi.nullptr);
+  }
+
+  void takeValue_forKey_(NSObject value, NSString? key) {
+    return _lib._objc_msgSend_122(
+        _id, _lib._sel_takeValue_forKey_1, value._id, key?._id ?? ffi.nullptr);
+  }
+
+  void takeValue_forKeyPath_(NSObject value, NSString? keyPath) {
+    return _lib._objc_msgSend_122(_id, _lib._sel_takeValue_forKeyPath_1,
+        value._id, keyPath?._id ?? ffi.nullptr);
+  }
+
+  NSObject handleQueryWithUnboundKey_(NSString? key) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_handleQueryWithUnboundKey_1, key?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void handleTakeValue_forUnboundKey_(NSObject value, NSString? key) {
+    return _lib._objc_msgSend_122(
+        _id,
+        _lib._sel_handleTakeValue_forUnboundKey_1,
+        value._id,
+        key?._id ?? ffi.nullptr);
+  }
+
+  void unableToSetNilForKey_(NSString? key) {
+    return _lib._objc_msgSend_186(
+        _id, _lib._sel_unableToSetNilForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  NSDictionary valuesForKeys_(NSArray? keys) {
+    final _ret = _lib._objc_msgSend_443(
+        _id, _lib._sel_valuesForKeys_1, keys?._id ?? ffi.nullptr);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  void takeValuesFromDictionary_(NSDictionary? properties) {
+    return _lib._objc_msgSend_444(_id, _lib._sel_takeValuesFromDictionary_1,
+        properties?._id ?? ffi.nullptr);
+  }
+
+  void observeValueForKeyPath_ofObject_change_context_(NSString? keyPath,
+      NSObject object, NSDictionary? change, ffi.Pointer<ffi.Void> context) {
+    return _lib._objc_msgSend_445(
+        _id,
+        _lib._sel_observeValueForKeyPath_ofObject_change_context_1,
+        keyPath?._id ?? ffi.nullptr,
+        object._id,
+        change?._id ?? ffi.nullptr,
+        context);
+  }
+
+  void addObserver_forKeyPath_options_context_(NSObject? observer,
+      NSString? keyPath, int options, ffi.Pointer<ffi.Void> context) {
+    return _lib._objc_msgSend_126(
+        _id,
+        _lib._sel_addObserver_forKeyPath_options_context_1,
+        observer?._id ?? ffi.nullptr,
+        keyPath?._id ?? ffi.nullptr,
+        options,
+        context);
+  }
+
+  void removeObserver_forKeyPath_context_(
+      NSObject? observer, NSString? keyPath, ffi.Pointer<ffi.Void> context) {
+    return _lib._objc_msgSend_127(
+        _id,
+        _lib._sel_removeObserver_forKeyPath_context_1,
+        observer?._id ?? ffi.nullptr,
+        keyPath?._id ?? ffi.nullptr,
+        context);
+  }
+
+  void removeObserver_forKeyPath_(NSObject? observer, NSString? keyPath) {
+    return _lib._objc_msgSend_128(_id, _lib._sel_removeObserver_forKeyPath_1,
+        observer?._id ?? ffi.nullptr, keyPath?._id ?? ffi.nullptr);
+  }
+
+  void willChangeValueForKey_(NSString? key) {
+    return _lib._objc_msgSend_186(
+        _id, _lib._sel_willChangeValueForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  void didChangeValueForKey_(NSString? key) {
+    return _lib._objc_msgSend_186(
+        _id, _lib._sel_didChangeValueForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  void willChange_valuesAtIndexes_forKey_(
+      int changeKind, NSIndexSet? indexes, NSString? key) {
+    return _lib._objc_msgSend_446(
+        _id,
+        _lib._sel_willChange_valuesAtIndexes_forKey_1,
+        changeKind,
+        indexes?._id ?? ffi.nullptr,
+        key?._id ?? ffi.nullptr);
+  }
+
+  void didChange_valuesAtIndexes_forKey_(
+      int changeKind, NSIndexSet? indexes, NSString? key) {
+    return _lib._objc_msgSend_446(
+        _id,
+        _lib._sel_didChange_valuesAtIndexes_forKey_1,
+        changeKind,
+        indexes?._id ?? ffi.nullptr,
+        key?._id ?? ffi.nullptr);
+  }
+
+  void willChangeValueForKey_withSetMutation_usingObjects_(
+      NSString? key, int mutationKind, NSSet? objects) {
+    return _lib._objc_msgSend_447(
+        _id,
+        _lib._sel_willChangeValueForKey_withSetMutation_usingObjects_1,
+        key?._id ?? ffi.nullptr,
+        mutationKind,
+        objects?._id ?? ffi.nullptr);
+  }
+
+  void didChangeValueForKey_withSetMutation_usingObjects_(
+      NSString? key, int mutationKind, NSSet? objects) {
+    return _lib._objc_msgSend_447(
+        _id,
+        _lib._sel_didChangeValueForKey_withSetMutation_usingObjects_1,
+        key?._id ?? ffi.nullptr,
+        mutationKind,
+        objects?._id ?? ffi.nullptr);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSObject1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSObject1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  ffi.Pointer<ffi.Void> get observationInfo {
+    return _lib._objc_msgSend_19(_id, _lib._sel_observationInfo1);
+  }
+
+  set observationInfo(ffi.Pointer<ffi.Void> value) {
+    _lib._objc_msgSend_448(_id, _lib._sel_setObservationInfo_1, value);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSObject1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  NSObject get classForKeyedArchiver {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_classForKeyedArchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject replacementObjectForKeyedArchiver_(NSKeyedArchiver? archiver) {
+    final _ret = _lib._objc_msgSend_461(
+        _id,
+        _lib._sel_replacementObjectForKeyedArchiver_1,
+        archiver?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSObject1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSObject1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void performSelectorOnMainThread_withObject_waitUntilDone_modes_(
+      ffi.Pointer<ObjCSel> aSelector, NSObject arg, bool wait, NSArray? array) {
+    return _lib._objc_msgSend_462(
+        _id,
+        _lib._sel_performSelectorOnMainThread_withObject_waitUntilDone_modes_1,
+        aSelector,
+        arg._id,
+        wait,
+        array?._id ?? ffi.nullptr);
+  }
+
+  void performSelectorOnMainThread_withObject_waitUntilDone_(
+      ffi.Pointer<ObjCSel> aSelector, NSObject arg, bool wait) {
+    return _lib._objc_msgSend_463(
+        _id,
+        _lib._sel_performSelectorOnMainThread_withObject_waitUntilDone_1,
+        aSelector,
+        arg._id,
+        wait);
+  }
+
+  void performSelector_onThread_withObject_waitUntilDone_modes_(
+      ffi.Pointer<ObjCSel> aSelector,
+      NSThread? thr,
+      NSObject arg,
+      bool wait,
+      NSArray? array) {
+    return _lib._objc_msgSend_480(
+        _id,
+        _lib._sel_performSelector_onThread_withObject_waitUntilDone_modes_1,
+        aSelector,
+        thr?._id ?? ffi.nullptr,
+        arg._id,
+        wait,
+        array?._id ?? ffi.nullptr);
+  }
+
+  void performSelector_onThread_withObject_waitUntilDone_(
+      ffi.Pointer<ObjCSel> aSelector, NSThread? thr, NSObject arg, bool wait) {
+    return _lib._objc_msgSend_481(
+        _id,
+        _lib._sel_performSelector_onThread_withObject_waitUntilDone_1,
+        aSelector,
+        thr?._id ?? ffi.nullptr,
+        arg._id,
+        wait);
+  }
+
+  void performSelectorInBackground_withObject_(
+      ffi.Pointer<ObjCSel> aSelector, NSObject arg) {
+    return _lib._objc_msgSend_82(_id,
+        _lib._sel_performSelectorInBackground_withObject_1, aSelector, arg._id);
+  }
+
+  NSObject get classForArchiver {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_classForArchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject replacementObjectForArchiver_(NSArchiver? archiver) {
+    final _ret = _lib._objc_msgSend_484(_id,
+        _lib._sel_replacementObjectForArchiver_1, archiver?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject get classForPortCoder {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_classForPortCoder1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject replacementObjectForPortCoder_(NSPortCoder? coder) {
+    final _ret = _lib._objc_msgSend_522(_id,
+        _lib._sel_replacementObjectForPortCoder_1, coder?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSClassDescription? get classDescription {
+    final _ret = _lib._objc_msgSend_525(_id, _lib._sel_classDescription1);
+    return _ret.address == 0
+        ? null
+        : NSClassDescription._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get attributeKeys {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_attributeKeys1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get toOneRelationshipKeys {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_toOneRelationshipKeys1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get toManyRelationshipKeys {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_toManyRelationshipKeys1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString inverseForRelationshipKey_(NSString? relationshipKey) {
+    final _ret = _lib._objc_msgSend_64(
+        _id,
+        _lib._sel_inverseForRelationshipKey_1,
+        relationshipKey?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject scriptingValueForSpecifier_(
+      NSScriptObjectSpecifier? objectSpecifier) {
+    final _ret = _lib._objc_msgSend_569(
+        _id,
+        _lib._sel_scriptingValueForSpecifier_1,
+        objectSpecifier?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary? get scriptingProperties {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_scriptingProperties1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  set scriptingProperties(NSDictionary? value) {
+    _lib._objc_msgSend_165(
+        _id, _lib._sel_setScriptingProperties_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSObject copyScriptingValue_forKey_withProperties_(
+      NSObject value, NSString? key, NSDictionary? properties) {
+    final _ret = _lib._objc_msgSend_570(
+        _id,
+        _lib._sel_copyScriptingValue_forKey_withProperties_1,
+        value._id,
+        key?._id ?? ffi.nullptr,
+        properties?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSObject
+      newScriptingObjectOfClass_forValueForKey_withContentsValue_properties_(
+          NSObject objectClass,
+          NSString? key,
+          NSObject contentsValue,
+          NSDictionary? properties) {
+    final _ret = _lib._objc_msgSend_571(
+        _id,
+        _lib._sel_newScriptingObjectOfClass_forValueForKey_withContentsValue_properties_1,
+        objectClass._id,
+        key?._id ?? ffi.nullptr,
+        contentsValue._id,
+        properties?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: false, release: true);
+  }
+
+  int get classCode {
+    return _lib._objc_msgSend_191(_id, _lib._sel_classCode1);
+  }
+
+  NSString? get className {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_className1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject valueAtIndex_inPropertyWithKey_(int index, NSString? key) {
+    final _ret = _lib._objc_msgSend_572(
+        _id,
+        _lib._sel_valueAtIndex_inPropertyWithKey_1,
+        index,
+        key?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject valueWithName_inPropertyWithKey_(NSString? name, NSString? key) {
+    final _ret = _lib._objc_msgSend_159(
+        _id,
+        _lib._sel_valueWithName_inPropertyWithKey_1,
+        name?._id ?? ffi.nullptr,
+        key?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject valueWithUniqueID_inPropertyWithKey_(
+      NSObject uniqueID, NSString? key) {
+    final _ret = _lib._objc_msgSend_272(
+        _id,
+        _lib._sel_valueWithUniqueID_inPropertyWithKey_1,
+        uniqueID._id,
+        key?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void insertValue_atIndex_inPropertyWithKey_(
+      NSObject value, int index, NSString? key) {
+    return _lib._objc_msgSend_573(
+        _id,
+        _lib._sel_insertValue_atIndex_inPropertyWithKey_1,
+        value._id,
+        index,
+        key?._id ?? ffi.nullptr);
+  }
+
+  void removeValueAtIndex_fromPropertyWithKey_(int index, NSString? key) {
+    return _lib._objc_msgSend_574(
+        _id,
+        _lib._sel_removeValueAtIndex_fromPropertyWithKey_1,
+        index,
+        key?._id ?? ffi.nullptr);
+  }
+
+  void replaceValueAtIndex_inPropertyWithKey_withValue_(
+      int index, NSString? key, NSObject value) {
+    return _lib._objc_msgSend_575(
+        _id,
+        _lib._sel_replaceValueAtIndex_inPropertyWithKey_withValue_1,
+        index,
+        key?._id ?? ffi.nullptr,
+        value._id);
+  }
+
+  void insertValue_inPropertyWithKey_(NSObject value, NSString? key) {
+    return _lib._objc_msgSend_122(
+        _id,
+        _lib._sel_insertValue_inPropertyWithKey_1,
+        value._id,
+        key?._id ?? ffi.nullptr);
+  }
+
+  NSObject coerceValue_forKey_(NSObject value, NSString? key) {
+    final _ret = _lib._objc_msgSend_272(_id, _lib._sel_coerceValue_forKey_1,
+        value._id, key?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSScriptObjectSpecifier? get objectSpecifier {
+    final _ret = _lib._objc_msgSend_556(_id, _lib._sel_objectSpecifier1);
+    return _ret.address == 0
+        ? null
+        : NSScriptObjectSpecifier._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray indicesOfObjectsByEvaluatingObjectSpecifier_(
+      NSScriptObjectSpecifier? specifier) {
+    final _ret = _lib._objc_msgSend_576(
+        _id,
+        _lib._sel_indicesOfObjectsByEvaluatingObjectSpecifier_1,
+        specifier?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool isEqualTo_(NSObject object) {
+    return _lib._objc_msgSend_0(_id, _lib._sel_isEqualTo_1, object._id);
+  }
+
+  bool isLessThanOrEqualTo_(NSObject object) {
+    return _lib._objc_msgSend_0(
+        _id, _lib._sel_isLessThanOrEqualTo_1, object._id);
+  }
+
+  bool isLessThan_(NSObject object) {
+    return _lib._objc_msgSend_0(_id, _lib._sel_isLessThan_1, object._id);
+  }
+
+  bool isGreaterThanOrEqualTo_(NSObject object) {
+    return _lib._objc_msgSend_0(
+        _id, _lib._sel_isGreaterThanOrEqualTo_1, object._id);
+  }
+
+  bool isGreaterThan_(NSObject object) {
+    return _lib._objc_msgSend_0(_id, _lib._sel_isGreaterThan_1, object._id);
+  }
+
+  bool isNotEqualTo_(NSObject object) {
+    return _lib._objc_msgSend_0(_id, _lib._sel_isNotEqualTo_1, object._id);
+  }
+
+  bool doesContain_(NSObject object) {
+    return _lib._objc_msgSend_0(_id, _lib._sel_doesContain_1, object._id);
+  }
+
+  bool isLike_(NSString? object) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_isLike_1, object?._id ?? ffi.nullptr);
+  }
+
+  bool isCaseInsensitiveLike_(NSString? object) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_isCaseInsensitiveLike_1, object?._id ?? ffi.nullptr);
+  }
+
+  bool scriptingIsEqualTo_(NSObject object) {
+    return _lib._objc_msgSend_0(
+        _id, _lib._sel_scriptingIsEqualTo_1, object._id);
+  }
+
+  bool scriptingIsLessThanOrEqualTo_(NSObject object) {
+    return _lib._objc_msgSend_0(
+        _id, _lib._sel_scriptingIsLessThanOrEqualTo_1, object._id);
+  }
+
+  bool scriptingIsLessThan_(NSObject object) {
+    return _lib._objc_msgSend_0(
+        _id, _lib._sel_scriptingIsLessThan_1, object._id);
+  }
+
+  bool scriptingIsGreaterThanOrEqualTo_(NSObject object) {
+    return _lib._objc_msgSend_0(
+        _id, _lib._sel_scriptingIsGreaterThanOrEqualTo_1, object._id);
+  }
+
+  bool scriptingIsGreaterThan_(NSObject object) {
+    return _lib._objc_msgSend_0(
+        _id, _lib._sel_scriptingIsGreaterThan_1, object._id);
+  }
+
+  bool scriptingBeginsWith_(NSObject object) {
+    return _lib._objc_msgSend_0(
+        _id, _lib._sel_scriptingBeginsWith_1, object._id);
+  }
+
+  bool scriptingEndsWith_(NSObject object) {
+    return _lib._objc_msgSend_0(_id, _lib._sel_scriptingEndsWith_1, object._id);
+  }
+
+  bool scriptingContains_(NSObject object) {
+    return _lib._objc_msgSend_0(_id, _lib._sel_scriptingContains_1, object._id);
+  }
+}
+
+class ObjCSel extends ffi.Opaque {}
+
+class ObjCObject extends ffi.Opaque {}
+
+typedef instancetype = ffi.Pointer<ObjCObject>;
+
+class _NSZone extends ffi.Opaque {}
+
+class Protocol extends _ObjCWrapper {
+  Protocol._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [Protocol] that points to the same underlying object as [other].
+  static Protocol castFrom<T extends _ObjCWrapper>(T other) {
+    return Protocol._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [Protocol] that wraps the given raw object pointer.
+  static Protocol castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return Protocol._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [Protocol].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_Protocol1);
+  }
+}
+
+typedef IMP = ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>;
+
+class NSInvocation extends NSObject {
+  NSInvocation._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSInvocation] that points to the same underlying object as [other].
+  static NSInvocation castFrom<T extends _ObjCWrapper>(T other) {
+    return NSInvocation._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSInvocation] that wraps the given raw object pointer.
+  static NSInvocation castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSInvocation._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSInvocation].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSInvocation1);
+  }
+
+  static NSInvocation invocationWithMethodSignature_(
+      SwiftLibrary _lib, NSMethodSignature? sig) {
+    final _ret = _lib._objc_msgSend_366(_lib._class_NSInvocation1,
+        _lib._sel_invocationWithMethodSignature_1, sig?._id ?? ffi.nullptr);
+    return NSInvocation._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSMethodSignature? get methodSignature {
+    final _ret = _lib._objc_msgSend_367(_id, _lib._sel_methodSignature1);
+    return _ret.address == 0
+        ? null
+        : NSMethodSignature._(_ret, _lib, retain: true, release: true);
+  }
+
+  void retainArguments() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_retainArguments1);
+  }
+
+  bool get argumentsRetained {
+    return _lib._objc_msgSend_12(_id, _lib._sel_argumentsRetained1);
+  }
+
+  NSObject get target {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_target1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  set target(NSObject value) {
+    _lib._objc_msgSend_368(_id, _lib._sel_setTarget_1, value._id);
+  }
+
+  ffi.Pointer<ObjCSel> get selector {
+    return _lib._objc_msgSend_369(_id, _lib._sel_selector1);
+  }
+
+  set selector(ffi.Pointer<ObjCSel> value) {
+    _lib._objc_msgSend_370(_id, _lib._sel_setSelector_1, value);
+  }
+
+  void getReturnValue_(ffi.Pointer<ffi.Void> retLoc) {
+    return _lib._objc_msgSend_47(_id, _lib._sel_getReturnValue_1, retLoc);
+  }
+
+  void setReturnValue_(ffi.Pointer<ffi.Void> retLoc) {
+    return _lib._objc_msgSend_47(_id, _lib._sel_setReturnValue_1, retLoc);
+  }
+
+  void getArgument_atIndex_(ffi.Pointer<ffi.Void> argumentLocation, int idx) {
+    return _lib._objc_msgSend_371(
+        _id, _lib._sel_getArgument_atIndex_1, argumentLocation, idx);
+  }
+
+  void setArgument_atIndex_(ffi.Pointer<ffi.Void> argumentLocation, int idx) {
+    return _lib._objc_msgSend_371(
+        _id, _lib._sel_setArgument_atIndex_1, argumentLocation, idx);
+  }
+
+  void invoke() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_invoke1);
+  }
+
+  void invokeWithTarget_(NSObject target) {
+    return _lib._objc_msgSend_15(_id, _lib._sel_invokeWithTarget_1, target._id);
+  }
+
+  static NSInvocation new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSInvocation1, _lib._sel_new1);
+    return NSInvocation._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSInvocation alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSInvocation1, _lib._sel_alloc1);
+    return NSInvocation._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSInvocation1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSInvocation1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSInvocation1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSInvocation1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSInvocation1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSInvocation1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSInvocation1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSInvocation1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSInvocation1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSMethodSignature extends NSObject {
+  NSMethodSignature._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSMethodSignature] that points to the same underlying object as [other].
+  static NSMethodSignature castFrom<T extends _ObjCWrapper>(T other) {
+    return NSMethodSignature._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSMethodSignature] that wraps the given raw object pointer.
+  static NSMethodSignature castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSMethodSignature._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSMethodSignature].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSMethodSignature1);
+  }
+
+  static NSMethodSignature signatureWithObjCTypes_(
+      SwiftLibrary _lib, ffi.Pointer<ffi.Char> types) {
+    final _ret = _lib._objc_msgSend_9(_lib._class_NSMethodSignature1,
+        _lib._sel_signatureWithObjCTypes_1, types);
+    return NSMethodSignature._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get numberOfArguments {
+    return _lib._objc_msgSend_10(_id, _lib._sel_numberOfArguments1);
+  }
+
+  ffi.Pointer<ffi.Char> getArgumentTypeAtIndex_(int idx) {
+    return _lib._objc_msgSend_11(_id, _lib._sel_getArgumentTypeAtIndex_1, idx);
+  }
+
+  int get frameLength {
+    return _lib._objc_msgSend_10(_id, _lib._sel_frameLength1);
+  }
+
+  bool isOneway() {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isOneway1);
+  }
+
+  ffi.Pointer<ffi.Char> get methodReturnType {
+    return _lib._objc_msgSend_13(_id, _lib._sel_methodReturnType1);
+  }
+
+  int get methodReturnLength {
+    return _lib._objc_msgSend_10(_id, _lib._sel_methodReturnLength1);
+  }
+
+  static NSMethodSignature new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMethodSignature1, _lib._sel_new1);
+    return NSMethodSignature._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSMethodSignature alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMethodSignature1, _lib._sel_alloc1);
+    return NSMethodSignature._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSMethodSignature1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSMethodSignature1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSMethodSignature1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSMethodSignature1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSMethodSignature1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSMethodSignature1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSMethodSignature1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSMethodSignature1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSMethodSignature1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef NSUInteger = ffi.UnsignedLong;
+
+class NSSet extends NSObject {
+  NSSet._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSSet] that points to the same underlying object as [other].
+  static NSSet castFrom<T extends _ObjCWrapper>(T other) {
+    return NSSet._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSSet] that wraps the given raw object pointer.
+  static NSSet castFromPointer(SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSSet._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSSet].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSSet1);
+  }
+
+  int get count {
+    return _lib._objc_msgSend_10(_id, _lib._sel_count1);
+  }
+
+  NSObject member_(NSObject object) {
+    final _ret = _lib._objc_msgSend_16(_id, _lib._sel_member_1, object._id);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSEnumerator objectEnumerator() {
+    final _ret = _lib._objc_msgSend_72(_id, _lib._sel_objectEnumerator1);
+    return NSEnumerator._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSSet init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSSet initWithObjects_count_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> objects, int cnt) {
+    final _ret = _lib._objc_msgSend_61(
+        _id, _lib._sel_initWithObjects_count_1, objects, cnt);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSSet initWithCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get allObjects {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_allObjects1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject anyObject() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_anyObject1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool containsObject_(NSObject anObject) {
+    return _lib._objc_msgSend_0(_id, _lib._sel_containsObject_1, anObject._id);
+  }
+
+  NSString? get description {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_description1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString descriptionWithLocale_(NSObject locale) {
+    final _ret = _lib._objc_msgSend_65(
+        _id, _lib._sel_descriptionWithLocale_1, locale._id);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool intersectsSet_(NSSet? otherSet) {
+    return _lib._objc_msgSend_355(
+        _id, _lib._sel_intersectsSet_1, otherSet?._id ?? ffi.nullptr);
+  }
+
+  bool isEqualToSet_(NSSet? otherSet) {
+    return _lib._objc_msgSend_355(
+        _id, _lib._sel_isEqualToSet_1, otherSet?._id ?? ffi.nullptr);
+  }
+
+  bool isSubsetOfSet_(NSSet? otherSet) {
+    return _lib._objc_msgSend_355(
+        _id, _lib._sel_isSubsetOfSet_1, otherSet?._id ?? ffi.nullptr);
+  }
+
+  void makeObjectsPerformSelector_(ffi.Pointer<ObjCSel> aSelector) {
+    return _lib._objc_msgSend_7(
+        _id, _lib._sel_makeObjectsPerformSelector_1, aSelector);
+  }
+
+  void makeObjectsPerformSelector_withObject_(
+      ffi.Pointer<ObjCSel> aSelector, NSObject argument) {
+    return _lib._objc_msgSend_82(
+        _id,
+        _lib._sel_makeObjectsPerformSelector_withObject_1,
+        aSelector,
+        argument._id);
+  }
+
+  NSSet setByAddingObject_(NSObject anObject) {
+    final _ret = _lib._objc_msgSend_356(
+        _id, _lib._sel_setByAddingObject_1, anObject._id);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSSet setByAddingObjectsFromSet_(NSSet? other) {
+    final _ret = _lib._objc_msgSend_357(
+        _id, _lib._sel_setByAddingObjectsFromSet_1, other?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSSet setByAddingObjectsFromArray_(NSArray? other) {
+    final _ret = _lib._objc_msgSend_358(_id,
+        _lib._sel_setByAddingObjectsFromArray_1, other?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  void enumerateObjectsUsingBlock_(ObjCBlock13 block) {
+    return _lib._objc_msgSend_359(
+        _id, _lib._sel_enumerateObjectsUsingBlock_1, block._id);
+  }
+
+  void enumerateObjectsWithOptions_usingBlock_(int opts, ObjCBlock13 block) {
+    return _lib._objc_msgSend_360(_id,
+        _lib._sel_enumerateObjectsWithOptions_usingBlock_1, opts, block._id);
+  }
+
+  NSSet objectsPassingTest_(ObjCBlock14 predicate) {
+    final _ret = _lib._objc_msgSend_361(
+        _id, _lib._sel_objectsPassingTest_1, predicate._id);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSSet objectsWithOptions_passingTest_(int opts, ObjCBlock14 predicate) {
+    final _ret = _lib._objc_msgSend_362(
+        _id, _lib._sel_objectsWithOptions_passingTest_1, opts, predicate._id);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSSet set1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSSet1, _lib._sel_set1);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSSet setWithObject_(SwiftLibrary _lib, NSObject object) {
+    final _ret = _lib._objc_msgSend_16(
+        _lib._class_NSSet1, _lib._sel_setWithObject_1, object._id);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSSet setWithObjects_count_(SwiftLibrary _lib,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> objects, int cnt) {
+    final _ret = _lib._objc_msgSend_61(
+        _lib._class_NSSet1, _lib._sel_setWithObjects_count_1, objects, cnt);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSSet setWithObjects_(SwiftLibrary _lib, NSObject firstObj) {
+    final _ret = _lib._objc_msgSend_16(
+        _lib._class_NSSet1, _lib._sel_setWithObjects_1, firstObj._id);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSSet setWithSet_(SwiftLibrary _lib, NSSet? set) {
+    final _ret = _lib._objc_msgSend_363(
+        _lib._class_NSSet1, _lib._sel_setWithSet_1, set?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSSet setWithArray_(SwiftLibrary _lib, NSArray? array) {
+    final _ret = _lib._objc_msgSend_67(_lib._class_NSSet1,
+        _lib._sel_setWithArray_1, array?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSSet initWithObjects_(NSObject firstObj) {
+    final _ret =
+        _lib._objc_msgSend_16(_id, _lib._sel_initWithObjects_1, firstObj._id);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSSet initWithSet_(NSSet? set) {
+    final _ret = _lib._objc_msgSend_363(
+        _id, _lib._sel_initWithSet_1, set?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSSet initWithSet_copyItems_(NSSet? set, bool flag) {
+    final _ret = _lib._objc_msgSend_364(
+        _id, _lib._sel_initWithSet_copyItems_1, set?._id ?? ffi.nullptr, flag);
+    return NSSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSSet initWithArray_(NSArray? array) {
+    final _ret = _lib._objc_msgSend_67(
+        _id, _lib._sel_initWithArray_1, array?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSObject valueForKey_(NSString? key) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_valueForKey_1, key?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  void setValue_forKey_(NSObject value, NSString? key) {
+    return _lib._objc_msgSend_122(
+        _id, _lib._sel_setValue_forKey_1, value._id, key?._id ?? ffi.nullptr);
+  }
+
+  @override
+  void addObserver_forKeyPath_options_context_(NSObject? observer,
+      NSString? keyPath, int options, ffi.Pointer<ffi.Void> context) {
+    return _lib._objc_msgSend_126(
+        _id,
+        _lib._sel_addObserver_forKeyPath_options_context_1,
+        observer?._id ?? ffi.nullptr,
+        keyPath?._id ?? ffi.nullptr,
+        options,
+        context);
+  }
+
+  @override
+  void removeObserver_forKeyPath_context_(
+      NSObject? observer, NSString? keyPath, ffi.Pointer<ffi.Void> context) {
+    return _lib._objc_msgSend_127(
+        _id,
+        _lib._sel_removeObserver_forKeyPath_context_1,
+        observer?._id ?? ffi.nullptr,
+        keyPath?._id ?? ffi.nullptr,
+        context);
+  }
+
+  @override
+  void removeObserver_forKeyPath_(NSObject? observer, NSString? keyPath) {
+    return _lib._objc_msgSend_128(_id, _lib._sel_removeObserver_forKeyPath_1,
+        observer?._id ?? ffi.nullptr, keyPath?._id ?? ffi.nullptr);
+  }
+
+  NSArray sortedArrayUsingDescriptors_(NSArray? sortDescriptors) {
+    final _ret = _lib._objc_msgSend_63(
+        _id,
+        _lib._sel_sortedArrayUsingDescriptors_1,
+        sortDescriptors?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSSet filteredSetUsingPredicate_(NSPredicate? predicate) {
+    final _ret = _lib._objc_msgSend_365(_id,
+        _lib._sel_filteredSetUsingPredicate_1, predicate?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSSet new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSSet1, _lib._sel_new1);
+    return NSSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSSet alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSSet1, _lib._sel_alloc1);
+    return NSSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSSet1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSSet1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSSet1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSSet1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSSet1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSSet1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSSet1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSSet1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSSet1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSEnumerator extends NSObject {
+  NSEnumerator._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSEnumerator] that points to the same underlying object as [other].
+  static NSEnumerator castFrom<T extends _ObjCWrapper>(T other) {
+    return NSEnumerator._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSEnumerator] that wraps the given raw object pointer.
+  static NSEnumerator castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSEnumerator._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSEnumerator].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSEnumerator1);
+  }
+
+  NSObject nextObject() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_nextObject1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSEnumerator new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSEnumerator1, _lib._sel_new1);
+    return NSEnumerator._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSEnumerator alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSEnumerator1, _lib._sel_alloc1);
+    return NSEnumerator._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSEnumerator1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSEnumerator1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSEnumerator1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSEnumerator1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSEnumerator1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSEnumerator1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSEnumerator1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSEnumerator1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSEnumerator1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSString extends NSObject {
+  NSString._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSString] that points to the same underlying object as [other].
+  static NSString castFrom<T extends _ObjCWrapper>(T other) {
+    return NSString._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSString] that wraps the given raw object pointer.
+  static NSString castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSString._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSString].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSString1);
+  }
+
+  factory NSString(SwiftLibrary _lib, String str) {
+    final cstr = str.toNativeUtf8();
+    final nsstr = stringWithCString_encoding_(_lib, cstr.cast(), 4 /* UTF8 */);
+    pkg_ffi.calloc.free(cstr);
+    return nsstr;
+  }
+
+  @override
+  String toString() => (UTF8String).cast<pkg_ffi.Utf8>().toDartString();
+  int get length {
+    return _lib._objc_msgSend_10(_id, _lib._sel_length1);
+  }
+
+  int characterAtIndex_(int index) {
+    return _lib._objc_msgSend_17(_id, _lib._sel_characterAtIndex_1, index);
+  }
+
+  @override
+  NSString init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString initWithCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString substringFromIndex_(int from) {
+    final _ret =
+        _lib._objc_msgSend_293(_id, _lib._sel_substringFromIndex_1, from);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString substringToIndex_(int to) {
+    final _ret = _lib._objc_msgSend_293(_id, _lib._sel_substringToIndex_1, to);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString substringWithRange_(NSRange range) {
+    final _ret =
+        _lib._objc_msgSend_294(_id, _lib._sel_substringWithRange_1, range);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  void getCharacters_range_(ffi.Pointer<unichar> buffer, NSRange range) {
+    return _lib._objc_msgSend_295(
+        _id, _lib._sel_getCharacters_range_1, buffer, range);
+  }
+
+  int compare_(NSString? string) {
+    return _lib._objc_msgSend_296(
+        _id, _lib._sel_compare_1, string?._id ?? ffi.nullptr);
+  }
+
+  int compare_options_(NSString? string, int mask) {
+    return _lib._objc_msgSend_297(
+        _id, _lib._sel_compare_options_1, string?._id ?? ffi.nullptr, mask);
+  }
+
+  int compare_options_range_(
+      NSString? string, int mask, NSRange rangeOfReceiverToCompare) {
+    return _lib._objc_msgSend_298(_id, _lib._sel_compare_options_range_1,
+        string?._id ?? ffi.nullptr, mask, rangeOfReceiverToCompare);
+  }
+
+  int compare_options_range_locale_(NSString? string, int mask,
+      NSRange rangeOfReceiverToCompare, NSObject locale) {
+    return _lib._objc_msgSend_299(_id, _lib._sel_compare_options_range_locale_1,
+        string?._id ?? ffi.nullptr, mask, rangeOfReceiverToCompare, locale._id);
+  }
+
+  int caseInsensitiveCompare_(NSString? string) {
+    return _lib._objc_msgSend_296(
+        _id, _lib._sel_caseInsensitiveCompare_1, string?._id ?? ffi.nullptr);
+  }
+
+  int localizedCompare_(NSString? string) {
+    return _lib._objc_msgSend_296(
+        _id, _lib._sel_localizedCompare_1, string?._id ?? ffi.nullptr);
+  }
+
+  int localizedCaseInsensitiveCompare_(NSString? string) {
+    return _lib._objc_msgSend_296(
+        _id,
+        _lib._sel_localizedCaseInsensitiveCompare_1,
+        string?._id ?? ffi.nullptr);
+  }
+
+  int localizedStandardCompare_(NSString? string) {
+    return _lib._objc_msgSend_296(
+        _id, _lib._sel_localizedStandardCompare_1, string?._id ?? ffi.nullptr);
+  }
+
+  bool isEqualToString_(NSString? aString) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_isEqualToString_1, aString?._id ?? ffi.nullptr);
+  }
+
+  bool hasPrefix_(NSString? str) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_hasPrefix_1, str?._id ?? ffi.nullptr);
+  }
+
+  bool hasSuffix_(NSString? str) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_hasSuffix_1, str?._id ?? ffi.nullptr);
+  }
+
+  NSString commonPrefixWithString_options_(NSString? str, int mask) {
+    final _ret = _lib._objc_msgSend_300(
+        _id,
+        _lib._sel_commonPrefixWithString_options_1,
+        str?._id ?? ffi.nullptr,
+        mask);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool containsString_(NSString? str) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_containsString_1, str?._id ?? ffi.nullptr);
+  }
+
+  bool localizedCaseInsensitiveContainsString_(NSString? str) {
+    return _lib._objc_msgSend_59(
+        _id,
+        _lib._sel_localizedCaseInsensitiveContainsString_1,
+        str?._id ?? ffi.nullptr);
+  }
+
+  bool localizedStandardContainsString_(NSString? str) {
+    return _lib._objc_msgSend_59(_id,
+        _lib._sel_localizedStandardContainsString_1, str?._id ?? ffi.nullptr);
+  }
+
+  NSRange localizedStandardRangeOfString_(NSString? str) {
+    return _lib._objc_msgSend_301(_id,
+        _lib._sel_localizedStandardRangeOfString_1, str?._id ?? ffi.nullptr);
+  }
+
+  NSRange rangeOfString_(NSString? searchString) {
+    return _lib._objc_msgSend_301(
+        _id, _lib._sel_rangeOfString_1, searchString?._id ?? ffi.nullptr);
+  }
+
+  NSRange rangeOfString_options_(NSString? searchString, int mask) {
+    return _lib._objc_msgSend_302(_id, _lib._sel_rangeOfString_options_1,
+        searchString?._id ?? ffi.nullptr, mask);
+  }
+
+  NSRange rangeOfString_options_range_(
+      NSString? searchString, int mask, NSRange rangeOfReceiverToSearch) {
+    return _lib._objc_msgSend_303(_id, _lib._sel_rangeOfString_options_range_1,
+        searchString?._id ?? ffi.nullptr, mask, rangeOfReceiverToSearch);
+  }
+
+  NSRange rangeOfString_options_range_locale_(NSString? searchString, int mask,
+      NSRange rangeOfReceiverToSearch, NSLocale? locale) {
+    return _lib._objc_msgSend_304(
+        _id,
+        _lib._sel_rangeOfString_options_range_locale_1,
+        searchString?._id ?? ffi.nullptr,
+        mask,
+        rangeOfReceiverToSearch,
+        locale?._id ?? ffi.nullptr);
+  }
+
+  NSRange rangeOfCharacterFromSet_(NSCharacterSet? searchSet) {
+    return _lib._objc_msgSend_305(_id, _lib._sel_rangeOfCharacterFromSet_1,
+        searchSet?._id ?? ffi.nullptr);
+  }
+
+  NSRange rangeOfCharacterFromSet_options_(
+      NSCharacterSet? searchSet, int mask) {
+    return _lib._objc_msgSend_306(
+        _id,
+        _lib._sel_rangeOfCharacterFromSet_options_1,
+        searchSet?._id ?? ffi.nullptr,
+        mask);
+  }
+
+  NSRange rangeOfCharacterFromSet_options_range_(
+      NSCharacterSet? searchSet, int mask, NSRange rangeOfReceiverToSearch) {
+    return _lib._objc_msgSend_307(
+        _id,
+        _lib._sel_rangeOfCharacterFromSet_options_range_1,
+        searchSet?._id ?? ffi.nullptr,
+        mask,
+        rangeOfReceiverToSearch);
+  }
+
+  NSRange rangeOfComposedCharacterSequenceAtIndex_(int index) {
+    return _lib._objc_msgSend_308(
+        _id, _lib._sel_rangeOfComposedCharacterSequenceAtIndex_1, index);
+  }
+
+  NSRange rangeOfComposedCharacterSequencesForRange_(NSRange range) {
+    return _lib._objc_msgSend_309(
+        _id, _lib._sel_rangeOfComposedCharacterSequencesForRange_1, range);
+  }
+
+  NSString stringByAppendingString_(NSString? aString) {
+    final _ret = _lib._objc_msgSend_64(
+        _id, _lib._sel_stringByAppendingString_1, aString?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString stringByAppendingFormat_(NSString? format) {
+    final _ret = _lib._objc_msgSend_64(
+        _id, _lib._sel_stringByAppendingFormat_1, format?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  double get doubleValue {
+    return _lib._objc_msgSend_149(_id, _lib._sel_doubleValue1);
+  }
+
+  double get floatValue {
+    return _lib._objc_msgSend_215(_id, _lib._sel_floatValue1);
+  }
+
+  int get intValue {
+    return _lib._objc_msgSend_213(_id, _lib._sel_intValue1);
+  }
+
+  int get integerValue {
+    return _lib._objc_msgSend_78(_id, _lib._sel_integerValue1);
+  }
+
+  int get longLongValue {
+    return _lib._objc_msgSend_214(_id, _lib._sel_longLongValue1);
+  }
+
+  bool get boolValue {
+    return _lib._objc_msgSend_12(_id, _lib._sel_boolValue1);
+  }
+
+  NSString? get uppercaseString {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_uppercaseString1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get lowercaseString {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_lowercaseString1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get capitalizedString {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_capitalizedString1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get localizedUppercaseString {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_localizedUppercaseString1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get localizedLowercaseString {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_localizedLowercaseString1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get localizedCapitalizedString {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_localizedCapitalizedString1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString uppercaseStringWithLocale_(NSLocale? locale) {
+    final _ret = _lib._objc_msgSend_310(
+        _id, _lib._sel_uppercaseStringWithLocale_1, locale?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString lowercaseStringWithLocale_(NSLocale? locale) {
+    final _ret = _lib._objc_msgSend_310(
+        _id, _lib._sel_lowercaseStringWithLocale_1, locale?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString capitalizedStringWithLocale_(NSLocale? locale) {
+    final _ret = _lib._objc_msgSend_310(_id,
+        _lib._sel_capitalizedStringWithLocale_1, locale?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  void getLineStart_end_contentsEnd_forRange_(
+      ffi.Pointer<NSUInteger> startPtr,
+      ffi.Pointer<NSUInteger> lineEndPtr,
+      ffi.Pointer<NSUInteger> contentsEndPtr,
+      NSRange range) {
+    return _lib._objc_msgSend_311(
+        _id,
+        _lib._sel_getLineStart_end_contentsEnd_forRange_1,
+        startPtr,
+        lineEndPtr,
+        contentsEndPtr,
+        range);
+  }
+
+  NSRange lineRangeForRange_(NSRange range) {
+    return _lib._objc_msgSend_309(_id, _lib._sel_lineRangeForRange_1, range);
+  }
+
+  void getParagraphStart_end_contentsEnd_forRange_(
+      ffi.Pointer<NSUInteger> startPtr,
+      ffi.Pointer<NSUInteger> parEndPtr,
+      ffi.Pointer<NSUInteger> contentsEndPtr,
+      NSRange range) {
+    return _lib._objc_msgSend_311(
+        _id,
+        _lib._sel_getParagraphStart_end_contentsEnd_forRange_1,
+        startPtr,
+        parEndPtr,
+        contentsEndPtr,
+        range);
+  }
+
+  NSRange paragraphRangeForRange_(NSRange range) {
+    return _lib._objc_msgSend_309(
+        _id, _lib._sel_paragraphRangeForRange_1, range);
+  }
+
+  void enumerateSubstringsInRange_options_usingBlock_(
+      NSRange range, int opts, ObjCBlock10 block) {
+    return _lib._objc_msgSend_312(
+        _id,
+        _lib._sel_enumerateSubstringsInRange_options_usingBlock_1,
+        range,
+        opts,
+        block._id);
+  }
+
+  void enumerateLinesUsingBlock_(ObjCBlock11 block) {
+    return _lib._objc_msgSend_313(
+        _id, _lib._sel_enumerateLinesUsingBlock_1, block._id);
+  }
+
+  ffi.Pointer<ffi.Char> get UTF8String {
+    return _lib._objc_msgSend_13(_id, _lib._sel_UTF8String1);
+  }
+
+  int get fastestEncoding {
+    return _lib._objc_msgSend_10(_id, _lib._sel_fastestEncoding1);
+  }
+
+  int get smallestEncoding {
+    return _lib._objc_msgSend_10(_id, _lib._sel_smallestEncoding1);
+  }
+
+  NSData dataUsingEncoding_allowLossyConversion_(int encoding, bool lossy) {
+    final _ret = _lib._objc_msgSend_314(_id,
+        _lib._sel_dataUsingEncoding_allowLossyConversion_1, encoding, lossy);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData dataUsingEncoding_(int encoding) {
+    final _ret =
+        _lib._objc_msgSend_315(_id, _lib._sel_dataUsingEncoding_1, encoding);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool canBeConvertedToEncoding_(int encoding) {
+    return _lib._objc_msgSend_89(
+        _id, _lib._sel_canBeConvertedToEncoding_1, encoding);
+  }
+
+  ffi.Pointer<ffi.Char> cStringUsingEncoding_(int encoding) {
+    return _lib._objc_msgSend_11(
+        _id, _lib._sel_cStringUsingEncoding_1, encoding);
+  }
+
+  bool getCString_maxLength_encoding_(
+      ffi.Pointer<ffi.Char> buffer, int maxBufferCount, int encoding) {
+    return _lib._objc_msgSend_316(
+        _id,
+        _lib._sel_getCString_maxLength_encoding_1,
+        buffer,
+        maxBufferCount,
+        encoding);
+  }
+
+  bool getBytes_maxLength_usedLength_encoding_options_range_remainingRange_(
+      ffi.Pointer<ffi.Void> buffer,
+      int maxBufferCount,
+      ffi.Pointer<NSUInteger> usedBufferCount,
+      int encoding,
+      int options,
+      NSRange range,
+      NSRangePointer leftover) {
+    return _lib._objc_msgSend_317(
+        _id,
+        _lib._sel_getBytes_maxLength_usedLength_encoding_options_range_remainingRange_1,
+        buffer,
+        maxBufferCount,
+        usedBufferCount,
+        encoding,
+        options,
+        range,
+        leftover);
+  }
+
+  int maximumLengthOfBytesUsingEncoding_(int enc) {
+    return _lib._objc_msgSend_86(
+        _id, _lib._sel_maximumLengthOfBytesUsingEncoding_1, enc);
+  }
+
+  int lengthOfBytesUsingEncoding_(int enc) {
+    return _lib._objc_msgSend_86(
+        _id, _lib._sel_lengthOfBytesUsingEncoding_1, enc);
+  }
+
+  static ffi.Pointer<NSStringEncoding> getAvailableStringEncodings(
+      SwiftLibrary _lib) {
+    return _lib._objc_msgSend_318(
+        _lib._class_NSString1, _lib._sel_availableStringEncodings1);
+  }
+
+  static NSString localizedNameOfStringEncoding_(
+      SwiftLibrary _lib, int encoding) {
+    final _ret = _lib._objc_msgSend_293(_lib._class_NSString1,
+        _lib._sel_localizedNameOfStringEncoding_1, encoding);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static int getDefaultCStringEncoding(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_10(
+        _lib._class_NSString1, _lib._sel_defaultCStringEncoding1);
+  }
+
+  NSString? get decomposedStringWithCanonicalMapping {
+    final _ret = _lib._objc_msgSend_20(
+        _id, _lib._sel_decomposedStringWithCanonicalMapping1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get precomposedStringWithCanonicalMapping {
+    final _ret = _lib._objc_msgSend_20(
+        _id, _lib._sel_precomposedStringWithCanonicalMapping1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get decomposedStringWithCompatibilityMapping {
+    final _ret = _lib._objc_msgSend_20(
+        _id, _lib._sel_decomposedStringWithCompatibilityMapping1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get precomposedStringWithCompatibilityMapping {
+    final _ret = _lib._objc_msgSend_20(
+        _id, _lib._sel_precomposedStringWithCompatibilityMapping1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray componentsSeparatedByString_(NSString? separator) {
+    final _ret = _lib._objc_msgSend_119(_id,
+        _lib._sel_componentsSeparatedByString_1, separator?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray componentsSeparatedByCharactersInSet_(NSCharacterSet? separator) {
+    final _ret = _lib._objc_msgSend_319(
+        _id,
+        _lib._sel_componentsSeparatedByCharactersInSet_1,
+        separator?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString stringByTrimmingCharactersInSet_(NSCharacterSet? set) {
+    final _ret = _lib._objc_msgSend_320(_id,
+        _lib._sel_stringByTrimmingCharactersInSet_1, set?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString stringByPaddingToLength_withString_startingAtIndex_(
+      int newLength, NSString? padString, int padIndex) {
+    final _ret = _lib._objc_msgSend_321(
+        _id,
+        _lib._sel_stringByPaddingToLength_withString_startingAtIndex_1,
+        newLength,
+        padString?._id ?? ffi.nullptr,
+        padIndex);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString stringByFoldingWithOptions_locale_(int options, NSLocale? locale) {
+    final _ret = _lib._objc_msgSend_322(
+        _id,
+        _lib._sel_stringByFoldingWithOptions_locale_1,
+        options,
+        locale?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString stringByReplacingOccurrencesOfString_withString_options_range_(
+      NSString? target,
+      NSString? replacement,
+      int options,
+      NSRange searchRange) {
+    final _ret = _lib._objc_msgSend_323(
+        _id,
+        _lib._sel_stringByReplacingOccurrencesOfString_withString_options_range_1,
+        target?._id ?? ffi.nullptr,
+        replacement?._id ?? ffi.nullptr,
+        options,
+        searchRange);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString stringByReplacingOccurrencesOfString_withString_(
+      NSString? target, NSString? replacement) {
+    final _ret = _lib._objc_msgSend_324(
+        _id,
+        _lib._sel_stringByReplacingOccurrencesOfString_withString_1,
+        target?._id ?? ffi.nullptr,
+        replacement?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString stringByReplacingCharactersInRange_withString_(
+      NSRange range, NSString? replacement) {
+    final _ret = _lib._objc_msgSend_325(
+        _id,
+        _lib._sel_stringByReplacingCharactersInRange_withString_1,
+        range,
+        replacement?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString stringByApplyingTransform_reverse_(
+      NSStringTransform transform, bool reverse) {
+    final _ret = _lib._objc_msgSend_326(
+        _id, _lib._sel_stringByApplyingTransform_reverse_1, transform, reverse);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool writeToURL_atomically_encoding_error_(NSURL? url, bool useAuxiliaryFile,
+      int enc, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_327(
+        _id,
+        _lib._sel_writeToURL_atomically_encoding_error_1,
+        url?._id ?? ffi.nullptr,
+        useAuxiliaryFile,
+        enc,
+        error);
+  }
+
+  bool writeToFile_atomically_encoding_error_(
+      NSString? path,
+      bool useAuxiliaryFile,
+      int enc,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_328(
+        _id,
+        _lib._sel_writeToFile_atomically_encoding_error_1,
+        path?._id ?? ffi.nullptr,
+        useAuxiliaryFile,
+        enc,
+        error);
+  }
+
+  NSString? get description {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_description1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get hash {
+    return _lib._objc_msgSend_10(_id, _lib._sel_hash1);
+  }
+
+  NSString initWithCharactersNoCopy_length_freeWhenDone_(
+      ffi.Pointer<unichar> characters, int length, bool freeBuffer) {
+    final _ret = _lib._objc_msgSend_329(
+        _id,
+        _lib._sel_initWithCharactersNoCopy_length_freeWhenDone_1,
+        characters,
+        length,
+        freeBuffer);
+    return NSString._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSString initWithCharactersNoCopy_length_deallocator_(
+      ffi.Pointer<unichar> chars, int len, ObjCBlock12 deallocator) {
+    final _ret = _lib._objc_msgSend_330(
+        _id,
+        _lib._sel_initWithCharactersNoCopy_length_deallocator_1,
+        chars,
+        len,
+        deallocator._id);
+    return NSString._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSString initWithCharacters_length_(
+      ffi.Pointer<unichar> characters, int length) {
+    final _ret = _lib._objc_msgSend_331(
+        _id, _lib._sel_initWithCharacters_length_1, characters, length);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString initWithUTF8String_(ffi.Pointer<ffi.Char> nullTerminatedCString) {
+    final _ret = _lib._objc_msgSend_332(
+        _id, _lib._sel_initWithUTF8String_1, nullTerminatedCString);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString initWithString_(NSString? aString) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initWithString_1, aString?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString initWithFormat_(NSString? format) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initWithFormat_1, format?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString initWithFormat_arguments_(
+      NSString? format, ffi.Pointer<__va_list_tag> argList) {
+    final _ret = _lib._objc_msgSend_333(
+        _id,
+        _lib._sel_initWithFormat_arguments_1,
+        format?._id ?? ffi.nullptr,
+        argList);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString initWithFormat_locale_(NSString? format, NSObject locale) {
+    final _ret = _lib._objc_msgSend_157(_id, _lib._sel_initWithFormat_locale_1,
+        format?._id ?? ffi.nullptr, locale._id);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString initWithFormat_locale_arguments_(
+      NSString? format, NSObject locale, ffi.Pointer<__va_list_tag> argList) {
+    final _ret = _lib._objc_msgSend_334(
+        _id,
+        _lib._sel_initWithFormat_locale_arguments_1,
+        format?._id ?? ffi.nullptr,
+        locale._id,
+        argList);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString initWithData_encoding_(NSData? data, int encoding) {
+    final _ret = _lib._objc_msgSend_335(_id, _lib._sel_initWithData_encoding_1,
+        data?._id ?? ffi.nullptr, encoding);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString initWithBytes_length_encoding_(
+      ffi.Pointer<ffi.Void> bytes, int len, int encoding) {
+    final _ret = _lib._objc_msgSend_336(
+        _id, _lib._sel_initWithBytes_length_encoding_1, bytes, len, encoding);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString initWithBytesNoCopy_length_encoding_freeWhenDone_(
+      ffi.Pointer<ffi.Void> bytes, int len, int encoding, bool freeBuffer) {
+    final _ret = _lib._objc_msgSend_337(
+        _id,
+        _lib._sel_initWithBytesNoCopy_length_encoding_freeWhenDone_1,
+        bytes,
+        len,
+        encoding,
+        freeBuffer);
+    return NSString._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSString initWithBytesNoCopy_length_encoding_deallocator_(
+      ffi.Pointer<ffi.Void> bytes,
+      int len,
+      int encoding,
+      ObjCBlock9 deallocator) {
+    final _ret = _lib._objc_msgSend_338(
+        _id,
+        _lib._sel_initWithBytesNoCopy_length_encoding_deallocator_1,
+        bytes,
+        len,
+        encoding,
+        deallocator._id);
+    return NSString._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSString string(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSString1, _lib._sel_string1);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString stringWithString_(SwiftLibrary _lib, NSString? string) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSString1,
+        _lib._sel_stringWithString_1, string?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString stringWithCharacters_length_(
+      SwiftLibrary _lib, ffi.Pointer<unichar> characters, int length) {
+    final _ret = _lib._objc_msgSend_331(_lib._class_NSString1,
+        _lib._sel_stringWithCharacters_length_1, characters, length);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString stringWithUTF8String_(
+      SwiftLibrary _lib, ffi.Pointer<ffi.Char> nullTerminatedCString) {
+    final _ret = _lib._objc_msgSend_332(_lib._class_NSString1,
+        _lib._sel_stringWithUTF8String_1, nullTerminatedCString);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString stringWithFormat_(SwiftLibrary _lib, NSString? format) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSString1,
+        _lib._sel_stringWithFormat_1, format?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString localizedStringWithFormat_(
+      SwiftLibrary _lib, NSString? format) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSString1,
+        _lib._sel_localizedStringWithFormat_1, format?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString initWithCString_encoding_(
+      ffi.Pointer<ffi.Char> nullTerminatedCString, int encoding) {
+    final _ret = _lib._objc_msgSend_339(_id,
+        _lib._sel_initWithCString_encoding_1, nullTerminatedCString, encoding);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString stringWithCString_encoding_(
+      SwiftLibrary _lib, ffi.Pointer<ffi.Char> cString, int enc) {
+    final _ret = _lib._objc_msgSend_339(_lib._class_NSString1,
+        _lib._sel_stringWithCString_encoding_1, cString, enc);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString initWithContentsOfURL_encoding_error_(
+      NSURL? url, int enc, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_340(
+        _id,
+        _lib._sel_initWithContentsOfURL_encoding_error_1,
+        url?._id ?? ffi.nullptr,
+        enc,
+        error);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString initWithContentsOfFile_encoding_error_(
+      NSString? path, int enc, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_341(
+        _id,
+        _lib._sel_initWithContentsOfFile_encoding_error_1,
+        path?._id ?? ffi.nullptr,
+        enc,
+        error);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString stringWithContentsOfURL_encoding_error_(SwiftLibrary _lib,
+      NSURL? url, int enc, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_340(
+        _lib._class_NSString1,
+        _lib._sel_stringWithContentsOfURL_encoding_error_1,
+        url?._id ?? ffi.nullptr,
+        enc,
+        error);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString stringWithContentsOfFile_encoding_error_(SwiftLibrary _lib,
+      NSString? path, int enc, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_341(
+        _lib._class_NSString1,
+        _lib._sel_stringWithContentsOfFile_encoding_error_1,
+        path?._id ?? ffi.nullptr,
+        enc,
+        error);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString initWithContentsOfURL_usedEncoding_error_(
+      NSURL? url,
+      ffi.Pointer<NSStringEncoding> enc,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_342(
+        _id,
+        _lib._sel_initWithContentsOfURL_usedEncoding_error_1,
+        url?._id ?? ffi.nullptr,
+        enc,
+        error);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString initWithContentsOfFile_usedEncoding_error_(
+      NSString? path,
+      ffi.Pointer<NSStringEncoding> enc,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_343(
+        _id,
+        _lib._sel_initWithContentsOfFile_usedEncoding_error_1,
+        path?._id ?? ffi.nullptr,
+        enc,
+        error);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString stringWithContentsOfURL_usedEncoding_error_(
+      SwiftLibrary _lib,
+      NSURL? url,
+      ffi.Pointer<NSStringEncoding> enc,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_342(
+        _lib._class_NSString1,
+        _lib._sel_stringWithContentsOfURL_usedEncoding_error_1,
+        url?._id ?? ffi.nullptr,
+        enc,
+        error);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString stringWithContentsOfFile_usedEncoding_error_(
+      SwiftLibrary _lib,
+      NSString? path,
+      ffi.Pointer<NSStringEncoding> enc,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_343(
+        _lib._class_NSString1,
+        _lib._sel_stringWithContentsOfFile_usedEncoding_error_1,
+        path?._id ?? ffi.nullptr,
+        enc,
+        error);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static int
+      stringEncodingForData_encodingOptions_convertedString_usedLossyConversion_(
+          SwiftLibrary _lib,
+          NSData? data,
+          NSDictionary? opts,
+          ffi.Pointer<ffi.Pointer<ObjCObject>> string,
+          ffi.Pointer<ffi.Bool> usedLossyConversion) {
+    return _lib._objc_msgSend_344(
+        _lib._class_NSString1,
+        _lib._sel_stringEncodingForData_encodingOptions_convertedString_usedLossyConversion_1,
+        data?._id ?? ffi.nullptr,
+        opts?._id ?? ffi.nullptr,
+        string,
+        usedLossyConversion);
+  }
+
+  NSObject propertyList() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_propertyList1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary propertyListFromStringsFileFormat() {
+    final _ret = _lib._objc_msgSend_164(
+        _id, _lib._sel_propertyListFromStringsFileFormat1);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  ffi.Pointer<ffi.Char> cString() {
+    return _lib._objc_msgSend_13(_id, _lib._sel_cString1);
+  }
+
+  ffi.Pointer<ffi.Char> lossyCString() {
+    return _lib._objc_msgSend_13(_id, _lib._sel_lossyCString1);
+  }
+
+  int cStringLength() {
+    return _lib._objc_msgSend_10(_id, _lib._sel_cStringLength1);
+  }
+
+  void getCString_(ffi.Pointer<ffi.Char> bytes) {
+    return _lib._objc_msgSend_251(_id, _lib._sel_getCString_1, bytes);
+  }
+
+  void getCString_maxLength_(ffi.Pointer<ffi.Char> bytes, int maxLength) {
+    return _lib._objc_msgSend_345(
+        _id, _lib._sel_getCString_maxLength_1, bytes, maxLength);
+  }
+
+  void getCString_maxLength_range_remainingRange_(ffi.Pointer<ffi.Char> bytes,
+      int maxLength, NSRange aRange, NSRangePointer leftoverRange) {
+    return _lib._objc_msgSend_346(
+        _id,
+        _lib._sel_getCString_maxLength_range_remainingRange_1,
+        bytes,
+        maxLength,
+        aRange,
+        leftoverRange);
+  }
+
+  bool writeToFile_atomically_(NSString? path, bool useAuxiliaryFile) {
+    return _lib._objc_msgSend_25(_id, _lib._sel_writeToFile_atomically_1,
+        path?._id ?? ffi.nullptr, useAuxiliaryFile);
+  }
+
+  bool writeToURL_atomically_(NSURL? url, bool atomically) {
+    return _lib._objc_msgSend_121(_id, _lib._sel_writeToURL_atomically_1,
+        url?._id ?? ffi.nullptr, atomically);
+  }
+
+  NSObject initWithContentsOfFile_(NSString? path) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initWithContentsOfFile_1, path?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject initWithContentsOfURL_(NSURL? url) {
+    final _ret = _lib._objc_msgSend_226(
+        _id, _lib._sel_initWithContentsOfURL_1, url?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject stringWithContentsOfFile_(SwiftLibrary _lib, NSString? path) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSString1,
+        _lib._sel_stringWithContentsOfFile_1, path?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject stringWithContentsOfURL_(SwiftLibrary _lib, NSURL? url) {
+    final _ret = _lib._objc_msgSend_226(_lib._class_NSString1,
+        _lib._sel_stringWithContentsOfURL_1, url?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject initWithCStringNoCopy_length_freeWhenDone_(
+      ffi.Pointer<ffi.Char> bytes, int length, bool freeBuffer) {
+    final _ret = _lib._objc_msgSend_347(
+        _id,
+        _lib._sel_initWithCStringNoCopy_length_freeWhenDone_1,
+        bytes,
+        length,
+        freeBuffer);
+    return NSObject._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSObject initWithCString_length_(ffi.Pointer<ffi.Char> bytes, int length) {
+    final _ret = _lib._objc_msgSend_339(
+        _id, _lib._sel_initWithCString_length_1, bytes, length);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject initWithCString_(ffi.Pointer<ffi.Char> bytes) {
+    final _ret =
+        _lib._objc_msgSend_332(_id, _lib._sel_initWithCString_1, bytes);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject stringWithCString_length_(
+      SwiftLibrary _lib, ffi.Pointer<ffi.Char> bytes, int length) {
+    final _ret = _lib._objc_msgSend_339(_lib._class_NSString1,
+        _lib._sel_stringWithCString_length_1, bytes, length);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject stringWithCString_(
+      SwiftLibrary _lib, ffi.Pointer<ffi.Char> bytes) {
+    final _ret = _lib._objc_msgSend_332(
+        _lib._class_NSString1, _lib._sel_stringWithCString_1, bytes);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void getCharacters_(ffi.Pointer<unichar> buffer) {
+    return _lib._objc_msgSend_348(_id, _lib._sel_getCharacters_1, buffer);
+  }
+
+  NSString variantFittingPresentationWidth_(int width) {
+    final _ret = _lib._objc_msgSend_349(
+        _id, _lib._sel_variantFittingPresentationWidth_1, width);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString pathWithComponents_(SwiftLibrary _lib, NSArray? components) {
+    final _ret = _lib._objc_msgSend_350(_lib._class_NSString1,
+        _lib._sel_pathWithComponents_1, components?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get pathComponents {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_pathComponents1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool get absolutePath {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isAbsolutePath1);
+  }
+
+  NSString? get lastPathComponent {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_lastPathComponent1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get stringByDeletingLastPathComponent {
+    final _ret = _lib._objc_msgSend_20(
+        _id, _lib._sel_stringByDeletingLastPathComponent1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString stringByAppendingPathComponent_(NSString? str) {
+    final _ret = _lib._objc_msgSend_64(_id,
+        _lib._sel_stringByAppendingPathComponent_1, str?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get pathExtension {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_pathExtension1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get stringByDeletingPathExtension {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_stringByDeletingPathExtension1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString stringByAppendingPathExtension_(NSString? str) {
+    final _ret = _lib._objc_msgSend_64(_id,
+        _lib._sel_stringByAppendingPathExtension_1, str?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get stringByAbbreviatingWithTildeInPath {
+    final _ret = _lib._objc_msgSend_20(
+        _id, _lib._sel_stringByAbbreviatingWithTildeInPath1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get stringByExpandingTildeInPath {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_stringByExpandingTildeInPath1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get stringByStandardizingPath {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_stringByStandardizingPath1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get stringByResolvingSymlinksInPath {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_stringByResolvingSymlinksInPath1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray stringsByAppendingPaths_(NSArray? paths) {
+    final _ret = _lib._objc_msgSend_63(
+        _id, _lib._sel_stringsByAppendingPaths_1, paths?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  int completePathIntoString_caseSensitive_matchesIntoArray_filterTypes_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outputName,
+      bool flag,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outputArray,
+      NSArray? filterTypes) {
+    return _lib._objc_msgSend_351(
+        _id,
+        _lib._sel_completePathIntoString_caseSensitive_matchesIntoArray_filterTypes_1,
+        outputName,
+        flag,
+        outputArray,
+        filterTypes?._id ?? ffi.nullptr);
+  }
+
+  ffi.Pointer<ffi.Char> get fileSystemRepresentation {
+    return _lib._objc_msgSend_13(_id, _lib._sel_fileSystemRepresentation1);
+  }
+
+  bool getFileSystemRepresentation_maxLength_(
+      ffi.Pointer<ffi.Char> cname, int max) {
+    return _lib._objc_msgSend_218(
+        _id, _lib._sel_getFileSystemRepresentation_maxLength_1, cname, max);
+  }
+
+  NSString stringByAddingPercentEncodingWithAllowedCharacters_(
+      NSCharacterSet? allowedCharacters) {
+    final _ret = _lib._objc_msgSend_320(
+        _id,
+        _lib._sel_stringByAddingPercentEncodingWithAllowedCharacters_1,
+        allowedCharacters?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get stringByRemovingPercentEncoding {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_stringByRemovingPercentEncoding1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString stringByAddingPercentEscapesUsingEncoding_(int enc) {
+    final _ret = _lib._objc_msgSend_293(
+        _id, _lib._sel_stringByAddingPercentEscapesUsingEncoding_1, enc);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString stringByReplacingPercentEscapesUsingEncoding_(int enc) {
+    final _ret = _lib._objc_msgSend_293(
+        _id, _lib._sel_stringByReplacingPercentEscapesUsingEncoding_1, enc);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray linguisticTagsInRange_scheme_options_orthography_tokenRanges_(
+      NSRange range,
+      NSLinguisticTagScheme scheme,
+      int options,
+      NSOrthography? orthography,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> tokenRanges) {
+    final _ret = _lib._objc_msgSend_353(
+        _id,
+        _lib._sel_linguisticTagsInRange_scheme_options_orthography_tokenRanges_1,
+        range,
+        scheme,
+        options,
+        orthography?._id ?? ffi.nullptr,
+        tokenRanges);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  void enumerateLinguisticTagsInRange_scheme_options_orthography_usingBlock_(
+      NSRange range,
+      NSLinguisticTagScheme scheme,
+      int options,
+      NSOrthography? orthography,
+      ObjCBlock10 block) {
+    return _lib._objc_msgSend_354(
+        _id,
+        _lib._sel_enumerateLinguisticTagsInRange_scheme_options_orthography_usingBlock_1,
+        range,
+        scheme,
+        options,
+        orthography?._id ?? ffi.nullptr,
+        block._id);
+  }
+
+  static NSString new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSString1, _lib._sel_new1);
+    return NSString._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSString alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSString1, _lib._sel_alloc1);
+    return NSString._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSString1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSString1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSString1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSString1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSString1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSString1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSString1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSString1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSString1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+extension StringToNSString on String {
+  NSString toNSString(SwiftLibrary lib) => NSString(lib, this);
+}
+
+typedef unichar = ffi.UnsignedShort;
+
+class NSCoder extends NSObject {
+  NSCoder._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSCoder] that points to the same underlying object as [other].
+  static NSCoder castFrom<T extends _ObjCWrapper>(T other) {
+    return NSCoder._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSCoder] that wraps the given raw object pointer.
+  static NSCoder castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSCoder._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSCoder].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSCoder1);
+  }
+
+  void encodeValueOfObjCType_at_(
+      ffi.Pointer<ffi.Char> type, ffi.Pointer<ffi.Void> addr) {
+    return _lib._objc_msgSend_18(
+        _id, _lib._sel_encodeValueOfObjCType_at_1, type, addr);
+  }
+
+  void encodeDataObject_(NSData? data) {
+    return _lib._objc_msgSend_248(
+        _id, _lib._sel_encodeDataObject_1, data?._id ?? ffi.nullptr);
+  }
+
+  NSData decodeDataObject() {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_decodeDataObject1);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  void decodeValueOfObjCType_at_size_(
+      ffi.Pointer<ffi.Char> type, ffi.Pointer<ffi.Void> data, int size) {
+    return _lib._objc_msgSend_249(
+        _id, _lib._sel_decodeValueOfObjCType_at_size_1, type, data, size);
+  }
+
+  int versionForClassName_(NSString? className) {
+    return _lib._objc_msgSend_250(
+        _id, _lib._sel_versionForClassName_1, className?._id ?? ffi.nullptr);
+  }
+
+  void encodeObject_(NSObject object) {
+    return _lib._objc_msgSend_15(_id, _lib._sel_encodeObject_1, object._id);
+  }
+
+  void encodeRootObject_(NSObject rootObject) {
+    return _lib._objc_msgSend_15(
+        _id, _lib._sel_encodeRootObject_1, rootObject._id);
+  }
+
+  void encodeBycopyObject_(NSObject anObject) {
+    return _lib._objc_msgSend_15(
+        _id, _lib._sel_encodeBycopyObject_1, anObject._id);
+  }
+
+  void encodeByrefObject_(NSObject anObject) {
+    return _lib._objc_msgSend_15(
+        _id, _lib._sel_encodeByrefObject_1, anObject._id);
+  }
+
+  void encodeConditionalObject_(NSObject object) {
+    return _lib._objc_msgSend_15(
+        _id, _lib._sel_encodeConditionalObject_1, object._id);
+  }
+
+  void encodeValuesOfObjCTypes_(ffi.Pointer<ffi.Char> types) {
+    return _lib._objc_msgSend_251(
+        _id, _lib._sel_encodeValuesOfObjCTypes_1, types);
+  }
+
+  void encodeArrayOfObjCType_count_at_(
+      ffi.Pointer<ffi.Char> type, int count, ffi.Pointer<ffi.Void> array) {
+    return _lib._objc_msgSend_252(
+        _id, _lib._sel_encodeArrayOfObjCType_count_at_1, type, count, array);
+  }
+
+  void encodeBytes_length_(ffi.Pointer<ffi.Void> byteaddr, int length) {
+    return _lib._objc_msgSend_21(
+        _id, _lib._sel_encodeBytes_length_1, byteaddr, length);
+  }
+
+  NSObject decodeObject() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_decodeObject1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject decodeTopLevelObjectAndReturnError_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_253(
+        _id, _lib._sel_decodeTopLevelObjectAndReturnError_1, error);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void decodeValuesOfObjCTypes_(ffi.Pointer<ffi.Char> types) {
+    return _lib._objc_msgSend_251(
+        _id, _lib._sel_decodeValuesOfObjCTypes_1, types);
+  }
+
+  void decodeArrayOfObjCType_count_at_(
+      ffi.Pointer<ffi.Char> itemType, int count, ffi.Pointer<ffi.Void> array) {
+    return _lib._objc_msgSend_252(_id,
+        _lib._sel_decodeArrayOfObjCType_count_at_1, itemType, count, array);
+  }
+
+  ffi.Pointer<ffi.Void> decodeBytesWithReturnedLength_(
+      ffi.Pointer<NSUInteger> lengthp) {
+    return _lib._objc_msgSend_254(
+        _id, _lib._sel_decodeBytesWithReturnedLength_1, lengthp);
+  }
+
+  void encodePropertyList_(NSObject aPropertyList) {
+    return _lib._objc_msgSend_15(
+        _id, _lib._sel_encodePropertyList_1, aPropertyList._id);
+  }
+
+  NSObject decodePropertyList() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_decodePropertyList1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void setObjectZone_(ffi.Pointer<NSZone> zone) {
+    return _lib._objc_msgSend_255(_id, _lib._sel_setObjectZone_1, zone);
+  }
+
+  ffi.Pointer<NSZone> objectZone() {
+    return _lib._objc_msgSend_256(_id, _lib._sel_objectZone1);
+  }
+
+  int get systemVersion {
+    return _lib._objc_msgSend_191(_id, _lib._sel_systemVersion1);
+  }
+
+  bool get allowsKeyedCoding {
+    return _lib._objc_msgSend_12(_id, _lib._sel_allowsKeyedCoding1);
+  }
+
+  void encodeObject_forKey_(NSObject object, NSString? key) {
+    return _lib._objc_msgSend_122(_id, _lib._sel_encodeObject_forKey_1,
+        object._id, key?._id ?? ffi.nullptr);
+  }
+
+  void encodeConditionalObject_forKey_(NSObject object, NSString? key) {
+    return _lib._objc_msgSend_122(
+        _id,
+        _lib._sel_encodeConditionalObject_forKey_1,
+        object._id,
+        key?._id ?? ffi.nullptr);
+  }
+
+  void encodeBool_forKey_(bool value, NSString? key) {
+    return _lib._objc_msgSend_257(
+        _id, _lib._sel_encodeBool_forKey_1, value, key?._id ?? ffi.nullptr);
+  }
+
+  void encodeInt_forKey_(int value, NSString? key) {
+    return _lib._objc_msgSend_258(
+        _id, _lib._sel_encodeInt_forKey_1, value, key?._id ?? ffi.nullptr);
+  }
+
+  void encodeInt32_forKey_(int value, NSString? key) {
+    return _lib._objc_msgSend_259(
+        _id, _lib._sel_encodeInt32_forKey_1, value, key?._id ?? ffi.nullptr);
+  }
+
+  void encodeInt64_forKey_(int value, NSString? key) {
+    return _lib._objc_msgSend_260(
+        _id, _lib._sel_encodeInt64_forKey_1, value, key?._id ?? ffi.nullptr);
+  }
+
+  void encodeFloat_forKey_(double value, NSString? key) {
+    return _lib._objc_msgSend_261(
+        _id, _lib._sel_encodeFloat_forKey_1, value, key?._id ?? ffi.nullptr);
+  }
+
+  void encodeDouble_forKey_(double value, NSString? key) {
+    return _lib._objc_msgSend_262(
+        _id, _lib._sel_encodeDouble_forKey_1, value, key?._id ?? ffi.nullptr);
+  }
+
+  void encodeBytes_length_forKey_(
+      ffi.Pointer<ffi.Uint8> bytes, int length, NSString? key) {
+    return _lib._objc_msgSend_263(_id, _lib._sel_encodeBytes_length_forKey_1,
+        bytes, length, key?._id ?? ffi.nullptr);
+  }
+
+  bool containsValueForKey_(NSString? key) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_containsValueForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  NSObject decodeObjectForKey_(NSString? key) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_decodeObjectForKey_1, key?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject decodeTopLevelObjectForKey_error_(
+      NSString? key, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_264(
+        _id,
+        _lib._sel_decodeTopLevelObjectForKey_error_1,
+        key?._id ?? ffi.nullptr,
+        error);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool decodeBoolForKey_(NSString? key) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_decodeBoolForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  int decodeIntForKey_(NSString? key) {
+    return _lib._objc_msgSend_265(
+        _id, _lib._sel_decodeIntForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  int decodeInt32ForKey_(NSString? key) {
+    return _lib._objc_msgSend_266(
+        _id, _lib._sel_decodeInt32ForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  int decodeInt64ForKey_(NSString? key) {
+    return _lib._objc_msgSend_267(
+        _id, _lib._sel_decodeInt64ForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  double decodeFloatForKey_(NSString? key) {
+    return _lib._objc_msgSend_268(
+        _id, _lib._sel_decodeFloatForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  double decodeDoubleForKey_(NSString? key) {
+    return _lib._objc_msgSend_269(
+        _id, _lib._sel_decodeDoubleForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  ffi.Pointer<ffi.Uint8> decodeBytesForKey_returnedLength_(
+      NSString? key, ffi.Pointer<NSUInteger> lengthp) {
+    return _lib._objc_msgSend_270(
+        _id,
+        _lib._sel_decodeBytesForKey_returnedLength_1,
+        key?._id ?? ffi.nullptr,
+        lengthp);
+  }
+
+  void encodeInteger_forKey_(int value, NSString? key) {
+    return _lib._objc_msgSend_271(
+        _id, _lib._sel_encodeInteger_forKey_1, value, key?._id ?? ffi.nullptr);
+  }
+
+  int decodeIntegerForKey_(NSString? key) {
+    return _lib._objc_msgSend_250(
+        _id, _lib._sel_decodeIntegerForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  bool get requiresSecureCoding {
+    return _lib._objc_msgSend_12(_id, _lib._sel_requiresSecureCoding1);
+  }
+
+  NSObject decodeObjectOfClass_forKey_(NSObject aClass, NSString? key) {
+    final _ret = _lib._objc_msgSend_272(
+        _id,
+        _lib._sel_decodeObjectOfClass_forKey_1,
+        aClass._id,
+        key?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject decodeTopLevelObjectOfClass_forKey_error_(NSObject aClass,
+      NSString? key, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_273(
+        _id,
+        _lib._sel_decodeTopLevelObjectOfClass_forKey_error_1,
+        aClass._id,
+        key?._id ?? ffi.nullptr,
+        error);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray decodeArrayOfObjectsOfClass_forKey_(NSObject cls, NSString? key) {
+    final _ret = _lib._objc_msgSend_274(
+        _id,
+        _lib._sel_decodeArrayOfObjectsOfClass_forKey_1,
+        cls._id,
+        key?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary decodeDictionaryWithKeysOfClass_objectsOfClass_forKey_(
+      NSObject keyCls, NSObject objectCls, NSString? key) {
+    final _ret = _lib._objc_msgSend_275(
+        _id,
+        _lib._sel_decodeDictionaryWithKeysOfClass_objectsOfClass_forKey_1,
+        keyCls._id,
+        objectCls._id,
+        key?._id ?? ffi.nullptr);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject decodeObjectOfClasses_forKey_(NSSet? classes, NSString? key) {
+    final _ret = _lib._objc_msgSend_276(
+        _id,
+        _lib._sel_decodeObjectOfClasses_forKey_1,
+        classes?._id ?? ffi.nullptr,
+        key?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject decodeTopLevelObjectOfClasses_forKey_error_(NSSet? classes,
+      NSString? key, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_277(
+        _id,
+        _lib._sel_decodeTopLevelObjectOfClasses_forKey_error_1,
+        classes?._id ?? ffi.nullptr,
+        key?._id ?? ffi.nullptr,
+        error);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray decodeArrayOfObjectsOfClasses_forKey_(NSSet? classes, NSString? key) {
+    final _ret = _lib._objc_msgSend_278(
+        _id,
+        _lib._sel_decodeArrayOfObjectsOfClasses_forKey_1,
+        classes?._id ?? ffi.nullptr,
+        key?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary decodeDictionaryWithKeysOfClasses_objectsOfClasses_forKey_(
+      NSSet? keyClasses, NSSet? objectClasses, NSString? key) {
+    final _ret = _lib._objc_msgSend_279(
+        _id,
+        _lib._sel_decodeDictionaryWithKeysOfClasses_objectsOfClasses_forKey_1,
+        keyClasses?._id ?? ffi.nullptr,
+        objectClasses?._id ?? ffi.nullptr,
+        key?._id ?? ffi.nullptr);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject decodePropertyListForKey_(NSString? key) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_decodePropertyListForKey_1, key?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSSet? get allowedClasses {
+    final _ret = _lib._objc_msgSend_280(_id, _lib._sel_allowedClasses1);
+    return _ret.address == 0
+        ? null
+        : NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  void failWithError_(NSError? error) {
+    return _lib._objc_msgSend_281(
+        _id, _lib._sel_failWithError_1, error?._id ?? ffi.nullptr);
+  }
+
+  int get decodingFailurePolicy {
+    return _lib._objc_msgSend_282(_id, _lib._sel_decodingFailurePolicy1);
+  }
+
+  NSError? get error {
+    final _ret = _lib._objc_msgSend_283(_id, _lib._sel_error1);
+    return _ret.address == 0
+        ? null
+        : NSError._(_ret, _lib, retain: true, release: true);
+  }
+
+  void encodeNXObject_(NSObject object) {
+    return _lib._objc_msgSend_15(_id, _lib._sel_encodeNXObject_1, object._id);
+  }
+
+  NSObject decodeNXObject() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_decodeNXObject1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void decodeValueOfObjCType_at_(
+      ffi.Pointer<ffi.Char> type, ffi.Pointer<ffi.Void> data) {
+    return _lib._objc_msgSend_18(
+        _id, _lib._sel_decodeValueOfObjCType_at_1, type, data);
+  }
+
+  void encodePoint_(NSPoint point) {
+    return _lib._objc_msgSend_284(_id, _lib._sel_encodePoint_1, point);
+  }
+
+  NSPoint decodePoint() {
+    return _lib._objc_msgSend_54(_id, _lib._sel_decodePoint1);
+  }
+
+  void encodeSize_(NSSize size) {
+    return _lib._objc_msgSend_285(_id, _lib._sel_encodeSize_1, size);
+  }
+
+  NSSize decodeSize() {
+    return _lib._objc_msgSend_55(_id, _lib._sel_decodeSize1);
+  }
+
+  void encodeRect_(NSRect rect) {
+    return _lib._objc_msgSend_286(_id, _lib._sel_encodeRect_1, rect);
+  }
+
+  NSRect decodeRect() {
+    return _lib._objc_msgSend_56(_id, _lib._sel_decodeRect1);
+  }
+
+  void encodePoint_forKey_(NSPoint point, NSString? key) {
+    return _lib._objc_msgSend_287(
+        _id, _lib._sel_encodePoint_forKey_1, point, key?._id ?? ffi.nullptr);
+  }
+
+  void encodeSize_forKey_(NSSize size, NSString? key) {
+    return _lib._objc_msgSend_288(
+        _id, _lib._sel_encodeSize_forKey_1, size, key?._id ?? ffi.nullptr);
+  }
+
+  void encodeRect_forKey_(NSRect rect, NSString? key) {
+    return _lib._objc_msgSend_289(
+        _id, _lib._sel_encodeRect_forKey_1, rect, key?._id ?? ffi.nullptr);
+  }
+
+  NSPoint decodePointForKey_(NSString? key) {
+    return _lib._objc_msgSend_290(
+        _id, _lib._sel_decodePointForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  NSSize decodeSizeForKey_(NSString? key) {
+    return _lib._objc_msgSend_291(
+        _id, _lib._sel_decodeSizeForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  NSRect decodeRectForKey_(NSString? key) {
+    return _lib._objc_msgSend_292(
+        _id, _lib._sel_decodeRectForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  static NSCoder new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSCoder1, _lib._sel_new1);
+    return NSCoder._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSCoder alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSCoder1, _lib._sel_alloc1);
+    return NSCoder._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSCoder1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSCoder1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSCoder1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSCoder1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSCoder1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSCoder1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSCoder1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSCoder1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSCoder1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSData extends NSObject {
+  NSData._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSData] that points to the same underlying object as [other].
+  static NSData castFrom<T extends _ObjCWrapper>(T other) {
+    return NSData._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSData] that wraps the given raw object pointer.
+  static NSData castFromPointer(SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSData._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSData].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSData1);
+  }
+
+  int get length {
+    return _lib._objc_msgSend_10(_id, _lib._sel_length1);
+  }
+
+  ffi.Pointer<ffi.Void> get bytes {
+    return _lib._objc_msgSend_19(_id, _lib._sel_bytes1);
+  }
+
+  NSString? get description {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_description1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  void getBytes_length_(ffi.Pointer<ffi.Void> buffer, int length) {
+    return _lib._objc_msgSend_21(
+        _id, _lib._sel_getBytes_length_1, buffer, length);
+  }
+
+  void getBytes_range_(ffi.Pointer<ffi.Void> buffer, NSRange range) {
+    return _lib._objc_msgSend_22(
+        _id, _lib._sel_getBytes_range_1, buffer, range);
+  }
+
+  bool isEqualToData_(NSData? other) {
+    return _lib._objc_msgSend_23(
+        _id, _lib._sel_isEqualToData_1, other?._id ?? ffi.nullptr);
+  }
+
+  NSData subdataWithRange_(NSRange range) {
+    final _ret =
+        _lib._objc_msgSend_24(_id, _lib._sel_subdataWithRange_1, range);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool writeToFile_atomically_(NSString? path, bool useAuxiliaryFile) {
+    return _lib._objc_msgSend_25(_id, _lib._sel_writeToFile_atomically_1,
+        path?._id ?? ffi.nullptr, useAuxiliaryFile);
+  }
+
+  bool writeToURL_atomically_(NSURL? url, bool atomically) {
+    return _lib._objc_msgSend_121(_id, _lib._sel_writeToURL_atomically_1,
+        url?._id ?? ffi.nullptr, atomically);
+  }
+
+  bool writeToFile_options_error_(NSString? path, int writeOptionsMask,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> errorPtr) {
+    return _lib._objc_msgSend_233(_id, _lib._sel_writeToFile_options_error_1,
+        path?._id ?? ffi.nullptr, writeOptionsMask, errorPtr);
+  }
+
+  bool writeToURL_options_error_(NSURL? url, int writeOptionsMask,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> errorPtr) {
+    return _lib._objc_msgSend_234(_id, _lib._sel_writeToURL_options_error_1,
+        url?._id ?? ffi.nullptr, writeOptionsMask, errorPtr);
+  }
+
+  NSRange rangeOfData_options_range_(
+      NSData? dataToFind, int mask, NSRange searchRange) {
+    return _lib._objc_msgSend_235(_id, _lib._sel_rangeOfData_options_range_1,
+        dataToFind?._id ?? ffi.nullptr, mask, searchRange);
+  }
+
+  void enumerateByteRangesUsingBlock_(ObjCBlock8 block) {
+    return _lib._objc_msgSend_236(
+        _id, _lib._sel_enumerateByteRangesUsingBlock_1, block._id);
+  }
+
+  static NSData data(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSData1, _lib._sel_data1);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSData dataWithBytes_length_(
+      SwiftLibrary _lib, ffi.Pointer<ffi.Void> bytes, int length) {
+    final _ret = _lib._objc_msgSend_237(
+        _lib._class_NSData1, _lib._sel_dataWithBytes_length_1, bytes, length);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSData dataWithBytesNoCopy_length_(
+      SwiftLibrary _lib, ffi.Pointer<ffi.Void> bytes, int length) {
+    final _ret = _lib._objc_msgSend_237(_lib._class_NSData1,
+        _lib._sel_dataWithBytesNoCopy_length_1, bytes, length);
+    return NSData._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSData dataWithBytesNoCopy_length_freeWhenDone_(
+      SwiftLibrary _lib, ffi.Pointer<ffi.Void> bytes, int length, bool b) {
+    final _ret = _lib._objc_msgSend_238(_lib._class_NSData1,
+        _lib._sel_dataWithBytesNoCopy_length_freeWhenDone_1, bytes, length, b);
+    return NSData._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSData dataWithContentsOfFile_options_error_(
+      SwiftLibrary _lib,
+      NSString? path,
+      int readOptionsMask,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> errorPtr) {
+    final _ret = _lib._objc_msgSend_239(
+        _lib._class_NSData1,
+        _lib._sel_dataWithContentsOfFile_options_error_1,
+        path?._id ?? ffi.nullptr,
+        readOptionsMask,
+        errorPtr);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSData dataWithContentsOfURL_options_error_(
+      SwiftLibrary _lib,
+      NSURL? url,
+      int readOptionsMask,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> errorPtr) {
+    final _ret = _lib._objc_msgSend_240(
+        _lib._class_NSData1,
+        _lib._sel_dataWithContentsOfURL_options_error_1,
+        url?._id ?? ffi.nullptr,
+        readOptionsMask,
+        errorPtr);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSData dataWithContentsOfFile_(SwiftLibrary _lib, NSString? path) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSData1,
+        _lib._sel_dataWithContentsOfFile_1, path?._id ?? ffi.nullptr);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSData dataWithContentsOfURL_(SwiftLibrary _lib, NSURL? url) {
+    final _ret = _lib._objc_msgSend_226(_lib._class_NSData1,
+        _lib._sel_dataWithContentsOfURL_1, url?._id ?? ffi.nullptr);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData initWithBytes_length_(ffi.Pointer<ffi.Void> bytes, int length) {
+    final _ret = _lib._objc_msgSend_237(
+        _id, _lib._sel_initWithBytes_length_1, bytes, length);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData initWithBytesNoCopy_length_(ffi.Pointer<ffi.Void> bytes, int length) {
+    final _ret = _lib._objc_msgSend_237(
+        _id, _lib._sel_initWithBytesNoCopy_length_1, bytes, length);
+    return NSData._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSData initWithBytesNoCopy_length_freeWhenDone_(
+      ffi.Pointer<ffi.Void> bytes, int length, bool b) {
+    final _ret = _lib._objc_msgSend_238(_id,
+        _lib._sel_initWithBytesNoCopy_length_freeWhenDone_1, bytes, length, b);
+    return NSData._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSData initWithBytesNoCopy_length_deallocator_(
+      ffi.Pointer<ffi.Void> bytes, int length, ObjCBlock9 deallocator) {
+    final _ret = _lib._objc_msgSend_241(
+        _id,
+        _lib._sel_initWithBytesNoCopy_length_deallocator_1,
+        bytes,
+        length,
+        deallocator._id);
+    return NSData._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSData initWithContentsOfFile_options_error_(NSString? path,
+      int readOptionsMask, ffi.Pointer<ffi.Pointer<ObjCObject>> errorPtr) {
+    final _ret = _lib._objc_msgSend_239(
+        _id,
+        _lib._sel_initWithContentsOfFile_options_error_1,
+        path?._id ?? ffi.nullptr,
+        readOptionsMask,
+        errorPtr);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData initWithContentsOfURL_options_error_(NSURL? url, int readOptionsMask,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> errorPtr) {
+    final _ret = _lib._objc_msgSend_240(
+        _id,
+        _lib._sel_initWithContentsOfURL_options_error_1,
+        url?._id ?? ffi.nullptr,
+        readOptionsMask,
+        errorPtr);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData initWithContentsOfFile_(NSString? path) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initWithContentsOfFile_1, path?._id ?? ffi.nullptr);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData initWithContentsOfURL_(NSURL? url) {
+    final _ret = _lib._objc_msgSend_226(
+        _id, _lib._sel_initWithContentsOfURL_1, url?._id ?? ffi.nullptr);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData initWithData_(NSData? data) {
+    final _ret = _lib._objc_msgSend_242(
+        _id, _lib._sel_initWithData_1, data?._id ?? ffi.nullptr);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSData dataWithData_(SwiftLibrary _lib, NSData? data) {
+    final _ret = _lib._objc_msgSend_242(_lib._class_NSData1,
+        _lib._sel_dataWithData_1, data?._id ?? ffi.nullptr);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData initWithBase64EncodedString_options_(
+      NSString? base64String, int options) {
+    final _ret = _lib._objc_msgSend_243(
+        _id,
+        _lib._sel_initWithBase64EncodedString_options_1,
+        base64String?._id ?? ffi.nullptr,
+        options);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString base64EncodedStringWithOptions_(int options) {
+    final _ret = _lib._objc_msgSend_244(
+        _id, _lib._sel_base64EncodedStringWithOptions_1, options);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData initWithBase64EncodedData_options_(NSData? base64Data, int options) {
+    final _ret = _lib._objc_msgSend_245(
+        _id,
+        _lib._sel_initWithBase64EncodedData_options_1,
+        base64Data?._id ?? ffi.nullptr,
+        options);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData base64EncodedDataWithOptions_(int options) {
+    final _ret = _lib._objc_msgSend_246(
+        _id, _lib._sel_base64EncodedDataWithOptions_1, options);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData decompressedDataUsingAlgorithm_error_(
+      int algorithm, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_247(_id,
+        _lib._sel_decompressedDataUsingAlgorithm_error_1, algorithm, error);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData compressedDataUsingAlgorithm_error_(
+      int algorithm, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_247(
+        _id, _lib._sel_compressedDataUsingAlgorithm_error_1, algorithm, error);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  void getBytes_(ffi.Pointer<ffi.Void> buffer) {
+    return _lib._objc_msgSend_47(_id, _lib._sel_getBytes_1, buffer);
+  }
+
+  static NSObject dataWithContentsOfMappedFile_(
+      SwiftLibrary _lib, NSString? path) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSData1,
+        _lib._sel_dataWithContentsOfMappedFile_1, path?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject initWithContentsOfMappedFile_(NSString? path) {
+    final _ret = _lib._objc_msgSend_30(_id,
+        _lib._sel_initWithContentsOfMappedFile_1, path?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject initWithBase64Encoding_(NSString? base64String) {
+    final _ret = _lib._objc_msgSend_30(_id, _lib._sel_initWithBase64Encoding_1,
+        base64String?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString base64Encoding() {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_base64Encoding1);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSData new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSData1, _lib._sel_new1);
+    return NSData._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSData alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSData1, _lib._sel_alloc1);
+    return NSData._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSData1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSData1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSData1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSData1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSData1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSData1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSData1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSData1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSData1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef NSRange = _NSRange;
+
+class _NSRange extends ffi.Struct {
+  @NSUInteger()
+  external int location;
+
+  @NSUInteger()
+  external int length;
+}
+
+class NSURL extends NSObject {
+  NSURL._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURL] that points to the same underlying object as [other].
+  static NSURL castFrom<T extends _ObjCWrapper>(T other) {
+    return NSURL._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSURL] that wraps the given raw object pointer.
+  static NSURL castFromPointer(SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURL._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURL].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSURL1);
+  }
+
+  NSURL initWithScheme_host_path_(
+      NSString? scheme, NSString? host, NSString? path) {
+    final _ret = _lib._objc_msgSend_26(
+        _id,
+        _lib._sel_initWithScheme_host_path_1,
+        scheme?._id ?? ffi.nullptr,
+        host?._id ?? ffi.nullptr,
+        path?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL initFileURLWithPath_isDirectory_relativeToURL_(
+      NSString? path, bool isDir, NSURL? baseURL) {
+    final _ret = _lib._objc_msgSend_27(
+        _id,
+        _lib._sel_initFileURLWithPath_isDirectory_relativeToURL_1,
+        path?._id ?? ffi.nullptr,
+        isDir,
+        baseURL?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL initFileURLWithPath_relativeToURL_(NSString? path, NSURL? baseURL) {
+    final _ret = _lib._objc_msgSend_28(
+        _id,
+        _lib._sel_initFileURLWithPath_relativeToURL_1,
+        path?._id ?? ffi.nullptr,
+        baseURL?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL initFileURLWithPath_isDirectory_(NSString? path, bool isDir) {
+    final _ret = _lib._objc_msgSend_29(
+        _id,
+        _lib._sel_initFileURLWithPath_isDirectory_1,
+        path?._id ?? ffi.nullptr,
+        isDir);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL initFileURLWithPath_(NSString? path) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initFileURLWithPath_1, path?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURL fileURLWithPath_isDirectory_relativeToURL_(
+      SwiftLibrary _lib, NSString? path, bool isDir, NSURL? baseURL) {
+    final _ret = _lib._objc_msgSend_31(
+        _lib._class_NSURL1,
+        _lib._sel_fileURLWithPath_isDirectory_relativeToURL_1,
+        path?._id ?? ffi.nullptr,
+        isDir,
+        baseURL?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURL fileURLWithPath_relativeToURL_(
+      SwiftLibrary _lib, NSString? path, NSURL? baseURL) {
+    final _ret = _lib._objc_msgSend_32(
+        _lib._class_NSURL1,
+        _lib._sel_fileURLWithPath_relativeToURL_1,
+        path?._id ?? ffi.nullptr,
+        baseURL?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURL fileURLWithPath_isDirectory_(
+      SwiftLibrary _lib, NSString? path, bool isDir) {
+    final _ret = _lib._objc_msgSend_33(
+        _lib._class_NSURL1,
+        _lib._sel_fileURLWithPath_isDirectory_1,
+        path?._id ?? ffi.nullptr,
+        isDir);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURL fileURLWithPath_(SwiftLibrary _lib, NSString? path) {
+    final _ret = _lib._objc_msgSend_34(_lib._class_NSURL1,
+        _lib._sel_fileURLWithPath_1, path?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL initFileURLWithFileSystemRepresentation_isDirectory_relativeToURL_(
+      ffi.Pointer<ffi.Char> path, bool isDir, NSURL? baseURL) {
+    final _ret = _lib._objc_msgSend_35(
+        _id,
+        _lib._sel_initFileURLWithFileSystemRepresentation_isDirectory_relativeToURL_1,
+        path,
+        isDir,
+        baseURL?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURL fileURLWithFileSystemRepresentation_isDirectory_relativeToURL_(
+      SwiftLibrary _lib,
+      ffi.Pointer<ffi.Char> path,
+      bool isDir,
+      NSURL? baseURL) {
+    final _ret = _lib._objc_msgSend_36(
+        _lib._class_NSURL1,
+        _lib._sel_fileURLWithFileSystemRepresentation_isDirectory_relativeToURL_1,
+        path,
+        isDir,
+        baseURL?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL initWithString_(NSString? URLString) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initWithString_1, URLString?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL initWithString_relativeToURL_(NSString? URLString, NSURL? baseURL) {
+    final _ret = _lib._objc_msgSend_28(
+        _id,
+        _lib._sel_initWithString_relativeToURL_1,
+        URLString?._id ?? ffi.nullptr,
+        baseURL?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURL URLWithString_(SwiftLibrary _lib, NSString? URLString) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSURL1,
+        _lib._sel_URLWithString_1, URLString?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURL URLWithString_relativeToURL_(
+      SwiftLibrary _lib, NSString? URLString, NSURL? baseURL) {
+    final _ret = _lib._objc_msgSend_28(
+        _lib._class_NSURL1,
+        _lib._sel_URLWithString_relativeToURL_1,
+        URLString?._id ?? ffi.nullptr,
+        baseURL?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL initWithDataRepresentation_relativeToURL_(
+      NSData? data, NSURL? baseURL) {
+    final _ret = _lib._objc_msgSend_37(
+        _id,
+        _lib._sel_initWithDataRepresentation_relativeToURL_1,
+        data?._id ?? ffi.nullptr,
+        baseURL?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURL URLWithDataRepresentation_relativeToURL_(
+      SwiftLibrary _lib, NSData? data, NSURL? baseURL) {
+    final _ret = _lib._objc_msgSend_38(
+        _lib._class_NSURL1,
+        _lib._sel_URLWithDataRepresentation_relativeToURL_1,
+        data?._id ?? ffi.nullptr,
+        baseURL?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL initAbsoluteURLWithDataRepresentation_relativeToURL_(
+      NSData? data, NSURL? baseURL) {
+    final _ret = _lib._objc_msgSend_37(
+        _id,
+        _lib._sel_initAbsoluteURLWithDataRepresentation_relativeToURL_1,
+        data?._id ?? ffi.nullptr,
+        baseURL?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURL absoluteURLWithDataRepresentation_relativeToURL_(
+      SwiftLibrary _lib, NSData? data, NSURL? baseURL) {
+    final _ret = _lib._objc_msgSend_38(
+        _lib._class_NSURL1,
+        _lib._sel_absoluteURLWithDataRepresentation_relativeToURL_1,
+        data?._id ?? ffi.nullptr,
+        baseURL?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData? get dataRepresentation {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_dataRepresentation1);
+    return _ret.address == 0
+        ? null
+        : NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get absoluteString {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_absoluteString1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get relativeString {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_relativeString1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get baseURL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_baseURL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get absoluteURL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_absoluteURL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get scheme {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_scheme1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get resourceSpecifier {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_resourceSpecifier1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get host {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_host1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber? get port {
+    final _ret = _lib._objc_msgSend_192(_id, _lib._sel_port1);
+    return _ret.address == 0
+        ? null
+        : NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get user {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_user1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get password {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_password1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get path {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_path1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get fragment {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_fragment1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get parameterString {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_parameterString1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get query {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_query1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get relativePath {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_relativePath1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool get hasDirectoryPath {
+    return _lib._objc_msgSend_12(_id, _lib._sel_hasDirectoryPath1);
+  }
+
+  bool getFileSystemRepresentation_maxLength_(
+      ffi.Pointer<ffi.Char> buffer, int maxBufferLength) {
+    return _lib._objc_msgSend_218(
+        _id,
+        _lib._sel_getFileSystemRepresentation_maxLength_1,
+        buffer,
+        maxBufferLength);
+  }
+
+  ffi.Pointer<ffi.Char> get fileSystemRepresentation {
+    return _lib._objc_msgSend_13(_id, _lib._sel_fileSystemRepresentation1);
+  }
+
+  bool get fileURL {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isFileURL1);
+  }
+
+  NSURL? get standardizedURL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_standardizedURL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool checkResourceIsReachableAndReturnError_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_219(
+        _id, _lib._sel_checkResourceIsReachableAndReturnError_1, error);
+  }
+
+  bool isFileReferenceURL() {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isFileReferenceURL1);
+  }
+
+  NSURL fileReferenceURL() {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_fileReferenceURL1);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get filePathURL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_filePathURL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool getResourceValue_forKey_error_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> value,
+      NSURLResourceKey key,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_220(
+        _id, _lib._sel_getResourceValue_forKey_error_1, value, key, error);
+  }
+
+  bool getPromisedItemResourceValue_forKey_error_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> value,
+      NSURLResourceKey key,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_220(
+        _id,
+        _lib._sel_getPromisedItemResourceValue_forKey_error_1,
+        value,
+        key,
+        error);
+  }
+
+  NSDictionary promisedItemResourceValuesForKeys_error_(
+      NSArray? keys, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_221(
+        _id,
+        _lib._sel_promisedItemResourceValuesForKeys_error_1,
+        keys?._id ?? ffi.nullptr,
+        error);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool checkPromisedItemIsReachableAndReturnError_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_219(
+        _id, _lib._sel_checkPromisedItemIsReachableAndReturnError_1, error);
+  }
+
+  static NSURL fileURLWithPathComponents_(
+      SwiftLibrary _lib, NSArray? components) {
+    final _ret = _lib._objc_msgSend_222(_lib._class_NSURL1,
+        _lib._sel_fileURLWithPathComponents_1, components?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get pathComponents {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_pathComponents1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get lastPathComponent {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_lastPathComponent1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get pathExtension {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_pathExtension1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL URLByAppendingPathComponent_(NSString? pathComponent) {
+    final _ret = _lib._objc_msgSend_34(
+        _id,
+        _lib._sel_URLByAppendingPathComponent_1,
+        pathComponent?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL URLByAppendingPathComponent_isDirectory_(
+      NSString? pathComponent, bool isDirectory) {
+    final _ret = _lib._objc_msgSend_33(
+        _id,
+        _lib._sel_URLByAppendingPathComponent_isDirectory_1,
+        pathComponent?._id ?? ffi.nullptr,
+        isDirectory);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get URLByDeletingLastPathComponent {
+    final _ret =
+        _lib._objc_msgSend_40(_id, _lib._sel_URLByDeletingLastPathComponent1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL URLByAppendingPathExtension_(NSString? pathExtension) {
+    final _ret = _lib._objc_msgSend_34(
+        _id,
+        _lib._sel_URLByAppendingPathExtension_1,
+        pathExtension?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get URLByDeletingPathExtension {
+    final _ret =
+        _lib._objc_msgSend_40(_id, _lib._sel_URLByDeletingPathExtension1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get URLByStandardizingPath {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_URLByStandardizingPath1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get URLByResolvingSymlinksInPath {
+    final _ret =
+        _lib._objc_msgSend_40(_id, _lib._sel_URLByResolvingSymlinksInPath1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData resourceDataUsingCache_(bool shouldUseCache) {
+    final _ret = _lib._objc_msgSend_223(
+        _id, _lib._sel_resourceDataUsingCache_1, shouldUseCache);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  void loadResourceDataNotifyingClient_usingCache_(
+      NSObject client, bool shouldUseCache) {
+    return _lib._objc_msgSend_224(
+        _id,
+        _lib._sel_loadResourceDataNotifyingClient_usingCache_1,
+        client._id,
+        shouldUseCache);
+  }
+
+  NSObject propertyForKey_(NSString? propertyKey) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_propertyForKey_1, propertyKey?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool setResourceData_(NSData? data) {
+    return _lib._objc_msgSend_23(
+        _id, _lib._sel_setResourceData_1, data?._id ?? ffi.nullptr);
+  }
+
+  bool setProperty_forKey_(NSObject property, NSString? propertyKey) {
+    return _lib._objc_msgSend_225(_id, _lib._sel_setProperty_forKey_1,
+        property._id, propertyKey?._id ?? ffi.nullptr);
+  }
+
+  NSURLHandle URLHandleUsingCache_(bool shouldUseCache) {
+    final _ret = _lib._objc_msgSend_232(
+        _id, _lib._sel_URLHandleUsingCache_1, shouldUseCache);
+    return NSURLHandle._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURL new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSURL1, _lib._sel_new1);
+    return NSURL._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSURL alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSURL1, _lib._sel_alloc1);
+    return NSURL._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURL1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURL1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURL1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURL1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURL1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURL1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURL1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSURL1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURL1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSNumber extends NSValue {
+  NSNumber._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSNumber] that points to the same underlying object as [other].
+  static NSNumber castFrom<T extends _ObjCWrapper>(T other) {
+    return NSNumber._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSNumber] that wraps the given raw object pointer.
+  static NSNumber castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSNumber._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSNumber].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSNumber1);
+  }
+
+  @override
+  NSNumber initWithCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber initWithChar_(int value) {
+    final _ret = _lib._objc_msgSend_196(_id, _lib._sel_initWithChar_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber initWithUnsignedChar_(int value) {
+    final _ret =
+        _lib._objc_msgSend_197(_id, _lib._sel_initWithUnsignedChar_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber initWithShort_(int value) {
+    final _ret = _lib._objc_msgSend_198(_id, _lib._sel_initWithShort_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber initWithUnsignedShort_(int value) {
+    final _ret =
+        _lib._objc_msgSend_199(_id, _lib._sel_initWithUnsignedShort_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber initWithInt_(int value) {
+    final _ret = _lib._objc_msgSend_200(_id, _lib._sel_initWithInt_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber initWithUnsignedInt_(int value) {
+    final _ret =
+        _lib._objc_msgSend_201(_id, _lib._sel_initWithUnsignedInt_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber initWithLong_(int value) {
+    final _ret = _lib._objc_msgSend_202(_id, _lib._sel_initWithLong_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber initWithUnsignedLong_(int value) {
+    final _ret =
+        _lib._objc_msgSend_203(_id, _lib._sel_initWithUnsignedLong_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber initWithLongLong_(int value) {
+    final _ret =
+        _lib._objc_msgSend_204(_id, _lib._sel_initWithLongLong_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber initWithUnsignedLongLong_(int value) {
+    final _ret = _lib._objc_msgSend_205(
+        _id, _lib._sel_initWithUnsignedLongLong_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber initWithFloat_(double value) {
+    final _ret = _lib._objc_msgSend_206(_id, _lib._sel_initWithFloat_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber initWithDouble_(double value) {
+    final _ret = _lib._objc_msgSend_207(_id, _lib._sel_initWithDouble_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber initWithBool_(bool value) {
+    final _ret = _lib._objc_msgSend_208(_id, _lib._sel_initWithBool_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber initWithInteger_(int value) {
+    final _ret =
+        _lib._objc_msgSend_202(_id, _lib._sel_initWithInteger_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber initWithUnsignedInteger_(int value) {
+    final _ret =
+        _lib._objc_msgSend_203(_id, _lib._sel_initWithUnsignedInteger_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get charValue {
+    return _lib._objc_msgSend_209(_id, _lib._sel_charValue1);
+  }
+
+  int get unsignedCharValue {
+    return _lib._objc_msgSend_210(_id, _lib._sel_unsignedCharValue1);
+  }
+
+  int get shortValue {
+    return _lib._objc_msgSend_211(_id, _lib._sel_shortValue1);
+  }
+
+  int get unsignedShortValue {
+    return _lib._objc_msgSend_212(_id, _lib._sel_unsignedShortValue1);
+  }
+
+  int get intValue {
+    return _lib._objc_msgSend_213(_id, _lib._sel_intValue1);
+  }
+
+  int get unsignedIntValue {
+    return _lib._objc_msgSend_191(_id, _lib._sel_unsignedIntValue1);
+  }
+
+  int get longValue {
+    return _lib._objc_msgSend_78(_id, _lib._sel_longValue1);
+  }
+
+  int get unsignedLongValue {
+    return _lib._objc_msgSend_10(_id, _lib._sel_unsignedLongValue1);
+  }
+
+  int get longLongValue {
+    return _lib._objc_msgSend_214(_id, _lib._sel_longLongValue1);
+  }
+
+  int get unsignedLongLongValue {
+    return _lib._objc_msgSend_148(_id, _lib._sel_unsignedLongLongValue1);
+  }
+
+  double get floatValue {
+    return _lib._objc_msgSend_215(_id, _lib._sel_floatValue1);
+  }
+
+  double get doubleValue {
+    return _lib._objc_msgSend_149(_id, _lib._sel_doubleValue1);
+  }
+
+  bool get boolValue {
+    return _lib._objc_msgSend_12(_id, _lib._sel_boolValue1);
+  }
+
+  int get integerValue {
+    return _lib._objc_msgSend_78(_id, _lib._sel_integerValue1);
+  }
+
+  int get unsignedIntegerValue {
+    return _lib._objc_msgSend_10(_id, _lib._sel_unsignedIntegerValue1);
+  }
+
+  NSString? get stringValue {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_stringValue1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int compare_(NSNumber? otherNumber) {
+    return _lib._objc_msgSend_216(
+        _id, _lib._sel_compare_1, otherNumber?._id ?? ffi.nullptr);
+  }
+
+  bool isEqualToNumber_(NSNumber? number) {
+    return _lib._objc_msgSend_217(
+        _id, _lib._sel_isEqualToNumber_1, number?._id ?? ffi.nullptr);
+  }
+
+  NSString descriptionWithLocale_(NSObject locale) {
+    final _ret = _lib._objc_msgSend_65(
+        _id, _lib._sel_descriptionWithLocale_1, locale._id);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNumber numberWithChar_(SwiftLibrary _lib, int value) {
+    final _ret = _lib._objc_msgSend_196(
+        _lib._class_NSNumber1, _lib._sel_numberWithChar_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNumber numberWithUnsignedChar_(SwiftLibrary _lib, int value) {
+    final _ret = _lib._objc_msgSend_197(
+        _lib._class_NSNumber1, _lib._sel_numberWithUnsignedChar_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNumber numberWithShort_(SwiftLibrary _lib, int value) {
+    final _ret = _lib._objc_msgSend_198(
+        _lib._class_NSNumber1, _lib._sel_numberWithShort_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNumber numberWithUnsignedShort_(SwiftLibrary _lib, int value) {
+    final _ret = _lib._objc_msgSend_199(
+        _lib._class_NSNumber1, _lib._sel_numberWithUnsignedShort_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNumber numberWithInt_(SwiftLibrary _lib, int value) {
+    final _ret = _lib._objc_msgSend_200(
+        _lib._class_NSNumber1, _lib._sel_numberWithInt_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNumber numberWithUnsignedInt_(SwiftLibrary _lib, int value) {
+    final _ret = _lib._objc_msgSend_201(
+        _lib._class_NSNumber1, _lib._sel_numberWithUnsignedInt_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNumber numberWithLong_(SwiftLibrary _lib, int value) {
+    final _ret = _lib._objc_msgSend_202(
+        _lib._class_NSNumber1, _lib._sel_numberWithLong_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNumber numberWithUnsignedLong_(SwiftLibrary _lib, int value) {
+    final _ret = _lib._objc_msgSend_203(
+        _lib._class_NSNumber1, _lib._sel_numberWithUnsignedLong_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNumber numberWithLongLong_(SwiftLibrary _lib, int value) {
+    final _ret = _lib._objc_msgSend_204(
+        _lib._class_NSNumber1, _lib._sel_numberWithLongLong_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNumber numberWithUnsignedLongLong_(SwiftLibrary _lib, int value) {
+    final _ret = _lib._objc_msgSend_205(
+        _lib._class_NSNumber1, _lib._sel_numberWithUnsignedLongLong_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNumber numberWithFloat_(SwiftLibrary _lib, double value) {
+    final _ret = _lib._objc_msgSend_206(
+        _lib._class_NSNumber1, _lib._sel_numberWithFloat_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNumber numberWithDouble_(SwiftLibrary _lib, double value) {
+    final _ret = _lib._objc_msgSend_207(
+        _lib._class_NSNumber1, _lib._sel_numberWithDouble_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNumber numberWithBool_(SwiftLibrary _lib, bool value) {
+    final _ret = _lib._objc_msgSend_208(
+        _lib._class_NSNumber1, _lib._sel_numberWithBool_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNumber numberWithInteger_(SwiftLibrary _lib, int value) {
+    final _ret = _lib._objc_msgSend_202(
+        _lib._class_NSNumber1, _lib._sel_numberWithInteger_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNumber numberWithUnsignedInteger_(SwiftLibrary _lib, int value) {
+    final _ret = _lib._objc_msgSend_203(
+        _lib._class_NSNumber1, _lib._sel_numberWithUnsignedInteger_1, value);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSValue valueWithBytes_objCType_(SwiftLibrary _lib,
+      ffi.Pointer<ffi.Void> value, ffi.Pointer<ffi.Char> type) {
+    final _ret = _lib._objc_msgSend_43(_lib._class_NSNumber1,
+        _lib._sel_valueWithBytes_objCType_1, value, type);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSValue value_withObjCType_(SwiftLibrary _lib,
+      ffi.Pointer<ffi.Void> value, ffi.Pointer<ffi.Char> type) {
+    final _ret = _lib._objc_msgSend_43(
+        _lib._class_NSNumber1, _lib._sel_value_withObjCType_1, value, type);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSValue valueWithNonretainedObject_(
+      SwiftLibrary _lib, NSObject anObject) {
+    final _ret = _lib._objc_msgSend_44(_lib._class_NSNumber1,
+        _lib._sel_valueWithNonretainedObject_1, anObject._id);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSValue valueWithPointer_(
+      SwiftLibrary _lib, ffi.Pointer<ffi.Void> pointer) {
+    final _ret = _lib._objc_msgSend_45(
+        _lib._class_NSNumber1, _lib._sel_valueWithPointer_1, pointer);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSValue valueWithRange_(SwiftLibrary _lib, NSRange range) {
+    final _ret = _lib._objc_msgSend_48(
+        _lib._class_NSNumber1, _lib._sel_valueWithRange_1, range);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSValue valueWithPoint_(SwiftLibrary _lib, NSPoint point) {
+    final _ret = _lib._objc_msgSend_50(
+        _lib._class_NSNumber1, _lib._sel_valueWithPoint_1, point);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSValue valueWithSize_(SwiftLibrary _lib, NSSize size) {
+    final _ret = _lib._objc_msgSend_51(
+        _lib._class_NSNumber1, _lib._sel_valueWithSize_1, size);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSValue valueWithRect_(SwiftLibrary _lib, NSRect rect) {
+    final _ret = _lib._objc_msgSend_52(
+        _lib._class_NSNumber1, _lib._sel_valueWithRect_1, rect);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSValue valueWithEdgeInsets_(SwiftLibrary _lib, NSEdgeInsets insets) {
+    final _ret = _lib._objc_msgSend_53(
+        _lib._class_NSNumber1, _lib._sel_valueWithEdgeInsets_1, insets);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNumber new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSNumber1, _lib._sel_new1);
+    return NSNumber._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSNumber alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSNumber1, _lib._sel_alloc1);
+    return NSNumber._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSNumber1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSNumber1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSNumber1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSNumber1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSNumber1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSNumber1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSNumber1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSNumber1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSNumber1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSValue extends NSObject {
+  NSValue._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSValue] that points to the same underlying object as [other].
+  static NSValue castFrom<T extends _ObjCWrapper>(T other) {
+    return NSValue._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSValue] that wraps the given raw object pointer.
+  static NSValue castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSValue._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSValue].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSValue1);
+  }
+
+  void getValue_size_(ffi.Pointer<ffi.Void> value, int size) {
+    return _lib._objc_msgSend_21(_id, _lib._sel_getValue_size_1, value, size);
+  }
+
+  ffi.Pointer<ffi.Char> get objCType {
+    return _lib._objc_msgSend_13(_id, _lib._sel_objCType1);
+  }
+
+  NSValue initWithBytes_objCType_(
+      ffi.Pointer<ffi.Void> value, ffi.Pointer<ffi.Char> type) {
+    final _ret = _lib._objc_msgSend_41(
+        _id, _lib._sel_initWithBytes_objCType_1, value, type);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSValue initWithCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSValue valueWithBytes_objCType_(SwiftLibrary _lib,
+      ffi.Pointer<ffi.Void> value, ffi.Pointer<ffi.Char> type) {
+    final _ret = _lib._objc_msgSend_43(
+        _lib._class_NSValue1, _lib._sel_valueWithBytes_objCType_1, value, type);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSValue value_withObjCType_(SwiftLibrary _lib,
+      ffi.Pointer<ffi.Void> value, ffi.Pointer<ffi.Char> type) {
+    final _ret = _lib._objc_msgSend_43(
+        _lib._class_NSValue1, _lib._sel_value_withObjCType_1, value, type);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSValue valueWithNonretainedObject_(
+      SwiftLibrary _lib, NSObject anObject) {
+    final _ret = _lib._objc_msgSend_44(_lib._class_NSValue1,
+        _lib._sel_valueWithNonretainedObject_1, anObject._id);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject get nonretainedObjectValue {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_nonretainedObjectValue1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSValue valueWithPointer_(
+      SwiftLibrary _lib, ffi.Pointer<ffi.Void> pointer) {
+    final _ret = _lib._objc_msgSend_45(
+        _lib._class_NSValue1, _lib._sel_valueWithPointer_1, pointer);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  ffi.Pointer<ffi.Void> get pointerValue {
+    return _lib._objc_msgSend_19(_id, _lib._sel_pointerValue1);
+  }
+
+  bool isEqualToValue_(NSValue? value) {
+    return _lib._objc_msgSend_46(
+        _id, _lib._sel_isEqualToValue_1, value?._id ?? ffi.nullptr);
+  }
+
+  void getValue_(ffi.Pointer<ffi.Void> value) {
+    return _lib._objc_msgSend_47(_id, _lib._sel_getValue_1, value);
+  }
+
+  static NSValue valueWithRange_(SwiftLibrary _lib, NSRange range) {
+    final _ret = _lib._objc_msgSend_48(
+        _lib._class_NSValue1, _lib._sel_valueWithRange_1, range);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSRange get rangeValue {
+    return _lib._objc_msgSend_49(_id, _lib._sel_rangeValue1);
+  }
+
+  static NSValue valueWithPoint_(SwiftLibrary _lib, NSPoint point) {
+    final _ret = _lib._objc_msgSend_50(
+        _lib._class_NSValue1, _lib._sel_valueWithPoint_1, point);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSValue valueWithSize_(SwiftLibrary _lib, NSSize size) {
+    final _ret = _lib._objc_msgSend_51(
+        _lib._class_NSValue1, _lib._sel_valueWithSize_1, size);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSValue valueWithRect_(SwiftLibrary _lib, NSRect rect) {
+    final _ret = _lib._objc_msgSend_52(
+        _lib._class_NSValue1, _lib._sel_valueWithRect_1, rect);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSValue valueWithEdgeInsets_(SwiftLibrary _lib, NSEdgeInsets insets) {
+    final _ret = _lib._objc_msgSend_53(
+        _lib._class_NSValue1, _lib._sel_valueWithEdgeInsets_1, insets);
+    return NSValue._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSPoint get pointValue {
+    return _lib._objc_msgSend_54(_id, _lib._sel_pointValue1);
+  }
+
+  NSSize get sizeValue {
+    return _lib._objc_msgSend_55(_id, _lib._sel_sizeValue1);
+  }
+
+  NSRect get rectValue {
+    return _lib._objc_msgSend_56(_id, _lib._sel_rectValue1);
+  }
+
+  NSEdgeInsets get edgeInsetsValue {
+    return _lib._objc_msgSend_57(_id, _lib._sel_edgeInsetsValue1);
+  }
+
+  static NSValue new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSValue1, _lib._sel_new1);
+    return NSValue._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSValue alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSValue1, _lib._sel_alloc1);
+    return NSValue._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSValue1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSValue1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSValue1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSValue1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSValue1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSValue1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSValue1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSValue1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSValue1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef NSPoint = CGPoint;
+
+class CGPoint extends ffi.Struct {
+  @CGFloat()
+  external double x;
+
+  @CGFloat()
+  external double y;
+}
+
+typedef CGFloat = ffi.Double;
+typedef NSSize = CGSize;
+
+class CGSize extends ffi.Struct {
+  @CGFloat()
+  external double width;
+
+  @CGFloat()
+  external double height;
+}
+
+typedef NSRect = CGRect;
+
+class CGRect extends ffi.Struct {
+  external CGPoint origin;
+
+  external CGSize size;
+}
+
+class NSEdgeInsets extends ffi.Struct {
+  @CGFloat()
+  external double top;
+
+  @CGFloat()
+  external double left;
+
+  @CGFloat()
+  external double bottom;
+
+  @CGFloat()
+  external double right;
+}
+
+class NSArray extends NSObject {
+  NSArray._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSArray] that points to the same underlying object as [other].
+  static NSArray castFrom<T extends _ObjCWrapper>(T other) {
+    return NSArray._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSArray] that wraps the given raw object pointer.
+  static NSArray castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSArray._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSArray].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSArray1);
+  }
+
+  int get count {
+    return _lib._objc_msgSend_10(_id, _lib._sel_count1);
+  }
+
+  NSObject objectAtIndex_(int index) {
+    final _ret = _lib._objc_msgSend_60(_id, _lib._sel_objectAtIndex_1, index);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSArray init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray initWithObjects_count_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> objects, int cnt) {
+    final _ret = _lib._objc_msgSend_61(
+        _id, _lib._sel_initWithObjects_count_1, objects, cnt);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray initWithCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray arrayByAddingObject_(NSObject anObject) {
+    final _ret = _lib._objc_msgSend_62(
+        _id, _lib._sel_arrayByAddingObject_1, anObject._id);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray arrayByAddingObjectsFromArray_(NSArray? otherArray) {
+    final _ret = _lib._objc_msgSend_63(
+        _id,
+        _lib._sel_arrayByAddingObjectsFromArray_1,
+        otherArray?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString componentsJoinedByString_(NSString? separator) {
+    final _ret = _lib._objc_msgSend_64(_id,
+        _lib._sel_componentsJoinedByString_1, separator?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool containsObject_(NSObject anObject) {
+    return _lib._objc_msgSend_0(_id, _lib._sel_containsObject_1, anObject._id);
+  }
+
+  NSString? get description {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_description1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString descriptionWithLocale_(NSObject locale) {
+    final _ret = _lib._objc_msgSend_65(
+        _id, _lib._sel_descriptionWithLocale_1, locale._id);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString descriptionWithLocale_indent_(NSObject locale, int level) {
+    final _ret = _lib._objc_msgSend_66(
+        _id, _lib._sel_descriptionWithLocale_indent_1, locale._id, level);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject firstObjectCommonWithArray_(NSArray? otherArray) {
+    final _ret = _lib._objc_msgSend_67(_id,
+        _lib._sel_firstObjectCommonWithArray_1, otherArray?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void getObjects_range_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> objects, NSRange range) {
+    return _lib._objc_msgSend_68(
+        _id, _lib._sel_getObjects_range_1, objects, range);
+  }
+
+  int indexOfObject_(NSObject anObject) {
+    return _lib._objc_msgSend_69(_id, _lib._sel_indexOfObject_1, anObject._id);
+  }
+
+  int indexOfObject_inRange_(NSObject anObject, NSRange range) {
+    return _lib._objc_msgSend_70(
+        _id, _lib._sel_indexOfObject_inRange_1, anObject._id, range);
+  }
+
+  int indexOfObjectIdenticalTo_(NSObject anObject) {
+    return _lib._objc_msgSend_69(
+        _id, _lib._sel_indexOfObjectIdenticalTo_1, anObject._id);
+  }
+
+  int indexOfObjectIdenticalTo_inRange_(NSObject anObject, NSRange range) {
+    return _lib._objc_msgSend_70(
+        _id, _lib._sel_indexOfObjectIdenticalTo_inRange_1, anObject._id, range);
+  }
+
+  bool isEqualToArray_(NSArray? otherArray) {
+    return _lib._objc_msgSend_71(
+        _id, _lib._sel_isEqualToArray_1, otherArray?._id ?? ffi.nullptr);
+  }
+
+  NSObject get firstObject {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_firstObject1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject get lastObject {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_lastObject1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSEnumerator objectEnumerator() {
+    final _ret = _lib._objc_msgSend_72(_id, _lib._sel_objectEnumerator1);
+    return NSEnumerator._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSEnumerator reverseObjectEnumerator() {
+    final _ret = _lib._objc_msgSend_72(_id, _lib._sel_reverseObjectEnumerator1);
+    return NSEnumerator._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData? get sortedArrayHint {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_sortedArrayHint1);
+    return _ret.address == 0
+        ? null
+        : NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray sortedArrayUsingFunction_context_(
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  NSInteger Function(ffi.Pointer<ObjCObject>,
+                      ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Void>)>>
+          comparator,
+      ffi.Pointer<ffi.Void> context) {
+    final _ret = _lib._objc_msgSend_73(
+        _id, _lib._sel_sortedArrayUsingFunction_context_1, comparator, context);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray sortedArrayUsingFunction_context_hint_(
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  NSInteger Function(ffi.Pointer<ObjCObject>,
+                      ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Void>)>>
+          comparator,
+      ffi.Pointer<ffi.Void> context,
+      NSData? hint) {
+    final _ret = _lib._objc_msgSend_74(
+        _id,
+        _lib._sel_sortedArrayUsingFunction_context_hint_1,
+        comparator,
+        context,
+        hint?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray sortedArrayUsingSelector_(ffi.Pointer<ObjCSel> comparator) {
+    final _ret = _lib._objc_msgSend_75(
+        _id, _lib._sel_sortedArrayUsingSelector_1, comparator);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray subarrayWithRange_(NSRange range) {
+    final _ret =
+        _lib._objc_msgSend_76(_id, _lib._sel_subarrayWithRange_1, range);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool writeToURL_error_(
+      NSURL? url, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_81(
+        _id, _lib._sel_writeToURL_error_1, url?._id ?? ffi.nullptr, error);
+  }
+
+  void makeObjectsPerformSelector_(ffi.Pointer<ObjCSel> aSelector) {
+    return _lib._objc_msgSend_7(
+        _id, _lib._sel_makeObjectsPerformSelector_1, aSelector);
+  }
+
+  void makeObjectsPerformSelector_withObject_(
+      ffi.Pointer<ObjCSel> aSelector, NSObject argument) {
+    return _lib._objc_msgSend_82(
+        _id,
+        _lib._sel_makeObjectsPerformSelector_withObject_1,
+        aSelector,
+        argument._id);
+  }
+
+  NSArray objectsAtIndexes_(NSIndexSet? indexes) {
+    final _ret = _lib._objc_msgSend_103(
+        _id, _lib._sel_objectsAtIndexes_1, indexes?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject objectAtIndexedSubscript_(int idx) {
+    final _ret =
+        _lib._objc_msgSend_60(_id, _lib._sel_objectAtIndexedSubscript_1, idx);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void enumerateObjectsUsingBlock_(ObjCBlock3 block) {
+    return _lib._objc_msgSend_104(
+        _id, _lib._sel_enumerateObjectsUsingBlock_1, block._id);
+  }
+
+  void enumerateObjectsWithOptions_usingBlock_(int opts, ObjCBlock3 block) {
+    return _lib._objc_msgSend_105(_id,
+        _lib._sel_enumerateObjectsWithOptions_usingBlock_1, opts, block._id);
+  }
+
+  void enumerateObjectsAtIndexes_options_usingBlock_(
+      NSIndexSet? s, int opts, ObjCBlock3 block) {
+    return _lib._objc_msgSend_106(
+        _id,
+        _lib._sel_enumerateObjectsAtIndexes_options_usingBlock_1,
+        s?._id ?? ffi.nullptr,
+        opts,
+        block._id);
+  }
+
+  int indexOfObjectPassingTest_(ObjCBlock4 predicate) {
+    return _lib._objc_msgSend_107(
+        _id, _lib._sel_indexOfObjectPassingTest_1, predicate._id);
+  }
+
+  int indexOfObjectWithOptions_passingTest_(int opts, ObjCBlock4 predicate) {
+    return _lib._objc_msgSend_108(_id,
+        _lib._sel_indexOfObjectWithOptions_passingTest_1, opts, predicate._id);
+  }
+
+  int indexOfObjectAtIndexes_options_passingTest_(
+      NSIndexSet? s, int opts, ObjCBlock4 predicate) {
+    return _lib._objc_msgSend_109(
+        _id,
+        _lib._sel_indexOfObjectAtIndexes_options_passingTest_1,
+        s?._id ?? ffi.nullptr,
+        opts,
+        predicate._id);
+  }
+
+  NSIndexSet indexesOfObjectsPassingTest_(ObjCBlock4 predicate) {
+    final _ret = _lib._objc_msgSend_110(
+        _id, _lib._sel_indexesOfObjectsPassingTest_1, predicate._id);
+    return NSIndexSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSIndexSet indexesOfObjectsWithOptions_passingTest_(
+      int opts, ObjCBlock4 predicate) {
+    final _ret = _lib._objc_msgSend_111(
+        _id,
+        _lib._sel_indexesOfObjectsWithOptions_passingTest_1,
+        opts,
+        predicate._id);
+    return NSIndexSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSIndexSet indexesOfObjectsAtIndexes_options_passingTest_(
+      NSIndexSet? s, int opts, ObjCBlock4 predicate) {
+    final _ret = _lib._objc_msgSend_112(
+        _id,
+        _lib._sel_indexesOfObjectsAtIndexes_options_passingTest_1,
+        s?._id ?? ffi.nullptr,
+        opts,
+        predicate._id);
+    return NSIndexSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray sortedArrayUsingComparator_(NSComparator cmptr) {
+    final _ret = _lib._objc_msgSend_113(
+        _id, _lib._sel_sortedArrayUsingComparator_1, cmptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray sortedArrayWithOptions_usingComparator_(
+      int opts, NSComparator cmptr) {
+    final _ret = _lib._objc_msgSend_114(
+        _id, _lib._sel_sortedArrayWithOptions_usingComparator_1, opts, cmptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  int indexOfObject_inSortedRange_options_usingComparator_(
+      NSObject obj, NSRange r, int opts, NSComparator cmp) {
+    return _lib._objc_msgSend_115(
+        _id,
+        _lib._sel_indexOfObject_inSortedRange_options_usingComparator_1,
+        obj._id,
+        r,
+        opts,
+        cmp);
+  }
+
+  static NSArray array(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSArray1, _lib._sel_array1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray arrayWithObject_(SwiftLibrary _lib, NSObject anObject) {
+    final _ret = _lib._objc_msgSend_16(
+        _lib._class_NSArray1, _lib._sel_arrayWithObject_1, anObject._id);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray arrayWithObjects_count_(SwiftLibrary _lib,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> objects, int cnt) {
+    final _ret = _lib._objc_msgSend_61(
+        _lib._class_NSArray1, _lib._sel_arrayWithObjects_count_1, objects, cnt);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray arrayWithObjects_(SwiftLibrary _lib, NSObject firstObj) {
+    final _ret = _lib._objc_msgSend_16(
+        _lib._class_NSArray1, _lib._sel_arrayWithObjects_1, firstObj._id);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray arrayWithArray_(SwiftLibrary _lib, NSArray? array) {
+    final _ret = _lib._objc_msgSend_67(_lib._class_NSArray1,
+        _lib._sel_arrayWithArray_1, array?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray initWithObjects_(NSObject firstObj) {
+    final _ret =
+        _lib._objc_msgSend_16(_id, _lib._sel_initWithObjects_1, firstObj._id);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray initWithArray_(NSArray? array) {
+    final _ret = _lib._objc_msgSend_67(
+        _id, _lib._sel_initWithArray_1, array?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray initWithArray_copyItems_(NSArray? array, bool flag) {
+    final _ret = _lib._objc_msgSend_116(_id,
+        _lib._sel_initWithArray_copyItems_1, array?._id ?? ffi.nullptr, flag);
+    return NSArray._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSArray initWithContentsOfURL_error_(
+      NSURL? url, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_117(
+        _id,
+        _lib._sel_initWithContentsOfURL_error_1,
+        url?._id ?? ffi.nullptr,
+        error);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray arrayWithContentsOfURL_error_(SwiftLibrary _lib, NSURL? url,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_117(
+        _lib._class_NSArray1,
+        _lib._sel_arrayWithContentsOfURL_error_1,
+        url?._id ?? ffi.nullptr,
+        error);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  void getObjects_(ffi.Pointer<ffi.Pointer<ObjCObject>> objects) {
+    return _lib._objc_msgSend_118(_id, _lib._sel_getObjects_1, objects);
+  }
+
+  static NSArray arrayWithContentsOfFile_(SwiftLibrary _lib, NSString? path) {
+    final _ret = _lib._objc_msgSend_119(_lib._class_NSArray1,
+        _lib._sel_arrayWithContentsOfFile_1, path?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray arrayWithContentsOfURL_(SwiftLibrary _lib, NSURL? url) {
+    final _ret = _lib._objc_msgSend_120(_lib._class_NSArray1,
+        _lib._sel_arrayWithContentsOfURL_1, url?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray initWithContentsOfFile_(NSString? path) {
+    final _ret = _lib._objc_msgSend_119(
+        _id, _lib._sel_initWithContentsOfFile_1, path?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray initWithContentsOfURL_(NSURL? url) {
+    final _ret = _lib._objc_msgSend_120(
+        _id, _lib._sel_initWithContentsOfURL_1, url?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool writeToFile_atomically_(NSString? path, bool useAuxiliaryFile) {
+    return _lib._objc_msgSend_25(_id, _lib._sel_writeToFile_atomically_1,
+        path?._id ?? ffi.nullptr, useAuxiliaryFile);
+  }
+
+  bool writeToURL_atomically_(NSURL? url, bool atomically) {
+    return _lib._objc_msgSend_121(_id, _lib._sel_writeToURL_atomically_1,
+        url?._id ?? ffi.nullptr, atomically);
+  }
+
+  NSArray pathsMatchingExtensions_(NSArray? filterTypes) {
+    final _ret = _lib._objc_msgSend_63(_id, _lib._sel_pathsMatchingExtensions_1,
+        filterTypes?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSObject valueForKey_(NSString? key) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_valueForKey_1, key?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  void setValue_forKey_(NSObject value, NSString? key) {
+    return _lib._objc_msgSend_122(
+        _id, _lib._sel_setValue_forKey_1, value._id, key?._id ?? ffi.nullptr);
+  }
+
+  void addObserver_toObjectsAtIndexes_forKeyPath_options_context_(
+      NSObject? observer,
+      NSIndexSet? indexes,
+      NSString? keyPath,
+      int options,
+      ffi.Pointer<ffi.Void> context) {
+    return _lib._objc_msgSend_123(
+        _id,
+        _lib._sel_addObserver_toObjectsAtIndexes_forKeyPath_options_context_1,
+        observer?._id ?? ffi.nullptr,
+        indexes?._id ?? ffi.nullptr,
+        keyPath?._id ?? ffi.nullptr,
+        options,
+        context);
+  }
+
+  void removeObserver_fromObjectsAtIndexes_forKeyPath_context_(
+      NSObject? observer,
+      NSIndexSet? indexes,
+      NSString? keyPath,
+      ffi.Pointer<ffi.Void> context) {
+    return _lib._objc_msgSend_124(
+        _id,
+        _lib._sel_removeObserver_fromObjectsAtIndexes_forKeyPath_context_1,
+        observer?._id ?? ffi.nullptr,
+        indexes?._id ?? ffi.nullptr,
+        keyPath?._id ?? ffi.nullptr,
+        context);
+  }
+
+  void removeObserver_fromObjectsAtIndexes_forKeyPath_(
+      NSObject? observer, NSIndexSet? indexes, NSString? keyPath) {
+    return _lib._objc_msgSend_125(
+        _id,
+        _lib._sel_removeObserver_fromObjectsAtIndexes_forKeyPath_1,
+        observer?._id ?? ffi.nullptr,
+        indexes?._id ?? ffi.nullptr,
+        keyPath?._id ?? ffi.nullptr);
+  }
+
+  @override
+  void addObserver_forKeyPath_options_context_(NSObject? observer,
+      NSString? keyPath, int options, ffi.Pointer<ffi.Void> context) {
+    return _lib._objc_msgSend_126(
+        _id,
+        _lib._sel_addObserver_forKeyPath_options_context_1,
+        observer?._id ?? ffi.nullptr,
+        keyPath?._id ?? ffi.nullptr,
+        options,
+        context);
+  }
+
+  @override
+  void removeObserver_forKeyPath_context_(
+      NSObject? observer, NSString? keyPath, ffi.Pointer<ffi.Void> context) {
+    return _lib._objc_msgSend_127(
+        _id,
+        _lib._sel_removeObserver_forKeyPath_context_1,
+        observer?._id ?? ffi.nullptr,
+        keyPath?._id ?? ffi.nullptr,
+        context);
+  }
+
+  @override
+  void removeObserver_forKeyPath_(NSObject? observer, NSString? keyPath) {
+    return _lib._objc_msgSend_128(_id, _lib._sel_removeObserver_forKeyPath_1,
+        observer?._id ?? ffi.nullptr, keyPath?._id ?? ffi.nullptr);
+  }
+
+  NSArray sortedArrayUsingDescriptors_(NSArray? sortDescriptors) {
+    final _ret = _lib._objc_msgSend_63(
+        _id,
+        _lib._sel_sortedArrayUsingDescriptors_1,
+        sortDescriptors?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray filteredArrayUsingPredicate_(NSPredicate? predicate) {
+    final _ret = _lib._objc_msgSend_195(_id,
+        _lib._sel_filteredArrayUsingPredicate_1, predicate?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSArray1, _lib._sel_new1);
+    return NSArray._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSArray alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSArray1, _lib._sel_alloc1);
+    return NSArray._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSArray1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSArray1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSArray1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSArray1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSArray1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSArray1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSArray1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSArray1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSArray1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef NSInteger = ffi.Long;
+
+class NSError extends NSObject {
+  NSError._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSError] that points to the same underlying object as [other].
+  static NSError castFrom<T extends _ObjCWrapper>(T other) {
+    return NSError._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSError] that wraps the given raw object pointer.
+  static NSError castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSError._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSError].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSError1);
+  }
+
+  NSError initWithDomain_code_userInfo_(NSErrorDomain domain, int code) {
+    final _ret = _lib._objc_msgSend_77(
+        _id, _lib._sel_initWithDomain_code_userInfo_1, domain, code);
+    return NSError._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSError errorWithDomain_code_userInfo_(
+      SwiftLibrary _lib, NSErrorDomain domain, int code) {
+    final _ret = _lib._objc_msgSend_77(_lib._class_NSError1,
+        _lib._sel_errorWithDomain_code_userInfo_1, domain, code);
+    return NSError._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSErrorDomain get domain {
+    return _lib._objc_msgSend_20(_id, _lib._sel_domain1);
+  }
+
+  int get code {
+    return _lib._objc_msgSend_78(_id, _lib._sel_code1);
+  }
+
+  static NSError new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSError1, _lib._sel_new1);
+    return NSError._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSError alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSError1, _lib._sel_alloc1);
+    return NSError._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSError1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSError1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSError1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSError1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSError1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSError1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSError1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSError1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSError1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef NSErrorDomain = ffi.Pointer<ObjCObject>;
+
+class NSIndexSet extends NSObject {
+  NSIndexSet._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSIndexSet] that points to the same underlying object as [other].
+  static NSIndexSet castFrom<T extends _ObjCWrapper>(T other) {
+    return NSIndexSet._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSIndexSet] that wraps the given raw object pointer.
+  static NSIndexSet castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSIndexSet._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSIndexSet].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSIndexSet1);
+  }
+
+  static NSIndexSet indexSet(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSIndexSet1, _lib._sel_indexSet1);
+    return NSIndexSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSIndexSet indexSetWithIndex_(SwiftLibrary _lib, int value) {
+    final _ret = _lib._objc_msgSend_60(
+        _lib._class_NSIndexSet1, _lib._sel_indexSetWithIndex_1, value);
+    return NSIndexSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSIndexSet indexSetWithIndexesInRange_(
+      SwiftLibrary _lib, NSRange range) {
+    final _ret = _lib._objc_msgSend_83(
+        _lib._class_NSIndexSet1, _lib._sel_indexSetWithIndexesInRange_1, range);
+    return NSIndexSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSIndexSet initWithIndexesInRange_(NSRange range) {
+    final _ret =
+        _lib._objc_msgSend_83(_id, _lib._sel_initWithIndexesInRange_1, range);
+    return NSIndexSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSIndexSet initWithIndexSet_(NSIndexSet? indexSet) {
+    final _ret = _lib._objc_msgSend_84(
+        _id, _lib._sel_initWithIndexSet_1, indexSet?._id ?? ffi.nullptr);
+    return NSIndexSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSIndexSet initWithIndex_(int value) {
+    final _ret = _lib._objc_msgSend_60(_id, _lib._sel_initWithIndex_1, value);
+    return NSIndexSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool isEqualToIndexSet_(NSIndexSet? indexSet) {
+    return _lib._objc_msgSend_85(
+        _id, _lib._sel_isEqualToIndexSet_1, indexSet?._id ?? ffi.nullptr);
+  }
+
+  int get count {
+    return _lib._objc_msgSend_10(_id, _lib._sel_count1);
+  }
+
+  int get firstIndex {
+    return _lib._objc_msgSend_10(_id, _lib._sel_firstIndex1);
+  }
+
+  int get lastIndex {
+    return _lib._objc_msgSend_10(_id, _lib._sel_lastIndex1);
+  }
+
+  int indexGreaterThanIndex_(int value) {
+    return _lib._objc_msgSend_86(_id, _lib._sel_indexGreaterThanIndex_1, value);
+  }
+
+  int indexLessThanIndex_(int value) {
+    return _lib._objc_msgSend_86(_id, _lib._sel_indexLessThanIndex_1, value);
+  }
+
+  int indexGreaterThanOrEqualToIndex_(int value) {
+    return _lib._objc_msgSend_86(
+        _id, _lib._sel_indexGreaterThanOrEqualToIndex_1, value);
+  }
+
+  int indexLessThanOrEqualToIndex_(int value) {
+    return _lib._objc_msgSend_86(
+        _id, _lib._sel_indexLessThanOrEqualToIndex_1, value);
+  }
+
+  int getIndexes_maxCount_inIndexRange_(ffi.Pointer<NSUInteger> indexBuffer,
+      int bufferSize, NSRangePointer range) {
+    return _lib._objc_msgSend_87(
+        _id,
+        _lib._sel_getIndexes_maxCount_inIndexRange_1,
+        indexBuffer,
+        bufferSize,
+        range);
+  }
+
+  int countOfIndexesInRange_(NSRange range) {
+    return _lib._objc_msgSend_88(_id, _lib._sel_countOfIndexesInRange_1, range);
+  }
+
+  bool containsIndex_(int value) {
+    return _lib._objc_msgSend_89(_id, _lib._sel_containsIndex_1, value);
+  }
+
+  bool containsIndexesInRange_(NSRange range) {
+    return _lib._objc_msgSend_90(
+        _id, _lib._sel_containsIndexesInRange_1, range);
+  }
+
+  bool containsIndexes_(NSIndexSet? indexSet) {
+    return _lib._objc_msgSend_85(
+        _id, _lib._sel_containsIndexes_1, indexSet?._id ?? ffi.nullptr);
+  }
+
+  bool intersectsIndexesInRange_(NSRange range) {
+    return _lib._objc_msgSend_90(
+        _id, _lib._sel_intersectsIndexesInRange_1, range);
+  }
+
+  void enumerateIndexesUsingBlock_(ObjCBlock block) {
+    return _lib._objc_msgSend_91(
+        _id, _lib._sel_enumerateIndexesUsingBlock_1, block._id);
+  }
+
+  void enumerateIndexesWithOptions_usingBlock_(int opts, ObjCBlock block) {
+    return _lib._objc_msgSend_92(_id,
+        _lib._sel_enumerateIndexesWithOptions_usingBlock_1, opts, block._id);
+  }
+
+  void enumerateIndexesInRange_options_usingBlock_(
+      NSRange range, int opts, ObjCBlock block) {
+    return _lib._objc_msgSend_93(
+        _id,
+        _lib._sel_enumerateIndexesInRange_options_usingBlock_1,
+        range,
+        opts,
+        block._id);
+  }
+
+  int indexPassingTest_(ObjCBlock1 predicate) {
+    return _lib._objc_msgSend_94(
+        _id, _lib._sel_indexPassingTest_1, predicate._id);
+  }
+
+  int indexWithOptions_passingTest_(int opts, ObjCBlock1 predicate) {
+    return _lib._objc_msgSend_95(
+        _id, _lib._sel_indexWithOptions_passingTest_1, opts, predicate._id);
+  }
+
+  int indexInRange_options_passingTest_(
+      NSRange range, int opts, ObjCBlock1 predicate) {
+    return _lib._objc_msgSend_96(
+        _id,
+        _lib._sel_indexInRange_options_passingTest_1,
+        range,
+        opts,
+        predicate._id);
+  }
+
+  NSIndexSet indexesPassingTest_(ObjCBlock1 predicate) {
+    final _ret = _lib._objc_msgSend_97(
+        _id, _lib._sel_indexesPassingTest_1, predicate._id);
+    return NSIndexSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSIndexSet indexesWithOptions_passingTest_(int opts, ObjCBlock1 predicate) {
+    final _ret = _lib._objc_msgSend_98(
+        _id, _lib._sel_indexesWithOptions_passingTest_1, opts, predicate._id);
+    return NSIndexSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSIndexSet indexesInRange_options_passingTest_(
+      NSRange range, int opts, ObjCBlock1 predicate) {
+    final _ret = _lib._objc_msgSend_99(
+        _id,
+        _lib._sel_indexesInRange_options_passingTest_1,
+        range,
+        opts,
+        predicate._id);
+    return NSIndexSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  void enumerateRangesUsingBlock_(ObjCBlock2 block) {
+    return _lib._objc_msgSend_100(
+        _id, _lib._sel_enumerateRangesUsingBlock_1, block._id);
+  }
+
+  void enumerateRangesWithOptions_usingBlock_(int opts, ObjCBlock2 block) {
+    return _lib._objc_msgSend_101(_id,
+        _lib._sel_enumerateRangesWithOptions_usingBlock_1, opts, block._id);
+  }
+
+  void enumerateRangesInRange_options_usingBlock_(
+      NSRange range, int opts, ObjCBlock2 block) {
+    return _lib._objc_msgSend_102(
+        _id,
+        _lib._sel_enumerateRangesInRange_options_usingBlock_1,
+        range,
+        opts,
+        block._id);
+  }
+
+  static NSIndexSet new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSIndexSet1, _lib._sel_new1);
+    return NSIndexSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSIndexSet alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSIndexSet1, _lib._sel_alloc1);
+    return NSIndexSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSIndexSet1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSIndexSet1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSIndexSet1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSIndexSet1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSIndexSet1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSIndexSet1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSIndexSet1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSIndexSet1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSIndexSet1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef NSRangePointer = ffi.Pointer<NSRange>;
+
+class _ObjCBlockBase implements ffi.Finalizable {
+  final ffi.Pointer<_ObjCBlock> _id;
+  final SwiftLibrary _lib;
+  bool _pendingRelease;
+
+  _ObjCBlockBase._(this._id, this._lib,
+      {bool retain = false, bool release = false})
+      : _pendingRelease = release {
+    if (retain) {
+      _lib._Block_copy(_id.cast());
+    }
+    if (release) {
+      _lib._objc_releaseFinalizer11.attach(this, _id.cast(), detach: this);
+    }
+  }
+
+  /// Releases the reference to the underlying ObjC block held by this wrapper.
+  /// Throws a StateError if this wrapper doesn't currently hold a reference.
+  void release() {
+    if (_pendingRelease) {
+      _pendingRelease = false;
+      _lib._Block_release(_id.cast());
+      _lib._objc_releaseFinalizer11.detach(this);
+    } else {
+      throw StateError(
+          'Released an ObjC block that was unowned or already released.');
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    return other is _ObjCBlockBase && _id == other._id;
+  }
+
+  @override
+  int get hashCode => _id.hashCode;
+}
+
+void _ObjCBlock_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block, int arg0, ffi.Pointer<ffi.Bool> arg1) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(NSUInteger arg0, ffi.Pointer<ffi.Bool> arg1)>>()
+      .asFunction<
+          void Function(int arg0, ffi.Pointer<ffi.Bool> arg1)>()(arg0, arg1);
+}
+
+final _ObjCBlock_closureRegistry = <int, Function>{};
+int _ObjCBlock_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock_registerClosure(Function fn) {
+  final id = ++_ObjCBlock_closureRegistryIndex;
+  _ObjCBlock_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block, int arg0, ffi.Pointer<ffi.Bool> arg1) {
+  return _ObjCBlock_closureRegistry[block.ref.target.address]!(arg0, arg1);
+}
+
+class ObjCBlock extends _ObjCBlockBase {
+  ObjCBlock._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(
+                      NSUInteger arg0, ffi.Pointer<ffi.Bool> arg1)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                NSUInteger arg0, ffi.Pointer<ffi.Bool> arg1)>(
+                        _ObjCBlock_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock.fromFunction(
+      SwiftLibrary lib, void Function(int arg0, ffi.Pointer<ffi.Bool> arg1) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                NSUInteger arg0, ffi.Pointer<ffi.Bool> arg1)>(
+                        _ObjCBlock_closureTrampoline)
+                    .cast(),
+                _ObjCBlock_registerClosure(fn)),
+            lib);
+  void call(int arg0, ffi.Pointer<ffi.Bool> arg1) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                    NSUInteger arg0, ffi.Pointer<ffi.Bool> arg1)>>()
+        .asFunction<
+            void Function(ffi.Pointer<_ObjCBlock> block, int arg0,
+                ffi.Pointer<ffi.Bool> arg1)>()(_id, arg0, arg1);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class _ObjCBlockDesc extends ffi.Struct {
+  @ffi.UnsignedLong()
+  external int reserved;
+
+  @ffi.UnsignedLong()
+  external int size;
+
+  external ffi.Pointer<ffi.Void> copy_helper;
+
+  external ffi.Pointer<ffi.Void> dispose_helper;
+
+  external ffi.Pointer<ffi.Char> signature;
+}
+
+class _ObjCBlock extends ffi.Struct {
+  external ffi.Pointer<ffi.Void> isa;
+
+  @ffi.Int()
+  external int flags;
+
+  @ffi.Int()
+  external int reserved;
+
+  external ffi.Pointer<ffi.Void> invoke;
+
+  external ffi.Pointer<_ObjCBlockDesc> descriptor;
+
+  external ffi.Pointer<ffi.Void> target;
+}
+
+abstract class NSEnumerationOptions {
+  static const int NSEnumerationConcurrent = 1;
+  static const int NSEnumerationReverse = 2;
+}
+
+bool _ObjCBlock1_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block, int arg0, ffi.Pointer<ffi.Bool> arg1) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Bool Function(NSUInteger arg0, ffi.Pointer<ffi.Bool> arg1)>>()
+      .asFunction<
+          bool Function(int arg0, ffi.Pointer<ffi.Bool> arg1)>()(arg0, arg1);
+}
+
+final _ObjCBlock1_closureRegistry = <int, Function>{};
+int _ObjCBlock1_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock1_registerClosure(Function fn) {
+  final id = ++_ObjCBlock1_closureRegistryIndex;
+  _ObjCBlock1_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+bool _ObjCBlock1_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block, int arg0, ffi.Pointer<ffi.Bool> arg1) {
+  return _ObjCBlock1_closureRegistry[block.ref.target.address]!(arg0, arg1);
+}
+
+class ObjCBlock1 extends _ObjCBlockBase {
+  ObjCBlock1._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock1.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Bool Function(
+                      NSUInteger arg0, ffi.Pointer<ffi.Bool> arg1)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Bool Function(ffi.Pointer<_ObjCBlock> block,
+                                NSUInteger arg0, ffi.Pointer<ffi.Bool> arg1)>(
+                        _ObjCBlock1_fnPtrTrampoline, false)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock1.fromFunction(
+      SwiftLibrary lib, bool Function(int arg0, ffi.Pointer<ffi.Bool> arg1) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Bool Function(ffi.Pointer<_ObjCBlock> block,
+                                NSUInteger arg0, ffi.Pointer<ffi.Bool> arg1)>(
+                        _ObjCBlock1_closureTrampoline, false)
+                    .cast(),
+                _ObjCBlock1_registerClosure(fn)),
+            lib);
+  bool call(int arg0, ffi.Pointer<ffi.Bool> arg1) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Bool Function(ffi.Pointer<_ObjCBlock> block,
+                    NSUInteger arg0, ffi.Pointer<ffi.Bool> arg1)>>()
+        .asFunction<
+            bool Function(ffi.Pointer<_ObjCBlock> block, int arg0,
+                ffi.Pointer<ffi.Bool> arg1)>()(_id, arg0, arg1);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+void _ObjCBlock2_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block, NSRange arg0, ffi.Pointer<ffi.Bool> arg1) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(NSRange arg0, ffi.Pointer<ffi.Bool> arg1)>>()
+      .asFunction<
+          void Function(
+              NSRange arg0, ffi.Pointer<ffi.Bool> arg1)>()(arg0, arg1);
+}
+
+final _ObjCBlock2_closureRegistry = <int, Function>{};
+int _ObjCBlock2_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock2_registerClosure(Function fn) {
+  final id = ++_ObjCBlock2_closureRegistryIndex;
+  _ObjCBlock2_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock2_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block, NSRange arg0, ffi.Pointer<ffi.Bool> arg1) {
+  return _ObjCBlock2_closureRegistry[block.ref.target.address]!(arg0, arg1);
+}
+
+class ObjCBlock2 extends _ObjCBlockBase {
+  ObjCBlock2._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock2.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(NSRange arg0, ffi.Pointer<ffi.Bool> arg1)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                NSRange arg0, ffi.Pointer<ffi.Bool> arg1)>(
+                        _ObjCBlock2_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock2.fromFunction(SwiftLibrary lib,
+      void Function(NSRange arg0, ffi.Pointer<ffi.Bool> arg1) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                NSRange arg0, ffi.Pointer<ffi.Bool> arg1)>(
+                        _ObjCBlock2_closureTrampoline)
+                    .cast(),
+                _ObjCBlock2_registerClosure(fn)),
+            lib);
+  void call(NSRange arg0, ffi.Pointer<ffi.Bool> arg1) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(ffi.Pointer<_ObjCBlock> block, NSRange arg0,
+                    ffi.Pointer<ffi.Bool> arg1)>>()
+        .asFunction<
+            void Function(ffi.Pointer<_ObjCBlock> block, NSRange arg0,
+                ffi.Pointer<ffi.Bool> arg1)>()(_id, arg0, arg1);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+void _ObjCBlock3_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, int arg1, ffi.Pointer<ffi.Bool> arg2) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(ffi.Pointer<ObjCObject> arg0, NSUInteger arg1,
+                  ffi.Pointer<ffi.Bool> arg2)>>()
+      .asFunction<
+          void Function(ffi.Pointer<ObjCObject> arg0, int arg1,
+              ffi.Pointer<ffi.Bool> arg2)>()(arg0, arg1, arg2);
+}
+
+final _ObjCBlock3_closureRegistry = <int, Function>{};
+int _ObjCBlock3_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock3_registerClosure(Function fn) {
+  final id = ++_ObjCBlock3_closureRegistryIndex;
+  _ObjCBlock3_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock3_closureTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, int arg1, ffi.Pointer<ffi.Bool> arg2) {
+  return _ObjCBlock3_closureRegistry[block.ref.target.address]!(
+      arg0, arg1, arg2);
+}
+
+class ObjCBlock3 extends _ObjCBlockBase {
+  ObjCBlock3._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock3.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0,
+                      NSUInteger arg1, ffi.Pointer<ffi.Bool> arg2)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                NSUInteger arg1,
+                                ffi.Pointer<ffi.Bool> arg2)>(
+                        _ObjCBlock3_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock3.fromFunction(
+      SwiftLibrary lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, int arg1,
+              ffi.Pointer<ffi.Bool> arg2)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                NSUInteger arg1,
+                                ffi.Pointer<ffi.Bool> arg2)>(
+                        _ObjCBlock3_closureTrampoline)
+                    .cast(),
+                _ObjCBlock3_registerClosure(fn)),
+            lib);
+  void call(
+      ffi.Pointer<ObjCObject> arg0, int arg1, ffi.Pointer<ffi.Bool> arg2) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    NSUInteger arg1,
+                    ffi.Pointer<ffi.Bool> arg2)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                int arg1,
+                ffi.Pointer<ffi.Bool> arg2)>()(_id, arg0, arg1, arg2);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+bool _ObjCBlock4_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, int arg1, ffi.Pointer<ffi.Bool> arg2) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Bool Function(ffi.Pointer<ObjCObject> arg0, NSUInteger arg1,
+                  ffi.Pointer<ffi.Bool> arg2)>>()
+      .asFunction<
+          bool Function(ffi.Pointer<ObjCObject> arg0, int arg1,
+              ffi.Pointer<ffi.Bool> arg2)>()(arg0, arg1, arg2);
+}
+
+final _ObjCBlock4_closureRegistry = <int, Function>{};
+int _ObjCBlock4_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock4_registerClosure(Function fn) {
+  final id = ++_ObjCBlock4_closureRegistryIndex;
+  _ObjCBlock4_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+bool _ObjCBlock4_closureTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, int arg1, ffi.Pointer<ffi.Bool> arg2) {
+  return _ObjCBlock4_closureRegistry[block.ref.target.address]!(
+      arg0, arg1, arg2);
+}
+
+class ObjCBlock4 extends _ObjCBlockBase {
+  ObjCBlock4._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock4.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<ffi.NativeFunction<ffi.Bool Function(ffi.Pointer<ObjCObject> arg0, NSUInteger arg1, ffi.Pointer<ffi.Bool> arg2)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Bool Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                NSUInteger arg1,
+                                ffi.Pointer<ffi.Bool> arg2)>(
+                        _ObjCBlock4_fnPtrTrampoline, false)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock4.fromFunction(
+      SwiftLibrary lib,
+      bool Function(ffi.Pointer<ObjCObject> arg0, int arg1,
+              ffi.Pointer<ffi.Bool> arg2)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Bool Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                NSUInteger arg1,
+                                ffi.Pointer<ffi.Bool> arg2)>(
+                        _ObjCBlock4_closureTrampoline, false)
+                    .cast(),
+                _ObjCBlock4_registerClosure(fn)),
+            lib);
+  bool call(
+      ffi.Pointer<ObjCObject> arg0, int arg1, ffi.Pointer<ffi.Bool> arg2) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Bool Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    NSUInteger arg1,
+                    ffi.Pointer<ffi.Bool> arg2)>>()
+        .asFunction<
+            bool Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                int arg1,
+                ffi.Pointer<ffi.Bool> arg2)>()(_id, arg0, arg1, arg2);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+typedef NSComparator = ffi.Pointer<_ObjCBlock>;
+int _ObjCBlock5_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Int32 Function(ffi.Pointer<ObjCObject> arg0,
+                  ffi.Pointer<ObjCObject> arg1)>>()
+      .asFunction<
+          int Function(ffi.Pointer<ObjCObject> arg0,
+              ffi.Pointer<ObjCObject> arg1)>()(arg0, arg1);
+}
+
+final _ObjCBlock5_closureRegistry = <int, Function>{};
+int _ObjCBlock5_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock5_registerClosure(Function fn) {
+  final id = ++_ObjCBlock5_closureRegistryIndex;
+  _ObjCBlock5_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+int _ObjCBlock5_closureTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1) {
+  return _ObjCBlock5_closureRegistry[block.ref.target.address]!(arg0, arg1);
+}
+
+class ObjCBlock5 extends _ObjCBlockBase {
+  ObjCBlock5._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock5.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Int32 Function(ffi.Pointer<ObjCObject> arg0,
+                      ffi.Pointer<ObjCObject> arg1)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Int32 Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1)>(
+                        _ObjCBlock5_fnPtrTrampoline, 0)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock5.fromFunction(
+      SwiftLibrary lib,
+      int Function(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Int32 Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1)>(
+                        _ObjCBlock5_closureTrampoline, 0)
+                    .cast(),
+                _ObjCBlock5_registerClosure(fn)),
+            lib);
+  int call(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Int32 Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    ffi.Pointer<ObjCObject> arg1)>>()
+        .asFunction<
+            int Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                ffi.Pointer<ObjCObject> arg1)>()(_id, arg0, arg1);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+abstract class NSComparisonResult {
+  static const int NSOrderedAscending = -1;
+  static const int NSOrderedSame = 0;
+  static const int NSOrderedDescending = 1;
+}
+
+abstract class NSSortOptions {
+  static const int NSSortConcurrent = 1;
+  static const int NSSortStable = 16;
+}
+
+abstract class NSBinarySearchingOptions {
+  static const int NSBinarySearchingFirstEqual = 256;
+  static const int NSBinarySearchingLastEqual = 512;
+  static const int NSBinarySearchingInsertionIndex = 1024;
+}
+
+abstract class NSKeyValueObservingOptions {
+  static const int NSKeyValueObservingOptionNew = 1;
+  static const int NSKeyValueObservingOptionOld = 2;
+  static const int NSKeyValueObservingOptionInitial = 4;
+  static const int NSKeyValueObservingOptionPrior = 8;
+}
+
+class NSPredicate extends NSObject {
+  NSPredicate._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSPredicate] that points to the same underlying object as [other].
+  static NSPredicate castFrom<T extends _ObjCWrapper>(T other) {
+    return NSPredicate._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSPredicate] that wraps the given raw object pointer.
+  static NSPredicate castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSPredicate._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSPredicate].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSPredicate1);
+  }
+
+  static NSPredicate predicateWithFormat_argumentArray_(
+      SwiftLibrary _lib, NSString? predicateFormat, NSArray? arguments) {
+    final _ret = _lib._objc_msgSend_129(
+        _lib._class_NSPredicate1,
+        _lib._sel_predicateWithFormat_argumentArray_1,
+        predicateFormat?._id ?? ffi.nullptr,
+        arguments?._id ?? ffi.nullptr);
+    return NSPredicate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSPredicate predicateWithFormat_(
+      SwiftLibrary _lib, NSString? predicateFormat) {
+    final _ret = _lib._objc_msgSend_130(_lib._class_NSPredicate1,
+        _lib._sel_predicateWithFormat_1, predicateFormat?._id ?? ffi.nullptr);
+    return NSPredicate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSPredicate predicateWithFormat_arguments_(SwiftLibrary _lib,
+      NSString? predicateFormat, ffi.Pointer<__va_list_tag> argList) {
+    final _ret = _lib._objc_msgSend_131(
+        _lib._class_NSPredicate1,
+        _lib._sel_predicateWithFormat_arguments_1,
+        predicateFormat?._id ?? ffi.nullptr,
+        argList);
+    return NSPredicate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSPredicate predicateFromMetadataQueryString_(
+      SwiftLibrary _lib, NSString? queryString) {
+    final _ret = _lib._objc_msgSend_130(
+        _lib._class_NSPredicate1,
+        _lib._sel_predicateFromMetadataQueryString_1,
+        queryString?._id ?? ffi.nullptr);
+    return NSPredicate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSPredicate predicateWithValue_(SwiftLibrary _lib, bool value) {
+    final _ret = _lib._objc_msgSend_132(
+        _lib._class_NSPredicate1, _lib._sel_predicateWithValue_1, value);
+    return NSPredicate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSPredicate predicateWithBlock_(SwiftLibrary _lib, ObjCBlock6 block) {
+    final _ret = _lib._objc_msgSend_193(
+        _lib._class_NSPredicate1, _lib._sel_predicateWithBlock_1, block._id);
+    return NSPredicate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get predicateFormat {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_predicateFormat1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSPredicate predicateWithSubstitutionVariables_(NSDictionary? variables) {
+    final _ret = _lib._objc_msgSend_143(
+        _id,
+        _lib._sel_predicateWithSubstitutionVariables_1,
+        variables?._id ?? ffi.nullptr);
+    return NSPredicate._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool evaluateWithObject_(NSObject object) {
+    return _lib._objc_msgSend_0(
+        _id, _lib._sel_evaluateWithObject_1, object._id);
+  }
+
+  bool evaluateWithObject_substitutionVariables_(
+      NSObject object, NSDictionary? bindings) {
+    return _lib._objc_msgSend_194(
+        _id,
+        _lib._sel_evaluateWithObject_substitutionVariables_1,
+        object._id,
+        bindings?._id ?? ffi.nullptr);
+  }
+
+  void allowEvaluation() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_allowEvaluation1);
+  }
+
+  static NSPredicate new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSPredicate1, _lib._sel_new1);
+    return NSPredicate._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSPredicate alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSPredicate1, _lib._sel_alloc1);
+    return NSPredicate._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSPredicate1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSPredicate1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSPredicate1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSPredicate1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSPredicate1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSPredicate1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSPredicate1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSPredicate1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSPredicate1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class __va_list_tag extends ffi.Struct {
+  @ffi.UnsignedInt()
+  external int gp_offset;
+
+  @ffi.UnsignedInt()
+  external int fp_offset;
+
+  external ffi.Pointer<ffi.Void> overflow_arg_area;
+
+  external ffi.Pointer<ffi.Void> reg_save_area;
+}
+
+bool _ObjCBlock6_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Bool Function(ffi.Pointer<ObjCObject> arg0,
+                  ffi.Pointer<ObjCObject> arg1)>>()
+      .asFunction<
+          bool Function(ffi.Pointer<ObjCObject> arg0,
+              ffi.Pointer<ObjCObject> arg1)>()(arg0, arg1);
+}
+
+final _ObjCBlock6_closureRegistry = <int, Function>{};
+int _ObjCBlock6_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock6_registerClosure(Function fn) {
+  final id = ++_ObjCBlock6_closureRegistryIndex;
+  _ObjCBlock6_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+bool _ObjCBlock6_closureTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1) {
+  return _ObjCBlock6_closureRegistry[block.ref.target.address]!(arg0, arg1);
+}
+
+class ObjCBlock6 extends _ObjCBlockBase {
+  ObjCBlock6._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock6.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Bool Function(ffi.Pointer<ObjCObject> arg0,
+                      ffi.Pointer<ObjCObject> arg1)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Bool Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1)>(
+                        _ObjCBlock6_fnPtrTrampoline, false)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock6.fromFunction(
+      SwiftLibrary lib,
+      bool Function(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Bool Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1)>(
+                        _ObjCBlock6_closureTrampoline, false)
+                    .cast(),
+                _ObjCBlock6_registerClosure(fn)),
+            lib);
+  bool call(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Bool Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    ffi.Pointer<ObjCObject> arg1)>>()
+        .asFunction<
+            bool Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                ffi.Pointer<ObjCObject> arg1)>()(_id, arg0, arg1);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class NSDictionary extends NSObject {
+  NSDictionary._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSDictionary] that points to the same underlying object as [other].
+  static NSDictionary castFrom<T extends _ObjCWrapper>(T other) {
+    return NSDictionary._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSDictionary] that wraps the given raw object pointer.
+  static NSDictionary castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSDictionary._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSDictionary].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSDictionary1);
+  }
+
+  int get count {
+    return _lib._objc_msgSend_10(_id, _lib._sel_count1);
+  }
+
+  NSObject objectForKey_(NSObject aKey) {
+    final _ret = _lib._objc_msgSend_16(_id, _lib._sel_objectForKey_1, aKey._id);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSEnumerator keyEnumerator() {
+    final _ret = _lib._objc_msgSend_72(_id, _lib._sel_keyEnumerator1);
+    return NSEnumerator._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSDictionary init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary initWithObjects_forKeys_count_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> objects,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> keys,
+      int cnt) {
+    final _ret = _lib._objc_msgSend_133(
+        _id, _lib._sel_initWithObjects_forKeys_count_1, objects, keys, cnt);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary initWithCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get allKeys {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_allKeys1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray allKeysForObject_(NSObject anObject) {
+    final _ret =
+        _lib._objc_msgSend_62(_id, _lib._sel_allKeysForObject_1, anObject._id);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get allValues {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_allValues1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get description {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_description1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get descriptionInStringsFileFormat {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_descriptionInStringsFileFormat1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString descriptionWithLocale_(NSObject locale) {
+    final _ret = _lib._objc_msgSend_65(
+        _id, _lib._sel_descriptionWithLocale_1, locale._id);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString descriptionWithLocale_indent_(NSObject locale, int level) {
+    final _ret = _lib._objc_msgSend_66(
+        _id, _lib._sel_descriptionWithLocale_indent_1, locale._id, level);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool isEqualToDictionary_(NSDictionary? otherDictionary) {
+    return _lib._objc_msgSend_134(_id, _lib._sel_isEqualToDictionary_1,
+        otherDictionary?._id ?? ffi.nullptr);
+  }
+
+  NSEnumerator objectEnumerator() {
+    final _ret = _lib._objc_msgSend_72(_id, _lib._sel_objectEnumerator1);
+    return NSEnumerator._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray objectsForKeys_notFoundMarker_(NSArray? keys, NSObject marker) {
+    final _ret = _lib._objc_msgSend_135(
+        _id,
+        _lib._sel_objectsForKeys_notFoundMarker_1,
+        keys?._id ?? ffi.nullptr,
+        marker._id);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool writeToURL_error_(
+      NSURL? url, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_81(
+        _id, _lib._sel_writeToURL_error_1, url?._id ?? ffi.nullptr, error);
+  }
+
+  NSArray keysSortedByValueUsingSelector_(ffi.Pointer<ObjCSel> comparator) {
+    final _ret = _lib._objc_msgSend_75(
+        _id, _lib._sel_keysSortedByValueUsingSelector_1, comparator);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  void getObjects_andKeys_count_(ffi.Pointer<ffi.Pointer<ObjCObject>> objects,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> keys, int count) {
+    return _lib._objc_msgSend_136(
+        _id, _lib._sel_getObjects_andKeys_count_1, objects, keys, count);
+  }
+
+  NSObject objectForKeyedSubscript_(NSObject key) {
+    final _ret = _lib._objc_msgSend_16(
+        _id, _lib._sel_objectForKeyedSubscript_1, key._id);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void enumerateKeysAndObjectsUsingBlock_(ObjCBlock7 block) {
+    return _lib._objc_msgSend_137(
+        _id, _lib._sel_enumerateKeysAndObjectsUsingBlock_1, block._id);
+  }
+
+  void enumerateKeysAndObjectsWithOptions_usingBlock_(
+      int opts, ObjCBlock7 block) {
+    return _lib._objc_msgSend_138(
+        _id,
+        _lib._sel_enumerateKeysAndObjectsWithOptions_usingBlock_1,
+        opts,
+        block._id);
+  }
+
+  NSArray keysSortedByValueUsingComparator_(NSComparator cmptr) {
+    final _ret = _lib._objc_msgSend_113(
+        _id, _lib._sel_keysSortedByValueUsingComparator_1, cmptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray keysSortedByValueWithOptions_usingComparator_(
+      int opts, NSComparator cmptr) {
+    final _ret = _lib._objc_msgSend_114(_id,
+        _lib._sel_keysSortedByValueWithOptions_usingComparator_1, opts, cmptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  void getObjects_andKeys_(ffi.Pointer<ffi.Pointer<ObjCObject>> objects,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> keys) {
+    return _lib._objc_msgSend_139(
+        _id, _lib._sel_getObjects_andKeys_1, objects, keys);
+  }
+
+  static NSDictionary dictionaryWithContentsOfFile_(
+      SwiftLibrary _lib, NSString? path) {
+    final _ret = _lib._objc_msgSend_140(_lib._class_NSDictionary1,
+        _lib._sel_dictionaryWithContentsOfFile_1, path?._id ?? ffi.nullptr);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDictionary dictionaryWithContentsOfURL_(
+      SwiftLibrary _lib, NSURL? url) {
+    final _ret = _lib._objc_msgSend_141(_lib._class_NSDictionary1,
+        _lib._sel_dictionaryWithContentsOfURL_1, url?._id ?? ffi.nullptr);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary initWithContentsOfFile_(NSString? path) {
+    final _ret = _lib._objc_msgSend_140(
+        _id, _lib._sel_initWithContentsOfFile_1, path?._id ?? ffi.nullptr);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary initWithContentsOfURL_(NSURL? url) {
+    final _ret = _lib._objc_msgSend_141(
+        _id, _lib._sel_initWithContentsOfURL_1, url?._id ?? ffi.nullptr);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool writeToFile_atomically_(NSString? path, bool useAuxiliaryFile) {
+    return _lib._objc_msgSend_25(_id, _lib._sel_writeToFile_atomically_1,
+        path?._id ?? ffi.nullptr, useAuxiliaryFile);
+  }
+
+  bool writeToURL_atomically_(NSURL? url, bool atomically) {
+    return _lib._objc_msgSend_121(_id, _lib._sel_writeToURL_atomically_1,
+        url?._id ?? ffi.nullptr, atomically);
+  }
+
+  static NSDictionary dictionary(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSDictionary1, _lib._sel_dictionary1);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDictionary dictionaryWithObject_forKey_(
+      SwiftLibrary _lib, NSObject object, NSObject key) {
+    final _ret = _lib._objc_msgSend_142(_lib._class_NSDictionary1,
+        _lib._sel_dictionaryWithObject_forKey_1, object._id, key._id);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDictionary dictionaryWithObjects_forKeys_count_(
+      SwiftLibrary _lib,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> objects,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> keys,
+      int cnt) {
+    final _ret = _lib._objc_msgSend_133(_lib._class_NSDictionary1,
+        _lib._sel_dictionaryWithObjects_forKeys_count_1, objects, keys, cnt);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDictionary dictionaryWithObjectsAndKeys_(
+      SwiftLibrary _lib, NSObject firstObject) {
+    final _ret = _lib._objc_msgSend_16(_lib._class_NSDictionary1,
+        _lib._sel_dictionaryWithObjectsAndKeys_1, firstObject._id);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDictionary dictionaryWithDictionary_(
+      SwiftLibrary _lib, NSDictionary? dict) {
+    final _ret = _lib._objc_msgSend_143(_lib._class_NSDictionary1,
+        _lib._sel_dictionaryWithDictionary_1, dict?._id ?? ffi.nullptr);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDictionary dictionaryWithObjects_forKeys_(
+      SwiftLibrary _lib, NSArray? objects, NSArray? keys) {
+    final _ret = _lib._objc_msgSend_144(
+        _lib._class_NSDictionary1,
+        _lib._sel_dictionaryWithObjects_forKeys_1,
+        objects?._id ?? ffi.nullptr,
+        keys?._id ?? ffi.nullptr);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary initWithObjectsAndKeys_(NSObject firstObject) {
+    final _ret = _lib._objc_msgSend_16(
+        _id, _lib._sel_initWithObjectsAndKeys_1, firstObject._id);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary initWithDictionary_(NSDictionary? otherDictionary) {
+    final _ret = _lib._objc_msgSend_143(_id, _lib._sel_initWithDictionary_1,
+        otherDictionary?._id ?? ffi.nullptr);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary initWithDictionary_copyItems_(
+      NSDictionary? otherDictionary, bool flag) {
+    final _ret = _lib._objc_msgSend_145(
+        _id,
+        _lib._sel_initWithDictionary_copyItems_1,
+        otherDictionary?._id ?? ffi.nullptr,
+        flag);
+    return NSDictionary._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSDictionary initWithObjects_forKeys_(NSArray? objects, NSArray? keys) {
+    final _ret = _lib._objc_msgSend_144(
+        _id,
+        _lib._sel_initWithObjects_forKeys_1,
+        objects?._id ?? ffi.nullptr,
+        keys?._id ?? ffi.nullptr);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary initWithContentsOfURL_error_(
+      NSURL? url, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_146(
+        _id,
+        _lib._sel_initWithContentsOfURL_error_1,
+        url?._id ?? ffi.nullptr,
+        error);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDictionary dictionaryWithContentsOfURL_error_(SwiftLibrary _lib,
+      NSURL? url, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_146(
+        _lib._class_NSDictionary1,
+        _lib._sel_dictionaryWithContentsOfURL_error_1,
+        url?._id ?? ffi.nullptr,
+        error);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject sharedKeySetForKeys_(SwiftLibrary _lib, NSArray? keys) {
+    final _ret = _lib._objc_msgSend_67(_lib._class_NSDictionary1,
+        _lib._sel_sharedKeySetForKeys_1, keys?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  int countByEnumeratingWithState_objects_count_(
+      ffi.Pointer<NSFastEnumerationState> state,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> buffer,
+      int len) {
+    return _lib._objc_msgSend_147(
+        _id,
+        _lib._sel_countByEnumeratingWithState_objects_count_1,
+        state,
+        buffer,
+        len);
+  }
+
+  int fileSize() {
+    return _lib._objc_msgSend_148(_id, _lib._sel_fileSize1);
+  }
+
+  NSDate fileModificationDate() {
+    final _ret = _lib._objc_msgSend_156(_id, _lib._sel_fileModificationDate1);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString fileType() {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_fileType1);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int filePosixPermissions() {
+    return _lib._objc_msgSend_10(_id, _lib._sel_filePosixPermissions1);
+  }
+
+  NSString fileOwnerAccountName() {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_fileOwnerAccountName1);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString fileGroupOwnerAccountName() {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_fileGroupOwnerAccountName1);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int fileSystemNumber() {
+    return _lib._objc_msgSend_78(_id, _lib._sel_fileSystemNumber1);
+  }
+
+  int fileSystemFileNumber() {
+    return _lib._objc_msgSend_10(_id, _lib._sel_fileSystemFileNumber1);
+  }
+
+  bool fileExtensionHidden() {
+    return _lib._objc_msgSend_12(_id, _lib._sel_fileExtensionHidden1);
+  }
+
+  int fileHFSCreatorCode() {
+    return _lib._objc_msgSend_191(_id, _lib._sel_fileHFSCreatorCode1);
+  }
+
+  int fileHFSTypeCode() {
+    return _lib._objc_msgSend_191(_id, _lib._sel_fileHFSTypeCode1);
+  }
+
+  bool fileIsImmutable() {
+    return _lib._objc_msgSend_12(_id, _lib._sel_fileIsImmutable1);
+  }
+
+  bool fileIsAppendOnly() {
+    return _lib._objc_msgSend_12(_id, _lib._sel_fileIsAppendOnly1);
+  }
+
+  NSDate fileCreationDate() {
+    final _ret = _lib._objc_msgSend_156(_id, _lib._sel_fileCreationDate1);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber fileOwnerAccountID() {
+    final _ret = _lib._objc_msgSend_192(_id, _lib._sel_fileOwnerAccountID1);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber fileGroupOwnerAccountID() {
+    final _ret =
+        _lib._objc_msgSend_192(_id, _lib._sel_fileGroupOwnerAccountID1);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSObject valueForKey_(NSString? key) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_valueForKey_1, key?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDictionary new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSDictionary1, _lib._sel_new1);
+    return NSDictionary._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSDictionary alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSDictionary1, _lib._sel_alloc1);
+    return NSDictionary._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSDictionary1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSDictionary1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSDictionary1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSDictionary1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSDictionary1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSDictionary1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSDictionary1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSDictionary1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSDictionary1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+void _ObjCBlock7_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0,
+    ffi.Pointer<ObjCObject> arg1,
+    ffi.Pointer<ffi.Bool> arg2) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(ffi.Pointer<ObjCObject> arg0,
+                  ffi.Pointer<ObjCObject> arg1, ffi.Pointer<ffi.Bool> arg2)>>()
+      .asFunction<
+          void Function(
+              ffi.Pointer<ObjCObject> arg0,
+              ffi.Pointer<ObjCObject> arg1,
+              ffi.Pointer<ffi.Bool> arg2)>()(arg0, arg1, arg2);
+}
+
+final _ObjCBlock7_closureRegistry = <int, Function>{};
+int _ObjCBlock7_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock7_registerClosure(Function fn) {
+  final id = ++_ObjCBlock7_closureRegistryIndex;
+  _ObjCBlock7_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock7_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0,
+    ffi.Pointer<ObjCObject> arg1,
+    ffi.Pointer<ffi.Bool> arg2) {
+  return _ObjCBlock7_closureRegistry[block.ref.target.address]!(
+      arg0, arg1, arg2);
+}
+
+class ObjCBlock7 extends _ObjCBlockBase {
+  ObjCBlock7._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock7.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(
+                      ffi.Pointer<ObjCObject> arg0,
+                      ffi.Pointer<ObjCObject> arg1,
+                      ffi.Pointer<ffi.Bool> arg2)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1,
+                                ffi.Pointer<ffi.Bool> arg2)>(
+                        _ObjCBlock7_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock7.fromFunction(
+      SwiftLibrary lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1,
+              ffi.Pointer<ffi.Bool> arg2)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1,
+                                ffi.Pointer<ffi.Bool> arg2)>(
+                        _ObjCBlock7_closureTrampoline)
+                    .cast(),
+                _ObjCBlock7_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1,
+      ffi.Pointer<ffi.Bool> arg2) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    ffi.Pointer<ObjCObject> arg1,
+                    ffi.Pointer<ffi.Bool> arg2)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                ffi.Pointer<ObjCObject> arg1,
+                ffi.Pointer<ffi.Bool> arg2)>()(_id, arg0, arg1, arg2);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class NSFastEnumerationState extends ffi.Struct {
+  @ffi.UnsignedLong()
+  external int state;
+
+  external ffi.Pointer<ffi.Pointer<ObjCObject>> itemsPtr;
+
+  external ffi.Pointer<ffi.UnsignedLong> mutationsPtr;
+
+  @ffi.Array.multi([5])
+  external ffi.Array<ffi.UnsignedLong> extra;
+}
+
+class NSDate extends NSObject {
+  NSDate._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSDate] that points to the same underlying object as [other].
+  static NSDate castFrom<T extends _ObjCWrapper>(T other) {
+    return NSDate._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSDate] that wraps the given raw object pointer.
+  static NSDate castFromPointer(SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSDate._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSDate].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSDate1);
+  }
+
+  double get timeIntervalSinceReferenceDate {
+    return _lib._objc_msgSend_149(
+        _id, _lib._sel_timeIntervalSinceReferenceDate1);
+  }
+
+  @override
+  NSDate init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate initWithTimeIntervalSinceReferenceDate_(double ti) {
+    final _ret = _lib._objc_msgSend_150(
+        _id, _lib._sel_initWithTimeIntervalSinceReferenceDate_1, ti);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate initWithCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  double timeIntervalSinceDate_(NSDate? anotherDate) {
+    return _lib._objc_msgSend_151(_id, _lib._sel_timeIntervalSinceDate_1,
+        anotherDate?._id ?? ffi.nullptr);
+  }
+
+  double get timeIntervalSinceNow {
+    return _lib._objc_msgSend_149(_id, _lib._sel_timeIntervalSinceNow1);
+  }
+
+  double get timeIntervalSince1970 {
+    return _lib._objc_msgSend_149(_id, _lib._sel_timeIntervalSince19701);
+  }
+
+  NSObject addTimeInterval_(double seconds) {
+    final _ret =
+        _lib._objc_msgSend_150(_id, _lib._sel_addTimeInterval_1, seconds);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate dateByAddingTimeInterval_(double ti) {
+    final _ret =
+        _lib._objc_msgSend_150(_id, _lib._sel_dateByAddingTimeInterval_1, ti);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate earlierDate_(NSDate? anotherDate) {
+    final _ret = _lib._objc_msgSend_152(
+        _id, _lib._sel_earlierDate_1, anotherDate?._id ?? ffi.nullptr);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate laterDate_(NSDate? anotherDate) {
+    final _ret = _lib._objc_msgSend_152(
+        _id, _lib._sel_laterDate_1, anotherDate?._id ?? ffi.nullptr);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  int compare_(NSDate? other) {
+    return _lib._objc_msgSend_153(
+        _id, _lib._sel_compare_1, other?._id ?? ffi.nullptr);
+  }
+
+  bool isEqualToDate_(NSDate? otherDate) {
+    return _lib._objc_msgSend_154(
+        _id, _lib._sel_isEqualToDate_1, otherDate?._id ?? ffi.nullptr);
+  }
+
+  NSString? get description {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_description1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString descriptionWithLocale_(NSObject locale) {
+    final _ret = _lib._objc_msgSend_65(
+        _id, _lib._sel_descriptionWithLocale_1, locale._id);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDate date(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSDate1, _lib._sel_date1);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDate dateWithTimeIntervalSinceNow_(SwiftLibrary _lib, double secs) {
+    final _ret = _lib._objc_msgSend_150(
+        _lib._class_NSDate1, _lib._sel_dateWithTimeIntervalSinceNow_1, secs);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDate dateWithTimeIntervalSinceReferenceDate_(
+      SwiftLibrary _lib, double ti) {
+    final _ret = _lib._objc_msgSend_150(_lib._class_NSDate1,
+        _lib._sel_dateWithTimeIntervalSinceReferenceDate_1, ti);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDate dateWithTimeIntervalSince1970_(SwiftLibrary _lib, double secs) {
+    final _ret = _lib._objc_msgSend_150(
+        _lib._class_NSDate1, _lib._sel_dateWithTimeIntervalSince1970_1, secs);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDate dateWithTimeInterval_sinceDate_(
+      SwiftLibrary _lib, double secsToBeAdded, NSDate? date) {
+    final _ret = _lib._objc_msgSend_155(
+        _lib._class_NSDate1,
+        _lib._sel_dateWithTimeInterval_sinceDate_1,
+        secsToBeAdded,
+        date?._id ?? ffi.nullptr);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDate? getDistantFuture(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_156(_lib._class_NSDate1, _lib._sel_distantFuture1);
+    return _ret.address == 0
+        ? null
+        : NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDate? getDistantPast(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_156(_lib._class_NSDate1, _lib._sel_distantPast1);
+    return _ret.address == 0
+        ? null
+        : NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDate? getNow(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_156(_lib._class_NSDate1, _lib._sel_now1);
+    return _ret.address == 0
+        ? null
+        : NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate initWithTimeIntervalSinceNow_(double secs) {
+    final _ret = _lib._objc_msgSend_150(
+        _id, _lib._sel_initWithTimeIntervalSinceNow_1, secs);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate initWithTimeIntervalSince1970_(double secs) {
+    final _ret = _lib._objc_msgSend_150(
+        _id, _lib._sel_initWithTimeIntervalSince1970_1, secs);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate initWithTimeInterval_sinceDate_(double secsToBeAdded, NSDate? date) {
+    final _ret = _lib._objc_msgSend_155(
+        _id,
+        _lib._sel_initWithTimeInterval_sinceDate_1,
+        secsToBeAdded,
+        date?._id ?? ffi.nullptr);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject dateWithNaturalLanguageString_locale_(
+      SwiftLibrary _lib, NSString? string, NSObject locale) {
+    final _ret = _lib._objc_msgSend_157(
+        _lib._class_NSDate1,
+        _lib._sel_dateWithNaturalLanguageString_locale_1,
+        string?._id ?? ffi.nullptr,
+        locale._id);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject dateWithNaturalLanguageString_(
+      SwiftLibrary _lib, NSString? string) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSDate1,
+        _lib._sel_dateWithNaturalLanguageString_1, string?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject dateWithString_(SwiftLibrary _lib, NSString? aString) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSDate1,
+        _lib._sel_dateWithString_1, aString?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSCalendarDate dateWithCalendarFormat_timeZone_(
+      NSString? format, NSTimeZone? aTimeZone) {
+    final _ret = _lib._objc_msgSend_189(
+        _id,
+        _lib._sel_dateWithCalendarFormat_timeZone_1,
+        format?._id ?? ffi.nullptr,
+        aTimeZone?._id ?? ffi.nullptr);
+    return NSCalendarDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString descriptionWithCalendarFormat_timeZone_locale_(
+      NSString? format, NSTimeZone? aTimeZone, NSObject locale) {
+    final _ret = _lib._objc_msgSend_190(
+        _id,
+        _lib._sel_descriptionWithCalendarFormat_timeZone_locale_1,
+        format?._id ?? ffi.nullptr,
+        aTimeZone?._id ?? ffi.nullptr,
+        locale._id);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject initWithString_(NSString? description) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initWithString_1, description?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDate new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSDate1, _lib._sel_new1);
+    return NSDate._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSDate alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSDate1, _lib._sel_alloc1);
+    return NSDate._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSDate1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSDate1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSDate1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSDate1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSDate1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSDate1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSDate1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSDate1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSDate1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef NSTimeInterval = ffi.Double;
+
+class NSCalendarDate extends NSDate {
+  NSCalendarDate._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSCalendarDate] that points to the same underlying object as [other].
+  static NSCalendarDate castFrom<T extends _ObjCWrapper>(T other) {
+    return NSCalendarDate._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSCalendarDate] that wraps the given raw object pointer.
+  static NSCalendarDate castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSCalendarDate._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSCalendarDate].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSCalendarDate1);
+  }
+
+  static NSObject calendarDate(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSCalendarDate1, _lib._sel_calendarDate1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject dateWithString_calendarFormat_locale_(SwiftLibrary _lib,
+      NSString? description, NSString? format, NSObject locale) {
+    final _ret = _lib._objc_msgSend_158(
+        _lib._class_NSCalendarDate1,
+        _lib._sel_dateWithString_calendarFormat_locale_1,
+        description?._id ?? ffi.nullptr,
+        format?._id ?? ffi.nullptr,
+        locale._id);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject dateWithString_calendarFormat_(
+      SwiftLibrary _lib, NSString? description, NSString? format) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSCalendarDate1,
+        _lib._sel_dateWithString_calendarFormat_1,
+        description?._id ?? ffi.nullptr,
+        format?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject dateWithYear_month_day_hour_minute_second_timeZone_(
+      SwiftLibrary _lib,
+      int year,
+      int month,
+      int day,
+      int hour,
+      int minute,
+      int second,
+      NSTimeZone? aTimeZone) {
+    final _ret = _lib._objc_msgSend_184(
+        _lib._class_NSCalendarDate1,
+        _lib._sel_dateWithYear_month_day_hour_minute_second_timeZone_1,
+        year,
+        month,
+        day,
+        hour,
+        minute,
+        second,
+        aTimeZone?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSCalendarDate dateByAddingYears_months_days_hours_minutes_seconds_(
+      int year, int month, int day, int hour, int minute, int second) {
+    final _ret = _lib._objc_msgSend_185(
+        _id,
+        _lib._sel_dateByAddingYears_months_days_hours_minutes_seconds_1,
+        year,
+        month,
+        day,
+        hour,
+        minute,
+        second);
+    return NSCalendarDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  int dayOfCommonEra() {
+    return _lib._objc_msgSend_78(_id, _lib._sel_dayOfCommonEra1);
+  }
+
+  int dayOfMonth() {
+    return _lib._objc_msgSend_78(_id, _lib._sel_dayOfMonth1);
+  }
+
+  int dayOfWeek() {
+    return _lib._objc_msgSend_78(_id, _lib._sel_dayOfWeek1);
+  }
+
+  int dayOfYear() {
+    return _lib._objc_msgSend_78(_id, _lib._sel_dayOfYear1);
+  }
+
+  int hourOfDay() {
+    return _lib._objc_msgSend_78(_id, _lib._sel_hourOfDay1);
+  }
+
+  int minuteOfHour() {
+    return _lib._objc_msgSend_78(_id, _lib._sel_minuteOfHour1);
+  }
+
+  int monthOfYear() {
+    return _lib._objc_msgSend_78(_id, _lib._sel_monthOfYear1);
+  }
+
+  int secondOfMinute() {
+    return _lib._objc_msgSend_78(_id, _lib._sel_secondOfMinute1);
+  }
+
+  int yearOfCommonEra() {
+    return _lib._objc_msgSend_78(_id, _lib._sel_yearOfCommonEra1);
+  }
+
+  NSString calendarFormat() {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_calendarFormat1);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString descriptionWithCalendarFormat_locale_(
+      NSString? format, NSObject locale) {
+    final _ret = _lib._objc_msgSend_167(
+        _id,
+        _lib._sel_descriptionWithCalendarFormat_locale_1,
+        format?._id ?? ffi.nullptr,
+        locale._id);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString descriptionWithCalendarFormat_(NSString? format) {
+    final _ret = _lib._objc_msgSend_64(_id,
+        _lib._sel_descriptionWithCalendarFormat_1, format?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSString descriptionWithLocale_(NSObject locale) {
+    final _ret = _lib._objc_msgSend_65(
+        _id, _lib._sel_descriptionWithLocale_1, locale._id);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSTimeZone timeZone() {
+    final _ret = _lib._objc_msgSend_162(_id, _lib._sel_timeZone1);
+    return NSTimeZone._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject initWithString_calendarFormat_locale_(
+      NSString? description, NSString? format, NSObject locale) {
+    final _ret = _lib._objc_msgSend_158(
+        _id,
+        _lib._sel_initWithString_calendarFormat_locale_1,
+        description?._id ?? ffi.nullptr,
+        format?._id ?? ffi.nullptr,
+        locale._id);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject initWithString_calendarFormat_(
+      NSString? description, NSString? format) {
+    final _ret = _lib._objc_msgSend_159(
+        _id,
+        _lib._sel_initWithString_calendarFormat_1,
+        description?._id ?? ffi.nullptr,
+        format?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSObject initWithString_(NSString? description) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initWithString_1, description?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject initWithYear_month_day_hour_minute_second_timeZone_(
+      int year,
+      int month,
+      int day,
+      int hour,
+      int minute,
+      int second,
+      NSTimeZone? aTimeZone) {
+    final _ret = _lib._objc_msgSend_184(
+        _id,
+        _lib._sel_initWithYear_month_day_hour_minute_second_timeZone_1,
+        year,
+        month,
+        day,
+        hour,
+        minute,
+        second,
+        aTimeZone?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void setCalendarFormat_(NSString? format) {
+    return _lib._objc_msgSend_186(
+        _id, _lib._sel_setCalendarFormat_1, format?._id ?? ffi.nullptr);
+  }
+
+  void setTimeZone_(NSTimeZone? aTimeZone) {
+    return _lib._objc_msgSend_187(
+        _id, _lib._sel_setTimeZone_1, aTimeZone?._id ?? ffi.nullptr);
+  }
+
+  void years_months_days_hours_minutes_seconds_sinceDate_(
+      ffi.Pointer<NSInteger> yp,
+      ffi.Pointer<NSInteger> mop,
+      ffi.Pointer<NSInteger> dp,
+      ffi.Pointer<NSInteger> hp,
+      ffi.Pointer<NSInteger> mip,
+      ffi.Pointer<NSInteger> sp,
+      NSCalendarDate? date) {
+    return _lib._objc_msgSend_188(
+        _id,
+        _lib._sel_years_months_days_hours_minutes_seconds_sinceDate_1,
+        yp,
+        mop,
+        dp,
+        hp,
+        mip,
+        sp,
+        date?._id ?? ffi.nullptr);
+  }
+
+  static NSDate? getDistantFuture(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_156(
+        _lib._class_NSCalendarDate1, _lib._sel_distantFuture1);
+    return _ret.address == 0
+        ? null
+        : NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDate? getDistantPast(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_156(
+        _lib._class_NSCalendarDate1, _lib._sel_distantPast1);
+    return _ret.address == 0
+        ? null
+        : NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCalendarDate date(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSCalendarDate1, _lib._sel_date1);
+    return NSCalendarDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCalendarDate dateWithTimeIntervalSinceNow_(
+      SwiftLibrary _lib, double secs) {
+    final _ret = _lib._objc_msgSend_150(_lib._class_NSCalendarDate1,
+        _lib._sel_dateWithTimeIntervalSinceNow_1, secs);
+    return NSCalendarDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCalendarDate dateWithTimeIntervalSinceReferenceDate_(
+      SwiftLibrary _lib, double ti) {
+    final _ret = _lib._objc_msgSend_150(_lib._class_NSCalendarDate1,
+        _lib._sel_dateWithTimeIntervalSinceReferenceDate_1, ti);
+    return NSCalendarDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCalendarDate dateWithTimeIntervalSince1970_(
+      SwiftLibrary _lib, double secs) {
+    final _ret = _lib._objc_msgSend_150(_lib._class_NSCalendarDate1,
+        _lib._sel_dateWithTimeIntervalSince1970_1, secs);
+    return NSCalendarDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCalendarDate dateWithTimeInterval_sinceDate_(
+      SwiftLibrary _lib, double secsToBeAdded, NSDate? date) {
+    final _ret = _lib._objc_msgSend_155(
+        _lib._class_NSCalendarDate1,
+        _lib._sel_dateWithTimeInterval_sinceDate_1,
+        secsToBeAdded,
+        date?._id ?? ffi.nullptr);
+    return NSCalendarDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDate? getNow(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_156(_lib._class_NSCalendarDate1, _lib._sel_now1);
+    return _ret.address == 0
+        ? null
+        : NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject dateWithNaturalLanguageString_locale_(
+      SwiftLibrary _lib, NSString? string, NSObject locale) {
+    final _ret = _lib._objc_msgSend_157(
+        _lib._class_NSCalendarDate1,
+        _lib._sel_dateWithNaturalLanguageString_locale_1,
+        string?._id ?? ffi.nullptr,
+        locale._id);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject dateWithNaturalLanguageString_(
+      SwiftLibrary _lib, NSString? string) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSCalendarDate1,
+        _lib._sel_dateWithNaturalLanguageString_1, string?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject dateWithString_(SwiftLibrary _lib, NSString? aString) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSCalendarDate1,
+        _lib._sel_dateWithString_1, aString?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCalendarDate new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSCalendarDate1, _lib._sel_new1);
+    return NSCalendarDate._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSCalendarDate alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSCalendarDate1, _lib._sel_alloc1);
+    return NSCalendarDate._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSCalendarDate1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSCalendarDate1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSCalendarDate1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSCalendarDate1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSCalendarDate1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSCalendarDate1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSCalendarDate1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSCalendarDate1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSCalendarDate1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSTimeZone extends NSObject {
+  NSTimeZone._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSTimeZone] that points to the same underlying object as [other].
+  static NSTimeZone castFrom<T extends _ObjCWrapper>(T other) {
+    return NSTimeZone._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSTimeZone] that wraps the given raw object pointer.
+  static NSTimeZone castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSTimeZone._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSTimeZone].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSTimeZone1);
+  }
+
+  NSString? get name {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_name1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData? get data {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_data1);
+    return _ret.address == 0
+        ? null
+        : NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  int secondsFromGMTForDate_(NSDate? aDate) {
+    return _lib._objc_msgSend_160(
+        _id, _lib._sel_secondsFromGMTForDate_1, aDate?._id ?? ffi.nullptr);
+  }
+
+  NSString abbreviationForDate_(NSDate? aDate) {
+    final _ret = _lib._objc_msgSend_161(
+        _id, _lib._sel_abbreviationForDate_1, aDate?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool isDaylightSavingTimeForDate_(NSDate? aDate) {
+    return _lib._objc_msgSend_154(_id, _lib._sel_isDaylightSavingTimeForDate_1,
+        aDate?._id ?? ffi.nullptr);
+  }
+
+  double daylightSavingTimeOffsetForDate_(NSDate? aDate) {
+    return _lib._objc_msgSend_151(_id,
+        _lib._sel_daylightSavingTimeOffsetForDate_1, aDate?._id ?? ffi.nullptr);
+  }
+
+  NSDate nextDaylightSavingTimeTransitionAfterDate_(NSDate? aDate) {
+    final _ret = _lib._objc_msgSend_152(
+        _id,
+        _lib._sel_nextDaylightSavingTimeTransitionAfterDate_1,
+        aDate?._id ?? ffi.nullptr);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTimeZone? getSystemTimeZone(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_162(
+        _lib._class_NSTimeZone1, _lib._sel_systemTimeZone1);
+    return _ret.address == 0
+        ? null
+        : NSTimeZone._(_ret, _lib, retain: true, release: true);
+  }
+
+  static void resetSystemTimeZone(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_1(
+        _lib._class_NSTimeZone1, _lib._sel_resetSystemTimeZone1);
+  }
+
+  static NSTimeZone? getDefaultTimeZone(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_162(
+        _lib._class_NSTimeZone1, _lib._sel_defaultTimeZone1);
+    return _ret.address == 0
+        ? null
+        : NSTimeZone._(_ret, _lib, retain: true, release: true);
+  }
+
+  static void setDefaultTimeZone(SwiftLibrary _lib, NSTimeZone? value) {
+    _lib._objc_msgSend_163(_lib._class_NSTimeZone1,
+        _lib._sel_setDefaultTimeZone_1, value?._id ?? ffi.nullptr);
+  }
+
+  static NSTimeZone? getLocalTimeZone(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_162(
+        _lib._class_NSTimeZone1, _lib._sel_localTimeZone1);
+    return _ret.address == 0
+        ? null
+        : NSTimeZone._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray? getKnownTimeZoneNames(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSTimeZone1, _lib._sel_knownTimeZoneNames1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDictionary? getAbbreviationDictionary(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_164(
+        _lib._class_NSTimeZone1, _lib._sel_abbreviationDictionary1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static void setAbbreviationDictionary(
+      SwiftLibrary _lib, NSDictionary? value) {
+    _lib._objc_msgSend_165(_lib._class_NSTimeZone1,
+        _lib._sel_setAbbreviationDictionary_1, value?._id ?? ffi.nullptr);
+  }
+
+  static NSString? getTimeZoneDataVersion(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_20(
+        _lib._class_NSTimeZone1, _lib._sel_timeZoneDataVersion1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get secondsFromGMT {
+    return _lib._objc_msgSend_78(_id, _lib._sel_secondsFromGMT1);
+  }
+
+  NSString? get abbreviation {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_abbreviation1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool get daylightSavingTime {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isDaylightSavingTime1);
+  }
+
+  double get daylightSavingTimeOffset {
+    return _lib._objc_msgSend_149(_id, _lib._sel_daylightSavingTimeOffset1);
+  }
+
+  NSDate? get nextDaylightSavingTimeTransition {
+    final _ret = _lib._objc_msgSend_156(
+        _id, _lib._sel_nextDaylightSavingTimeTransition1);
+    return _ret.address == 0
+        ? null
+        : NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get description {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_description1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool isEqualToTimeZone_(NSTimeZone? aTimeZone) {
+    return _lib._objc_msgSend_166(
+        _id, _lib._sel_isEqualToTimeZone_1, aTimeZone?._id ?? ffi.nullptr);
+  }
+
+  NSString localizedName_locale_(int style, NSLocale? locale) {
+    final _ret = _lib._objc_msgSend_181(_id, _lib._sel_localizedName_locale_1,
+        style, locale?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTimeZone timeZoneWithName_(SwiftLibrary _lib, NSString? tzName) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSTimeZone1,
+        _lib._sel_timeZoneWithName_1, tzName?._id ?? ffi.nullptr);
+    return NSTimeZone._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTimeZone timeZoneWithName_data_(
+      SwiftLibrary _lib, NSString? tzName, NSData? aData) {
+    final _ret = _lib._objc_msgSend_182(
+        _lib._class_NSTimeZone1,
+        _lib._sel_timeZoneWithName_data_1,
+        tzName?._id ?? ffi.nullptr,
+        aData?._id ?? ffi.nullptr);
+    return NSTimeZone._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSTimeZone initWithName_(NSString? tzName) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initWithName_1, tzName?._id ?? ffi.nullptr);
+    return NSTimeZone._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSTimeZone initWithName_data_(NSString? tzName, NSData? aData) {
+    final _ret = _lib._objc_msgSend_182(_id, _lib._sel_initWithName_data_1,
+        tzName?._id ?? ffi.nullptr, aData?._id ?? ffi.nullptr);
+    return NSTimeZone._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTimeZone timeZoneForSecondsFromGMT_(SwiftLibrary _lib, int seconds) {
+    final _ret = _lib._objc_msgSend_183(_lib._class_NSTimeZone1,
+        _lib._sel_timeZoneForSecondsFromGMT_1, seconds);
+    return NSTimeZone._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTimeZone timeZoneWithAbbreviation_(
+      SwiftLibrary _lib, NSString? abbreviation) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSTimeZone1,
+        _lib._sel_timeZoneWithAbbreviation_1, abbreviation?._id ?? ffi.nullptr);
+    return NSTimeZone._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTimeZone new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSTimeZone1, _lib._sel_new1);
+    return NSTimeZone._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSTimeZone alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSTimeZone1, _lib._sel_alloc1);
+    return NSTimeZone._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSTimeZone1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSTimeZone1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSTimeZone1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSTimeZone1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSTimeZone1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSTimeZone1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSTimeZone1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSTimeZone1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSTimeZone1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSTimeZoneNameStyle {
+  static const int NSTimeZoneNameStyleStandard = 0;
+  static const int NSTimeZoneNameStyleShortStandard = 1;
+  static const int NSTimeZoneNameStyleDaylightSaving = 2;
+  static const int NSTimeZoneNameStyleShortDaylightSaving = 3;
+  static const int NSTimeZoneNameStyleGeneric = 4;
+  static const int NSTimeZoneNameStyleShortGeneric = 5;
+}
+
+class NSLocale extends NSObject {
+  NSLocale._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSLocale] that points to the same underlying object as [other].
+  static NSLocale castFrom<T extends _ObjCWrapper>(T other) {
+    return NSLocale._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSLocale] that wraps the given raw object pointer.
+  static NSLocale castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSLocale._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSLocale].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSLocale1);
+  }
+
+  NSObject objectForKey_(NSLocaleKey key) {
+    final _ret = _lib._objc_msgSend_30(_id, _lib._sel_objectForKey_1, key);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString displayNameForKey_value_(NSLocaleKey key, NSObject value) {
+    final _ret = _lib._objc_msgSend_167(
+        _id, _lib._sel_displayNameForKey_value_1, key, value._id);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSLocale initWithLocaleIdentifier_(NSString? string) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initWithLocaleIdentifier_1, string?._id ?? ffi.nullptr);
+    return NSLocale._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSLocale initWithCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr);
+    return NSLocale._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get localeIdentifier {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_localeIdentifier1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString localizedStringForLocaleIdentifier_(NSString? localeIdentifier) {
+    final _ret = _lib._objc_msgSend_64(
+        _id,
+        _lib._sel_localizedStringForLocaleIdentifier_1,
+        localeIdentifier?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get languageCode {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_languageCode1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString localizedStringForLanguageCode_(NSString? languageCode) {
+    final _ret = _lib._objc_msgSend_64(
+        _id,
+        _lib._sel_localizedStringForLanguageCode_1,
+        languageCode?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get countryCode {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_countryCode1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString localizedStringForCountryCode_(NSString? countryCode) {
+    final _ret = _lib._objc_msgSend_64(
+        _id,
+        _lib._sel_localizedStringForCountryCode_1,
+        countryCode?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get scriptCode {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_scriptCode1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString localizedStringForScriptCode_(NSString? scriptCode) {
+    final _ret = _lib._objc_msgSend_64(
+        _id,
+        _lib._sel_localizedStringForScriptCode_1,
+        scriptCode?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get variantCode {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_variantCode1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString localizedStringForVariantCode_(NSString? variantCode) {
+    final _ret = _lib._objc_msgSend_64(
+        _id,
+        _lib._sel_localizedStringForVariantCode_1,
+        variantCode?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSCharacterSet? get exemplarCharacterSet {
+    final _ret = _lib._objc_msgSend_168(_id, _lib._sel_exemplarCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get calendarIdentifier {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_calendarIdentifier1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString localizedStringForCalendarIdentifier_(NSString? calendarIdentifier) {
+    final _ret = _lib._objc_msgSend_64(
+        _id,
+        _lib._sel_localizedStringForCalendarIdentifier_1,
+        calendarIdentifier?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get collationIdentifier {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_collationIdentifier1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString localizedStringForCollationIdentifier_(
+      NSString? collationIdentifier) {
+    final _ret = _lib._objc_msgSend_64(
+        _id,
+        _lib._sel_localizedStringForCollationIdentifier_1,
+        collationIdentifier?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool get usesMetricSystem {
+    return _lib._objc_msgSend_12(_id, _lib._sel_usesMetricSystem1);
+  }
+
+  NSString? get decimalSeparator {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_decimalSeparator1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get groupingSeparator {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_groupingSeparator1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get currencySymbol {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_currencySymbol1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get currencyCode {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_currencyCode1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString localizedStringForCurrencyCode_(NSString? currencyCode) {
+    final _ret = _lib._objc_msgSend_64(
+        _id,
+        _lib._sel_localizedStringForCurrencyCode_1,
+        currencyCode?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get collatorIdentifier {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_collatorIdentifier1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString localizedStringForCollatorIdentifier_(NSString? collatorIdentifier) {
+    final _ret = _lib._objc_msgSend_64(
+        _id,
+        _lib._sel_localizedStringForCollatorIdentifier_1,
+        collatorIdentifier?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get quotationBeginDelimiter {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_quotationBeginDelimiter1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get quotationEndDelimiter {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_quotationEndDelimiter1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get alternateQuotationBeginDelimiter {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_alternateQuotationBeginDelimiter1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get alternateQuotationEndDelimiter {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_alternateQuotationEndDelimiter1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSLocale? getAutoupdatingCurrentLocale(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_176(
+        _lib._class_NSLocale1, _lib._sel_autoupdatingCurrentLocale1);
+    return _ret.address == 0
+        ? null
+        : NSLocale._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSLocale? getCurrentLocale(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_176(_lib._class_NSLocale1, _lib._sel_currentLocale1);
+    return _ret.address == 0
+        ? null
+        : NSLocale._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSLocale? getSystemLocale(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_176(_lib._class_NSLocale1, _lib._sel_systemLocale1);
+    return _ret.address == 0
+        ? null
+        : NSLocale._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSLocale localeWithLocaleIdentifier_(
+      SwiftLibrary _lib, NSString? ident) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSLocale1,
+        _lib._sel_localeWithLocaleIdentifier_1, ident?._id ?? ffi.nullptr);
+    return NSLocale._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSLocale init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSLocale._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray? getAvailableLocaleIdentifiers(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSLocale1, _lib._sel_availableLocaleIdentifiers1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray? getISOLanguageCodes(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSLocale1, _lib._sel_ISOLanguageCodes1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray? getISOCountryCodes(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSLocale1, _lib._sel_ISOCountryCodes1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray? getISOCurrencyCodes(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSLocale1, _lib._sel_ISOCurrencyCodes1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray? getCommonISOCurrencyCodes(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSLocale1, _lib._sel_commonISOCurrencyCodes1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray? getPreferredLanguages(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSLocale1, _lib._sel_preferredLanguages1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDictionary componentsFromLocaleIdentifier_(
+      SwiftLibrary _lib, NSString? string) {
+    final _ret = _lib._objc_msgSend_140(_lib._class_NSLocale1,
+        _lib._sel_componentsFromLocaleIdentifier_1, string?._id ?? ffi.nullptr);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString localeIdentifierFromComponents_(
+      SwiftLibrary _lib, NSDictionary? dict) {
+    final _ret = _lib._objc_msgSend_177(_lib._class_NSLocale1,
+        _lib._sel_localeIdentifierFromComponents_1, dict?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString canonicalLocaleIdentifierFromString_(
+      SwiftLibrary _lib, NSString? string) {
+    final _ret = _lib._objc_msgSend_64(
+        _lib._class_NSLocale1,
+        _lib._sel_canonicalLocaleIdentifierFromString_1,
+        string?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString canonicalLanguageIdentifierFromString_(
+      SwiftLibrary _lib, NSString? string) {
+    final _ret = _lib._objc_msgSend_64(
+        _lib._class_NSLocale1,
+        _lib._sel_canonicalLanguageIdentifierFromString_1,
+        string?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString localeIdentifierFromWindowsLocaleCode_(
+      SwiftLibrary _lib, int lcid) {
+    final _ret = _lib._objc_msgSend_178(_lib._class_NSLocale1,
+        _lib._sel_localeIdentifierFromWindowsLocaleCode_1, lcid);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static int windowsLocaleCodeFromLocaleIdentifier_(
+      SwiftLibrary _lib, NSString? localeIdentifier) {
+    return _lib._objc_msgSend_179(
+        _lib._class_NSLocale1,
+        _lib._sel_windowsLocaleCodeFromLocaleIdentifier_1,
+        localeIdentifier?._id ?? ffi.nullptr);
+  }
+
+  static int characterDirectionForLanguage_(
+      SwiftLibrary _lib, NSString? isoLangCode) {
+    return _lib._objc_msgSend_180(
+        _lib._class_NSLocale1,
+        _lib._sel_characterDirectionForLanguage_1,
+        isoLangCode?._id ?? ffi.nullptr);
+  }
+
+  static int lineDirectionForLanguage_(
+      SwiftLibrary _lib, NSString? isoLangCode) {
+    return _lib._objc_msgSend_180(_lib._class_NSLocale1,
+        _lib._sel_lineDirectionForLanguage_1, isoLangCode?._id ?? ffi.nullptr);
+  }
+
+  static NSLocale new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSLocale1, _lib._sel_new1);
+    return NSLocale._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSLocale alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSLocale1, _lib._sel_alloc1);
+    return NSLocale._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSLocale1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSLocale1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSLocale1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSLocale1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSLocale1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSLocale1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSLocale1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSLocale1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSLocale1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef NSLocaleKey = ffi.Pointer<ObjCObject>;
+
+class NSCharacterSet extends NSObject {
+  NSCharacterSet._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSCharacterSet] that points to the same underlying object as [other].
+  static NSCharacterSet castFrom<T extends _ObjCWrapper>(T other) {
+    return NSCharacterSet._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSCharacterSet] that wraps the given raw object pointer.
+  static NSCharacterSet castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSCharacterSet._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSCharacterSet].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSCharacterSet1);
+  }
+
+  static NSCharacterSet? getControlCharacterSet(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_controlCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getWhitespaceCharacterSet(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_whitespaceCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getWhitespaceAndNewlineCharacterSet(
+      SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_168(_lib._class_NSCharacterSet1,
+        _lib._sel_whitespaceAndNewlineCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getDecimalDigitCharacterSet(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_decimalDigitCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getLetterCharacterSet(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_letterCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getLowercaseLetterCharacterSet(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_lowercaseLetterCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getUppercaseLetterCharacterSet(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_uppercaseLetterCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getNonBaseCharacterSet(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_nonBaseCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getAlphanumericCharacterSet(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_alphanumericCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getDecomposableCharacterSet(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_decomposableCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getIllegalCharacterSet(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_illegalCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getPunctuationCharacterSet(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_punctuationCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getCapitalizedLetterCharacterSet(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_capitalizedLetterCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getSymbolCharacterSet(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_symbolCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getNewlineCharacterSet(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_newlineCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSCharacterSet characterSetWithRange_(
+      SwiftLibrary _lib, NSRange aRange) {
+    final _ret = _lib._objc_msgSend_169(
+        _lib._class_NSCharacterSet1, _lib._sel_characterSetWithRange_1, aRange);
+    return NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet characterSetWithCharactersInString_(
+      SwiftLibrary _lib, NSString? aString) {
+    final _ret = _lib._objc_msgSend_170(
+        _lib._class_NSCharacterSet1,
+        _lib._sel_characterSetWithCharactersInString_1,
+        aString?._id ?? ffi.nullptr);
+    return NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet characterSetWithBitmapRepresentation_(
+      SwiftLibrary _lib, NSData? data) {
+    final _ret = _lib._objc_msgSend_171(
+        _lib._class_NSCharacterSet1,
+        _lib._sel_characterSetWithBitmapRepresentation_1,
+        data?._id ?? ffi.nullptr);
+    return NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet characterSetWithContentsOfFile_(
+      SwiftLibrary _lib, NSString? fName) {
+    final _ret = _lib._objc_msgSend_170(_lib._class_NSCharacterSet1,
+        _lib._sel_characterSetWithContentsOfFile_1, fName?._id ?? ffi.nullptr);
+    return NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSCharacterSet initWithCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr);
+    return NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool characterIsMember_(int aCharacter) {
+    return _lib._objc_msgSend_172(
+        _id, _lib._sel_characterIsMember_1, aCharacter);
+  }
+
+  NSData? get bitmapRepresentation {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_bitmapRepresentation1);
+    return _ret.address == 0
+        ? null
+        : NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSCharacterSet? get invertedSet {
+    final _ret = _lib._objc_msgSend_168(_id, _lib._sel_invertedSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool longCharacterIsMember_(int theLongChar) {
+    return _lib._objc_msgSend_173(
+        _id, _lib._sel_longCharacterIsMember_1, theLongChar);
+  }
+
+  bool isSupersetOfSet_(NSCharacterSet? theOtherSet) {
+    return _lib._objc_msgSend_174(
+        _id, _lib._sel_isSupersetOfSet_1, theOtherSet?._id ?? ffi.nullptr);
+  }
+
+  bool hasMemberInPlane_(int thePlane) {
+    return _lib._objc_msgSend_175(_id, _lib._sel_hasMemberInPlane_1, thePlane);
+  }
+
+  static NSCharacterSet? getURLUserAllowedCharacterSet(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_URLUserAllowedCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getURLPasswordAllowedCharacterSet(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_URLPasswordAllowedCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getURLHostAllowedCharacterSet(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_URLHostAllowedCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getURLPathAllowedCharacterSet(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_URLPathAllowedCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getURLQueryAllowedCharacterSet(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_URLQueryAllowedCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet? getURLFragmentAllowedCharacterSet(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_168(
+        _lib._class_NSCharacterSet1, _lib._sel_URLFragmentAllowedCharacterSet1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCharacterSet new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSCharacterSet1, _lib._sel_new1);
+    return NSCharacterSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSCharacterSet alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSCharacterSet1, _lib._sel_alloc1);
+    return NSCharacterSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSCharacterSet1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSCharacterSet1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSCharacterSet1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSCharacterSet1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSCharacterSet1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSCharacterSet1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSCharacterSet1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSCharacterSet1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSCharacterSet1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef UTF32Char = UInt32;
+typedef UInt32 = ffi.UnsignedInt;
+
+abstract class NSLocaleLanguageDirection {
+  static const int NSLocaleLanguageDirectionUnknown = 0;
+  static const int NSLocaleLanguageDirectionLeftToRight = 1;
+  static const int NSLocaleLanguageDirectionRightToLeft = 2;
+  static const int NSLocaleLanguageDirectionTopToBottom = 3;
+  static const int NSLocaleLanguageDirectionBottomToTop = 4;
+}
+
+typedef OSType = FourCharCode;
+typedef FourCharCode = UInt32;
+typedef NSURLResourceKey = ffi.Pointer<ObjCObject>;
+
+class NSURLHandle extends NSObject {
+  NSURLHandle._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURLHandle] that points to the same underlying object as [other].
+  static NSURLHandle castFrom<T extends _ObjCWrapper>(T other) {
+    return NSURLHandle._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSURLHandle] that wraps the given raw object pointer.
+  static NSURLHandle castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURLHandle._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURLHandle].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSURLHandle1);
+  }
+
+  static void registerURLHandleClass_(
+      SwiftLibrary _lib, NSObject anURLHandleSubclass) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLHandle1,
+        _lib._sel_registerURLHandleClass_1, anURLHandleSubclass._id);
+  }
+
+  static NSObject URLHandleClassForURL_(SwiftLibrary _lib, NSURL? anURL) {
+    final _ret = _lib._objc_msgSend_226(_lib._class_NSURLHandle1,
+        _lib._sel_URLHandleClassForURL_1, anURL?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  int status() {
+    return _lib._objc_msgSend_227(_id, _lib._sel_status1);
+  }
+
+  NSString failureReason() {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_failureReason1);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  void addClient_(NSObject? client) {
+    return _lib._objc_msgSend_15(
+        _id, _lib._sel_addClient_1, client?._id ?? ffi.nullptr);
+  }
+
+  void removeClient_(NSObject? client) {
+    return _lib._objc_msgSend_15(
+        _id, _lib._sel_removeClient_1, client?._id ?? ffi.nullptr);
+  }
+
+  void loadInBackground() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_loadInBackground1);
+  }
+
+  void cancelLoadInBackground() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_cancelLoadInBackground1);
+  }
+
+  NSData resourceData() {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_resourceData1);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData availableResourceData() {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_availableResourceData1);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  int expectedResourceDataSize() {
+    return _lib._objc_msgSend_214(_id, _lib._sel_expectedResourceDataSize1);
+  }
+
+  void flushCachedData() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_flushCachedData1);
+  }
+
+  void backgroundLoadDidFailWithReason_(NSString? reason) {
+    return _lib._objc_msgSend_186(
+        _id,
+        _lib._sel_backgroundLoadDidFailWithReason_1,
+        reason?._id ?? ffi.nullptr);
+  }
+
+  void didLoadBytes_loadComplete_(NSData? newBytes, bool yorn) {
+    return _lib._objc_msgSend_228(_id, _lib._sel_didLoadBytes_loadComplete_1,
+        newBytes?._id ?? ffi.nullptr, yorn);
+  }
+
+  static bool canInitWithURL_(SwiftLibrary _lib, NSURL? anURL) {
+    return _lib._objc_msgSend_229(_lib._class_NSURLHandle1,
+        _lib._sel_canInitWithURL_1, anURL?._id ?? ffi.nullptr);
+  }
+
+  static NSURLHandle cachedHandleForURL_(SwiftLibrary _lib, NSURL? anURL) {
+    final _ret = _lib._objc_msgSend_230(_lib._class_NSURLHandle1,
+        _lib._sel_cachedHandleForURL_1, anURL?._id ?? ffi.nullptr);
+    return NSURLHandle._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject initWithURL_cached_(NSURL? anURL, bool willCache) {
+    final _ret = _lib._objc_msgSend_231(_id, _lib._sel_initWithURL_cached_1,
+        anURL?._id ?? ffi.nullptr, willCache);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject propertyForKey_(NSString? propertyKey) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_propertyForKey_1, propertyKey?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject propertyForKeyIfAvailable_(NSString? propertyKey) {
+    final _ret = _lib._objc_msgSend_30(_id,
+        _lib._sel_propertyForKeyIfAvailable_1, propertyKey?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool writeProperty_forKey_(NSObject propertyValue, NSString? propertyKey) {
+    return _lib._objc_msgSend_225(_id, _lib._sel_writeProperty_forKey_1,
+        propertyValue._id, propertyKey?._id ?? ffi.nullptr);
+  }
+
+  bool writeData_(NSData? data) {
+    return _lib._objc_msgSend_23(
+        _id, _lib._sel_writeData_1, data?._id ?? ffi.nullptr);
+  }
+
+  NSData loadInForeground() {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_loadInForeground1);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  void beginLoadInBackground() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_beginLoadInBackground1);
+  }
+
+  void endLoadInBackground() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_endLoadInBackground1);
+  }
+
+  static NSURLHandle new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSURLHandle1, _lib._sel_new1);
+    return NSURLHandle._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSURLHandle alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSURLHandle1, _lib._sel_alloc1);
+    return NSURLHandle._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURLHandle1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLHandle1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLHandle1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLHandle1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURLHandle1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURLHandle1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURLHandle1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSURLHandle1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLHandle1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSURLHandleStatus {
+  static const int NSURLHandleNotLoaded = 0;
+  static const int NSURLHandleLoadSucceeded = 1;
+  static const int NSURLHandleLoadInProgress = 2;
+  static const int NSURLHandleLoadFailed = 3;
+}
+
+abstract class NSDataWritingOptions {
+  static const int NSDataWritingAtomic = 1;
+  static const int NSDataWritingWithoutOverwriting = 2;
+  static const int NSDataWritingFileProtectionNone = 268435456;
+  static const int NSDataWritingFileProtectionComplete = 536870912;
+  static const int NSDataWritingFileProtectionCompleteUnlessOpen = 805306368;
+  static const int
+      NSDataWritingFileProtectionCompleteUntilFirstUserAuthentication =
+      1073741824;
+  static const int NSDataWritingFileProtectionMask = 4026531840;
+  static const int NSAtomicWrite = 1;
+}
+
+abstract class NSDataSearchOptions {
+  static const int NSDataSearchBackwards = 1;
+  static const int NSDataSearchAnchored = 2;
+}
+
+void _ObjCBlock8_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ffi.Void> arg0, NSRange arg1, ffi.Pointer<ffi.Bool> arg2) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(ffi.Pointer<ffi.Void> arg0, NSRange arg1,
+                  ffi.Pointer<ffi.Bool> arg2)>>()
+      .asFunction<
+          void Function(ffi.Pointer<ffi.Void> arg0, NSRange arg1,
+              ffi.Pointer<ffi.Bool> arg2)>()(arg0, arg1, arg2);
+}
+
+final _ObjCBlock8_closureRegistry = <int, Function>{};
+int _ObjCBlock8_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock8_registerClosure(Function fn) {
+  final id = ++_ObjCBlock8_closureRegistryIndex;
+  _ObjCBlock8_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock8_closureTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ffi.Void> arg0, NSRange arg1, ffi.Pointer<ffi.Bool> arg2) {
+  return _ObjCBlock8_closureRegistry[block.ref.target.address]!(
+      arg0, arg1, arg2);
+}
+
+class ObjCBlock8 extends _ObjCBlockBase {
+  ObjCBlock8._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock8.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ffi.Void> arg0, NSRange arg1,
+                      ffi.Pointer<ffi.Bool> arg2)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ffi.Void> arg0,
+                                NSRange arg1,
+                                ffi.Pointer<ffi.Bool> arg2)>(
+                        _ObjCBlock8_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock8.fromFunction(
+      SwiftLibrary lib,
+      void Function(ffi.Pointer<ffi.Void> arg0, NSRange arg1,
+              ffi.Pointer<ffi.Bool> arg2)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ffi.Void> arg0,
+                                NSRange arg1,
+                                ffi.Pointer<ffi.Bool> arg2)>(
+                        _ObjCBlock8_closureTrampoline)
+                    .cast(),
+                _ObjCBlock8_registerClosure(fn)),
+            lib);
+  void call(
+      ffi.Pointer<ffi.Void> arg0, NSRange arg1, ffi.Pointer<ffi.Bool> arg2) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ffi.Void> arg0,
+                    NSRange arg1,
+                    ffi.Pointer<ffi.Bool> arg2)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ffi.Void> arg0,
+                NSRange arg1,
+                ffi.Pointer<ffi.Bool> arg2)>()(_id, arg0, arg1, arg2);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+abstract class NSDataReadingOptions {
+  static const int NSDataReadingMappedIfSafe = 1;
+  static const int NSDataReadingUncached = 2;
+  static const int NSDataReadingMappedAlways = 8;
+  static const int NSDataReadingMapped = 1;
+  static const int NSMappedRead = 1;
+  static const int NSUncachedRead = 2;
+}
+
+void _ObjCBlock9_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ffi.Void> arg0, int arg1) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(ffi.Pointer<ffi.Void> arg0, NSUInteger arg1)>>()
+      .asFunction<
+          void Function(ffi.Pointer<ffi.Void> arg0, int arg1)>()(arg0, arg1);
+}
+
+final _ObjCBlock9_closureRegistry = <int, Function>{};
+int _ObjCBlock9_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock9_registerClosure(Function fn) {
+  final id = ++_ObjCBlock9_closureRegistryIndex;
+  _ObjCBlock9_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock9_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ffi.Void> arg0, int arg1) {
+  return _ObjCBlock9_closureRegistry[block.ref.target.address]!(arg0, arg1);
+}
+
+class ObjCBlock9 extends _ObjCBlockBase {
+  ObjCBlock9._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock9.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(
+                      ffi.Pointer<ffi.Void> arg0, NSUInteger arg1)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                        ffi.Void Function(
+                            ffi.Pointer<_ObjCBlock> block,
+                            ffi.Pointer<ffi.Void> arg0,
+                            NSUInteger arg1)>(_ObjCBlock9_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock9.fromFunction(
+      SwiftLibrary lib, void Function(ffi.Pointer<ffi.Void> arg0, int arg1) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                        ffi.Void Function(
+                            ffi.Pointer<_ObjCBlock> block,
+                            ffi.Pointer<ffi.Void> arg0,
+                            NSUInteger arg1)>(_ObjCBlock9_closureTrampoline)
+                    .cast(),
+                _ObjCBlock9_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ffi.Void> arg0, int arg1) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ffi.Void> arg0, NSUInteger arg1)>>()
+        .asFunction<
+            void Function(ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ffi.Void> arg0, int arg1)>()(_id, arg0, arg1);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+abstract class NSDataBase64DecodingOptions {
+  static const int NSDataBase64DecodingIgnoreUnknownCharacters = 1;
+}
+
+abstract class NSDataBase64EncodingOptions {
+  static const int NSDataBase64Encoding64CharacterLineLength = 1;
+  static const int NSDataBase64Encoding76CharacterLineLength = 2;
+  static const int NSDataBase64EncodingEndLineWithCarriageReturn = 16;
+  static const int NSDataBase64EncodingEndLineWithLineFeed = 32;
+}
+
+abstract class NSDataCompressionAlgorithm {
+  static const int NSDataCompressionAlgorithmLZFSE = 0;
+  static const int NSDataCompressionAlgorithmLZ4 = 1;
+  static const int NSDataCompressionAlgorithmLZMA = 2;
+  static const int NSDataCompressionAlgorithmZlib = 3;
+}
+
+typedef NSZone = _NSZone;
+
+abstract class NSDecodingFailurePolicy {
+  static const int NSDecodingFailurePolicyRaiseException = 0;
+  static const int NSDecodingFailurePolicySetErrorAndReturn = 1;
+}
+
+abstract class NSStringCompareOptions {
+  static const int NSCaseInsensitiveSearch = 1;
+  static const int NSLiteralSearch = 2;
+  static const int NSBackwardsSearch = 4;
+  static const int NSAnchoredSearch = 8;
+  static const int NSNumericSearch = 64;
+  static const int NSDiacriticInsensitiveSearch = 128;
+  static const int NSWidthInsensitiveSearch = 256;
+  static const int NSForcedOrderingSearch = 512;
+  static const int NSRegularExpressionSearch = 1024;
+}
+
+abstract class NSStringEnumerationOptions {
+  static const int NSStringEnumerationByLines = 0;
+  static const int NSStringEnumerationByParagraphs = 1;
+  static const int NSStringEnumerationByComposedCharacterSequences = 2;
+  static const int NSStringEnumerationByWords = 3;
+  static const int NSStringEnumerationBySentences = 4;
+  static const int NSStringEnumerationByCaretPositions = 5;
+  static const int NSStringEnumerationByDeletionClusters = 6;
+  static const int NSStringEnumerationReverse = 256;
+  static const int NSStringEnumerationSubstringNotRequired = 512;
+  static const int NSStringEnumerationLocalized = 1024;
+}
+
+void _ObjCBlock10_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0,
+    NSRange arg1,
+    NSRange arg2,
+    ffi.Pointer<ffi.Bool> arg3) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(ffi.Pointer<ObjCObject> arg0, NSRange arg1,
+                  NSRange arg2, ffi.Pointer<ffi.Bool> arg3)>>()
+      .asFunction<
+          void Function(
+              ffi.Pointer<ObjCObject> arg0,
+              NSRange arg1,
+              NSRange arg2,
+              ffi.Pointer<ffi.Bool> arg3)>()(arg0, arg1, arg2, arg3);
+}
+
+final _ObjCBlock10_closureRegistry = <int, Function>{};
+int _ObjCBlock10_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock10_registerClosure(Function fn) {
+  final id = ++_ObjCBlock10_closureRegistryIndex;
+  _ObjCBlock10_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock10_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0,
+    NSRange arg1,
+    NSRange arg2,
+    ffi.Pointer<ffi.Bool> arg3) {
+  return _ObjCBlock10_closureRegistry[block.ref.target.address]!(
+      arg0, arg1, arg2, arg3);
+}
+
+class ObjCBlock10 extends _ObjCBlockBase {
+  ObjCBlock10._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock10.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0, NSRange arg1,
+                      NSRange arg2, ffi.Pointer<ffi.Bool> arg3)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                NSRange arg1,
+                                NSRange arg2,
+                                ffi.Pointer<ffi.Bool> arg3)>(
+                        _ObjCBlock10_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock10.fromFunction(
+      SwiftLibrary lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, NSRange arg1, NSRange arg2,
+              ffi.Pointer<ffi.Bool> arg3)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                NSRange arg1,
+                                NSRange arg2,
+                                ffi.Pointer<ffi.Bool> arg3)>(
+                        _ObjCBlock10_closureTrampoline)
+                    .cast(),
+                _ObjCBlock10_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0, NSRange arg1, NSRange arg2,
+      ffi.Pointer<ffi.Bool> arg3) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    NSRange arg1,
+                    NSRange arg2,
+                    ffi.Pointer<ffi.Bool> arg3)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                NSRange arg1,
+                NSRange arg2,
+                ffi.Pointer<ffi.Bool> arg3)>()(_id, arg0, arg1, arg2, arg3);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+void _ObjCBlock11_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ffi.Bool> arg1) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(
+                  ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ffi.Bool> arg1)>>()
+      .asFunction<
+          void Function(ffi.Pointer<ObjCObject> arg0,
+              ffi.Pointer<ffi.Bool> arg1)>()(arg0, arg1);
+}
+
+final _ObjCBlock11_closureRegistry = <int, Function>{};
+int _ObjCBlock11_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock11_registerClosure(Function fn) {
+  final id = ++_ObjCBlock11_closureRegistryIndex;
+  _ObjCBlock11_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock11_closureTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ffi.Bool> arg1) {
+  return _ObjCBlock11_closureRegistry[block.ref.target.address]!(arg0, arg1);
+}
+
+class ObjCBlock11 extends _ObjCBlockBase {
+  ObjCBlock11._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock11.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0,
+                      ffi.Pointer<ffi.Bool> arg1)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ffi.Bool> arg1)>(
+                        _ObjCBlock11_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock11.fromFunction(
+      SwiftLibrary lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ffi.Bool> arg1)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ffi.Bool> arg1)>(
+                        _ObjCBlock11_closureTrampoline)
+                    .cast(),
+                _ObjCBlock11_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ffi.Bool> arg1) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    ffi.Pointer<ffi.Bool> arg1)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                ffi.Pointer<ffi.Bool> arg1)>()(_id, arg0, arg1);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+typedef NSStringEncoding = NSUInteger;
+
+abstract class NSStringEncodingConversionOptions {
+  static const int NSStringEncodingConversionAllowLossy = 1;
+  static const int NSStringEncodingConversionExternalRepresentation = 2;
+}
+
+typedef NSStringTransform = ffi.Pointer<ObjCObject>;
+void _ObjCBlock12_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<unichar> arg0, int arg1) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(ffi.Pointer<unichar> arg0, NSUInteger arg1)>>()
+      .asFunction<
+          void Function(ffi.Pointer<unichar> arg0, int arg1)>()(arg0, arg1);
+}
+
+final _ObjCBlock12_closureRegistry = <int, Function>{};
+int _ObjCBlock12_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock12_registerClosure(Function fn) {
+  final id = ++_ObjCBlock12_closureRegistryIndex;
+  _ObjCBlock12_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock12_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<unichar> arg0, int arg1) {
+  return _ObjCBlock12_closureRegistry[block.ref.target.address]!(arg0, arg1);
+}
+
+class ObjCBlock12 extends _ObjCBlockBase {
+  ObjCBlock12._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock12.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(
+                      ffi.Pointer<unichar> arg0, NSUInteger arg1)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                        ffi.Void Function(
+                            ffi.Pointer<_ObjCBlock> block,
+                            ffi.Pointer<unichar> arg0,
+                            NSUInteger arg1)>(_ObjCBlock12_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock12.fromFunction(
+      SwiftLibrary lib, void Function(ffi.Pointer<unichar> arg0, int arg1) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                        ffi.Void Function(
+                            ffi.Pointer<_ObjCBlock> block,
+                            ffi.Pointer<unichar> arg0,
+                            NSUInteger arg1)>(_ObjCBlock12_closureTrampoline)
+                    .cast(),
+                _ObjCBlock12_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<unichar> arg0, int arg1) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<unichar> arg0, NSUInteger arg1)>>()
+        .asFunction<
+            void Function(ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<unichar> arg0, int arg1)>()(_id, arg0, arg1);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+typedef NSLinguisticTagScheme = ffi.Pointer<ObjCObject>;
+
+abstract class NSLinguisticTaggerOptions {
+  static const int NSLinguisticTaggerOmitWords = 1;
+  static const int NSLinguisticTaggerOmitPunctuation = 2;
+  static const int NSLinguisticTaggerOmitWhitespace = 4;
+  static const int NSLinguisticTaggerOmitOther = 8;
+  static const int NSLinguisticTaggerJoinNames = 16;
+}
+
+class NSOrthography extends NSObject {
+  NSOrthography._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSOrthography] that points to the same underlying object as [other].
+  static NSOrthography castFrom<T extends _ObjCWrapper>(T other) {
+    return NSOrthography._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSOrthography] that wraps the given raw object pointer.
+  static NSOrthography castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSOrthography._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSOrthography].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSOrthography1);
+  }
+
+  NSString? get dominantScript {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_dominantScript1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary? get languageMap {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_languageMap1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSOrthography initWithDominantScript_languageMap_(
+      NSString? script, NSDictionary? map) {
+    final _ret = _lib._objc_msgSend_352(
+        _id,
+        _lib._sel_initWithDominantScript_languageMap_1,
+        script?._id ?? ffi.nullptr,
+        map?._id ?? ffi.nullptr);
+    return NSOrthography._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSOrthography initWithCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr);
+    return NSOrthography._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray languagesForScript_(NSString? script) {
+    final _ret = _lib._objc_msgSend_119(
+        _id, _lib._sel_languagesForScript_1, script?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString dominantLanguageForScript_(NSString? script) {
+    final _ret = _lib._objc_msgSend_64(
+        _id, _lib._sel_dominantLanguageForScript_1, script?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get dominantLanguage {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_dominantLanguage1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get allScripts {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_allScripts1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get allLanguages {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_allLanguages1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSOrthography defaultOrthographyForLanguage_(
+      SwiftLibrary _lib, NSString? language) {
+    final _ret = _lib._objc_msgSend_30(
+        _lib._class_NSOrthography1,
+        _lib._sel_defaultOrthographyForLanguage_1,
+        language?._id ?? ffi.nullptr);
+    return NSOrthography._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSOrthography orthographyWithDominantScript_languageMap_(
+      SwiftLibrary _lib, NSString? script, NSDictionary? map) {
+    final _ret = _lib._objc_msgSend_352(
+        _lib._class_NSOrthography1,
+        _lib._sel_orthographyWithDominantScript_languageMap_1,
+        script?._id ?? ffi.nullptr,
+        map?._id ?? ffi.nullptr);
+    return NSOrthography._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSOrthography new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSOrthography1, _lib._sel_new1);
+    return NSOrthography._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSOrthography alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSOrthography1, _lib._sel_alloc1);
+    return NSOrthography._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSOrthography1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSOrthography1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSOrthography1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSOrthography1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSOrthography1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSOrthography1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSOrthography1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSOrthography1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSOrthography1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+void _ObjCBlock13_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ffi.Bool> arg1) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(
+                  ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ffi.Bool> arg1)>>()
+      .asFunction<
+          void Function(ffi.Pointer<ObjCObject> arg0,
+              ffi.Pointer<ffi.Bool> arg1)>()(arg0, arg1);
+}
+
+final _ObjCBlock13_closureRegistry = <int, Function>{};
+int _ObjCBlock13_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock13_registerClosure(Function fn) {
+  final id = ++_ObjCBlock13_closureRegistryIndex;
+  _ObjCBlock13_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock13_closureTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ffi.Bool> arg1) {
+  return _ObjCBlock13_closureRegistry[block.ref.target.address]!(arg0, arg1);
+}
+
+class ObjCBlock13 extends _ObjCBlockBase {
+  ObjCBlock13._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock13.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0,
+                      ffi.Pointer<ffi.Bool> arg1)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ffi.Bool> arg1)>(
+                        _ObjCBlock13_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock13.fromFunction(
+      SwiftLibrary lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ffi.Bool> arg1)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ffi.Bool> arg1)>(
+                        _ObjCBlock13_closureTrampoline)
+                    .cast(),
+                _ObjCBlock13_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ffi.Bool> arg1) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    ffi.Pointer<ffi.Bool> arg1)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                ffi.Pointer<ffi.Bool> arg1)>()(_id, arg0, arg1);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+bool _ObjCBlock14_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ffi.Bool> arg1) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Bool Function(
+                  ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ffi.Bool> arg1)>>()
+      .asFunction<
+          bool Function(ffi.Pointer<ObjCObject> arg0,
+              ffi.Pointer<ffi.Bool> arg1)>()(arg0, arg1);
+}
+
+final _ObjCBlock14_closureRegistry = <int, Function>{};
+int _ObjCBlock14_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock14_registerClosure(Function fn) {
+  final id = ++_ObjCBlock14_closureRegistryIndex;
+  _ObjCBlock14_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+bool _ObjCBlock14_closureTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ffi.Bool> arg1) {
+  return _ObjCBlock14_closureRegistry[block.ref.target.address]!(arg0, arg1);
+}
+
+class ObjCBlock14 extends _ObjCBlockBase {
+  ObjCBlock14._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock14.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Bool Function(ffi.Pointer<ObjCObject> arg0,
+                      ffi.Pointer<ffi.Bool> arg1)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Bool Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ffi.Bool> arg1)>(
+                        _ObjCBlock14_fnPtrTrampoline, false)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock14.fromFunction(
+      SwiftLibrary lib,
+      bool Function(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ffi.Bool> arg1)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Bool Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ffi.Bool> arg1)>(
+                        _ObjCBlock14_closureTrampoline, false)
+                    .cast(),
+                _ObjCBlock14_registerClosure(fn)),
+            lib);
+  bool call(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ffi.Bool> arg1) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Bool Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    ffi.Pointer<ffi.Bool> arg1)>>()
+        .asFunction<
+            bool Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                ffi.Pointer<ffi.Bool> arg1)>()(_id, arg0, arg1);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class NSFileManager extends NSObject {
+  NSFileManager._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSFileManager] that points to the same underlying object as [other].
+  static NSFileManager castFrom<T extends _ObjCWrapper>(T other) {
+    return NSFileManager._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSFileManager] that wraps the given raw object pointer.
+  static NSFileManager castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSFileManager._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSFileManager].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSFileManager1);
+  }
+
+  static NSFileManager? getDefaultManager(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_382(
+        _lib._class_NSFileManager1, _lib._sel_defaultManager1);
+    return _ret.address == 0
+        ? null
+        : NSFileManager._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray mountedVolumeURLsIncludingResourceValuesForKeys_options_(
+      NSArray? propertyKeys, int options) {
+    final _ret = _lib._objc_msgSend_383(
+        _id,
+        _lib._sel_mountedVolumeURLsIncludingResourceValuesForKeys_options_1,
+        propertyKeys?._id ?? ffi.nullptr,
+        options);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  void unmountVolumeAtURL_options_completionHandler_(
+      NSURL? url, int mask, ObjCBlock15 completionHandler) {
+    return _lib._objc_msgSend_384(
+        _id,
+        _lib._sel_unmountVolumeAtURL_options_completionHandler_1,
+        url?._id ?? ffi.nullptr,
+        mask,
+        completionHandler._id);
+  }
+
+  NSArray contentsOfDirectoryAtURL_includingPropertiesForKeys_options_error_(
+      NSURL? url,
+      NSArray? keys,
+      int mask,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_385(
+        _id,
+        _lib._sel_contentsOfDirectoryAtURL_includingPropertiesForKeys_options_error_1,
+        url?._id ?? ffi.nullptr,
+        keys?._id ?? ffi.nullptr,
+        mask,
+        error);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray URLsForDirectory_inDomains_(int directory, int domainMask) {
+    final _ret = _lib._objc_msgSend_386(
+        _id, _lib._sel_URLsForDirectory_inDomains_1, directory, domainMask);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL URLForDirectory_inDomain_appropriateForURL_create_error_(
+      int directory,
+      int domain,
+      NSURL? url,
+      bool shouldCreate,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_387(
+        _id,
+        _lib._sel_URLForDirectory_inDomain_appropriateForURL_create_error_1,
+        directory,
+        domain,
+        url?._id ?? ffi.nullptr,
+        shouldCreate,
+        error);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool getRelationship_ofDirectoryAtURL_toItemAtURL_error_(
+      ffi.Pointer<ffi.Int32> outRelationship,
+      NSURL? directoryURL,
+      NSURL? otherURL,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_388(
+        _id,
+        _lib._sel_getRelationship_ofDirectoryAtURL_toItemAtURL_error_1,
+        outRelationship,
+        directoryURL?._id ?? ffi.nullptr,
+        otherURL?._id ?? ffi.nullptr,
+        error);
+  }
+
+  bool getRelationship_ofDirectory_inDomain_toItemAtURL_error_(
+      ffi.Pointer<ffi.Int32> outRelationship,
+      int directory,
+      int domainMask,
+      NSURL? url,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_389(
+        _id,
+        _lib._sel_getRelationship_ofDirectory_inDomain_toItemAtURL_error_1,
+        outRelationship,
+        directory,
+        domainMask,
+        url?._id ?? ffi.nullptr,
+        error);
+  }
+
+  bool createDirectoryAtURL_withIntermediateDirectories_attributes_error_(
+      NSURL? url,
+      bool createIntermediates,
+      NSDictionary? attributes,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_390(
+        _id,
+        _lib._sel_createDirectoryAtURL_withIntermediateDirectories_attributes_error_1,
+        url?._id ?? ffi.nullptr,
+        createIntermediates,
+        attributes?._id ?? ffi.nullptr,
+        error);
+  }
+
+  bool createSymbolicLinkAtURL_withDestinationURL_error_(
+      NSURL? url, NSURL? destURL, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_391(
+        _id,
+        _lib._sel_createSymbolicLinkAtURL_withDestinationURL_error_1,
+        url?._id ?? ffi.nullptr,
+        destURL?._id ?? ffi.nullptr,
+        error);
+  }
+
+  NSObject? get delegate {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_delegate1);
+    return _ret.address == 0
+        ? null
+        : NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  set delegate(NSObject? value) {
+    _lib._objc_msgSend_368(
+        _id, _lib._sel_setDelegate_1, value?._id ?? ffi.nullptr);
+  }
+
+  bool setAttributes_ofItemAtPath_error_(NSDictionary? attributes,
+      NSString? path, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_392(
+        _id,
+        _lib._sel_setAttributes_ofItemAtPath_error_1,
+        attributes?._id ?? ffi.nullptr,
+        path?._id ?? ffi.nullptr,
+        error);
+  }
+
+  bool createDirectoryAtPath_withIntermediateDirectories_attributes_error_(
+      NSString? path,
+      bool createIntermediates,
+      NSDictionary? attributes,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_393(
+        _id,
+        _lib._sel_createDirectoryAtPath_withIntermediateDirectories_attributes_error_1,
+        path?._id ?? ffi.nullptr,
+        createIntermediates,
+        attributes?._id ?? ffi.nullptr,
+        error);
+  }
+
+  NSArray contentsOfDirectoryAtPath_error_(
+      NSString? path, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_394(
+        _id,
+        _lib._sel_contentsOfDirectoryAtPath_error_1,
+        path?._id ?? ffi.nullptr,
+        error);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray subpathsOfDirectoryAtPath_error_(
+      NSString? path, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_394(
+        _id,
+        _lib._sel_subpathsOfDirectoryAtPath_error_1,
+        path?._id ?? ffi.nullptr,
+        error);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary attributesOfItemAtPath_error_(
+      NSString? path, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_395(
+        _id,
+        _lib._sel_attributesOfItemAtPath_error_1,
+        path?._id ?? ffi.nullptr,
+        error);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary attributesOfFileSystemForPath_error_(
+      NSString? path, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_395(
+        _id,
+        _lib._sel_attributesOfFileSystemForPath_error_1,
+        path?._id ?? ffi.nullptr,
+        error);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool createSymbolicLinkAtPath_withDestinationPath_error_(NSString? path,
+      NSString? destPath, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_396(
+        _id,
+        _lib._sel_createSymbolicLinkAtPath_withDestinationPath_error_1,
+        path?._id ?? ffi.nullptr,
+        destPath?._id ?? ffi.nullptr,
+        error);
+  }
+
+  NSString destinationOfSymbolicLinkAtPath_error_(
+      NSString? path, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_397(
+        _id,
+        _lib._sel_destinationOfSymbolicLinkAtPath_error_1,
+        path?._id ?? ffi.nullptr,
+        error);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool copyItemAtPath_toPath_error_(NSString? srcPath, NSString? dstPath,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_396(_id, _lib._sel_copyItemAtPath_toPath_error_1,
+        srcPath?._id ?? ffi.nullptr, dstPath?._id ?? ffi.nullptr, error);
+  }
+
+  bool moveItemAtPath_toPath_error_(NSString? srcPath, NSString? dstPath,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_396(_id, _lib._sel_moveItemAtPath_toPath_error_1,
+        srcPath?._id ?? ffi.nullptr, dstPath?._id ?? ffi.nullptr, error);
+  }
+
+  bool linkItemAtPath_toPath_error_(NSString? srcPath, NSString? dstPath,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_396(_id, _lib._sel_linkItemAtPath_toPath_error_1,
+        srcPath?._id ?? ffi.nullptr, dstPath?._id ?? ffi.nullptr, error);
+  }
+
+  bool removeItemAtPath_error_(
+      NSString? path, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_398(_id, _lib._sel_removeItemAtPath_error_1,
+        path?._id ?? ffi.nullptr, error);
+  }
+
+  bool copyItemAtURL_toURL_error_(NSURL? srcURL, NSURL? dstURL,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_391(_id, _lib._sel_copyItemAtURL_toURL_error_1,
+        srcURL?._id ?? ffi.nullptr, dstURL?._id ?? ffi.nullptr, error);
+  }
+
+  bool moveItemAtURL_toURL_error_(NSURL? srcURL, NSURL? dstURL,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_391(_id, _lib._sel_moveItemAtURL_toURL_error_1,
+        srcURL?._id ?? ffi.nullptr, dstURL?._id ?? ffi.nullptr, error);
+  }
+
+  bool linkItemAtURL_toURL_error_(NSURL? srcURL, NSURL? dstURL,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_391(_id, _lib._sel_linkItemAtURL_toURL_error_1,
+        srcURL?._id ?? ffi.nullptr, dstURL?._id ?? ffi.nullptr, error);
+  }
+
+  bool removeItemAtURL_error_(
+      NSURL? URL, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_81(
+        _id, _lib._sel_removeItemAtURL_error_1, URL?._id ?? ffi.nullptr, error);
+  }
+
+  bool trashItemAtURL_resultingItemURL_error_(
+      NSURL? url,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outResultingURL,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_399(
+        _id,
+        _lib._sel_trashItemAtURL_resultingItemURL_error_1,
+        url?._id ?? ffi.nullptr,
+        outResultingURL,
+        error);
+  }
+
+  NSDictionary fileAttributesAtPath_traverseLink_(NSString? path, bool yorn) {
+    final _ret = _lib._objc_msgSend_400(
+        _id,
+        _lib._sel_fileAttributesAtPath_traverseLink_1,
+        path?._id ?? ffi.nullptr,
+        yorn);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool changeFileAttributes_atPath_(NSDictionary? attributes, NSString? path) {
+    return _lib._objc_msgSend_401(_id, _lib._sel_changeFileAttributes_atPath_1,
+        attributes?._id ?? ffi.nullptr, path?._id ?? ffi.nullptr);
+  }
+
+  NSArray directoryContentsAtPath_(NSString? path) {
+    final _ret = _lib._objc_msgSend_119(
+        _id, _lib._sel_directoryContentsAtPath_1, path?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary fileSystemAttributesAtPath_(NSString? path) {
+    final _ret = _lib._objc_msgSend_140(
+        _id, _lib._sel_fileSystemAttributesAtPath_1, path?._id ?? ffi.nullptr);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString pathContentOfSymbolicLinkAtPath_(NSString? path) {
+    final _ret = _lib._objc_msgSend_64(_id,
+        _lib._sel_pathContentOfSymbolicLinkAtPath_1, path?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool createSymbolicLinkAtPath_pathContent_(
+      NSString? path, NSString? otherpath) {
+    return _lib._objc_msgSend_402(
+        _id,
+        _lib._sel_createSymbolicLinkAtPath_pathContent_1,
+        path?._id ?? ffi.nullptr,
+        otherpath?._id ?? ffi.nullptr);
+  }
+
+  bool createDirectoryAtPath_attributes_(
+      NSString? path, NSDictionary? attributes) {
+    return _lib._objc_msgSend_403(
+        _id,
+        _lib._sel_createDirectoryAtPath_attributes_1,
+        path?._id ?? ffi.nullptr,
+        attributes?._id ?? ffi.nullptr);
+  }
+
+  bool linkPath_toPath_handler_(
+      NSString? src, NSString? dest, NSObject handler) {
+    return _lib._objc_msgSend_404(_id, _lib._sel_linkPath_toPath_handler_1,
+        src?._id ?? ffi.nullptr, dest?._id ?? ffi.nullptr, handler._id);
+  }
+
+  bool copyPath_toPath_handler_(
+      NSString? src, NSString? dest, NSObject handler) {
+    return _lib._objc_msgSend_404(_id, _lib._sel_copyPath_toPath_handler_1,
+        src?._id ?? ffi.nullptr, dest?._id ?? ffi.nullptr, handler._id);
+  }
+
+  bool movePath_toPath_handler_(
+      NSString? src, NSString? dest, NSObject handler) {
+    return _lib._objc_msgSend_404(_id, _lib._sel_movePath_toPath_handler_1,
+        src?._id ?? ffi.nullptr, dest?._id ?? ffi.nullptr, handler._id);
+  }
+
+  bool removeFileAtPath_handler_(NSString? path, NSObject handler) {
+    return _lib._objc_msgSend_405(_id, _lib._sel_removeFileAtPath_handler_1,
+        path?._id ?? ffi.nullptr, handler._id);
+  }
+
+  NSString? get currentDirectoryPath {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_currentDirectoryPath1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool changeCurrentDirectoryPath_(NSString? path) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_changeCurrentDirectoryPath_1, path?._id ?? ffi.nullptr);
+  }
+
+  bool fileExistsAtPath_(NSString? path) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_fileExistsAtPath_1, path?._id ?? ffi.nullptr);
+  }
+
+  bool fileExistsAtPath_isDirectory_(
+      NSString? path, ffi.Pointer<ffi.Bool> isDirectory) {
+    return _lib._objc_msgSend_406(_id, _lib._sel_fileExistsAtPath_isDirectory_1,
+        path?._id ?? ffi.nullptr, isDirectory);
+  }
+
+  bool isReadableFileAtPath_(NSString? path) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_isReadableFileAtPath_1, path?._id ?? ffi.nullptr);
+  }
+
+  bool isWritableFileAtPath_(NSString? path) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_isWritableFileAtPath_1, path?._id ?? ffi.nullptr);
+  }
+
+  bool isExecutableFileAtPath_(NSString? path) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_isExecutableFileAtPath_1, path?._id ?? ffi.nullptr);
+  }
+
+  bool isDeletableFileAtPath_(NSString? path) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_isDeletableFileAtPath_1, path?._id ?? ffi.nullptr);
+  }
+
+  bool contentsEqualAtPath_andPath_(NSString? path1, NSString? path2) {
+    return _lib._objc_msgSend_402(_id, _lib._sel_contentsEqualAtPath_andPath_1,
+        path1?._id ?? ffi.nullptr, path2?._id ?? ffi.nullptr);
+  }
+
+  NSString displayNameAtPath_(NSString? path) {
+    final _ret = _lib._objc_msgSend_64(
+        _id, _lib._sel_displayNameAtPath_1, path?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray componentsToDisplayForPath_(NSString? path) {
+    final _ret = _lib._objc_msgSend_119(
+        _id, _lib._sel_componentsToDisplayForPath_1, path?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get homeDirectoryForCurrentUser {
+    final _ret =
+        _lib._objc_msgSend_40(_id, _lib._sel_homeDirectoryForCurrentUser1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get temporaryDirectory {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_temporaryDirectory1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL homeDirectoryForUser_(NSString? userName) {
+    final _ret = _lib._objc_msgSend_34(
+        _id, _lib._sel_homeDirectoryForUser_1, userName?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSFileManager new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSFileManager1, _lib._sel_new1);
+    return NSFileManager._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSFileManager alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSFileManager1, _lib._sel_alloc1);
+    return NSFileManager._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSFileManager1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSFileManager1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSFileManager1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSFileManager1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSFileManager1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSFileManager1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSFileManager1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSFileManager1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSFileManager1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSVolumeEnumerationOptions {
+  static const int NSVolumeEnumerationSkipHiddenVolumes = 2;
+  static const int NSVolumeEnumerationProduceFileReferenceURLs = 4;
+}
+
+abstract class NSFileManagerUnmountOptions {
+  static const int NSFileManagerUnmountAllPartitionsAndEjectDisk = 1;
+  static const int NSFileManagerUnmountWithoutUI = 2;
+}
+
+void _ObjCBlock15_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ObjCObject> arg0) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ObjCObject> arg0)>>()
+      .asFunction<void Function(ffi.Pointer<ObjCObject> arg0)>()(arg0);
+}
+
+final _ObjCBlock15_closureRegistry = <int, Function>{};
+int _ObjCBlock15_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock15_registerClosure(Function fn) {
+  final id = ++_ObjCBlock15_closureRegistryIndex;
+  _ObjCBlock15_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock15_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ObjCObject> arg0) {
+  return _ObjCBlock15_closureRegistry[block.ref.target.address]!(arg0);
+}
+
+class ObjCBlock15 extends _ObjCBlockBase {
+  ObjCBlock15._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock15.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0)>(
+                        _ObjCBlock15_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock15.fromFunction(
+      SwiftLibrary lib, void Function(ffi.Pointer<ObjCObject> arg0) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0)>(
+                        _ObjCBlock15_closureTrampoline)
+                    .cast(),
+                _ObjCBlock15_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0)>>()
+        .asFunction<
+            void Function(ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0)>()(_id, arg0);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+abstract class NSDirectoryEnumerationOptions {
+  static const int NSDirectoryEnumerationSkipsSubdirectoryDescendants = 1;
+  static const int NSDirectoryEnumerationSkipsPackageDescendants = 2;
+  static const int NSDirectoryEnumerationSkipsHiddenFiles = 4;
+  static const int NSDirectoryEnumerationIncludesDirectoriesPostOrder = 8;
+  static const int NSDirectoryEnumerationProducesRelativePathURLs = 16;
+}
+
+abstract class NSSearchPathDirectory {
+  static const int NSApplicationDirectory = 1;
+  static const int NSDemoApplicationDirectory = 2;
+  static const int NSDeveloperApplicationDirectory = 3;
+  static const int NSAdminApplicationDirectory = 4;
+  static const int NSLibraryDirectory = 5;
+  static const int NSDeveloperDirectory = 6;
+  static const int NSUserDirectory = 7;
+  static const int NSDocumentationDirectory = 8;
+  static const int NSDocumentDirectory = 9;
+  static const int NSCoreServiceDirectory = 10;
+  static const int NSAutosavedInformationDirectory = 11;
+  static const int NSDesktopDirectory = 12;
+  static const int NSCachesDirectory = 13;
+  static const int NSApplicationSupportDirectory = 14;
+  static const int NSDownloadsDirectory = 15;
+  static const int NSInputMethodsDirectory = 16;
+  static const int NSMoviesDirectory = 17;
+  static const int NSMusicDirectory = 18;
+  static const int NSPicturesDirectory = 19;
+  static const int NSPrinterDescriptionDirectory = 20;
+  static const int NSSharedPublicDirectory = 21;
+  static const int NSPreferencePanesDirectory = 22;
+  static const int NSApplicationScriptsDirectory = 23;
+  static const int NSItemReplacementDirectory = 99;
+  static const int NSAllApplicationsDirectory = 100;
+  static const int NSAllLibrariesDirectory = 101;
+  static const int NSTrashDirectory = 102;
+}
+
+abstract class NSSearchPathDomainMask {
+  static const int NSUserDomainMask = 1;
+  static const int NSLocalDomainMask = 2;
+  static const int NSNetworkDomainMask = 4;
+  static const int NSSystemDomainMask = 8;
+  static const int NSAllDomainsMask = 65535;
+}
+
+abstract class NSURLRelationship {
+  static const int NSURLRelationshipContains = 0;
+  static const int NSURLRelationshipSame = 1;
+  static const int NSURLRelationshipOther = 2;
+}
+
+class NSMutableArray extends NSArray {
+  NSMutableArray._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSMutableArray] that points to the same underlying object as [other].
+  static NSMutableArray castFrom<T extends _ObjCWrapper>(T other) {
+    return NSMutableArray._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSMutableArray] that wraps the given raw object pointer.
+  static NSMutableArray castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSMutableArray._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSMutableArray].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSMutableArray1);
+  }
+
+  void addObject_(NSObject anObject) {
+    return _lib._objc_msgSend_15(_id, _lib._sel_addObject_1, anObject._id);
+  }
+
+  void insertObject_atIndex_(NSObject anObject, int index) {
+    return _lib._objc_msgSend_409(
+        _id, _lib._sel_insertObject_atIndex_1, anObject._id, index);
+  }
+
+  void removeLastObject() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_removeLastObject1);
+  }
+
+  void removeObjectAtIndex_(int index) {
+    return _lib._objc_msgSend_410(_id, _lib._sel_removeObjectAtIndex_1, index);
+  }
+
+  void replaceObjectAtIndex_withObject_(int index, NSObject anObject) {
+    return _lib._objc_msgSend_411(
+        _id, _lib._sel_replaceObjectAtIndex_withObject_1, index, anObject._id);
+  }
+
+  @override
+  NSMutableArray init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSMutableArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSMutableArray initWithCapacity_(int numItems) {
+    final _ret =
+        _lib._objc_msgSend_60(_id, _lib._sel_initWithCapacity_1, numItems);
+    return NSMutableArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSMutableArray initWithCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr);
+    return NSMutableArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  void addObjectsFromArray_(NSArray? otherArray) {
+    return _lib._objc_msgSend_412(
+        _id, _lib._sel_addObjectsFromArray_1, otherArray?._id ?? ffi.nullptr);
+  }
+
+  void exchangeObjectAtIndex_withObjectAtIndex_(int idx1, int idx2) {
+    return _lib._objc_msgSend_413(
+        _id, _lib._sel_exchangeObjectAtIndex_withObjectAtIndex_1, idx1, idx2);
+  }
+
+  void removeAllObjects() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_removeAllObjects1);
+  }
+
+  void removeObject_inRange_(NSObject anObject, NSRange range) {
+    return _lib._objc_msgSend_414(
+        _id, _lib._sel_removeObject_inRange_1, anObject._id, range);
+  }
+
+  void removeObject_(NSObject anObject) {
+    return _lib._objc_msgSend_15(_id, _lib._sel_removeObject_1, anObject._id);
+  }
+
+  void removeObjectIdenticalTo_inRange_(NSObject anObject, NSRange range) {
+    return _lib._objc_msgSend_414(
+        _id, _lib._sel_removeObjectIdenticalTo_inRange_1, anObject._id, range);
+  }
+
+  void removeObjectIdenticalTo_(NSObject anObject) {
+    return _lib._objc_msgSend_15(
+        _id, _lib._sel_removeObjectIdenticalTo_1, anObject._id);
+  }
+
+  void removeObjectsFromIndices_numIndices_(
+      ffi.Pointer<NSUInteger> indices, int cnt) {
+    return _lib._objc_msgSend_415(
+        _id, _lib._sel_removeObjectsFromIndices_numIndices_1, indices, cnt);
+  }
+
+  void removeObjectsInArray_(NSArray? otherArray) {
+    return _lib._objc_msgSend_412(
+        _id, _lib._sel_removeObjectsInArray_1, otherArray?._id ?? ffi.nullptr);
+  }
+
+  void removeObjectsInRange_(NSRange range) {
+    return _lib._objc_msgSend_416(_id, _lib._sel_removeObjectsInRange_1, range);
+  }
+
+  void replaceObjectsInRange_withObjectsFromArray_range_(
+      NSRange range, NSArray? otherArray, NSRange otherRange) {
+    return _lib._objc_msgSend_417(
+        _id,
+        _lib._sel_replaceObjectsInRange_withObjectsFromArray_range_1,
+        range,
+        otherArray?._id ?? ffi.nullptr,
+        otherRange);
+  }
+
+  void replaceObjectsInRange_withObjectsFromArray_(
+      NSRange range, NSArray? otherArray) {
+    return _lib._objc_msgSend_418(
+        _id,
+        _lib._sel_replaceObjectsInRange_withObjectsFromArray_1,
+        range,
+        otherArray?._id ?? ffi.nullptr);
+  }
+
+  void setArray_(NSArray? otherArray) {
+    return _lib._objc_msgSend_412(
+        _id, _lib._sel_setArray_1, otherArray?._id ?? ffi.nullptr);
+  }
+
+  void sortUsingFunction_context_(
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  NSInteger Function(ffi.Pointer<ObjCObject>,
+                      ffi.Pointer<ObjCObject>, ffi.Pointer<ffi.Void>)>>
+          compare,
+      ffi.Pointer<ffi.Void> context) {
+    return _lib._objc_msgSend_419(
+        _id, _lib._sel_sortUsingFunction_context_1, compare, context);
+  }
+
+  void sortUsingSelector_(ffi.Pointer<ObjCSel> comparator) {
+    return _lib._objc_msgSend_7(_id, _lib._sel_sortUsingSelector_1, comparator);
+  }
+
+  void insertObjects_atIndexes_(NSArray? objects, NSIndexSet? indexes) {
+    return _lib._objc_msgSend_420(_id, _lib._sel_insertObjects_atIndexes_1,
+        objects?._id ?? ffi.nullptr, indexes?._id ?? ffi.nullptr);
+  }
+
+  void removeObjectsAtIndexes_(NSIndexSet? indexes) {
+    return _lib._objc_msgSend_421(
+        _id, _lib._sel_removeObjectsAtIndexes_1, indexes?._id ?? ffi.nullptr);
+  }
+
+  void replaceObjectsAtIndexes_withObjects_(
+      NSIndexSet? indexes, NSArray? objects) {
+    return _lib._objc_msgSend_422(
+        _id,
+        _lib._sel_replaceObjectsAtIndexes_withObjects_1,
+        indexes?._id ?? ffi.nullptr,
+        objects?._id ?? ffi.nullptr);
+  }
+
+  void setObject_atIndexedSubscript_(NSObject obj, int idx) {
+    return _lib._objc_msgSend_409(
+        _id, _lib._sel_setObject_atIndexedSubscript_1, obj._id, idx);
+  }
+
+  void sortUsingComparator_(NSComparator cmptr) {
+    return _lib._objc_msgSend_423(_id, _lib._sel_sortUsingComparator_1, cmptr);
+  }
+
+  void sortWithOptions_usingComparator_(int opts, NSComparator cmptr) {
+    return _lib._objc_msgSend_424(
+        _id, _lib._sel_sortWithOptions_usingComparator_1, opts, cmptr);
+  }
+
+  static NSMutableArray arrayWithCapacity_(SwiftLibrary _lib, int numItems) {
+    final _ret = _lib._objc_msgSend_60(
+        _lib._class_NSMutableArray1, _lib._sel_arrayWithCapacity_1, numItems);
+    return NSMutableArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableArray arrayWithContentsOfFile_(
+      SwiftLibrary _lib, NSString? path) {
+    final _ret = _lib._objc_msgSend_425(_lib._class_NSMutableArray1,
+        _lib._sel_arrayWithContentsOfFile_1, path?._id ?? ffi.nullptr);
+    return NSMutableArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableArray arrayWithContentsOfURL_(SwiftLibrary _lib, NSURL? url) {
+    final _ret = _lib._objc_msgSend_426(_lib._class_NSMutableArray1,
+        _lib._sel_arrayWithContentsOfURL_1, url?._id ?? ffi.nullptr);
+    return NSMutableArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSMutableArray initWithContentsOfFile_(NSString? path) {
+    final _ret = _lib._objc_msgSend_425(
+        _id, _lib._sel_initWithContentsOfFile_1, path?._id ?? ffi.nullptr);
+    return NSMutableArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSMutableArray initWithContentsOfURL_(NSURL? url) {
+    final _ret = _lib._objc_msgSend_426(
+        _id, _lib._sel_initWithContentsOfURL_1, url?._id ?? ffi.nullptr);
+    return NSMutableArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  void applyDifference_() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_applyDifference_1);
+  }
+
+  void sortUsingDescriptors_(NSArray? sortDescriptors) {
+    return _lib._objc_msgSend_412(_id, _lib._sel_sortUsingDescriptors_1,
+        sortDescriptors?._id ?? ffi.nullptr);
+  }
+
+  void filterUsingPredicate_(NSPredicate? predicate) {
+    return _lib._objc_msgSend_427(
+        _id, _lib._sel_filterUsingPredicate_1, predicate?._id ?? ffi.nullptr);
+  }
+
+  static NSMutableArray array(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMutableArray1, _lib._sel_array1);
+    return NSMutableArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableArray arrayWithObject_(SwiftLibrary _lib, NSObject anObject) {
+    final _ret = _lib._objc_msgSend_16(
+        _lib._class_NSMutableArray1, _lib._sel_arrayWithObject_1, anObject._id);
+    return NSMutableArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableArray arrayWithObjects_count_(SwiftLibrary _lib,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> objects, int cnt) {
+    final _ret = _lib._objc_msgSend_61(_lib._class_NSMutableArray1,
+        _lib._sel_arrayWithObjects_count_1, objects, cnt);
+    return NSMutableArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableArray arrayWithObjects_(
+      SwiftLibrary _lib, NSObject firstObj) {
+    final _ret = _lib._objc_msgSend_16(_lib._class_NSMutableArray1,
+        _lib._sel_arrayWithObjects_1, firstObj._id);
+    return NSMutableArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableArray arrayWithArray_(SwiftLibrary _lib, NSArray? array) {
+    final _ret = _lib._objc_msgSend_67(_lib._class_NSMutableArray1,
+        _lib._sel_arrayWithArray_1, array?._id ?? ffi.nullptr);
+    return NSMutableArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray arrayWithContentsOfURL_error_(SwiftLibrary _lib, NSURL? url,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_117(
+        _lib._class_NSMutableArray1,
+        _lib._sel_arrayWithContentsOfURL_error_1,
+        url?._id ?? ffi.nullptr,
+        error);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableArray new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMutableArray1, _lib._sel_new1);
+    return NSMutableArray._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSMutableArray alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMutableArray1, _lib._sel_alloc1);
+    return NSMutableArray._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSMutableArray1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSMutableArray1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSMutableArray1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSMutableArray1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSMutableArray1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSMutableArray1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSMutableArray1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSMutableArray1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSMutableArray1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSMutableOrderedSet extends NSOrderedSet {
+  NSMutableOrderedSet._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSMutableOrderedSet] that points to the same underlying object as [other].
+  static NSMutableOrderedSet castFrom<T extends _ObjCWrapper>(T other) {
+    return NSMutableOrderedSet._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSMutableOrderedSet] that wraps the given raw object pointer.
+  static NSMutableOrderedSet castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSMutableOrderedSet._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSMutableOrderedSet].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSMutableOrderedSet1);
+  }
+
+  void insertObject_atIndex_(NSObject object, int idx) {
+    return _lib._objc_msgSend_409(
+        _id, _lib._sel_insertObject_atIndex_1, object._id, idx);
+  }
+
+  void removeObjectAtIndex_(int idx) {
+    return _lib._objc_msgSend_410(_id, _lib._sel_removeObjectAtIndex_1, idx);
+  }
+
+  void replaceObjectAtIndex_withObject_(int idx, NSObject object) {
+    return _lib._objc_msgSend_411(
+        _id, _lib._sel_replaceObjectAtIndex_withObject_1, idx, object._id);
+  }
+
+  @override
+  NSMutableOrderedSet initWithCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr);
+    return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSMutableOrderedSet init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSMutableOrderedSet initWithCapacity_(int numItems) {
+    final _ret =
+        _lib._objc_msgSend_60(_id, _lib._sel_initWithCapacity_1, numItems);
+    return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  void addObject_(NSObject object) {
+    return _lib._objc_msgSend_15(_id, _lib._sel_addObject_1, object._id);
+  }
+
+  void addObjects_count_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> objects, int count) {
+    return _lib._objc_msgSend_435(
+        _id, _lib._sel_addObjects_count_1, objects, count);
+  }
+
+  void addObjectsFromArray_(NSArray? array) {
+    return _lib._objc_msgSend_412(
+        _id, _lib._sel_addObjectsFromArray_1, array?._id ?? ffi.nullptr);
+  }
+
+  void exchangeObjectAtIndex_withObjectAtIndex_(int idx1, int idx2) {
+    return _lib._objc_msgSend_413(
+        _id, _lib._sel_exchangeObjectAtIndex_withObjectAtIndex_1, idx1, idx2);
+  }
+
+  void moveObjectsAtIndexes_toIndex_(NSIndexSet? indexes, int idx) {
+    return _lib._objc_msgSend_436(_id, _lib._sel_moveObjectsAtIndexes_toIndex_1,
+        indexes?._id ?? ffi.nullptr, idx);
+  }
+
+  void insertObjects_atIndexes_(NSArray? objects, NSIndexSet? indexes) {
+    return _lib._objc_msgSend_420(_id, _lib._sel_insertObjects_atIndexes_1,
+        objects?._id ?? ffi.nullptr, indexes?._id ?? ffi.nullptr);
+  }
+
+  void setObject_atIndex_(NSObject obj, int idx) {
+    return _lib._objc_msgSend_409(
+        _id, _lib._sel_setObject_atIndex_1, obj._id, idx);
+  }
+
+  void setObject_atIndexedSubscript_(NSObject obj, int idx) {
+    return _lib._objc_msgSend_409(
+        _id, _lib._sel_setObject_atIndexedSubscript_1, obj._id, idx);
+  }
+
+  void replaceObjectsInRange_withObjects_count_(
+      NSRange range, ffi.Pointer<ffi.Pointer<ObjCObject>> objects, int count) {
+    return _lib._objc_msgSend_437(
+        _id,
+        _lib._sel_replaceObjectsInRange_withObjects_count_1,
+        range,
+        objects,
+        count);
+  }
+
+  void replaceObjectsAtIndexes_withObjects_(
+      NSIndexSet? indexes, NSArray? objects) {
+    return _lib._objc_msgSend_422(
+        _id,
+        _lib._sel_replaceObjectsAtIndexes_withObjects_1,
+        indexes?._id ?? ffi.nullptr,
+        objects?._id ?? ffi.nullptr);
+  }
+
+  void removeObjectsInRange_(NSRange range) {
+    return _lib._objc_msgSend_416(_id, _lib._sel_removeObjectsInRange_1, range);
+  }
+
+  void removeObjectsAtIndexes_(NSIndexSet? indexes) {
+    return _lib._objc_msgSend_421(
+        _id, _lib._sel_removeObjectsAtIndexes_1, indexes?._id ?? ffi.nullptr);
+  }
+
+  void removeAllObjects() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_removeAllObjects1);
+  }
+
+  void removeObject_(NSObject object) {
+    return _lib._objc_msgSend_15(_id, _lib._sel_removeObject_1, object._id);
+  }
+
+  void removeObjectsInArray_(NSArray? array) {
+    return _lib._objc_msgSend_412(
+        _id, _lib._sel_removeObjectsInArray_1, array?._id ?? ffi.nullptr);
+  }
+
+  void intersectOrderedSet_(NSOrderedSet? other) {
+    return _lib._objc_msgSend_438(
+        _id, _lib._sel_intersectOrderedSet_1, other?._id ?? ffi.nullptr);
+  }
+
+  void minusOrderedSet_(NSOrderedSet? other) {
+    return _lib._objc_msgSend_438(
+        _id, _lib._sel_minusOrderedSet_1, other?._id ?? ffi.nullptr);
+  }
+
+  void unionOrderedSet_(NSOrderedSet? other) {
+    return _lib._objc_msgSend_438(
+        _id, _lib._sel_unionOrderedSet_1, other?._id ?? ffi.nullptr);
+  }
+
+  void intersectSet_(NSSet? other) {
+    return _lib._objc_msgSend_439(
+        _id, _lib._sel_intersectSet_1, other?._id ?? ffi.nullptr);
+  }
+
+  void minusSet_(NSSet? other) {
+    return _lib._objc_msgSend_439(
+        _id, _lib._sel_minusSet_1, other?._id ?? ffi.nullptr);
+  }
+
+  void unionSet_(NSSet? other) {
+    return _lib._objc_msgSend_439(
+        _id, _lib._sel_unionSet_1, other?._id ?? ffi.nullptr);
+  }
+
+  void sortUsingComparator_(NSComparator cmptr) {
+    return _lib._objc_msgSend_423(_id, _lib._sel_sortUsingComparator_1, cmptr);
+  }
+
+  void sortWithOptions_usingComparator_(int opts, NSComparator cmptr) {
+    return _lib._objc_msgSend_424(
+        _id, _lib._sel_sortWithOptions_usingComparator_1, opts, cmptr);
+  }
+
+  void sortRange_options_usingComparator_(
+      NSRange range, int opts, NSComparator cmptr) {
+    return _lib._objc_msgSend_440(
+        _id, _lib._sel_sortRange_options_usingComparator_1, range, opts, cmptr);
+  }
+
+  static NSMutableOrderedSet orderedSetWithCapacity_(
+      SwiftLibrary _lib, int numItems) {
+    final _ret = _lib._objc_msgSend_60(_lib._class_NSMutableOrderedSet1,
+        _lib._sel_orderedSetWithCapacity_1, numItems);
+    return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  void applyDifference_() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_applyDifference_1);
+  }
+
+  void sortUsingDescriptors_(NSArray? sortDescriptors) {
+    return _lib._objc_msgSend_412(_id, _lib._sel_sortUsingDescriptors_1,
+        sortDescriptors?._id ?? ffi.nullptr);
+  }
+
+  void filterUsingPredicate_(NSPredicate? p) {
+    return _lib._objc_msgSend_427(
+        _id, _lib._sel_filterUsingPredicate_1, p?._id ?? ffi.nullptr);
+  }
+
+  static NSMutableOrderedSet orderedSet(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSMutableOrderedSet1, _lib._sel_orderedSet1);
+    return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableOrderedSet orderedSetWithObject_(
+      SwiftLibrary _lib, NSObject object) {
+    final _ret = _lib._objc_msgSend_16(_lib._class_NSMutableOrderedSet1,
+        _lib._sel_orderedSetWithObject_1, object._id);
+    return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableOrderedSet orderedSetWithObjects_count_(SwiftLibrary _lib,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> objects, int cnt) {
+    final _ret = _lib._objc_msgSend_61(_lib._class_NSMutableOrderedSet1,
+        _lib._sel_orderedSetWithObjects_count_1, objects, cnt);
+    return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableOrderedSet orderedSetWithObjects_(
+      SwiftLibrary _lib, NSObject firstObj) {
+    final _ret = _lib._objc_msgSend_16(_lib._class_NSMutableOrderedSet1,
+        _lib._sel_orderedSetWithObjects_1, firstObj._id);
+    return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableOrderedSet orderedSetWithOrderedSet_(
+      SwiftLibrary _lib, NSOrderedSet? set) {
+    final _ret = _lib._objc_msgSend_430(_lib._class_NSMutableOrderedSet1,
+        _lib._sel_orderedSetWithOrderedSet_1, set?._id ?? ffi.nullptr);
+    return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableOrderedSet orderedSetWithOrderedSet_range_copyItems_(
+      SwiftLibrary _lib, NSOrderedSet? set, NSRange range, bool flag) {
+    final _ret = _lib._objc_msgSend_431(
+        _lib._class_NSMutableOrderedSet1,
+        _lib._sel_orderedSetWithOrderedSet_range_copyItems_1,
+        set?._id ?? ffi.nullptr,
+        range,
+        flag);
+    return NSMutableOrderedSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSMutableOrderedSet orderedSetWithArray_(
+      SwiftLibrary _lib, NSArray? array) {
+    final _ret = _lib._objc_msgSend_67(_lib._class_NSMutableOrderedSet1,
+        _lib._sel_orderedSetWithArray_1, array?._id ?? ffi.nullptr);
+    return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableOrderedSet orderedSetWithArray_range_copyItems_(
+      SwiftLibrary _lib, NSArray? array, NSRange range, bool flag) {
+    final _ret = _lib._objc_msgSend_432(
+        _lib._class_NSMutableOrderedSet1,
+        _lib._sel_orderedSetWithArray_range_copyItems_1,
+        array?._id ?? ffi.nullptr,
+        range,
+        flag);
+    return NSMutableOrderedSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSMutableOrderedSet orderedSetWithSet_(SwiftLibrary _lib, NSSet? set) {
+    final _ret = _lib._objc_msgSend_363(_lib._class_NSMutableOrderedSet1,
+        _lib._sel_orderedSetWithSet_1, set?._id ?? ffi.nullptr);
+    return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableOrderedSet orderedSetWithSet_copyItems_(
+      SwiftLibrary _lib, NSSet? set, bool flag) {
+    final _ret = _lib._objc_msgSend_364(_lib._class_NSMutableOrderedSet1,
+        _lib._sel_orderedSetWithSet_copyItems_1, set?._id ?? ffi.nullptr, flag);
+    return NSMutableOrderedSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSMutableOrderedSet new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMutableOrderedSet1, _lib._sel_new1);
+    return NSMutableOrderedSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSMutableOrderedSet alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSMutableOrderedSet1, _lib._sel_alloc1);
+    return NSMutableOrderedSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSMutableOrderedSet1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSMutableOrderedSet1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSMutableOrderedSet1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSMutableOrderedSet1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSMutableOrderedSet1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSMutableOrderedSet1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSMutableOrderedSet1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSMutableOrderedSet1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSMutableOrderedSet1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSOrderedSet extends NSObject {
+  NSOrderedSet._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSOrderedSet] that points to the same underlying object as [other].
+  static NSOrderedSet castFrom<T extends _ObjCWrapper>(T other) {
+    return NSOrderedSet._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSOrderedSet] that wraps the given raw object pointer.
+  static NSOrderedSet castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSOrderedSet._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSOrderedSet].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSOrderedSet1);
+  }
+
+  int get count {
+    return _lib._objc_msgSend_10(_id, _lib._sel_count1);
+  }
+
+  NSObject objectAtIndex_(int idx) {
+    final _ret = _lib._objc_msgSend_60(_id, _lib._sel_objectAtIndex_1, idx);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  int indexOfObject_(NSObject object) {
+    return _lib._objc_msgSend_69(_id, _lib._sel_indexOfObject_1, object._id);
+  }
+
+  @override
+  NSOrderedSet init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSOrderedSet initWithObjects_count_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> objects, int cnt) {
+    final _ret = _lib._objc_msgSend_61(
+        _id, _lib._sel_initWithObjects_count_1, objects, cnt);
+    return NSOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSOrderedSet initWithCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr);
+    return NSOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  void getObjects_range_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> objects, NSRange range) {
+    return _lib._objc_msgSend_68(
+        _id, _lib._sel_getObjects_range_1, objects, range);
+  }
+
+  NSArray objectsAtIndexes_(NSIndexSet? indexes) {
+    final _ret = _lib._objc_msgSend_103(
+        _id, _lib._sel_objectsAtIndexes_1, indexes?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject get firstObject {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_firstObject1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject get lastObject {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_lastObject1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool isEqualToOrderedSet_(NSOrderedSet? other) {
+    return _lib._objc_msgSend_428(
+        _id, _lib._sel_isEqualToOrderedSet_1, other?._id ?? ffi.nullptr);
+  }
+
+  bool containsObject_(NSObject object) {
+    return _lib._objc_msgSend_0(_id, _lib._sel_containsObject_1, object._id);
+  }
+
+  bool intersectsOrderedSet_(NSOrderedSet? other) {
+    return _lib._objc_msgSend_428(
+        _id, _lib._sel_intersectsOrderedSet_1, other?._id ?? ffi.nullptr);
+  }
+
+  bool intersectsSet_(NSSet? set) {
+    return _lib._objc_msgSend_355(
+        _id, _lib._sel_intersectsSet_1, set?._id ?? ffi.nullptr);
+  }
+
+  bool isSubsetOfOrderedSet_(NSOrderedSet? other) {
+    return _lib._objc_msgSend_428(
+        _id, _lib._sel_isSubsetOfOrderedSet_1, other?._id ?? ffi.nullptr);
+  }
+
+  bool isSubsetOfSet_(NSSet? set) {
+    return _lib._objc_msgSend_355(
+        _id, _lib._sel_isSubsetOfSet_1, set?._id ?? ffi.nullptr);
+  }
+
+  NSObject objectAtIndexedSubscript_(int idx) {
+    final _ret =
+        _lib._objc_msgSend_60(_id, _lib._sel_objectAtIndexedSubscript_1, idx);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSEnumerator objectEnumerator() {
+    final _ret = _lib._objc_msgSend_72(_id, _lib._sel_objectEnumerator1);
+    return NSEnumerator._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSEnumerator reverseObjectEnumerator() {
+    final _ret = _lib._objc_msgSend_72(_id, _lib._sel_reverseObjectEnumerator1);
+    return NSEnumerator._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSOrderedSet? get reversedOrderedSet {
+    final _ret = _lib._objc_msgSend_429(_id, _lib._sel_reversedOrderedSet1);
+    return _ret.address == 0
+        ? null
+        : NSOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get array {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_array1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSSet? get set1 {
+    final _ret = _lib._objc_msgSend_280(_id, _lib._sel_set1);
+    return _ret.address == 0
+        ? null
+        : NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  void enumerateObjectsUsingBlock_(ObjCBlock3 block) {
+    return _lib._objc_msgSend_104(
+        _id, _lib._sel_enumerateObjectsUsingBlock_1, block._id);
+  }
+
+  void enumerateObjectsWithOptions_usingBlock_(int opts, ObjCBlock3 block) {
+    return _lib._objc_msgSend_105(_id,
+        _lib._sel_enumerateObjectsWithOptions_usingBlock_1, opts, block._id);
+  }
+
+  void enumerateObjectsAtIndexes_options_usingBlock_(
+      NSIndexSet? s, int opts, ObjCBlock3 block) {
+    return _lib._objc_msgSend_106(
+        _id,
+        _lib._sel_enumerateObjectsAtIndexes_options_usingBlock_1,
+        s?._id ?? ffi.nullptr,
+        opts,
+        block._id);
+  }
+
+  int indexOfObjectPassingTest_(ObjCBlock4 predicate) {
+    return _lib._objc_msgSend_107(
+        _id, _lib._sel_indexOfObjectPassingTest_1, predicate._id);
+  }
+
+  int indexOfObjectWithOptions_passingTest_(int opts, ObjCBlock4 predicate) {
+    return _lib._objc_msgSend_108(_id,
+        _lib._sel_indexOfObjectWithOptions_passingTest_1, opts, predicate._id);
+  }
+
+  int indexOfObjectAtIndexes_options_passingTest_(
+      NSIndexSet? s, int opts, ObjCBlock4 predicate) {
+    return _lib._objc_msgSend_109(
+        _id,
+        _lib._sel_indexOfObjectAtIndexes_options_passingTest_1,
+        s?._id ?? ffi.nullptr,
+        opts,
+        predicate._id);
+  }
+
+  NSIndexSet indexesOfObjectsPassingTest_(ObjCBlock4 predicate) {
+    final _ret = _lib._objc_msgSend_110(
+        _id, _lib._sel_indexesOfObjectsPassingTest_1, predicate._id);
+    return NSIndexSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSIndexSet indexesOfObjectsWithOptions_passingTest_(
+      int opts, ObjCBlock4 predicate) {
+    final _ret = _lib._objc_msgSend_111(
+        _id,
+        _lib._sel_indexesOfObjectsWithOptions_passingTest_1,
+        opts,
+        predicate._id);
+    return NSIndexSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSIndexSet indexesOfObjectsAtIndexes_options_passingTest_(
+      NSIndexSet? s, int opts, ObjCBlock4 predicate) {
+    final _ret = _lib._objc_msgSend_112(
+        _id,
+        _lib._sel_indexesOfObjectsAtIndexes_options_passingTest_1,
+        s?._id ?? ffi.nullptr,
+        opts,
+        predicate._id);
+    return NSIndexSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  int indexOfObject_inSortedRange_options_usingComparator_(
+      NSObject object, NSRange range, int opts, NSComparator cmp) {
+    return _lib._objc_msgSend_115(
+        _id,
+        _lib._sel_indexOfObject_inSortedRange_options_usingComparator_1,
+        object._id,
+        range,
+        opts,
+        cmp);
+  }
+
+  NSArray sortedArrayUsingComparator_(NSComparator cmptr) {
+    final _ret = _lib._objc_msgSend_113(
+        _id, _lib._sel_sortedArrayUsingComparator_1, cmptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray sortedArrayWithOptions_usingComparator_(
+      int opts, NSComparator cmptr) {
+    final _ret = _lib._objc_msgSend_114(
+        _id, _lib._sel_sortedArrayWithOptions_usingComparator_1, opts, cmptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get description {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_description1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString descriptionWithLocale_(NSObject locale) {
+    final _ret = _lib._objc_msgSend_65(
+        _id, _lib._sel_descriptionWithLocale_1, locale._id);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString descriptionWithLocale_indent_(NSObject locale, int level) {
+    final _ret = _lib._objc_msgSend_66(
+        _id, _lib._sel_descriptionWithLocale_indent_1, locale._id, level);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSOrderedSet orderedSet(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSOrderedSet1, _lib._sel_orderedSet1);
+    return NSOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSOrderedSet orderedSetWithObject_(
+      SwiftLibrary _lib, NSObject object) {
+    final _ret = _lib._objc_msgSend_16(_lib._class_NSOrderedSet1,
+        _lib._sel_orderedSetWithObject_1, object._id);
+    return NSOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSOrderedSet orderedSetWithObjects_count_(SwiftLibrary _lib,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> objects, int cnt) {
+    final _ret = _lib._objc_msgSend_61(_lib._class_NSOrderedSet1,
+        _lib._sel_orderedSetWithObjects_count_1, objects, cnt);
+    return NSOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSOrderedSet orderedSetWithObjects_(
+      SwiftLibrary _lib, NSObject firstObj) {
+    final _ret = _lib._objc_msgSend_16(_lib._class_NSOrderedSet1,
+        _lib._sel_orderedSetWithObjects_1, firstObj._id);
+    return NSOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSOrderedSet orderedSetWithOrderedSet_(
+      SwiftLibrary _lib, NSOrderedSet? set) {
+    final _ret = _lib._objc_msgSend_430(_lib._class_NSOrderedSet1,
+        _lib._sel_orderedSetWithOrderedSet_1, set?._id ?? ffi.nullptr);
+    return NSOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSOrderedSet orderedSetWithOrderedSet_range_copyItems_(
+      SwiftLibrary _lib, NSOrderedSet? set, NSRange range, bool flag) {
+    final _ret = _lib._objc_msgSend_431(
+        _lib._class_NSOrderedSet1,
+        _lib._sel_orderedSetWithOrderedSet_range_copyItems_1,
+        set?._id ?? ffi.nullptr,
+        range,
+        flag);
+    return NSOrderedSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSOrderedSet orderedSetWithArray_(SwiftLibrary _lib, NSArray? array) {
+    final _ret = _lib._objc_msgSend_67(_lib._class_NSOrderedSet1,
+        _lib._sel_orderedSetWithArray_1, array?._id ?? ffi.nullptr);
+    return NSOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSOrderedSet orderedSetWithArray_range_copyItems_(
+      SwiftLibrary _lib, NSArray? array, NSRange range, bool flag) {
+    final _ret = _lib._objc_msgSend_432(
+        _lib._class_NSOrderedSet1,
+        _lib._sel_orderedSetWithArray_range_copyItems_1,
+        array?._id ?? ffi.nullptr,
+        range,
+        flag);
+    return NSOrderedSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSOrderedSet orderedSetWithSet_(SwiftLibrary _lib, NSSet? set) {
+    final _ret = _lib._objc_msgSend_363(_lib._class_NSOrderedSet1,
+        _lib._sel_orderedSetWithSet_1, set?._id ?? ffi.nullptr);
+    return NSOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSOrderedSet orderedSetWithSet_copyItems_(
+      SwiftLibrary _lib, NSSet? set, bool flag) {
+    final _ret = _lib._objc_msgSend_364(_lib._class_NSOrderedSet1,
+        _lib._sel_orderedSetWithSet_copyItems_1, set?._id ?? ffi.nullptr, flag);
+    return NSOrderedSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSOrderedSet initWithObject_(NSObject object) {
+    final _ret =
+        _lib._objc_msgSend_16(_id, _lib._sel_initWithObject_1, object._id);
+    return NSOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSOrderedSet initWithObjects_(NSObject firstObj) {
+    final _ret =
+        _lib._objc_msgSend_16(_id, _lib._sel_initWithObjects_1, firstObj._id);
+    return NSOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSOrderedSet initWithOrderedSet_(NSOrderedSet? set) {
+    final _ret = _lib._objc_msgSend_430(
+        _id, _lib._sel_initWithOrderedSet_1, set?._id ?? ffi.nullptr);
+    return NSOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSOrderedSet initWithOrderedSet_copyItems_(NSOrderedSet? set, bool flag) {
+    final _ret = _lib._objc_msgSend_433(
+        _id,
+        _lib._sel_initWithOrderedSet_copyItems_1,
+        set?._id ?? ffi.nullptr,
+        flag);
+    return NSOrderedSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSOrderedSet initWithOrderedSet_range_copyItems_(
+      NSOrderedSet? set, NSRange range, bool flag) {
+    final _ret = _lib._objc_msgSend_431(
+        _id,
+        _lib._sel_initWithOrderedSet_range_copyItems_1,
+        set?._id ?? ffi.nullptr,
+        range,
+        flag);
+    return NSOrderedSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSOrderedSet initWithArray_(NSArray? array) {
+    final _ret = _lib._objc_msgSend_67(
+        _id, _lib._sel_initWithArray_1, array?._id ?? ffi.nullptr);
+    return NSOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSOrderedSet initWithArray_copyItems_(NSArray? set, bool flag) {
+    final _ret = _lib._objc_msgSend_116(_id,
+        _lib._sel_initWithArray_copyItems_1, set?._id ?? ffi.nullptr, flag);
+    return NSOrderedSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSOrderedSet initWithArray_range_copyItems_(
+      NSArray? set, NSRange range, bool flag) {
+    final _ret = _lib._objc_msgSend_432(
+        _id,
+        _lib._sel_initWithArray_range_copyItems_1,
+        set?._id ?? ffi.nullptr,
+        range,
+        flag);
+    return NSOrderedSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSOrderedSet initWithSet_(NSSet? set) {
+    final _ret = _lib._objc_msgSend_363(
+        _id, _lib._sel_initWithSet_1, set?._id ?? ffi.nullptr);
+    return NSOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSOrderedSet initWithSet_copyItems_(NSSet? set, bool flag) {
+    final _ret = _lib._objc_msgSend_364(
+        _id, _lib._sel_initWithSet_copyItems_1, set?._id ?? ffi.nullptr, flag);
+    return NSOrderedSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  @override
+  NSObject valueForKey_(NSString? key) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_valueForKey_1, key?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  void setValue_forKey_(NSObject value, NSString? key) {
+    return _lib._objc_msgSend_122(
+        _id, _lib._sel_setValue_forKey_1, value._id, key?._id ?? ffi.nullptr);
+  }
+
+  @override
+  void addObserver_forKeyPath_options_context_(NSObject? observer,
+      NSString? keyPath, int options, ffi.Pointer<ffi.Void> context) {
+    return _lib._objc_msgSend_126(
+        _id,
+        _lib._sel_addObserver_forKeyPath_options_context_1,
+        observer?._id ?? ffi.nullptr,
+        keyPath?._id ?? ffi.nullptr,
+        options,
+        context);
+  }
+
+  @override
+  void removeObserver_forKeyPath_context_(
+      NSObject? observer, NSString? keyPath, ffi.Pointer<ffi.Void> context) {
+    return _lib._objc_msgSend_127(
+        _id,
+        _lib._sel_removeObserver_forKeyPath_context_1,
+        observer?._id ?? ffi.nullptr,
+        keyPath?._id ?? ffi.nullptr,
+        context);
+  }
+
+  @override
+  void removeObserver_forKeyPath_(NSObject? observer, NSString? keyPath) {
+    return _lib._objc_msgSend_128(_id, _lib._sel_removeObserver_forKeyPath_1,
+        observer?._id ?? ffi.nullptr, keyPath?._id ?? ffi.nullptr);
+  }
+
+  NSArray sortedArrayUsingDescriptors_(NSArray? sortDescriptors) {
+    final _ret = _lib._objc_msgSend_63(
+        _id,
+        _lib._sel_sortedArrayUsingDescriptors_1,
+        sortDescriptors?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSOrderedSet filteredOrderedSetUsingPredicate_(NSPredicate? p) {
+    final _ret = _lib._objc_msgSend_434(_id,
+        _lib._sel_filteredOrderedSetUsingPredicate_1, p?._id ?? ffi.nullptr);
+    return NSOrderedSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSOrderedSet new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSOrderedSet1, _lib._sel_new1);
+    return NSOrderedSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSOrderedSet alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSOrderedSet1, _lib._sel_alloc1);
+    return NSOrderedSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSOrderedSet1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSOrderedSet1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSOrderedSet1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSOrderedSet1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSOrderedSet1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSOrderedSet1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSOrderedSet1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSOrderedSet1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSOrderedSet1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSMutableSet extends NSSet {
+  NSMutableSet._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSMutableSet] that points to the same underlying object as [other].
+  static NSMutableSet castFrom<T extends _ObjCWrapper>(T other) {
+    return NSMutableSet._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSMutableSet] that wraps the given raw object pointer.
+  static NSMutableSet castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSMutableSet._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSMutableSet].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSMutableSet1);
+  }
+
+  void addObject_(NSObject object) {
+    return _lib._objc_msgSend_15(_id, _lib._sel_addObject_1, object._id);
+  }
+
+  void removeObject_(NSObject object) {
+    return _lib._objc_msgSend_15(_id, _lib._sel_removeObject_1, object._id);
+  }
+
+  @override
+  NSMutableSet initWithCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr);
+    return NSMutableSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSMutableSet init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSMutableSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSMutableSet initWithCapacity_(int numItems) {
+    final _ret =
+        _lib._objc_msgSend_60(_id, _lib._sel_initWithCapacity_1, numItems);
+    return NSMutableSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  void addObjectsFromArray_(NSArray? array) {
+    return _lib._objc_msgSend_412(
+        _id, _lib._sel_addObjectsFromArray_1, array?._id ?? ffi.nullptr);
+  }
+
+  void intersectSet_(NSSet? otherSet) {
+    return _lib._objc_msgSend_439(
+        _id, _lib._sel_intersectSet_1, otherSet?._id ?? ffi.nullptr);
+  }
+
+  void minusSet_(NSSet? otherSet) {
+    return _lib._objc_msgSend_439(
+        _id, _lib._sel_minusSet_1, otherSet?._id ?? ffi.nullptr);
+  }
+
+  void removeAllObjects() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_removeAllObjects1);
+  }
+
+  void unionSet_(NSSet? otherSet) {
+    return _lib._objc_msgSend_439(
+        _id, _lib._sel_unionSet_1, otherSet?._id ?? ffi.nullptr);
+  }
+
+  void setSet_(NSSet? otherSet) {
+    return _lib._objc_msgSend_439(
+        _id, _lib._sel_setSet_1, otherSet?._id ?? ffi.nullptr);
+  }
+
+  static NSMutableSet setWithCapacity_(SwiftLibrary _lib, int numItems) {
+    final _ret = _lib._objc_msgSend_60(
+        _lib._class_NSMutableSet1, _lib._sel_setWithCapacity_1, numItems);
+    return NSMutableSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  void filterUsingPredicate_(NSPredicate? predicate) {
+    return _lib._objc_msgSend_427(
+        _id, _lib._sel_filterUsingPredicate_1, predicate?._id ?? ffi.nullptr);
+  }
+
+  static NSMutableSet set1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMutableSet1, _lib._sel_set1);
+    return NSMutableSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableSet setWithObject_(SwiftLibrary _lib, NSObject object) {
+    final _ret = _lib._objc_msgSend_16(
+        _lib._class_NSMutableSet1, _lib._sel_setWithObject_1, object._id);
+    return NSMutableSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableSet setWithObjects_count_(SwiftLibrary _lib,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> objects, int cnt) {
+    final _ret = _lib._objc_msgSend_61(_lib._class_NSMutableSet1,
+        _lib._sel_setWithObjects_count_1, objects, cnt);
+    return NSMutableSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableSet setWithObjects_(SwiftLibrary _lib, NSObject firstObj) {
+    final _ret = _lib._objc_msgSend_16(
+        _lib._class_NSMutableSet1, _lib._sel_setWithObjects_1, firstObj._id);
+    return NSMutableSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableSet setWithSet_(SwiftLibrary _lib, NSSet? set) {
+    final _ret = _lib._objc_msgSend_363(_lib._class_NSMutableSet1,
+        _lib._sel_setWithSet_1, set?._id ?? ffi.nullptr);
+    return NSMutableSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableSet setWithArray_(SwiftLibrary _lib, NSArray? array) {
+    final _ret = _lib._objc_msgSend_67(_lib._class_NSMutableSet1,
+        _lib._sel_setWithArray_1, array?._id ?? ffi.nullptr);
+    return NSMutableSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableSet new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMutableSet1, _lib._sel_new1);
+    return NSMutableSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSMutableSet alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMutableSet1, _lib._sel_alloc1);
+    return NSMutableSet._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSMutableSet1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSMutableSet1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSMutableSet1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSMutableSet1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSMutableSet1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSMutableSet1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSMutableSet1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSMutableSet1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSMutableSet1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSKeyValueChange {
+  static const int NSKeyValueChangeSetting = 1;
+  static const int NSKeyValueChangeInsertion = 2;
+  static const int NSKeyValueChangeRemoval = 3;
+  static const int NSKeyValueChangeReplacement = 4;
+}
+
+abstract class NSKeyValueSetMutationKind {
+  static const int NSKeyValueUnionSetMutation = 1;
+  static const int NSKeyValueMinusSetMutation = 2;
+  static const int NSKeyValueIntersectSetMutation = 3;
+  static const int NSKeyValueSetSetMutation = 4;
+}
+
+class NSKeyedArchiver extends NSCoder {
+  NSKeyedArchiver._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSKeyedArchiver] that points to the same underlying object as [other].
+  static NSKeyedArchiver castFrom<T extends _ObjCWrapper>(T other) {
+    return NSKeyedArchiver._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSKeyedArchiver] that wraps the given raw object pointer.
+  static NSKeyedArchiver castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSKeyedArchiver._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSKeyedArchiver].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSKeyedArchiver1);
+  }
+
+  NSKeyedArchiver initRequiringSecureCoding_(bool requiresSecureCoding) {
+    final _ret = _lib._objc_msgSend_449(
+        _id, _lib._sel_initRequiringSecureCoding_1, requiresSecureCoding);
+    return NSKeyedArchiver._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSData archivedDataWithRootObject_requiringSecureCoding_error_(
+      SwiftLibrary _lib,
+      NSObject object,
+      bool requiresSecureCoding,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_450(
+        _lib._class_NSKeyedArchiver1,
+        _lib._sel_archivedDataWithRootObject_requiringSecureCoding_error_1,
+        object._id,
+        requiresSecureCoding,
+        error);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSKeyedArchiver init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSKeyedArchiver._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSKeyedArchiver initForWritingWithMutableData_(NSMutableData? data) {
+    final _ret = _lib._objc_msgSend_455(_id,
+        _lib._sel_initForWritingWithMutableData_1, data?._id ?? ffi.nullptr);
+    return NSKeyedArchiver._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSData archivedDataWithRootObject_(
+      SwiftLibrary _lib, NSObject rootObject) {
+    final _ret = _lib._objc_msgSend_456(_lib._class_NSKeyedArchiver1,
+        _lib._sel_archivedDataWithRootObject_1, rootObject._id);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool archiveRootObject_toFile_(
+      SwiftLibrary _lib, NSObject rootObject, NSString? path) {
+    return _lib._objc_msgSend_225(
+        _lib._class_NSKeyedArchiver1,
+        _lib._sel_archiveRootObject_toFile_1,
+        rootObject._id,
+        path?._id ?? ffi.nullptr);
+  }
+
+  NSObject? get delegate {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_delegate1);
+    return _ret.address == 0
+        ? null
+        : NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  set delegate(NSObject? value) {
+    _lib._objc_msgSend_368(
+        _id, _lib._sel_setDelegate_1, value?._id ?? ffi.nullptr);
+  }
+
+  int get outputFormat {
+    return _lib._objc_msgSend_457(_id, _lib._sel_outputFormat1);
+  }
+
+  set outputFormat(int value) {
+    _lib._objc_msgSend_458(_id, _lib._sel_setOutputFormat_1, value);
+  }
+
+  NSData? get encodedData {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_encodedData1);
+    return _ret.address == 0
+        ? null
+        : NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  void finishEncoding() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_finishEncoding1);
+  }
+
+  static void setClassName_forClass_(
+      SwiftLibrary _lib, NSString? codedName, NSObject cls) {
+    return _lib._objc_msgSend_459(
+        _lib._class_NSKeyedArchiver1,
+        _lib._sel_setClassName_forClass_1,
+        codedName?._id ?? ffi.nullptr,
+        cls._id);
+  }
+
+  static NSString classNameForClass_(SwiftLibrary _lib, NSObject cls) {
+    final _ret = _lib._objc_msgSend_65(
+        _lib._class_NSKeyedArchiver1, _lib._sel_classNameForClass_1, cls._id);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  void encodeObject_forKey_(NSObject object, NSString? key) {
+    return _lib._objc_msgSend_122(_id, _lib._sel_encodeObject_forKey_1,
+        object._id, key?._id ?? ffi.nullptr);
+  }
+
+  @override
+  void encodeConditionalObject_forKey_(NSObject object, NSString? key) {
+    return _lib._objc_msgSend_122(
+        _id,
+        _lib._sel_encodeConditionalObject_forKey_1,
+        object._id,
+        key?._id ?? ffi.nullptr);
+  }
+
+  @override
+  void encodeBool_forKey_(bool value, NSString? key) {
+    return _lib._objc_msgSend_257(
+        _id, _lib._sel_encodeBool_forKey_1, value, key?._id ?? ffi.nullptr);
+  }
+
+  @override
+  void encodeInt_forKey_(int value, NSString? key) {
+    return _lib._objc_msgSend_258(
+        _id, _lib._sel_encodeInt_forKey_1, value, key?._id ?? ffi.nullptr);
+  }
+
+  @override
+  void encodeInt32_forKey_(int value, NSString? key) {
+    return _lib._objc_msgSend_259(
+        _id, _lib._sel_encodeInt32_forKey_1, value, key?._id ?? ffi.nullptr);
+  }
+
+  @override
+  void encodeInt64_forKey_(int value, NSString? key) {
+    return _lib._objc_msgSend_260(
+        _id, _lib._sel_encodeInt64_forKey_1, value, key?._id ?? ffi.nullptr);
+  }
+
+  @override
+  void encodeFloat_forKey_(double value, NSString? key) {
+    return _lib._objc_msgSend_261(
+        _id, _lib._sel_encodeFloat_forKey_1, value, key?._id ?? ffi.nullptr);
+  }
+
+  @override
+  void encodeDouble_forKey_(double value, NSString? key) {
+    return _lib._objc_msgSend_262(
+        _id, _lib._sel_encodeDouble_forKey_1, value, key?._id ?? ffi.nullptr);
+  }
+
+  @override
+  void encodeBytes_length_forKey_(
+      ffi.Pointer<ffi.Uint8> bytes, int length, NSString? key) {
+    return _lib._objc_msgSend_263(_id, _lib._sel_encodeBytes_length_forKey_1,
+        bytes, length, key?._id ?? ffi.nullptr);
+  }
+
+  @override
+  bool get requiresSecureCoding {
+    return _lib._objc_msgSend_12(_id, _lib._sel_requiresSecureCoding1);
+  }
+
+  set requiresSecureCoding(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setRequiresSecureCoding_1, value);
+  }
+
+  static NSKeyedArchiver new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSKeyedArchiver1, _lib._sel_new1);
+    return NSKeyedArchiver._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSKeyedArchiver alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSKeyedArchiver1, _lib._sel_alloc1);
+    return NSKeyedArchiver._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSKeyedArchiver1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSKeyedArchiver1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSKeyedArchiver1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSKeyedArchiver1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSKeyedArchiver1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSKeyedArchiver1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSKeyedArchiver1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSKeyedArchiver1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSKeyedArchiver1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSMutableData extends NSData {
+  NSMutableData._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSMutableData] that points to the same underlying object as [other].
+  static NSMutableData castFrom<T extends _ObjCWrapper>(T other) {
+    return NSMutableData._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSMutableData] that wraps the given raw object pointer.
+  static NSMutableData castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSMutableData._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSMutableData].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSMutableData1);
+  }
+
+  ffi.Pointer<ffi.Void> get mutableBytes {
+    return _lib._objc_msgSend_19(_id, _lib._sel_mutableBytes1);
+  }
+
+  @override
+  int get length {
+    return _lib._objc_msgSend_10(_id, _lib._sel_length1);
+  }
+
+  set length(int value) {
+    _lib._objc_msgSend_451(_id, _lib._sel_setLength_1, value);
+  }
+
+  void appendBytes_length_(ffi.Pointer<ffi.Void> bytes, int length) {
+    return _lib._objc_msgSend_21(
+        _id, _lib._sel_appendBytes_length_1, bytes, length);
+  }
+
+  void appendData_(NSData? other) {
+    return _lib._objc_msgSend_248(
+        _id, _lib._sel_appendData_1, other?._id ?? ffi.nullptr);
+  }
+
+  void increaseLengthBy_(int extraLength) {
+    return _lib._objc_msgSend_410(
+        _id, _lib._sel_increaseLengthBy_1, extraLength);
+  }
+
+  void replaceBytesInRange_withBytes_(
+      NSRange range, ffi.Pointer<ffi.Void> bytes) {
+    return _lib._objc_msgSend_452(
+        _id, _lib._sel_replaceBytesInRange_withBytes_1, range, bytes);
+  }
+
+  void resetBytesInRange_(NSRange range) {
+    return _lib._objc_msgSend_416(_id, _lib._sel_resetBytesInRange_1, range);
+  }
+
+  void setData_(NSData? data) {
+    return _lib._objc_msgSend_248(
+        _id, _lib._sel_setData_1, data?._id ?? ffi.nullptr);
+  }
+
+  void replaceBytesInRange_withBytes_length_(NSRange range,
+      ffi.Pointer<ffi.Void> replacementBytes, int replacementLength) {
+    return _lib._objc_msgSend_453(
+        _id,
+        _lib._sel_replaceBytesInRange_withBytes_length_1,
+        range,
+        replacementBytes,
+        replacementLength);
+  }
+
+  static NSMutableData dataWithCapacity_(SwiftLibrary _lib, int aNumItems) {
+    final _ret = _lib._objc_msgSend_60(
+        _lib._class_NSMutableData1, _lib._sel_dataWithCapacity_1, aNumItems);
+    return NSMutableData._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableData dataWithLength_(SwiftLibrary _lib, int length) {
+    final _ret = _lib._objc_msgSend_60(
+        _lib._class_NSMutableData1, _lib._sel_dataWithLength_1, length);
+    return NSMutableData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSMutableData initWithCapacity_(int capacity) {
+    final _ret =
+        _lib._objc_msgSend_60(_id, _lib._sel_initWithCapacity_1, capacity);
+    return NSMutableData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSMutableData initWithLength_(int length) {
+    final _ret = _lib._objc_msgSend_60(_id, _lib._sel_initWithLength_1, length);
+    return NSMutableData._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool decompressUsingAlgorithm_error_(
+      int algorithm, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_454(
+        _id, _lib._sel_decompressUsingAlgorithm_error_1, algorithm, error);
+  }
+
+  bool compressUsingAlgorithm_error_(
+      int algorithm, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_454(
+        _id, _lib._sel_compressUsingAlgorithm_error_1, algorithm, error);
+  }
+
+  static NSMutableData data(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMutableData1, _lib._sel_data1);
+    return NSMutableData._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableData dataWithBytes_length_(
+      SwiftLibrary _lib, ffi.Pointer<ffi.Void> bytes, int length) {
+    final _ret = _lib._objc_msgSend_237(_lib._class_NSMutableData1,
+        _lib._sel_dataWithBytes_length_1, bytes, length);
+    return NSMutableData._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableData dataWithBytesNoCopy_length_(
+      SwiftLibrary _lib, ffi.Pointer<ffi.Void> bytes, int length) {
+    final _ret = _lib._objc_msgSend_237(_lib._class_NSMutableData1,
+        _lib._sel_dataWithBytesNoCopy_length_1, bytes, length);
+    return NSMutableData._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSMutableData dataWithBytesNoCopy_length_freeWhenDone_(
+      SwiftLibrary _lib, ffi.Pointer<ffi.Void> bytes, int length, bool b) {
+    final _ret = _lib._objc_msgSend_238(_lib._class_NSMutableData1,
+        _lib._sel_dataWithBytesNoCopy_length_freeWhenDone_1, bytes, length, b);
+    return NSMutableData._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSMutableData dataWithContentsOfFile_options_error_(
+      SwiftLibrary _lib,
+      NSString? path,
+      int readOptionsMask,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> errorPtr) {
+    final _ret = _lib._objc_msgSend_239(
+        _lib._class_NSMutableData1,
+        _lib._sel_dataWithContentsOfFile_options_error_1,
+        path?._id ?? ffi.nullptr,
+        readOptionsMask,
+        errorPtr);
+    return NSMutableData._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableData dataWithContentsOfURL_options_error_(
+      SwiftLibrary _lib,
+      NSURL? url,
+      int readOptionsMask,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> errorPtr) {
+    final _ret = _lib._objc_msgSend_240(
+        _lib._class_NSMutableData1,
+        _lib._sel_dataWithContentsOfURL_options_error_1,
+        url?._id ?? ffi.nullptr,
+        readOptionsMask,
+        errorPtr);
+    return NSMutableData._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableData dataWithContentsOfFile_(
+      SwiftLibrary _lib, NSString? path) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSMutableData1,
+        _lib._sel_dataWithContentsOfFile_1, path?._id ?? ffi.nullptr);
+    return NSMutableData._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableData dataWithContentsOfURL_(SwiftLibrary _lib, NSURL? url) {
+    final _ret = _lib._objc_msgSend_226(_lib._class_NSMutableData1,
+        _lib._sel_dataWithContentsOfURL_1, url?._id ?? ffi.nullptr);
+    return NSMutableData._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableData dataWithData_(SwiftLibrary _lib, NSData? data) {
+    final _ret = _lib._objc_msgSend_242(_lib._class_NSMutableData1,
+        _lib._sel_dataWithData_1, data?._id ?? ffi.nullptr);
+    return NSMutableData._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject dataWithContentsOfMappedFile_(
+      SwiftLibrary _lib, NSString? path) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSMutableData1,
+        _lib._sel_dataWithContentsOfMappedFile_1, path?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableData new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMutableData1, _lib._sel_new1);
+    return NSMutableData._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSMutableData alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMutableData1, _lib._sel_alloc1);
+    return NSMutableData._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSMutableData1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSMutableData1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSMutableData1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSMutableData1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSMutableData1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSMutableData1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSMutableData1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSMutableData1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSMutableData1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSPropertyListFormat {
+  static const int NSPropertyListOpenStepFormat = 1;
+  static const int NSPropertyListXMLFormat_v1_0 = 100;
+  static const int NSPropertyListBinaryFormat_v1_0 = 200;
+}
+
+class NSThread extends NSObject {
+  NSThread._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSThread] that points to the same underlying object as [other].
+  static NSThread castFrom<T extends _ObjCWrapper>(T other) {
+    return NSThread._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSThread] that wraps the given raw object pointer.
+  static NSThread castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSThread._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSThread].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSThread1);
+  }
+
+  static NSThread? getCurrentThread(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_464(_lib._class_NSThread1, _lib._sel_currentThread1);
+    return _ret.address == 0
+        ? null
+        : NSThread._(_ret, _lib, retain: true, release: true);
+  }
+
+  static void detachNewThreadWithBlock_(SwiftLibrary _lib, ObjCBlock16 block) {
+    return _lib._objc_msgSend_465(
+        _lib._class_NSThread1, _lib._sel_detachNewThreadWithBlock_1, block._id);
+  }
+
+  static void detachNewThreadSelector_toTarget_withObject_(SwiftLibrary _lib,
+      ffi.Pointer<ObjCSel> selector, NSObject target, NSObject argument) {
+    return _lib._objc_msgSend_466(
+        _lib._class_NSThread1,
+        _lib._sel_detachNewThreadSelector_toTarget_withObject_1,
+        selector,
+        target._id,
+        argument._id);
+  }
+
+  static bool isMultiThreaded(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSThread1, _lib._sel_isMultiThreaded1);
+  }
+
+  NSMutableDictionary? get threadDictionary {
+    final _ret = _lib._objc_msgSend_471(_id, _lib._sel_threadDictionary1);
+    return _ret.address == 0
+        ? null
+        : NSMutableDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static void sleepUntilDate_(SwiftLibrary _lib, NSDate? date) {
+    return _lib._objc_msgSend_472(_lib._class_NSThread1,
+        _lib._sel_sleepUntilDate_1, date?._id ?? ffi.nullptr);
+  }
+
+  static void sleepForTimeInterval_(SwiftLibrary _lib, double ti) {
+    return _lib._objc_msgSend_473(
+        _lib._class_NSThread1, _lib._sel_sleepForTimeInterval_1, ti);
+  }
+
+  static void exit(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_1(_lib._class_NSThread1, _lib._sel_exit1);
+  }
+
+  double get threadPriority {
+    return _lib._objc_msgSend_149(_id, _lib._sel_threadPriority1);
+  }
+
+  set threadPriority(double value) {
+    _lib._objc_msgSend_474(_id, _lib._sel_setThreadPriority_1, value);
+  }
+
+  int get qualityOfService {
+    return _lib._objc_msgSend_475(_id, _lib._sel_qualityOfService1);
+  }
+
+  set qualityOfService(int value) {
+    _lib._objc_msgSend_476(_id, _lib._sel_setQualityOfService_1, value);
+  }
+
+  static NSArray? getCallStackReturnAddresses(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSThread1, _lib._sel_callStackReturnAddresses1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray? getCallStackSymbols(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSThread1, _lib._sel_callStackSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get name {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_name1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set name(NSString? value) {
+    _lib._objc_msgSend_477(_id, _lib._sel_setName_1, value?._id ?? ffi.nullptr);
+  }
+
+  int get stackSize {
+    return _lib._objc_msgSend_10(_id, _lib._sel_stackSize1);
+  }
+
+  set stackSize(int value) {
+    _lib._objc_msgSend_451(_id, _lib._sel_setStackSize_1, value);
+  }
+
+  bool get isMainThread {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isMainThread1);
+  }
+
+  static NSThread? getMainThread(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_464(_lib._class_NSThread1, _lib._sel_mainThread1);
+    return _ret.address == 0
+        ? null
+        : NSThread._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSThread init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSThread._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSThread initWithTarget_selector_object_(
+      NSObject target, ffi.Pointer<ObjCSel> selector, NSObject argument) {
+    final _ret = _lib._objc_msgSend_478(
+        _id,
+        _lib._sel_initWithTarget_selector_object_1,
+        target._id,
+        selector,
+        argument._id);
+    return NSThread._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSThread initWithBlock_(ObjCBlock16 block) {
+    final _ret =
+        _lib._objc_msgSend_479(_id, _lib._sel_initWithBlock_1, block._id);
+    return NSThread._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool get executing {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isExecuting1);
+  }
+
+  bool get finished {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isFinished1);
+  }
+
+  bool get cancelled {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isCancelled1);
+  }
+
+  void cancel() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_cancel1);
+  }
+
+  void start() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_start1);
+  }
+
+  void main() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_main1);
+  }
+
+  static NSThread new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSThread1, _lib._sel_new1);
+    return NSThread._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSThread alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSThread1, _lib._sel_alloc1);
+    return NSThread._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSThread1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSThread1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSThread1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSThread1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSThread1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSThread1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSThread1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSThread1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSThread1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+void _ObjCBlock16_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block) {
+  return block.ref.target
+      .cast<ffi.NativeFunction<ffi.Void Function()>>()
+      .asFunction<void Function()>()();
+}
+
+final _ObjCBlock16_closureRegistry = <int, Function>{};
+int _ObjCBlock16_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock16_registerClosure(Function fn) {
+  final id = ++_ObjCBlock16_closureRegistryIndex;
+  _ObjCBlock16_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock16_closureTrampoline(ffi.Pointer<_ObjCBlock> block) {
+  return _ObjCBlock16_closureRegistry[block.ref.target.address]!();
+}
+
+class ObjCBlock16 extends _ObjCBlockBase {
+  ObjCBlock16._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock16.fromFunctionPointer(SwiftLibrary lib,
+      ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>> ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block)>(
+                        _ObjCBlock16_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock16.fromFunction(SwiftLibrary lib, void Function() fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block)>(
+                        _ObjCBlock16_closureTrampoline)
+                    .cast(),
+                _ObjCBlock16_registerClosure(fn)),
+            lib);
+  void call() {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(ffi.Pointer<_ObjCBlock> block)>>()
+        .asFunction<void Function(ffi.Pointer<_ObjCBlock> block)>()(_id);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class NSMutableDictionary extends NSDictionary {
+  NSMutableDictionary._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSMutableDictionary] that points to the same underlying object as [other].
+  static NSMutableDictionary castFrom<T extends _ObjCWrapper>(T other) {
+    return NSMutableDictionary._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSMutableDictionary] that wraps the given raw object pointer.
+  static NSMutableDictionary castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSMutableDictionary._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSMutableDictionary].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSMutableDictionary1);
+  }
+
+  void removeObjectForKey_(NSObject aKey) {
+    return _lib._objc_msgSend_15(_id, _lib._sel_removeObjectForKey_1, aKey._id);
+  }
+
+  void setObject_forKey_(NSObject anObject, NSObject aKey) {
+    return _lib._objc_msgSend_467(
+        _id, _lib._sel_setObject_forKey_1, anObject._id, aKey._id);
+  }
+
+  @override
+  NSMutableDictionary init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSMutableDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSMutableDictionary initWithCapacity_(int numItems) {
+    final _ret =
+        _lib._objc_msgSend_60(_id, _lib._sel_initWithCapacity_1, numItems);
+    return NSMutableDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSMutableDictionary initWithCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr);
+    return NSMutableDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  void addEntriesFromDictionary_(NSDictionary? otherDictionary) {
+    return _lib._objc_msgSend_444(_id, _lib._sel_addEntriesFromDictionary_1,
+        otherDictionary?._id ?? ffi.nullptr);
+  }
+
+  void removeAllObjects() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_removeAllObjects1);
+  }
+
+  void removeObjectsForKeys_(NSArray? keyArray) {
+    return _lib._objc_msgSend_412(
+        _id, _lib._sel_removeObjectsForKeys_1, keyArray?._id ?? ffi.nullptr);
+  }
+
+  void setDictionary_(NSDictionary? otherDictionary) {
+    return _lib._objc_msgSend_444(
+        _id, _lib._sel_setDictionary_1, otherDictionary?._id ?? ffi.nullptr);
+  }
+
+  void setObject_forKeyedSubscript_(NSObject obj, NSObject key) {
+    return _lib._objc_msgSend_467(
+        _id, _lib._sel_setObject_forKeyedSubscript_1, obj._id, key._id);
+  }
+
+  static NSMutableDictionary dictionaryWithCapacity_(
+      SwiftLibrary _lib, int numItems) {
+    final _ret = _lib._objc_msgSend_60(_lib._class_NSMutableDictionary1,
+        _lib._sel_dictionaryWithCapacity_1, numItems);
+    return NSMutableDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableDictionary dictionaryWithContentsOfFile_(
+      SwiftLibrary _lib, NSString? path) {
+    final _ret = _lib._objc_msgSend_468(_lib._class_NSMutableDictionary1,
+        _lib._sel_dictionaryWithContentsOfFile_1, path?._id ?? ffi.nullptr);
+    return NSMutableDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableDictionary dictionaryWithContentsOfURL_(
+      SwiftLibrary _lib, NSURL? url) {
+    final _ret = _lib._objc_msgSend_469(_lib._class_NSMutableDictionary1,
+        _lib._sel_dictionaryWithContentsOfURL_1, url?._id ?? ffi.nullptr);
+    return NSMutableDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSMutableDictionary initWithContentsOfFile_(NSString? path) {
+    final _ret = _lib._objc_msgSend_468(
+        _id, _lib._sel_initWithContentsOfFile_1, path?._id ?? ffi.nullptr);
+    return NSMutableDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSMutableDictionary initWithContentsOfURL_(NSURL? url) {
+    final _ret = _lib._objc_msgSend_469(
+        _id, _lib._sel_initWithContentsOfURL_1, url?._id ?? ffi.nullptr);
+    return NSMutableDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableDictionary dictionaryWithSharedKeySet_(
+      SwiftLibrary _lib, NSObject keyset) {
+    final _ret = _lib._objc_msgSend_470(_lib._class_NSMutableDictionary1,
+        _lib._sel_dictionaryWithSharedKeySet_1, keyset._id);
+    return NSMutableDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  void setValue_forKey_(NSObject value, NSString? key) {
+    return _lib._objc_msgSend_122(
+        _id, _lib._sel_setValue_forKey_1, value._id, key?._id ?? ffi.nullptr);
+  }
+
+  static NSMutableDictionary dictionary(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSMutableDictionary1, _lib._sel_dictionary1);
+    return NSMutableDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableDictionary dictionaryWithObject_forKey_(
+      SwiftLibrary _lib, NSObject object, NSObject key) {
+    final _ret = _lib._objc_msgSend_142(_lib._class_NSMutableDictionary1,
+        _lib._sel_dictionaryWithObject_forKey_1, object._id, key._id);
+    return NSMutableDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableDictionary dictionaryWithObjects_forKeys_count_(
+      SwiftLibrary _lib,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> objects,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> keys,
+      int cnt) {
+    final _ret = _lib._objc_msgSend_133(_lib._class_NSMutableDictionary1,
+        _lib._sel_dictionaryWithObjects_forKeys_count_1, objects, keys, cnt);
+    return NSMutableDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableDictionary dictionaryWithObjectsAndKeys_(
+      SwiftLibrary _lib, NSObject firstObject) {
+    final _ret = _lib._objc_msgSend_16(_lib._class_NSMutableDictionary1,
+        _lib._sel_dictionaryWithObjectsAndKeys_1, firstObject._id);
+    return NSMutableDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableDictionary dictionaryWithDictionary_(
+      SwiftLibrary _lib, NSDictionary? dict) {
+    final _ret = _lib._objc_msgSend_143(_lib._class_NSMutableDictionary1,
+        _lib._sel_dictionaryWithDictionary_1, dict?._id ?? ffi.nullptr);
+    return NSMutableDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableDictionary dictionaryWithObjects_forKeys_(
+      SwiftLibrary _lib, NSArray? objects, NSArray? keys) {
+    final _ret = _lib._objc_msgSend_144(
+        _lib._class_NSMutableDictionary1,
+        _lib._sel_dictionaryWithObjects_forKeys_1,
+        objects?._id ?? ffi.nullptr,
+        keys?._id ?? ffi.nullptr);
+    return NSMutableDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDictionary dictionaryWithContentsOfURL_error_(SwiftLibrary _lib,
+      NSURL? url, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_146(
+        _lib._class_NSMutableDictionary1,
+        _lib._sel_dictionaryWithContentsOfURL_error_1,
+        url?._id ?? ffi.nullptr,
+        error);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject sharedKeySetForKeys_(SwiftLibrary _lib, NSArray? keys) {
+    final _ret = _lib._objc_msgSend_67(_lib._class_NSMutableDictionary1,
+        _lib._sel_sharedKeySetForKeys_1, keys?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableDictionary new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMutableDictionary1, _lib._sel_new1);
+    return NSMutableDictionary._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSMutableDictionary alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSMutableDictionary1, _lib._sel_alloc1);
+    return NSMutableDictionary._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSMutableDictionary1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSMutableDictionary1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSMutableDictionary1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSMutableDictionary1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSMutableDictionary1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSMutableDictionary1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSMutableDictionary1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSMutableDictionary1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSMutableDictionary1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSQualityOfService {
+  static const int NSQualityOfServiceUserInteractive = 33;
+  static const int NSQualityOfServiceUserInitiated = 25;
+  static const int NSQualityOfServiceUtility = 17;
+  static const int NSQualityOfServiceBackground = 9;
+  static const int NSQualityOfServiceDefault = -1;
+}
+
+class NSArchiver extends NSCoder {
+  NSArchiver._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSArchiver] that points to the same underlying object as [other].
+  static NSArchiver castFrom<T extends _ObjCWrapper>(T other) {
+    return NSArchiver._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSArchiver] that wraps the given raw object pointer.
+  static NSArchiver castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSArchiver._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSArchiver].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSArchiver1);
+  }
+
+  NSArchiver initForWritingWithMutableData_(NSMutableData? mdata) {
+    final _ret = _lib._objc_msgSend_455(_id,
+        _lib._sel_initForWritingWithMutableData_1, mdata?._id ?? ffi.nullptr);
+    return NSArchiver._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSMutableData? get archiverData {
+    final _ret = _lib._objc_msgSend_482(_id, _lib._sel_archiverData1);
+    return _ret.address == 0
+        ? null
+        : NSMutableData._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  void encodeRootObject_(NSObject rootObject) {
+    return _lib._objc_msgSend_15(
+        _id, _lib._sel_encodeRootObject_1, rootObject._id);
+  }
+
+  @override
+  void encodeConditionalObject_(NSObject object) {
+    return _lib._objc_msgSend_15(
+        _id, _lib._sel_encodeConditionalObject_1, object._id);
+  }
+
+  static NSData archivedDataWithRootObject_(
+      SwiftLibrary _lib, NSObject rootObject) {
+    final _ret = _lib._objc_msgSend_456(_lib._class_NSArchiver1,
+        _lib._sel_archivedDataWithRootObject_1, rootObject._id);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool archiveRootObject_toFile_(
+      SwiftLibrary _lib, NSObject rootObject, NSString? path) {
+    return _lib._objc_msgSend_225(
+        _lib._class_NSArchiver1,
+        _lib._sel_archiveRootObject_toFile_1,
+        rootObject._id,
+        path?._id ?? ffi.nullptr);
+  }
+
+  void encodeClassName_intoClassName_(
+      NSString? trueName, NSString? inArchiveName) {
+    return _lib._objc_msgSend_483(
+        _id,
+        _lib._sel_encodeClassName_intoClassName_1,
+        trueName?._id ?? ffi.nullptr,
+        inArchiveName?._id ?? ffi.nullptr);
+  }
+
+  NSString classNameEncodedForTrueClassName_(NSString? trueName) {
+    final _ret = _lib._objc_msgSend_64(
+        _id,
+        _lib._sel_classNameEncodedForTrueClassName_1,
+        trueName?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  void replaceObject_withObject_(NSObject object, NSObject newObject) {
+    return _lib._objc_msgSend_467(
+        _id, _lib._sel_replaceObject_withObject_1, object._id, newObject._id);
+  }
+
+  static NSArchiver new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSArchiver1, _lib._sel_new1);
+    return NSArchiver._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSArchiver alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSArchiver1, _lib._sel_alloc1);
+    return NSArchiver._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSArchiver1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSArchiver1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSArchiver1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSArchiver1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSArchiver1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSArchiver1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSArchiver1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSArchiver1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSArchiver1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSPortCoder extends NSCoder {
+  NSPortCoder._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSPortCoder] that points to the same underlying object as [other].
+  static NSPortCoder castFrom<T extends _ObjCWrapper>(T other) {
+    return NSPortCoder._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSPortCoder] that wraps the given raw object pointer.
+  static NSPortCoder castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSPortCoder._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSPortCoder].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSPortCoder1);
+  }
+
+  bool isBycopy() {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isBycopy1);
+  }
+
+  bool isByref() {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isByref1);
+  }
+
+  void encodePortObject_(NSPort? aport) {
+    return _lib._objc_msgSend_520(
+        _id, _lib._sel_encodePortObject_1, aport?._id ?? ffi.nullptr);
+  }
+
+  NSPort decodePortObject() {
+    final _ret = _lib._objc_msgSend_485(_id, _lib._sel_decodePortObject1);
+    return NSPort._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSConnection connection() {
+    final _ret = _lib._objc_msgSend_504(_id, _lib._sel_connection1);
+    return NSConnection._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject portCoderWithReceivePort_sendPort_components_(
+      SwiftLibrary _lib, NSPort? rcvPort, NSPort? sndPort, NSArray? comps) {
+    final _ret = _lib._objc_msgSend_521(
+        _lib._class_NSPortCoder1,
+        _lib._sel_portCoderWithReceivePort_sendPort_components_1,
+        rcvPort?._id ?? ffi.nullptr,
+        sndPort?._id ?? ffi.nullptr,
+        comps?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject initWithReceivePort_sendPort_components_(
+      NSPort? rcvPort, NSPort? sndPort, NSArray? comps) {
+    final _ret = _lib._objc_msgSend_521(
+        _id,
+        _lib._sel_initWithReceivePort_sendPort_components_1,
+        rcvPort?._id ?? ffi.nullptr,
+        sndPort?._id ?? ffi.nullptr,
+        comps?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void dispatch() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_dispatch1);
+  }
+
+  static NSPortCoder new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSPortCoder1, _lib._sel_new1);
+    return NSPortCoder._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSPortCoder alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSPortCoder1, _lib._sel_alloc1);
+    return NSPortCoder._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSPortCoder1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSPortCoder1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSPortCoder1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSPortCoder1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSPortCoder1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSPortCoder1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSPortCoder1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSPortCoder1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSPortCoder1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSPort extends NSObject {
+  NSPort._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSPort] that points to the same underlying object as [other].
+  static NSPort castFrom<T extends _ObjCWrapper>(T other) {
+    return NSPort._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSPort] that wraps the given raw object pointer.
+  static NSPort castFromPointer(SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSPort._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSPort].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSPort1);
+  }
+
+  static NSPort port(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_485(_lib._class_NSPort1, _lib._sel_port1);
+    return NSPort._(_ret, _lib, retain: true, release: true);
+  }
+
+  void invalidate() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_invalidate1);
+  }
+
+  bool get valid {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isValid1);
+  }
+
+  void setDelegate_(NSObject? anObject) {
+    return _lib._objc_msgSend_15(
+        _id, _lib._sel_setDelegate_1, anObject?._id ?? ffi.nullptr);
+  }
+
+  NSObject delegate() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_delegate1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void scheduleInRunLoop_forMode_(NSRunLoop? runLoop, NSRunLoopMode mode) {
+    return _lib._objc_msgSend_501(_id, _lib._sel_scheduleInRunLoop_forMode_1,
+        runLoop?._id ?? ffi.nullptr, mode);
+  }
+
+  void removeFromRunLoop_forMode_(NSRunLoop? runLoop, NSRunLoopMode mode) {
+    return _lib._objc_msgSend_501(_id, _lib._sel_removeFromRunLoop_forMode_1,
+        runLoop?._id ?? ffi.nullptr, mode);
+  }
+
+  int get reservedSpaceLength {
+    return _lib._objc_msgSend_10(_id, _lib._sel_reservedSpaceLength1);
+  }
+
+  bool sendBeforeDate_components_from_reserved_(
+      NSDate? limitDate,
+      NSMutableArray? components,
+      NSPort? receivePort,
+      int headerSpaceReserved) {
+    return _lib._objc_msgSend_502(
+        _id,
+        _lib._sel_sendBeforeDate_components_from_reserved_1,
+        limitDate?._id ?? ffi.nullptr,
+        components?._id ?? ffi.nullptr,
+        receivePort?._id ?? ffi.nullptr,
+        headerSpaceReserved);
+  }
+
+  bool sendBeforeDate_msgid_components_from_reserved_(
+      NSDate? limitDate,
+      int msgID,
+      NSMutableArray? components,
+      NSPort? receivePort,
+      int headerSpaceReserved) {
+    return _lib._objc_msgSend_503(
+        _id,
+        _lib._sel_sendBeforeDate_msgid_components_from_reserved_1,
+        limitDate?._id ?? ffi.nullptr,
+        msgID,
+        components?._id ?? ffi.nullptr,
+        receivePort?._id ?? ffi.nullptr,
+        headerSpaceReserved);
+  }
+
+  void addConnection_toRunLoop_forMode_(
+      NSConnection? conn, NSRunLoop? runLoop, NSRunLoopMode mode) {
+    return _lib._objc_msgSend_519(
+        _id,
+        _lib._sel_addConnection_toRunLoop_forMode_1,
+        conn?._id ?? ffi.nullptr,
+        runLoop?._id ?? ffi.nullptr,
+        mode);
+  }
+
+  void removeConnection_fromRunLoop_forMode_(
+      NSConnection? conn, NSRunLoop? runLoop, NSRunLoopMode mode) {
+    return _lib._objc_msgSend_519(
+        _id,
+        _lib._sel_removeConnection_fromRunLoop_forMode_1,
+        conn?._id ?? ffi.nullptr,
+        runLoop?._id ?? ffi.nullptr,
+        mode);
+  }
+
+  static NSPort new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSPort1, _lib._sel_new1);
+    return NSPort._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSPort alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSPort1, _lib._sel_alloc1);
+    return NSPort._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSPort1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSPort1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSPort1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSPort1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSPort1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSPort1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSPort1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSPort1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSPort1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSRunLoop extends NSObject {
+  NSRunLoop._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSRunLoop] that points to the same underlying object as [other].
+  static NSRunLoop castFrom<T extends _ObjCWrapper>(T other) {
+    return NSRunLoop._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSRunLoop] that wraps the given raw object pointer.
+  static NSRunLoop castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSRunLoop._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSRunLoop].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSRunLoop1);
+  }
+
+  static NSRunLoop? getCurrentRunLoop(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_486(
+        _lib._class_NSRunLoop1, _lib._sel_currentRunLoop1);
+    return _ret.address == 0
+        ? null
+        : NSRunLoop._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSRunLoop? getMainRunLoop(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_486(_lib._class_NSRunLoop1, _lib._sel_mainRunLoop1);
+    return _ret.address == 0
+        ? null
+        : NSRunLoop._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSRunLoopMode get currentMode {
+    return _lib._objc_msgSend_20(_id, _lib._sel_currentMode1);
+  }
+
+  CFRunLoopRef getCFRunLoop() {
+    return _lib._objc_msgSend_487(_id, _lib._sel_getCFRunLoop1);
+  }
+
+  void addTimer_forMode_(NSTimer? timer, NSRunLoopMode mode) {
+    return _lib._objc_msgSend_494(
+        _id, _lib._sel_addTimer_forMode_1, timer?._id ?? ffi.nullptr, mode);
+  }
+
+  void addPort_forMode_(NSPort? aPort, NSRunLoopMode mode) {
+    return _lib._objc_msgSend_495(
+        _id, _lib._sel_addPort_forMode_1, aPort?._id ?? ffi.nullptr, mode);
+  }
+
+  void removePort_forMode_(NSPort? aPort, NSRunLoopMode mode) {
+    return _lib._objc_msgSend_495(
+        _id, _lib._sel_removePort_forMode_1, aPort?._id ?? ffi.nullptr, mode);
+  }
+
+  NSDate limitDateForMode_(NSRunLoopMode mode) {
+    final _ret =
+        _lib._objc_msgSend_496(_id, _lib._sel_limitDateForMode_1, mode);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  void acceptInputForMode_beforeDate_(NSRunLoopMode mode, NSDate? limitDate) {
+    return _lib._objc_msgSend_497(
+        _id,
+        _lib._sel_acceptInputForMode_beforeDate_1,
+        mode,
+        limitDate?._id ?? ffi.nullptr);
+  }
+
+  void run() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_run1);
+  }
+
+  void runUntilDate_(NSDate? limitDate) {
+    return _lib._objc_msgSend_472(
+        _id, _lib._sel_runUntilDate_1, limitDate?._id ?? ffi.nullptr);
+  }
+
+  bool runMode_beforeDate_(NSRunLoopMode mode, NSDate? limitDate) {
+    return _lib._objc_msgSend_498(_id, _lib._sel_runMode_beforeDate_1, mode,
+        limitDate?._id ?? ffi.nullptr);
+  }
+
+  void configureAsServer() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_configureAsServer1);
+  }
+
+  void performInModes_block_(NSArray? modes, ObjCBlock16 block) {
+    return _lib._objc_msgSend_499(_id, _lib._sel_performInModes_block_1,
+        modes?._id ?? ffi.nullptr, block._id);
+  }
+
+  void performBlock_(ObjCBlock16 block) {
+    return _lib._objc_msgSend_465(_id, _lib._sel_performBlock_1, block._id);
+  }
+
+  void performSelector_target_argument_order_modes_(
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject target,
+      NSObject arg,
+      int order,
+      NSArray? modes) {
+    return _lib._objc_msgSend_500(
+        _id,
+        _lib._sel_performSelector_target_argument_order_modes_1,
+        aSelector,
+        target._id,
+        arg._id,
+        order,
+        modes?._id ?? ffi.nullptr);
+  }
+
+  void cancelPerformSelector_target_argument_(
+      ffi.Pointer<ObjCSel> aSelector, NSObject target, NSObject arg) {
+    return _lib._objc_msgSend_466(
+        _id,
+        _lib._sel_cancelPerformSelector_target_argument_1,
+        aSelector,
+        target._id,
+        arg._id);
+  }
+
+  void cancelPerformSelectorsWithTarget_(NSObject target) {
+    return _lib._objc_msgSend_15(
+        _id, _lib._sel_cancelPerformSelectorsWithTarget_1, target._id);
+  }
+
+  static NSRunLoop new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSRunLoop1, _lib._sel_new1);
+    return NSRunLoop._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSRunLoop alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSRunLoop1, _lib._sel_alloc1);
+    return NSRunLoop._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSRunLoop1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSRunLoop1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSRunLoop1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSRunLoop1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSRunLoop1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSRunLoop1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSRunLoop1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSRunLoop1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSRunLoop1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef NSRunLoopMode = ffi.Pointer<ObjCObject>;
+typedef CFRunLoopRef = ffi.Pointer<__CFRunLoop>;
+
+class __CFRunLoop extends ffi.Opaque {}
+
+class NSTimer extends NSObject {
+  NSTimer._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSTimer] that points to the same underlying object as [other].
+  static NSTimer castFrom<T extends _ObjCWrapper>(T other) {
+    return NSTimer._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSTimer] that wraps the given raw object pointer.
+  static NSTimer castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSTimer._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSTimer].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSTimer1);
+  }
+
+  static NSTimer timerWithTimeInterval_invocation_repeats_(
+      SwiftLibrary _lib, double ti, NSInvocation? invocation, bool yesOrNo) {
+    final _ret = _lib._objc_msgSend_488(
+        _lib._class_NSTimer1,
+        _lib._sel_timerWithTimeInterval_invocation_repeats_1,
+        ti,
+        invocation?._id ?? ffi.nullptr,
+        yesOrNo);
+    return NSTimer._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTimer scheduledTimerWithTimeInterval_invocation_repeats_(
+      SwiftLibrary _lib, double ti, NSInvocation? invocation, bool yesOrNo) {
+    final _ret = _lib._objc_msgSend_488(
+        _lib._class_NSTimer1,
+        _lib._sel_scheduledTimerWithTimeInterval_invocation_repeats_1,
+        ti,
+        invocation?._id ?? ffi.nullptr,
+        yesOrNo);
+    return NSTimer._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTimer timerWithTimeInterval_target_selector_userInfo_repeats_(
+      SwiftLibrary _lib,
+      double ti,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject userInfo,
+      bool yesOrNo) {
+    final _ret = _lib._objc_msgSend_489(
+        _lib._class_NSTimer1,
+        _lib._sel_timerWithTimeInterval_target_selector_userInfo_repeats_1,
+        ti,
+        aTarget._id,
+        aSelector,
+        userInfo._id,
+        yesOrNo);
+    return NSTimer._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTimer
+      scheduledTimerWithTimeInterval_target_selector_userInfo_repeats_(
+          SwiftLibrary _lib,
+          double ti,
+          NSObject aTarget,
+          ffi.Pointer<ObjCSel> aSelector,
+          NSObject userInfo,
+          bool yesOrNo) {
+    final _ret = _lib._objc_msgSend_489(
+        _lib._class_NSTimer1,
+        _lib._sel_scheduledTimerWithTimeInterval_target_selector_userInfo_repeats_1,
+        ti,
+        aTarget._id,
+        aSelector,
+        userInfo._id,
+        yesOrNo);
+    return NSTimer._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTimer timerWithTimeInterval_repeats_block_(
+      SwiftLibrary _lib, double interval, bool repeats, ObjCBlock17 block) {
+    final _ret = _lib._objc_msgSend_490(
+        _lib._class_NSTimer1,
+        _lib._sel_timerWithTimeInterval_repeats_block_1,
+        interval,
+        repeats,
+        block._id);
+    return NSTimer._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTimer scheduledTimerWithTimeInterval_repeats_block_(
+      SwiftLibrary _lib, double interval, bool repeats, ObjCBlock17 block) {
+    final _ret = _lib._objc_msgSend_490(
+        _lib._class_NSTimer1,
+        _lib._sel_scheduledTimerWithTimeInterval_repeats_block_1,
+        interval,
+        repeats,
+        block._id);
+    return NSTimer._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSTimer initWithFireDate_interval_repeats_block_(
+      NSDate? date, double interval, bool repeats, ObjCBlock17 block) {
+    final _ret = _lib._objc_msgSend_491(
+        _id,
+        _lib._sel_initWithFireDate_interval_repeats_block_1,
+        date?._id ?? ffi.nullptr,
+        interval,
+        repeats,
+        block._id);
+    return NSTimer._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSTimer initWithFireDate_interval_target_selector_userInfo_repeats_(
+      NSDate? date,
+      double ti,
+      NSObject t,
+      ffi.Pointer<ObjCSel> s,
+      NSObject ui,
+      bool rep) {
+    final _ret = _lib._objc_msgSend_492(
+        _id,
+        _lib._sel_initWithFireDate_interval_target_selector_userInfo_repeats_1,
+        date?._id ?? ffi.nullptr,
+        ti,
+        t._id,
+        s,
+        ui._id,
+        rep);
+    return NSTimer._(_ret, _lib, retain: true, release: true);
+  }
+
+  void fire() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_fire1);
+  }
+
+  NSDate? get fireDate {
+    final _ret = _lib._objc_msgSend_156(_id, _lib._sel_fireDate1);
+    return _ret.address == 0
+        ? null
+        : NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  set fireDate(NSDate? value) {
+    _lib._objc_msgSend_493(
+        _id, _lib._sel_setFireDate_1, value?._id ?? ffi.nullptr);
+  }
+
+  double get timeInterval {
+    return _lib._objc_msgSend_149(_id, _lib._sel_timeInterval1);
+  }
+
+  double get tolerance {
+    return _lib._objc_msgSend_149(_id, _lib._sel_tolerance1);
+  }
+
+  set tolerance(double value) {
+    _lib._objc_msgSend_474(_id, _lib._sel_setTolerance_1, value);
+  }
+
+  void invalidate() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_invalidate1);
+  }
+
+  bool get valid {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isValid1);
+  }
+
+  NSObject get userInfo {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_userInfo1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTimer new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSTimer1, _lib._sel_new1);
+    return NSTimer._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSTimer alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSTimer1, _lib._sel_alloc1);
+    return NSTimer._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSTimer1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSTimer1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSTimer1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSTimer1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSTimer1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSTimer1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSTimer1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSTimer1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSTimer1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+void _ObjCBlock17_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ObjCObject> arg0) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ObjCObject> arg0)>>()
+      .asFunction<void Function(ffi.Pointer<ObjCObject> arg0)>()(arg0);
+}
+
+final _ObjCBlock17_closureRegistry = <int, Function>{};
+int _ObjCBlock17_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock17_registerClosure(Function fn) {
+  final id = ++_ObjCBlock17_closureRegistryIndex;
+  _ObjCBlock17_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock17_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ObjCObject> arg0) {
+  return _ObjCBlock17_closureRegistry[block.ref.target.address]!(arg0);
+}
+
+class ObjCBlock17 extends _ObjCBlockBase {
+  ObjCBlock17._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock17.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0)>(
+                        _ObjCBlock17_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock17.fromFunction(
+      SwiftLibrary lib, void Function(ffi.Pointer<ObjCObject> arg0) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0)>(
+                        _ObjCBlock17_closureTrampoline)
+                    .cast(),
+                _ObjCBlock17_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0)>>()
+        .asFunction<
+            void Function(ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0)>()(_id, arg0);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class NSConnection extends NSObject {
+  NSConnection._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSConnection] that points to the same underlying object as [other].
+  static NSConnection castFrom<T extends _ObjCWrapper>(T other) {
+    return NSConnection._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSConnection] that wraps the given raw object pointer.
+  static NSConnection castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSConnection._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSConnection].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSConnection1);
+  }
+
+  NSDictionary? get statistics {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_statistics1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray allConnections(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSConnection1, _lib._sel_allConnections1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSConnection defaultConnection(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_504(
+        _lib._class_NSConnection1, _lib._sel_defaultConnection1);
+    return NSConnection._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSConnection connectionWithRegisteredName_host_(
+      SwiftLibrary _lib, NSString? name, NSString? hostName) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSConnection1,
+        _lib._sel_connectionWithRegisteredName_host_1,
+        name?._id ?? ffi.nullptr,
+        hostName?._id ?? ffi.nullptr);
+    return NSConnection._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSConnection connectionWithRegisteredName_host_usingNameServer_(
+      SwiftLibrary _lib,
+      NSString? name,
+      NSString? hostName,
+      NSPortNameServer? server) {
+    final _ret = _lib._objc_msgSend_509(
+        _lib._class_NSConnection1,
+        _lib._sel_connectionWithRegisteredName_host_usingNameServer_1,
+        name?._id ?? ffi.nullptr,
+        hostName?._id ?? ffi.nullptr,
+        server?._id ?? ffi.nullptr);
+    return NSConnection._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDistantObject rootProxyForConnectionWithRegisteredName_host_(
+      SwiftLibrary _lib, NSString? name, NSString? hostName) {
+    final _ret = _lib._objc_msgSend_512(
+        _lib._class_NSConnection1,
+        _lib._sel_rootProxyForConnectionWithRegisteredName_host_1,
+        name?._id ?? ffi.nullptr,
+        hostName?._id ?? ffi.nullptr);
+    return NSDistantObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDistantObject
+      rootProxyForConnectionWithRegisteredName_host_usingNameServer_(
+          SwiftLibrary _lib,
+          NSString? name,
+          NSString? hostName,
+          NSPortNameServer? server) {
+    final _ret = _lib._objc_msgSend_513(
+        _lib._class_NSConnection1,
+        _lib._sel_rootProxyForConnectionWithRegisteredName_host_usingNameServer_1,
+        name?._id ?? ffi.nullptr,
+        hostName?._id ?? ffi.nullptr,
+        server?._id ?? ffi.nullptr);
+    return NSDistantObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSConnection serviceConnectionWithName_rootObject_usingNameServer_(
+      SwiftLibrary _lib,
+      NSString? name,
+      NSObject root,
+      NSPortNameServer? server) {
+    final _ret = _lib._objc_msgSend_514(
+        _lib._class_NSConnection1,
+        _lib._sel_serviceConnectionWithName_rootObject_usingNameServer_1,
+        name?._id ?? ffi.nullptr,
+        root._id,
+        server?._id ?? ffi.nullptr);
+    return NSConnection._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSConnection serviceConnectionWithName_rootObject_(
+      SwiftLibrary _lib, NSString? name, NSObject root) {
+    final _ret = _lib._objc_msgSend_157(
+        _lib._class_NSConnection1,
+        _lib._sel_serviceConnectionWithName_rootObject_1,
+        name?._id ?? ffi.nullptr,
+        root._id);
+    return NSConnection._(_ret, _lib, retain: true, release: true);
+  }
+
+  double get requestTimeout {
+    return _lib._objc_msgSend_149(_id, _lib._sel_requestTimeout1);
+  }
+
+  set requestTimeout(double value) {
+    _lib._objc_msgSend_474(_id, _lib._sel_setRequestTimeout_1, value);
+  }
+
+  double get replyTimeout {
+    return _lib._objc_msgSend_149(_id, _lib._sel_replyTimeout1);
+  }
+
+  set replyTimeout(double value) {
+    _lib._objc_msgSend_474(_id, _lib._sel_setReplyTimeout_1, value);
+  }
+
+  NSObject get rootObject {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_rootObject1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  set rootObject(NSObject value) {
+    _lib._objc_msgSend_368(_id, _lib._sel_setRootObject_1, value._id);
+  }
+
+  NSObject? get delegate {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_delegate1);
+    return _ret.address == 0
+        ? null
+        : NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  set delegate(NSObject? value) {
+    _lib._objc_msgSend_368(
+        _id, _lib._sel_setDelegate_1, value?._id ?? ffi.nullptr);
+  }
+
+  bool get independentConversationQueueing {
+    return _lib._objc_msgSend_12(
+        _id, _lib._sel_independentConversationQueueing1);
+  }
+
+  set independentConversationQueueing(bool value) {
+    _lib._objc_msgSend_460(
+        _id, _lib._sel_setIndependentConversationQueueing_1, value);
+  }
+
+  bool get valid {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isValid1);
+  }
+
+  NSDistantObject? get rootProxy {
+    final _ret = _lib._objc_msgSend_515(_id, _lib._sel_rootProxy1);
+    return _ret.address == 0
+        ? null
+        : NSDistantObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void invalidate() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_invalidate1);
+  }
+
+  void addRequestMode_(NSString? rmode) {
+    return _lib._objc_msgSend_186(
+        _id, _lib._sel_addRequestMode_1, rmode?._id ?? ffi.nullptr);
+  }
+
+  void removeRequestMode_(NSString? rmode) {
+    return _lib._objc_msgSend_186(
+        _id, _lib._sel_removeRequestMode_1, rmode?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get requestModes {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_requestModes1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool registerName_(NSString? name) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_registerName_1, name?._id ?? ffi.nullptr);
+  }
+
+  bool registerName_withNameServer_(NSString? name, NSPortNameServer? server) {
+    return _lib._objc_msgSend_516(_id, _lib._sel_registerName_withNameServer_1,
+        name?._id ?? ffi.nullptr, server?._id ?? ffi.nullptr);
+  }
+
+  static NSConnection connectionWithReceivePort_sendPort_(
+      SwiftLibrary _lib, NSPort? receivePort, NSPort? sendPort) {
+    final _ret = _lib._objc_msgSend_517(
+        _lib._class_NSConnection1,
+        _lib._sel_connectionWithReceivePort_sendPort_1,
+        receivePort?._id ?? ffi.nullptr,
+        sendPort?._id ?? ffi.nullptr);
+    return NSConnection._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject currentConversation(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSConnection1, _lib._sel_currentConversation1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSConnection initWithReceivePort_sendPort_(
+      NSPort? receivePort, NSPort? sendPort) {
+    final _ret = _lib._objc_msgSend_517(
+        _id,
+        _lib._sel_initWithReceivePort_sendPort_1,
+        receivePort?._id ?? ffi.nullptr,
+        sendPort?._id ?? ffi.nullptr);
+    return NSConnection._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSPort? get sendPort {
+    final _ret = _lib._objc_msgSend_485(_id, _lib._sel_sendPort1);
+    return _ret.address == 0
+        ? null
+        : NSPort._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSPort? get receivePort {
+    final _ret = _lib._objc_msgSend_485(_id, _lib._sel_receivePort1);
+    return _ret.address == 0
+        ? null
+        : NSPort._(_ret, _lib, retain: true, release: true);
+  }
+
+  void enableMultipleThreads() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_enableMultipleThreads1);
+  }
+
+  bool get multipleThreadsEnabled {
+    return _lib._objc_msgSend_12(_id, _lib._sel_multipleThreadsEnabled1);
+  }
+
+  void addRunLoop_(NSRunLoop? runloop) {
+    return _lib._objc_msgSend_518(
+        _id, _lib._sel_addRunLoop_1, runloop?._id ?? ffi.nullptr);
+  }
+
+  void removeRunLoop_(NSRunLoop? runloop) {
+    return _lib._objc_msgSend_518(
+        _id, _lib._sel_removeRunLoop_1, runloop?._id ?? ffi.nullptr);
+  }
+
+  void runInNewThread() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_runInNewThread1);
+  }
+
+  NSArray? get remoteObjects {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_remoteObjects1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get localObjects {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_localObjects1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  void dispatchWithComponents_(NSArray? components) {
+    return _lib._objc_msgSend_412(_id, _lib._sel_dispatchWithComponents_1,
+        components?._id ?? ffi.nullptr);
+  }
+
+  static NSConnection new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSConnection1, _lib._sel_new1);
+    return NSConnection._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSConnection alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSConnection1, _lib._sel_alloc1);
+    return NSConnection._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSConnection1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSConnection1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSConnection1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSConnection1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSConnection1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSConnection1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSConnection1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSConnection1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSConnection1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSPortNameServer extends NSObject {
+  NSPortNameServer._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSPortNameServer] that points to the same underlying object as [other].
+  static NSPortNameServer castFrom<T extends _ObjCWrapper>(T other) {
+    return NSPortNameServer._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSPortNameServer] that wraps the given raw object pointer.
+  static NSPortNameServer castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSPortNameServer._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSPortNameServer].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSPortNameServer1);
+  }
+
+  static NSPortNameServer systemDefaultPortNameServer(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_505(
+        _lib._class_NSPortNameServer1, _lib._sel_systemDefaultPortNameServer1);
+    return NSPortNameServer._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSPort portForName_(NSString? name) {
+    final _ret = _lib._objc_msgSend_506(
+        _id, _lib._sel_portForName_1, name?._id ?? ffi.nullptr);
+    return NSPort._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSPort portForName_host_(NSString? name, NSString? host) {
+    final _ret = _lib._objc_msgSend_507(_id, _lib._sel_portForName_host_1,
+        name?._id ?? ffi.nullptr, host?._id ?? ffi.nullptr);
+    return NSPort._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool registerPort_name_(NSPort? port, NSString? name) {
+    return _lib._objc_msgSend_508(_id, _lib._sel_registerPort_name_1,
+        port?._id ?? ffi.nullptr, name?._id ?? ffi.nullptr);
+  }
+
+  bool removePortForName_(NSString? name) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_removePortForName_1, name?._id ?? ffi.nullptr);
+  }
+
+  static NSPortNameServer new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSPortNameServer1, _lib._sel_new1);
+    return NSPortNameServer._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSPortNameServer alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSPortNameServer1, _lib._sel_alloc1);
+    return NSPortNameServer._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSPortNameServer1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSPortNameServer1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSPortNameServer1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSPortNameServer1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSPortNameServer1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSPortNameServer1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSPortNameServer1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSPortNameServer1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSPortNameServer1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSDistantObject extends NSProxy {
+  NSDistantObject._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSDistantObject] that points to the same underlying object as [other].
+  static NSDistantObject castFrom<T extends _ObjCWrapper>(T other) {
+    return NSDistantObject._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSDistantObject] that wraps the given raw object pointer.
+  static NSDistantObject castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSDistantObject._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSDistantObject].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSDistantObject1);
+  }
+
+  static NSObject proxyWithTarget_connection_(
+      SwiftLibrary _lib, NSObject target, NSConnection? connection) {
+    final _ret = _lib._objc_msgSend_510(
+        _lib._class_NSDistantObject1,
+        _lib._sel_proxyWithTarget_connection_1,
+        target._id,
+        connection?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDistantObject initWithTarget_connection_(
+      NSObject target, NSConnection? connection) {
+    final _ret = _lib._objc_msgSend_510(
+        _id,
+        _lib._sel_initWithTarget_connection_1,
+        target._id,
+        connection?._id ?? ffi.nullptr);
+    return NSDistantObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject proxyWithLocal_connection_(
+      SwiftLibrary _lib, NSObject target, NSConnection? connection) {
+    final _ret = _lib._objc_msgSend_510(
+        _lib._class_NSDistantObject1,
+        _lib._sel_proxyWithLocal_connection_1,
+        target._id,
+        connection?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDistantObject initWithLocal_connection_(
+      NSObject target, NSConnection? connection) {
+    final _ret = _lib._objc_msgSend_510(
+        _id,
+        _lib._sel_initWithLocal_connection_1,
+        target._id,
+        connection?._id ?? ffi.nullptr);
+    return NSDistantObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDistantObject initWithCoder_(NSCoder? inCoder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, inCoder?._id ?? ffi.nullptr);
+    return NSDistantObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void setProtocolForProxy_(Protocol? proto) {
+    return _lib._objc_msgSend_511(
+        _id, _lib._sel_setProtocolForProxy_1, proto?._id ?? ffi.nullptr);
+  }
+
+  NSConnection? get connectionForProxy {
+    final _ret = _lib._objc_msgSend_504(_id, _lib._sel_connectionForProxy1);
+    return _ret.address == 0
+        ? null
+        : NSConnection._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSDistantObject1, _lib._sel_alloc1);
+    return NSObject._(_ret, _lib, retain: false, release: true);
+  }
+
+  static bool respondsToSelector_(
+      SwiftLibrary _lib, ffi.Pointer<ObjCSel> aSelector) {
+    return _lib._objc_msgSend_4(_lib._class_NSDistantObject1,
+        _lib._sel_respondsToSelector_1, aSelector);
+  }
+}
+
+class NSProxy extends _ObjCWrapper {
+  NSProxy._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSProxy] that points to the same underlying object as [other].
+  static NSProxy castFrom<T extends _ObjCWrapper>(T other) {
+    return NSProxy._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSProxy] that wraps the given raw object pointer.
+  static NSProxy castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSProxy._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSProxy].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSProxy1);
+  }
+
+  static NSObject alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSProxy1, _lib._sel_alloc1);
+    return NSObject._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSObject allocWithZone_(SwiftLibrary _lib, ffi.Pointer<NSZone> zone) {
+    final _ret = _lib._objc_msgSend_3(
+        _lib._class_NSProxy1, _lib._sel_allocWithZone_1, zone);
+    return NSObject._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSObject class1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSProxy1, _lib._sel_class1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void forwardInvocation_(NSInvocation? invocation) {
+    return _lib._objc_msgSend_372(
+        _id, _lib._sel_forwardInvocation_1, invocation?._id ?? ffi.nullptr);
+  }
+
+  NSMethodSignature methodSignatureForSelector_(ffi.Pointer<ObjCSel> sel) {
+    final _ret = _lib._objc_msgSend_373(
+        _id, _lib._sel_methodSignatureForSelector_1, sel);
+    return NSMethodSignature._(_ret, _lib, retain: true, release: true);
+  }
+
+  void dealloc() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_dealloc1);
+  }
+
+  void finalize() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_finalize1);
+  }
+
+  NSString? get description {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_description1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get debugDescription {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_debugDescription1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool respondsToSelector_(
+      SwiftLibrary _lib, ffi.Pointer<ObjCSel> aSelector) {
+    return _lib._objc_msgSend_4(
+        _lib._class_NSProxy1, _lib._sel_respondsToSelector_1, aSelector);
+  }
+
+  bool allowsWeakReference() {
+    return _lib._objc_msgSend_12(_id, _lib._sel_allowsWeakReference1);
+  }
+
+  bool retainWeakReference() {
+    return _lib._objc_msgSend_12(_id, _lib._sel_retainWeakReference1);
+  }
+}
+
+class NSClassDescription extends NSObject {
+  NSClassDescription._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSClassDescription] that points to the same underlying object as [other].
+  static NSClassDescription castFrom<T extends _ObjCWrapper>(T other) {
+    return NSClassDescription._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSClassDescription] that wraps the given raw object pointer.
+  static NSClassDescription castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSClassDescription._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSClassDescription].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSClassDescription1);
+  }
+
+  static void registerClassDescription_forClass_(
+      SwiftLibrary _lib, NSClassDescription? description, NSObject aClass) {
+    return _lib._objc_msgSend_523(
+        _lib._class_NSClassDescription1,
+        _lib._sel_registerClassDescription_forClass_1,
+        description?._id ?? ffi.nullptr,
+        aClass._id);
+  }
+
+  static void invalidateClassDescriptionCache(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_1(_lib._class_NSClassDescription1,
+        _lib._sel_invalidateClassDescriptionCache1);
+  }
+
+  static NSClassDescription classDescriptionForClass_(
+      SwiftLibrary _lib, NSObject aClass) {
+    final _ret = _lib._objc_msgSend_524(_lib._class_NSClassDescription1,
+        _lib._sel_classDescriptionForClass_1, aClass._id);
+    return NSClassDescription._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSArray? get attributeKeys {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_attributeKeys1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSArray? get toOneRelationshipKeys {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_toOneRelationshipKeys1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSArray? get toManyRelationshipKeys {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_toManyRelationshipKeys1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSString inverseForRelationshipKey_(NSString? relationshipKey) {
+    final _ret = _lib._objc_msgSend_64(
+        _id,
+        _lib._sel_inverseForRelationshipKey_1,
+        relationshipKey?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSClassDescription new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSClassDescription1, _lib._sel_new1);
+    return NSClassDescription._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSClassDescription alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSClassDescription1, _lib._sel_alloc1);
+    return NSClassDescription._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSClassDescription1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSClassDescription1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSClassDescription1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSClassDescription1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSClassDescription1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSClassDescription1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSClassDescription1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSClassDescription1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSClassDescription1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSScriptObjectSpecifier extends NSObject {
+  NSScriptObjectSpecifier._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSScriptObjectSpecifier] that points to the same underlying object as [other].
+  static NSScriptObjectSpecifier castFrom<T extends _ObjCWrapper>(T other) {
+    return NSScriptObjectSpecifier._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSScriptObjectSpecifier] that wraps the given raw object pointer.
+  static NSScriptObjectSpecifier castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSScriptObjectSpecifier._(other, lib,
+        retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSScriptObjectSpecifier].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSScriptObjectSpecifier1);
+  }
+
+  static NSScriptObjectSpecifier objectSpecifierWithDescriptor_(
+      SwiftLibrary _lib, NSAppleEventDescriptor? descriptor) {
+    final _ret = _lib._objc_msgSend_548(
+        _lib._class_NSScriptObjectSpecifier1,
+        _lib._sel_objectSpecifierWithDescriptor_1,
+        descriptor?._id ?? ffi.nullptr);
+    return NSScriptObjectSpecifier._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSScriptObjectSpecifier initWithContainerSpecifier_key_(
+      NSScriptObjectSpecifier? container, NSString? property) {
+    final _ret = _lib._objc_msgSend_549(
+        _id,
+        _lib._sel_initWithContainerSpecifier_key_1,
+        container?._id ?? ffi.nullptr,
+        property?._id ?? ffi.nullptr);
+    return NSScriptObjectSpecifier._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSScriptObjectSpecifier
+      initWithContainerClassDescription_containerSpecifier_key_(
+          NSScriptClassDescription? classDesc,
+          NSScriptObjectSpecifier? container,
+          NSString? property) {
+    final _ret = _lib._objc_msgSend_566(
+        _id,
+        _lib._sel_initWithContainerClassDescription_containerSpecifier_key_1,
+        classDesc?._id ?? ffi.nullptr,
+        container?._id ?? ffi.nullptr,
+        property?._id ?? ffi.nullptr);
+    return NSScriptObjectSpecifier._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSScriptObjectSpecifier initWithCoder_(NSCoder? inCoder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, inCoder?._id ?? ffi.nullptr);
+    return NSScriptObjectSpecifier._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSScriptObjectSpecifier? get childSpecifier {
+    final _ret = _lib._objc_msgSend_556(_id, _lib._sel_childSpecifier1);
+    return _ret.address == 0
+        ? null
+        : NSScriptObjectSpecifier._(_ret, _lib, retain: true, release: true);
+  }
+
+  set childSpecifier(NSScriptObjectSpecifier? value) {
+    _lib._objc_msgSend_557(
+        _id, _lib._sel_setChildSpecifier_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSScriptObjectSpecifier? get containerSpecifier {
+    final _ret = _lib._objc_msgSend_556(_id, _lib._sel_containerSpecifier1);
+    return _ret.address == 0
+        ? null
+        : NSScriptObjectSpecifier._(_ret, _lib, retain: true, release: true);
+  }
+
+  set containerSpecifier(NSScriptObjectSpecifier? value) {
+    _lib._objc_msgSend_557(
+        _id, _lib._sel_setContainerSpecifier_1, value?._id ?? ffi.nullptr);
+  }
+
+  bool get containerIsObjectBeingTested {
+    return _lib._objc_msgSend_12(_id, _lib._sel_containerIsObjectBeingTested1);
+  }
+
+  set containerIsObjectBeingTested(bool value) {
+    _lib._objc_msgSend_460(
+        _id, _lib._sel_setContainerIsObjectBeingTested_1, value);
+  }
+
+  bool get containerIsRangeContainerObject {
+    return _lib._objc_msgSend_12(
+        _id, _lib._sel_containerIsRangeContainerObject1);
+  }
+
+  set containerIsRangeContainerObject(bool value) {
+    _lib._objc_msgSend_460(
+        _id, _lib._sel_setContainerIsRangeContainerObject_1, value);
+  }
+
+  NSString? get key {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_key1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set key(NSString? value) {
+    _lib._objc_msgSend_477(_id, _lib._sel_setKey_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSScriptClassDescription? get containerClassDescription {
+    final _ret =
+        _lib._objc_msgSend_552(_id, _lib._sel_containerClassDescription1);
+    return _ret.address == 0
+        ? null
+        : NSScriptClassDescription._(_ret, _lib, retain: true, release: true);
+  }
+
+  set containerClassDescription(NSScriptClassDescription? value) {
+    _lib._objc_msgSend_567(_id, _lib._sel_setContainerClassDescription_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  NSScriptClassDescription? get keyClassDescription {
+    final _ret = _lib._objc_msgSend_552(_id, _lib._sel_keyClassDescription1);
+    return _ret.address == 0
+        ? null
+        : NSScriptClassDescription._(_ret, _lib, retain: true, release: true);
+  }
+
+  ffi.Pointer<NSInteger> indicesOfObjectsByEvaluatingWithContainer_count_(
+      NSObject container, ffi.Pointer<NSInteger> count) {
+    return _lib._objc_msgSend_568(
+        _id,
+        _lib._sel_indicesOfObjectsByEvaluatingWithContainer_count_1,
+        container._id,
+        count);
+  }
+
+  NSObject objectsByEvaluatingWithContainers_(NSObject containers) {
+    final _ret = _lib._objc_msgSend_16(
+        _id, _lib._sel_objectsByEvaluatingWithContainers_1, containers._id);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject get objectsByEvaluatingSpecifier {
+    final _ret =
+        _lib._objc_msgSend_2(_id, _lib._sel_objectsByEvaluatingSpecifier1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get evaluationErrorNumber {
+    return _lib._objc_msgSend_78(_id, _lib._sel_evaluationErrorNumber1);
+  }
+
+  set evaluationErrorNumber(int value) {
+    _lib._objc_msgSend_558(_id, _lib._sel_setEvaluationErrorNumber_1, value);
+  }
+
+  NSScriptObjectSpecifier? get evaluationErrorSpecifier {
+    final _ret =
+        _lib._objc_msgSend_556(_id, _lib._sel_evaluationErrorSpecifier1);
+    return _ret.address == 0
+        ? null
+        : NSScriptObjectSpecifier._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSAppleEventDescriptor? get descriptor {
+    final _ret = _lib._objc_msgSend_526(_id, _lib._sel_descriptor1);
+    return _ret.address == 0
+        ? null
+        : NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSScriptObjectSpecifier new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSScriptObjectSpecifier1, _lib._sel_new1);
+    return NSScriptObjectSpecifier._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSScriptObjectSpecifier alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSScriptObjectSpecifier1, _lib._sel_alloc1);
+    return NSScriptObjectSpecifier._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSScriptObjectSpecifier1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSScriptObjectSpecifier1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSScriptObjectSpecifier1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSScriptObjectSpecifier1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSScriptObjectSpecifier1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSScriptObjectSpecifier1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSScriptObjectSpecifier1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSScriptObjectSpecifier1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSScriptObjectSpecifier1,
+        _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSAppleEventDescriptor extends NSObject {
+  NSAppleEventDescriptor._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSAppleEventDescriptor] that points to the same underlying object as [other].
+  static NSAppleEventDescriptor castFrom<T extends _ObjCWrapper>(T other) {
+    return NSAppleEventDescriptor._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSAppleEventDescriptor] that wraps the given raw object pointer.
+  static NSAppleEventDescriptor castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSAppleEventDescriptor._(other, lib,
+        retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSAppleEventDescriptor].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSAppleEventDescriptor1);
+  }
+
+  static NSAppleEventDescriptor nullDescriptor(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_526(
+        _lib._class_NSAppleEventDescriptor1, _lib._sel_nullDescriptor1);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAppleEventDescriptor descriptorWithDescriptorType_bytes_length_(
+      SwiftLibrary _lib,
+      int descriptorType,
+      ffi.Pointer<ffi.Void> bytes,
+      int byteCount) {
+    final _ret = _lib._objc_msgSend_527(
+        _lib._class_NSAppleEventDescriptor1,
+        _lib._sel_descriptorWithDescriptorType_bytes_length_1,
+        descriptorType,
+        bytes,
+        byteCount);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAppleEventDescriptor descriptorWithDescriptorType_data_(
+      SwiftLibrary _lib, int descriptorType, NSData? data) {
+    final _ret = _lib._objc_msgSend_528(
+        _lib._class_NSAppleEventDescriptor1,
+        _lib._sel_descriptorWithDescriptorType_data_1,
+        descriptorType,
+        data?._id ?? ffi.nullptr);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAppleEventDescriptor descriptorWithBoolean_(
+      SwiftLibrary _lib, int boolean) {
+    final _ret = _lib._objc_msgSend_529(_lib._class_NSAppleEventDescriptor1,
+        _lib._sel_descriptorWithBoolean_1, boolean);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAppleEventDescriptor descriptorWithEnumCode_(
+      SwiftLibrary _lib, int enumerator) {
+    final _ret = _lib._objc_msgSend_530(_lib._class_NSAppleEventDescriptor1,
+        _lib._sel_descriptorWithEnumCode_1, enumerator);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAppleEventDescriptor descriptorWithInt32_(
+      SwiftLibrary _lib, int signedInt) {
+    final _ret = _lib._objc_msgSend_531(_lib._class_NSAppleEventDescriptor1,
+        _lib._sel_descriptorWithInt32_1, signedInt);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAppleEventDescriptor descriptorWithDouble_(
+      SwiftLibrary _lib, double doubleValue) {
+    final _ret = _lib._objc_msgSend_532(_lib._class_NSAppleEventDescriptor1,
+        _lib._sel_descriptorWithDouble_1, doubleValue);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAppleEventDescriptor descriptorWithTypeCode_(
+      SwiftLibrary _lib, int typeCode) {
+    final _ret = _lib._objc_msgSend_530(_lib._class_NSAppleEventDescriptor1,
+        _lib._sel_descriptorWithTypeCode_1, typeCode);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAppleEventDescriptor descriptorWithString_(
+      SwiftLibrary _lib, NSString? string) {
+    final _ret = _lib._objc_msgSend_533(_lib._class_NSAppleEventDescriptor1,
+        _lib._sel_descriptorWithString_1, string?._id ?? ffi.nullptr);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAppleEventDescriptor descriptorWithDate_(
+      SwiftLibrary _lib, NSDate? date) {
+    final _ret = _lib._objc_msgSend_534(_lib._class_NSAppleEventDescriptor1,
+        _lib._sel_descriptorWithDate_1, date?._id ?? ffi.nullptr);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAppleEventDescriptor descriptorWithFileURL_(
+      SwiftLibrary _lib, NSURL? fileURL) {
+    final _ret = _lib._objc_msgSend_535(_lib._class_NSAppleEventDescriptor1,
+        _lib._sel_descriptorWithFileURL_1, fileURL?._id ?? ffi.nullptr);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAppleEventDescriptor
+      appleEventWithEventClass_eventID_targetDescriptor_returnID_transactionID_(
+          SwiftLibrary _lib,
+          int eventClass,
+          int eventID,
+          NSAppleEventDescriptor? targetDescriptor,
+          int returnID,
+          int transactionID) {
+    final _ret = _lib._objc_msgSend_536(
+        _lib._class_NSAppleEventDescriptor1,
+        _lib._sel_appleEventWithEventClass_eventID_targetDescriptor_returnID_transactionID_1,
+        eventClass,
+        eventID,
+        targetDescriptor?._id ?? ffi.nullptr,
+        returnID,
+        transactionID);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAppleEventDescriptor listDescriptor(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_526(
+        _lib._class_NSAppleEventDescriptor1, _lib._sel_listDescriptor1);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAppleEventDescriptor recordDescriptor(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_526(
+        _lib._class_NSAppleEventDescriptor1, _lib._sel_recordDescriptor1);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAppleEventDescriptor currentProcessDescriptor(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_526(_lib._class_NSAppleEventDescriptor1,
+        _lib._sel_currentProcessDescriptor1);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAppleEventDescriptor descriptorWithProcessIdentifier_(
+      SwiftLibrary _lib, int processIdentifier) {
+    final _ret = _lib._objc_msgSend_531(_lib._class_NSAppleEventDescriptor1,
+        _lib._sel_descriptorWithProcessIdentifier_1, processIdentifier);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAppleEventDescriptor descriptorWithBundleIdentifier_(
+      SwiftLibrary _lib, NSString? bundleIdentifier) {
+    final _ret = _lib._objc_msgSend_533(
+        _lib._class_NSAppleEventDescriptor1,
+        _lib._sel_descriptorWithBundleIdentifier_1,
+        bundleIdentifier?._id ?? ffi.nullptr);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAppleEventDescriptor descriptorWithApplicationURL_(
+      SwiftLibrary _lib, NSURL? applicationURL) {
+    final _ret = _lib._objc_msgSend_535(
+        _lib._class_NSAppleEventDescriptor1,
+        _lib._sel_descriptorWithApplicationURL_1,
+        applicationURL?._id ?? ffi.nullptr);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSAppleEventDescriptor initWithAEDescNoCopy_(ffi.Pointer<AEDesc> aeDesc) {
+    final _ret =
+        _lib._objc_msgSend_537(_id, _lib._sel_initWithAEDescNoCopy_1, aeDesc);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSAppleEventDescriptor initWithDescriptorType_bytes_length_(
+      int descriptorType, ffi.Pointer<ffi.Void> bytes, int byteCount) {
+    final _ret = _lib._objc_msgSend_538(
+        _id,
+        _lib._sel_initWithDescriptorType_bytes_length_1,
+        descriptorType,
+        bytes,
+        byteCount);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSAppleEventDescriptor initWithDescriptorType_data_(
+      int descriptorType, NSData? data) {
+    final _ret = _lib._objc_msgSend_539(
+        _id,
+        _lib._sel_initWithDescriptorType_data_1,
+        descriptorType,
+        data?._id ?? ffi.nullptr);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSAppleEventDescriptor
+      initWithEventClass_eventID_targetDescriptor_returnID_transactionID_(
+          int eventClass,
+          int eventID,
+          NSAppleEventDescriptor? targetDescriptor,
+          int returnID,
+          int transactionID) {
+    final _ret = _lib._objc_msgSend_540(
+        _id,
+        _lib._sel_initWithEventClass_eventID_targetDescriptor_returnID_transactionID_1,
+        eventClass,
+        eventID,
+        targetDescriptor?._id ?? ffi.nullptr,
+        returnID,
+        transactionID);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSAppleEventDescriptor initListDescriptor() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_initListDescriptor1);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSAppleEventDescriptor initRecordDescriptor() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_initRecordDescriptor1);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  ffi.Pointer<AEDesc> get aeDesc {
+    return _lib._objc_msgSend_541(_id, _lib._sel_aeDesc1);
+  }
+
+  int get descriptorType {
+    return _lib._objc_msgSend_191(_id, _lib._sel_descriptorType1);
+  }
+
+  NSData? get data {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_data1);
+    return _ret.address == 0
+        ? null
+        : NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get booleanValue {
+    return _lib._objc_msgSend_210(_id, _lib._sel_booleanValue1);
+  }
+
+  int get enumCodeValue {
+    return _lib._objc_msgSend_191(_id, _lib._sel_enumCodeValue1);
+  }
+
+  int get int32Value {
+    return _lib._objc_msgSend_213(_id, _lib._sel_int32Value1);
+  }
+
+  double get doubleValue {
+    return _lib._objc_msgSend_149(_id, _lib._sel_doubleValue1);
+  }
+
+  int get typeCodeValue {
+    return _lib._objc_msgSend_191(_id, _lib._sel_typeCodeValue1);
+  }
+
+  NSString? get stringValue {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_stringValue1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate? get dateValue {
+    final _ret = _lib._objc_msgSend_156(_id, _lib._sel_dateValue1);
+    return _ret.address == 0
+        ? null
+        : NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get fileURLValue {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_fileURLValue1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get eventClass {
+    return _lib._objc_msgSend_191(_id, _lib._sel_eventClass1);
+  }
+
+  int get eventID {
+    return _lib._objc_msgSend_191(_id, _lib._sel_eventID1);
+  }
+
+  int get returnID {
+    return _lib._objc_msgSend_211(_id, _lib._sel_returnID1);
+  }
+
+  int get transactionID {
+    return _lib._objc_msgSend_213(_id, _lib._sel_transactionID1);
+  }
+
+  void setParamDescriptor_forKeyword_(
+      NSAppleEventDescriptor? descriptor, int keyword) {
+    return _lib._objc_msgSend_542(
+        _id,
+        _lib._sel_setParamDescriptor_forKeyword_1,
+        descriptor?._id ?? ffi.nullptr,
+        keyword);
+  }
+
+  NSAppleEventDescriptor paramDescriptorForKeyword_(int keyword) {
+    final _ret = _lib._objc_msgSend_530(
+        _id, _lib._sel_paramDescriptorForKeyword_1, keyword);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  void removeParamDescriptorWithKeyword_(int keyword) {
+    return _lib._objc_msgSend_543(
+        _id, _lib._sel_removeParamDescriptorWithKeyword_1, keyword);
+  }
+
+  void setAttributeDescriptor_forKeyword_(
+      NSAppleEventDescriptor? descriptor, int keyword) {
+    return _lib._objc_msgSend_542(
+        _id,
+        _lib._sel_setAttributeDescriptor_forKeyword_1,
+        descriptor?._id ?? ffi.nullptr,
+        keyword);
+  }
+
+  NSAppleEventDescriptor attributeDescriptorForKeyword_(int keyword) {
+    final _ret = _lib._objc_msgSend_530(
+        _id, _lib._sel_attributeDescriptorForKeyword_1, keyword);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSAppleEventDescriptor sendEventWithOptions_timeout_error_(int sendOptions,
+      double timeoutInSeconds, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_544(
+        _id,
+        _lib._sel_sendEventWithOptions_timeout_error_1,
+        sendOptions,
+        timeoutInSeconds,
+        error);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool get isRecordDescriptor {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isRecordDescriptor1);
+  }
+
+  int get numberOfItems {
+    return _lib._objc_msgSend_78(_id, _lib._sel_numberOfItems1);
+  }
+
+  void insertDescriptor_atIndex_(
+      NSAppleEventDescriptor? descriptor, int index) {
+    return _lib._objc_msgSend_545(_id, _lib._sel_insertDescriptor_atIndex_1,
+        descriptor?._id ?? ffi.nullptr, index);
+  }
+
+  NSAppleEventDescriptor descriptorAtIndex_(int index) {
+    final _ret =
+        _lib._objc_msgSend_546(_id, _lib._sel_descriptorAtIndex_1, index);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  void removeDescriptorAtIndex_(int index) {
+    return _lib._objc_msgSend_374(
+        _id, _lib._sel_removeDescriptorAtIndex_1, index);
+  }
+
+  void setDescriptor_forKeyword_(
+      NSAppleEventDescriptor? descriptor, int keyword) {
+    return _lib._objc_msgSend_542(_id, _lib._sel_setDescriptor_forKeyword_1,
+        descriptor?._id ?? ffi.nullptr, keyword);
+  }
+
+  NSAppleEventDescriptor descriptorForKeyword_(int keyword) {
+    final _ret =
+        _lib._objc_msgSend_530(_id, _lib._sel_descriptorForKeyword_1, keyword);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  void removeDescriptorWithKeyword_(int keyword) {
+    return _lib._objc_msgSend_543(
+        _id, _lib._sel_removeDescriptorWithKeyword_1, keyword);
+  }
+
+  int keywordForDescriptorAtIndex_(int index) {
+    return _lib._objc_msgSend_547(
+        _id, _lib._sel_keywordForDescriptorAtIndex_1, index);
+  }
+
+  NSAppleEventDescriptor coerceToDescriptorType_(int descriptorType) {
+    final _ret = _lib._objc_msgSend_530(
+        _id, _lib._sel_coerceToDescriptorType_1, descriptorType);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAppleEventDescriptor new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSAppleEventDescriptor1, _lib._sel_new1);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSAppleEventDescriptor alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSAppleEventDescriptor1, _lib._sel_alloc1);
+    return NSAppleEventDescriptor._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSAppleEventDescriptor1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSAppleEventDescriptor1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSAppleEventDescriptor1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSAppleEventDescriptor1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSAppleEventDescriptor1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSAppleEventDescriptor1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSAppleEventDescriptor1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSAppleEventDescriptor1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSAppleEventDescriptor1,
+        _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef DescType = ResType;
+typedef ResType = FourCharCode;
+typedef Boolean = ffi.UnsignedChar;
+typedef SInt32 = ffi.Int;
+typedef AEEventClass = FourCharCode;
+typedef AEEventID = FourCharCode;
+typedef AEReturnID = SInt16;
+typedef SInt16 = ffi.Short;
+typedef AETransactionID = SInt32;
+typedef pid_t = __darwin_pid_t;
+typedef __darwin_pid_t = __int32_t;
+typedef __int32_t = ffi.Int;
+
+@ffi.Packed(2)
+class AEDesc extends ffi.Struct {
+  @DescType()
+  external int descriptorType;
+
+  external AEDataStorage dataHandle;
+}
+
+typedef AEDataStorage = ffi.Pointer<AEDataStorageType>;
+typedef AEDataStorageType = ffi.Pointer<OpaqueAEDataStorageType>;
+
+class OpaqueAEDataStorageType extends ffi.Opaque {}
+
+typedef AEKeyword = FourCharCode;
+
+abstract class NSAppleEventSendOptions {
+  static const int NSAppleEventSendNoReply = 1;
+  static const int NSAppleEventSendQueueReply = 2;
+  static const int NSAppleEventSendWaitForReply = 3;
+  static const int NSAppleEventSendNeverInteract = 16;
+  static const int NSAppleEventSendCanInteract = 32;
+  static const int NSAppleEventSendAlwaysInteract = 48;
+  static const int NSAppleEventSendCanSwitchLayer = 64;
+  static const int NSAppleEventSendDontRecord = 4096;
+  static const int NSAppleEventSendDontExecute = 8192;
+  static const int NSAppleEventSendDontAnnotate = 65536;
+  static const int NSAppleEventSendDefaultOptions = 35;
+}
+
+class NSScriptClassDescription extends NSClassDescription {
+  NSScriptClassDescription._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSScriptClassDescription] that points to the same underlying object as [other].
+  static NSScriptClassDescription castFrom<T extends _ObjCWrapper>(T other) {
+    return NSScriptClassDescription._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSScriptClassDescription] that wraps the given raw object pointer.
+  static NSScriptClassDescription castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSScriptClassDescription._(other, lib,
+        retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSScriptClassDescription].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSScriptClassDescription1);
+  }
+
+  static NSScriptClassDescription classDescriptionForClass_(
+      SwiftLibrary _lib, NSObject aClass) {
+    final _ret = _lib._objc_msgSend_550(_lib._class_NSScriptClassDescription1,
+        _lib._sel_classDescriptionForClass_1, aClass._id);
+    return NSScriptClassDescription._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSScriptClassDescription initWithSuiteName_className_dictionary_(
+      NSString? suiteName,
+      NSString? className,
+      NSDictionary? classDeclaration) {
+    final _ret = _lib._objc_msgSend_551(
+        _id,
+        _lib._sel_initWithSuiteName_className_dictionary_1,
+        suiteName?._id ?? ffi.nullptr,
+        className?._id ?? ffi.nullptr,
+        classDeclaration?._id ?? ffi.nullptr);
+    return NSScriptClassDescription._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get suiteName {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_suiteName1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get className {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_className1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get implementationClassName {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_implementationClassName1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSScriptClassDescription? get superclassDescription {
+    final _ret = _lib._objc_msgSend_552(_id, _lib._sel_superclassDescription1);
+    return _ret.address == 0
+        ? null
+        : NSScriptClassDescription._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get appleEventCode {
+    return _lib._objc_msgSend_191(_id, _lib._sel_appleEventCode1);
+  }
+
+  bool matchesAppleEventCode_(int appleEventCode) {
+    return _lib._objc_msgSend_173(
+        _id, _lib._sel_matchesAppleEventCode_1, appleEventCode);
+  }
+
+  bool supportsCommand_(NSScriptCommandDescription? commandDescription) {
+    return _lib._objc_msgSend_562(_id, _lib._sel_supportsCommand_1,
+        commandDescription?._id ?? ffi.nullptr);
+  }
+
+  ffi.Pointer<ObjCSel> selectorForCommand_(
+      NSScriptCommandDescription? commandDescription) {
+    return _lib._objc_msgSend_563(_id, _lib._sel_selectorForCommand_1,
+        commandDescription?._id ?? ffi.nullptr);
+  }
+
+  NSString typeForKey_(NSString? key) {
+    final _ret = _lib._objc_msgSend_64(
+        _id, _lib._sel_typeForKey_1, key?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSScriptClassDescription classDescriptionForKey_(NSString? key) {
+    final _ret = _lib._objc_msgSend_564(
+        _id, _lib._sel_classDescriptionForKey_1, key?._id ?? ffi.nullptr);
+    return NSScriptClassDescription._(_ret, _lib, retain: true, release: true);
+  }
+
+  int appleEventCodeForKey_(NSString? key) {
+    return _lib._objc_msgSend_553(
+        _id, _lib._sel_appleEventCodeForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  NSString keyWithAppleEventCode_(int appleEventCode) {
+    final _ret = _lib._objc_msgSend_565(
+        _id, _lib._sel_keyWithAppleEventCode_1, appleEventCode);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get defaultSubcontainerAttributeKey {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_defaultSubcontainerAttributeKey1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool isLocationRequiredToCreateForKey_(NSString? toManyRelationshipKey) {
+    return _lib._objc_msgSend_59(
+        _id,
+        _lib._sel_isLocationRequiredToCreateForKey_1,
+        toManyRelationshipKey?._id ?? ffi.nullptr);
+  }
+
+  bool hasPropertyForKey_(NSString? key) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_hasPropertyForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  bool hasOrderedToManyRelationshipForKey_(NSString? key) {
+    return _lib._objc_msgSend_59(
+        _id,
+        _lib._sel_hasOrderedToManyRelationshipForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  bool hasReadablePropertyForKey_(NSString? key) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_hasReadablePropertyForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  bool hasWritablePropertyForKey_(NSString? key) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_hasWritablePropertyForKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  bool isReadOnlyKey_(NSString? key) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_isReadOnlyKey_1, key?._id ?? ffi.nullptr);
+  }
+
+  static void registerClassDescription_forClass_(
+      SwiftLibrary _lib, NSClassDescription? description, NSObject aClass) {
+    return _lib._objc_msgSend_523(
+        _lib._class_NSScriptClassDescription1,
+        _lib._sel_registerClassDescription_forClass_1,
+        description?._id ?? ffi.nullptr,
+        aClass._id);
+  }
+
+  static void invalidateClassDescriptionCache(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_1(_lib._class_NSScriptClassDescription1,
+        _lib._sel_invalidateClassDescriptionCache1);
+  }
+
+  static NSScriptClassDescription new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSScriptClassDescription1, _lib._sel_new1);
+    return NSScriptClassDescription._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSScriptClassDescription alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSScriptClassDescription1, _lib._sel_alloc1);
+    return NSScriptClassDescription._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSScriptClassDescription1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSScriptClassDescription1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSScriptClassDescription1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSScriptClassDescription1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSScriptClassDescription1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSScriptClassDescription1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSScriptClassDescription1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSScriptClassDescription1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSScriptClassDescription1,
+        _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSScriptCommandDescription extends NSObject {
+  NSScriptCommandDescription._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSScriptCommandDescription] that points to the same underlying object as [other].
+  static NSScriptCommandDescription castFrom<T extends _ObjCWrapper>(T other) {
+    return NSScriptCommandDescription._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSScriptCommandDescription] that wraps the given raw object pointer.
+  static NSScriptCommandDescription castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSScriptCommandDescription._(other, lib,
+        retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSScriptCommandDescription].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSScriptCommandDescription1);
+  }
+
+  @override
+  NSObject init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSScriptCommandDescription initWithSuiteName_commandName_dictionary_(
+      NSString? suiteName,
+      NSString? commandName,
+      NSDictionary? commandDeclaration) {
+    final _ret = _lib._objc_msgSend_551(
+        _id,
+        _lib._sel_initWithSuiteName_commandName_dictionary_1,
+        suiteName?._id ?? ffi.nullptr,
+        commandName?._id ?? ffi.nullptr,
+        commandDeclaration?._id ?? ffi.nullptr);
+    return NSScriptCommandDescription._(_ret, _lib,
+        retain: true, release: true);
+  }
+
+  NSScriptCommandDescription initWithCoder_(NSCoder? inCoder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, inCoder?._id ?? ffi.nullptr);
+    return NSScriptCommandDescription._(_ret, _lib,
+        retain: true, release: true);
+  }
+
+  NSString? get suiteName {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_suiteName1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get commandName {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_commandName1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get appleEventClassCode {
+    return _lib._objc_msgSend_191(_id, _lib._sel_appleEventClassCode1);
+  }
+
+  int get appleEventCode {
+    return _lib._objc_msgSend_191(_id, _lib._sel_appleEventCode1);
+  }
+
+  NSString? get commandClassName {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_commandClassName1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get returnType {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_returnType1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get appleEventCodeForReturnType {
+    return _lib._objc_msgSend_191(_id, _lib._sel_appleEventCodeForReturnType1);
+  }
+
+  NSArray? get argumentNames {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_argumentNames1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString typeForArgumentWithName_(NSString? argumentName) {
+    final _ret = _lib._objc_msgSend_64(_id, _lib._sel_typeForArgumentWithName_1,
+        argumentName?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int appleEventCodeForArgumentWithName_(NSString? argumentName) {
+    return _lib._objc_msgSend_553(
+        _id,
+        _lib._sel_appleEventCodeForArgumentWithName_1,
+        argumentName?._id ?? ffi.nullptr);
+  }
+
+  bool isOptionalArgumentWithName_(NSString? argumentName) {
+    return _lib._objc_msgSend_59(_id, _lib._sel_isOptionalArgumentWithName_1,
+        argumentName?._id ?? ffi.nullptr);
+  }
+
+  NSScriptCommand createCommandInstance() {
+    final _ret = _lib._objc_msgSend_560(_id, _lib._sel_createCommandInstance1);
+    return NSScriptCommand._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSScriptCommand createCommandInstanceWithZone_(ffi.Pointer<NSZone> zone) {
+    final _ret = _lib._objc_msgSend_561(
+        _id, _lib._sel_createCommandInstanceWithZone_1, zone);
+    return NSScriptCommand._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSScriptCommandDescription new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSScriptCommandDescription1, _lib._sel_new1);
+    return NSScriptCommandDescription._(_ret, _lib,
+        retain: false, release: true);
+  }
+
+  static NSScriptCommandDescription alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSScriptCommandDescription1, _lib._sel_alloc1);
+    return NSScriptCommandDescription._(_ret, _lib,
+        retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSScriptCommandDescription1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSScriptCommandDescription1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSScriptCommandDescription1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSScriptCommandDescription1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSScriptCommandDescription1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSScriptCommandDescription1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSScriptCommandDescription1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSScriptCommandDescription1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSScriptCommandDescription1,
+        _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSScriptCommand extends NSObject {
+  NSScriptCommand._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSScriptCommand] that points to the same underlying object as [other].
+  static NSScriptCommand castFrom<T extends _ObjCWrapper>(T other) {
+    return NSScriptCommand._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSScriptCommand] that wraps the given raw object pointer.
+  static NSScriptCommand castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSScriptCommand._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSScriptCommand].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSScriptCommand1);
+  }
+
+  NSScriptCommand initWithCommandDescription_(
+      NSScriptCommandDescription? commandDef) {
+    final _ret = _lib._objc_msgSend_554(_id,
+        _lib._sel_initWithCommandDescription_1, commandDef?._id ?? ffi.nullptr);
+    return NSScriptCommand._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSScriptCommand initWithCoder_(NSCoder? inCoder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, inCoder?._id ?? ffi.nullptr);
+    return NSScriptCommand._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSScriptCommandDescription? get commandDescription {
+    final _ret = _lib._objc_msgSend_555(_id, _lib._sel_commandDescription1);
+    return _ret.address == 0
+        ? null
+        : NSScriptCommandDescription._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject get directParameter {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_directParameter1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  set directParameter(NSObject value) {
+    _lib._objc_msgSend_368(_id, _lib._sel_setDirectParameter_1, value._id);
+  }
+
+  NSScriptObjectSpecifier? get receiversSpecifier {
+    final _ret = _lib._objc_msgSend_556(_id, _lib._sel_receiversSpecifier1);
+    return _ret.address == 0
+        ? null
+        : NSScriptObjectSpecifier._(_ret, _lib, retain: true, release: true);
+  }
+
+  set receiversSpecifier(NSScriptObjectSpecifier? value) {
+    _lib._objc_msgSend_557(
+        _id, _lib._sel_setReceiversSpecifier_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSObject get evaluatedReceivers {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_evaluatedReceivers1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary? get arguments {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_arguments1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  set arguments(NSDictionary? value) {
+    _lib._objc_msgSend_165(
+        _id, _lib._sel_setArguments_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSDictionary? get evaluatedArguments {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_evaluatedArguments1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool get wellFormed {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isWellFormed1);
+  }
+
+  NSObject performDefaultImplementation() {
+    final _ret =
+        _lib._objc_msgSend_2(_id, _lib._sel_performDefaultImplementation1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject executeCommand() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_executeCommand1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get scriptErrorNumber {
+    return _lib._objc_msgSend_78(_id, _lib._sel_scriptErrorNumber1);
+  }
+
+  set scriptErrorNumber(int value) {
+    _lib._objc_msgSend_558(_id, _lib._sel_setScriptErrorNumber_1, value);
+  }
+
+  NSAppleEventDescriptor? get scriptErrorOffendingObjectDescriptor {
+    final _ret = _lib._objc_msgSend_526(
+        _id, _lib._sel_scriptErrorOffendingObjectDescriptor1);
+    return _ret.address == 0
+        ? null
+        : NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  set scriptErrorOffendingObjectDescriptor(NSAppleEventDescriptor? value) {
+    _lib._objc_msgSend_559(
+        _id,
+        _lib._sel_setScriptErrorOffendingObjectDescriptor_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  NSAppleEventDescriptor? get scriptErrorExpectedTypeDescriptor {
+    final _ret = _lib._objc_msgSend_526(
+        _id, _lib._sel_scriptErrorExpectedTypeDescriptor1);
+    return _ret.address == 0
+        ? null
+        : NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  set scriptErrorExpectedTypeDescriptor(NSAppleEventDescriptor? value) {
+    _lib._objc_msgSend_559(
+        _id,
+        _lib._sel_setScriptErrorExpectedTypeDescriptor_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get scriptErrorString {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_scriptErrorString1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set scriptErrorString(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setScriptErrorString_1, value?._id ?? ffi.nullptr);
+  }
+
+  static NSScriptCommand currentCommand(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_560(
+        _lib._class_NSScriptCommand1, _lib._sel_currentCommand1);
+    return NSScriptCommand._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSAppleEventDescriptor? get appleEvent {
+    final _ret = _lib._objc_msgSend_526(_id, _lib._sel_appleEvent1);
+    return _ret.address == 0
+        ? null
+        : NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true);
+  }
+
+  void suspendExecution() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_suspendExecution1);
+  }
+
+  void resumeExecutionWithResult_(NSObject result) {
+    return _lib._objc_msgSend_15(
+        _id, _lib._sel_resumeExecutionWithResult_1, result._id);
+  }
+
+  static NSScriptCommand new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSScriptCommand1, _lib._sel_new1);
+    return NSScriptCommand._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSScriptCommand alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSScriptCommand1, _lib._sel_alloc1);
+    return NSScriptCommand._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSScriptCommand1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSScriptCommand1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSScriptCommand1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSScriptCommand1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSScriptCommand1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSScriptCommand1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSScriptCommand1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSScriptCommand1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSScriptCommand1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSItemProvider extends NSObject {
+  NSItemProvider._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSItemProvider] that points to the same underlying object as [other].
+  static NSItemProvider castFrom<T extends _ObjCWrapper>(T other) {
+    return NSItemProvider._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSItemProvider] that wraps the given raw object pointer.
+  static NSItemProvider castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSItemProvider._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSItemProvider].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSItemProvider1);
+  }
+
+  @override
+  NSItemProvider init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSItemProvider._(_ret, _lib, retain: true, release: true);
+  }
+
+  void registerDataRepresentationForTypeIdentifier_visibility_loadHandler_(
+      NSString? typeIdentifier, int visibility, ObjCBlock18 loadHandler) {
+    return _lib._objc_msgSend_588(
+        _id,
+        _lib._sel_registerDataRepresentationForTypeIdentifier_visibility_loadHandler_1,
+        typeIdentifier?._id ?? ffi.nullptr,
+        visibility,
+        loadHandler._id);
+  }
+
+  void
+      registerFileRepresentationForTypeIdentifier_fileOptions_visibility_loadHandler_(
+          NSString? typeIdentifier,
+          int fileOptions,
+          int visibility,
+          ObjCBlock20 loadHandler) {
+    return _lib._objc_msgSend_589(
+        _id,
+        _lib._sel_registerFileRepresentationForTypeIdentifier_fileOptions_visibility_loadHandler_1,
+        typeIdentifier?._id ?? ffi.nullptr,
+        fileOptions,
+        visibility,
+        loadHandler._id);
+  }
+
+  NSArray? get registeredTypeIdentifiers {
+    final _ret =
+        _lib._objc_msgSend_80(_id, _lib._sel_registeredTypeIdentifiers1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray registeredTypeIdentifiersWithFileOptions_(int fileOptions) {
+    final _ret = _lib._objc_msgSend_590(
+        _id, _lib._sel_registeredTypeIdentifiersWithFileOptions_1, fileOptions);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool hasItemConformingToTypeIdentifier_(NSString? typeIdentifier) {
+    return _lib._objc_msgSend_59(
+        _id,
+        _lib._sel_hasItemConformingToTypeIdentifier_1,
+        typeIdentifier?._id ?? ffi.nullptr);
+  }
+
+  bool hasRepresentationConformingToTypeIdentifier_fileOptions_(
+      NSString? typeIdentifier, int fileOptions) {
+    return _lib._objc_msgSend_591(
+        _id,
+        _lib._sel_hasRepresentationConformingToTypeIdentifier_fileOptions_1,
+        typeIdentifier?._id ?? ffi.nullptr,
+        fileOptions);
+  }
+
+  NSProgress loadDataRepresentationForTypeIdentifier_completionHandler_(
+      NSString? typeIdentifier, ObjCBlock19 completionHandler) {
+    final _ret = _lib._objc_msgSend_592(
+        _id,
+        _lib._sel_loadDataRepresentationForTypeIdentifier_completionHandler_1,
+        typeIdentifier?._id ?? ffi.nullptr,
+        completionHandler._id);
+    return NSProgress._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSProgress loadFileRepresentationForTypeIdentifier_completionHandler_(
+      NSString? typeIdentifier, ObjCBlock22 completionHandler) {
+    final _ret = _lib._objc_msgSend_593(
+        _id,
+        _lib._sel_loadFileRepresentationForTypeIdentifier_completionHandler_1,
+        typeIdentifier?._id ?? ffi.nullptr,
+        completionHandler._id);
+    return NSProgress._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSProgress loadInPlaceFileRepresentationForTypeIdentifier_completionHandler_(
+      NSString? typeIdentifier, ObjCBlock21 completionHandler) {
+    final _ret = _lib._objc_msgSend_594(
+        _id,
+        _lib._sel_loadInPlaceFileRepresentationForTypeIdentifier_completionHandler_1,
+        typeIdentifier?._id ?? ffi.nullptr,
+        completionHandler._id);
+    return NSProgress._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get suggestedName {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_suggestedName1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set suggestedName(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setSuggestedName_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSItemProvider initWithObject_(NSObject? object) {
+    final _ret = _lib._objc_msgSend_16(
+        _id, _lib._sel_initWithObject_1, object?._id ?? ffi.nullptr);
+    return NSItemProvider._(_ret, _lib, retain: true, release: true);
+  }
+
+  void registerObject_visibility_(NSObject? object, int visibility) {
+    return _lib._objc_msgSend_595(_id, _lib._sel_registerObject_visibility_1,
+        object?._id ?? ffi.nullptr, visibility);
+  }
+
+  void registerObjectOfClass_visibility_loadHandler_(
+      NSObject? aClass, int visibility, ObjCBlock23 loadHandler) {
+    return _lib._objc_msgSend_596(
+        _id,
+        _lib._sel_registerObjectOfClass_visibility_loadHandler_1,
+        aClass?._id ?? ffi.nullptr,
+        visibility,
+        loadHandler._id);
+  }
+
+  bool canLoadObjectOfClass_(NSObject? aClass) {
+    return _lib._objc_msgSend_0(
+        _id, _lib._sel_canLoadObjectOfClass_1, aClass?._id ?? ffi.nullptr);
+  }
+
+  NSProgress loadObjectOfClass_completionHandler_(
+      NSObject? aClass, ObjCBlock24 completionHandler) {
+    final _ret = _lib._objc_msgSend_597(
+        _id,
+        _lib._sel_loadObjectOfClass_completionHandler_1,
+        aClass?._id ?? ffi.nullptr,
+        completionHandler._id);
+    return NSProgress._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSItemProvider initWithItem_typeIdentifier_(
+      NSObject? item, NSString? typeIdentifier) {
+    final _ret = _lib._objc_msgSend_272(
+        _id,
+        _lib._sel_initWithItem_typeIdentifier_1,
+        item?._id ?? ffi.nullptr,
+        typeIdentifier?._id ?? ffi.nullptr);
+    return NSItemProvider._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSItemProvider initWithContentsOfURL_(NSURL? fileURL) {
+    final _ret = _lib._objc_msgSend_226(
+        _id, _lib._sel_initWithContentsOfURL_1, fileURL?._id ?? ffi.nullptr);
+    return NSItemProvider._(_ret, _lib, retain: true, release: true);
+  }
+
+  void registerItemForTypeIdentifier_loadHandler_(
+      NSString? typeIdentifier, NSItemProviderLoadHandler loadHandler) {
+    return _lib._objc_msgSend_598(
+        _id,
+        _lib._sel_registerItemForTypeIdentifier_loadHandler_1,
+        typeIdentifier?._id ?? ffi.nullptr,
+        loadHandler);
+  }
+
+  void loadItemForTypeIdentifier_options_completionHandler_(
+      NSString? typeIdentifier,
+      NSDictionary? options,
+      NSItemProviderCompletionHandler completionHandler) {
+    return _lib._objc_msgSend_599(
+        _id,
+        _lib._sel_loadItemForTypeIdentifier_options_completionHandler_1,
+        typeIdentifier?._id ?? ffi.nullptr,
+        options?._id ?? ffi.nullptr,
+        completionHandler);
+  }
+
+  NSItemProviderLoadHandler get previewImageHandler {
+    return _lib._objc_msgSend_600(_id, _lib._sel_previewImageHandler1);
+  }
+
+  set previewImageHandler(NSItemProviderLoadHandler value) {
+    _lib._objc_msgSend_601(_id, _lib._sel_setPreviewImageHandler_1, value);
+  }
+
+  void loadPreviewImageWithOptions_completionHandler_(NSDictionary? options,
+      NSItemProviderCompletionHandler completionHandler) {
+    return _lib._objc_msgSend_602(
+        _id,
+        _lib._sel_loadPreviewImageWithOptions_completionHandler_1,
+        options?._id ?? ffi.nullptr,
+        completionHandler);
+  }
+
+  static NSItemProvider new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSItemProvider1, _lib._sel_new1);
+    return NSItemProvider._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSItemProvider alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSItemProvider1, _lib._sel_alloc1);
+    return NSItemProvider._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSItemProvider1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSItemProvider1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSItemProvider1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSItemProvider1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSItemProvider1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSItemProvider1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSItemProvider1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSItemProvider1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSItemProvider1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSItemProviderRepresentationVisibility {
+  static const int NSItemProviderRepresentationVisibilityAll = 0;
+  static const int NSItemProviderRepresentationVisibilityTeam = 1;
+  static const int NSItemProviderRepresentationVisibilityGroup = 2;
+  static const int NSItemProviderRepresentationVisibilityOwnProcess = 3;
+}
+
+ffi.Pointer<ObjCObject> _ObjCBlock18_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<_ObjCBlock> arg0) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Pointer<ObjCObject> Function(ffi.Pointer<_ObjCBlock> arg0)>>()
+      .asFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<_ObjCBlock> arg0)>()(arg0);
+}
+
+final _ObjCBlock18_closureRegistry = <int, Function>{};
+int _ObjCBlock18_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock18_registerClosure(Function fn) {
+  final id = ++_ObjCBlock18_closureRegistryIndex;
+  _ObjCBlock18_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+ffi.Pointer<ObjCObject> _ObjCBlock18_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<_ObjCBlock> arg0) {
+  return _ObjCBlock18_closureRegistry[block.ref.target.address]!(arg0);
+}
+
+class ObjCBlock18 extends _ObjCBlockBase {
+  ObjCBlock18._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock18.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Pointer<ObjCObject> Function(
+                      ffi.Pointer<_ObjCBlock> arg0)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Pointer<ObjCObject> Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<_ObjCBlock> arg0)>(
+                        _ObjCBlock18_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock18.fromFunction(SwiftLibrary lib,
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<_ObjCBlock> arg0) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Pointer<ObjCObject> Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<_ObjCBlock> arg0)>(
+                        _ObjCBlock18_closureTrampoline)
+                    .cast(),
+                _ObjCBlock18_registerClosure(fn)),
+            lib);
+  ffi.Pointer<ObjCObject> call(ffi.Pointer<_ObjCBlock> arg0) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Pointer<ObjCObject> Function(ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<_ObjCBlock> arg0)>>()
+        .asFunction<
+            ffi.Pointer<ObjCObject> Function(ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<_ObjCBlock> arg0)>()(_id, arg0);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class NSProgress extends NSObject {
+  NSProgress._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSProgress] that points to the same underlying object as [other].
+  static NSProgress castFrom<T extends _ObjCWrapper>(T other) {
+    return NSProgress._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSProgress] that wraps the given raw object pointer.
+  static NSProgress castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSProgress._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSProgress].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSProgress1);
+  }
+
+  static NSProgress currentProgress(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_577(
+        _lib._class_NSProgress1, _lib._sel_currentProgress1);
+    return NSProgress._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSProgress progressWithTotalUnitCount_(
+      SwiftLibrary _lib, int unitCount) {
+    final _ret = _lib._objc_msgSend_578(_lib._class_NSProgress1,
+        _lib._sel_progressWithTotalUnitCount_1, unitCount);
+    return NSProgress._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSProgress discreteProgressWithTotalUnitCount_(
+      SwiftLibrary _lib, int unitCount) {
+    final _ret = _lib._objc_msgSend_578(_lib._class_NSProgress1,
+        _lib._sel_discreteProgressWithTotalUnitCount_1, unitCount);
+    return NSProgress._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSProgress progressWithTotalUnitCount_parent_pendingUnitCount_(
+      SwiftLibrary _lib,
+      int unitCount,
+      NSProgress? parent,
+      int portionOfParentTotalUnitCount) {
+    final _ret = _lib._objc_msgSend_579(
+        _lib._class_NSProgress1,
+        _lib._sel_progressWithTotalUnitCount_parent_pendingUnitCount_1,
+        unitCount,
+        parent?._id ?? ffi.nullptr,
+        portionOfParentTotalUnitCount);
+    return NSProgress._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSProgress initWithParent_userInfo_(NSProgress? parentProgressOrNil) {
+    final _ret = _lib._objc_msgSend_580(
+        _id,
+        _lib._sel_initWithParent_userInfo_1,
+        parentProgressOrNil?._id ?? ffi.nullptr);
+    return NSProgress._(_ret, _lib, retain: true, release: true);
+  }
+
+  void becomeCurrentWithPendingUnitCount_(int unitCount) {
+    return _lib._objc_msgSend_581(
+        _id, _lib._sel_becomeCurrentWithPendingUnitCount_1, unitCount);
+  }
+
+  void performAsCurrentWithPendingUnitCount_usingBlock_(
+      int unitCount, ObjCBlock16 work) {
+    return _lib._objc_msgSend_582(
+        _id,
+        _lib._sel_performAsCurrentWithPendingUnitCount_usingBlock_1,
+        unitCount,
+        work._id);
+  }
+
+  void resignCurrent() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_resignCurrent1);
+  }
+
+  void addChild_withPendingUnitCount_(NSProgress? child, int inUnitCount) {
+    return _lib._objc_msgSend_583(
+        _id,
+        _lib._sel_addChild_withPendingUnitCount_1,
+        child?._id ?? ffi.nullptr,
+        inUnitCount);
+  }
+
+  int get totalUnitCount {
+    return _lib._objc_msgSend_584(_id, _lib._sel_totalUnitCount1);
+  }
+
+  set totalUnitCount(int value) {
+    _lib._objc_msgSend_585(_id, _lib._sel_setTotalUnitCount_1, value);
+  }
+
+  int get completedUnitCount {
+    return _lib._objc_msgSend_584(_id, _lib._sel_completedUnitCount1);
+  }
+
+  set completedUnitCount(int value) {
+    _lib._objc_msgSend_585(_id, _lib._sel_setCompletedUnitCount_1, value);
+  }
+
+  NSString? get localizedDescription {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_localizedDescription1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set localizedDescription(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setLocalizedDescription_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get localizedAdditionalDescription {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_localizedAdditionalDescription1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set localizedAdditionalDescription(NSString? value) {
+    _lib._objc_msgSend_477(_id, _lib._sel_setLocalizedAdditionalDescription_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  bool get cancellable {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isCancellable1);
+  }
+
+  set cancellable(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setCancellable_1, value);
+  }
+
+  bool get pausable {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isPausable1);
+  }
+
+  set pausable(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setPausable_1, value);
+  }
+
+  bool get cancelled {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isCancelled1);
+  }
+
+  bool get paused {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isPaused1);
+  }
+
+  ObjCBlock16 get cancellationHandler {
+    final _ret = _lib._objc_msgSend_586(_id, _lib._sel_cancellationHandler1);
+    return ObjCBlock16._(_ret, _lib);
+  }
+
+  set cancellationHandler(ObjCBlock16 value) {
+    _lib._objc_msgSend_587(_id, _lib._sel_setCancellationHandler_1, value._id);
+  }
+
+  ObjCBlock16 get pausingHandler {
+    final _ret = _lib._objc_msgSend_586(_id, _lib._sel_pausingHandler1);
+    return ObjCBlock16._(_ret, _lib);
+  }
+
+  set pausingHandler(ObjCBlock16 value) {
+    _lib._objc_msgSend_587(_id, _lib._sel_setPausingHandler_1, value._id);
+  }
+
+  ObjCBlock16 get resumingHandler {
+    final _ret = _lib._objc_msgSend_586(_id, _lib._sel_resumingHandler1);
+    return ObjCBlock16._(_ret, _lib);
+  }
+
+  set resumingHandler(ObjCBlock16 value) {
+    _lib._objc_msgSend_587(_id, _lib._sel_setResumingHandler_1, value._id);
+  }
+
+  void setUserInfoObject_forKey_(
+      NSObject objectOrNil, NSProgressUserInfoKey key) {
+    return _lib._objc_msgSend_122(
+        _id, _lib._sel_setUserInfoObject_forKey_1, objectOrNil._id, key);
+  }
+
+  bool get indeterminate {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isIndeterminate1);
+  }
+
+  double get fractionCompleted {
+    return _lib._objc_msgSend_149(_id, _lib._sel_fractionCompleted1);
+  }
+
+  bool get finished {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isFinished1);
+  }
+
+  void cancel() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_cancel1);
+  }
+
+  void pause() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_pause1);
+  }
+
+  void resume() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_resume1);
+  }
+
+  static NSProgress new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSProgress1, _lib._sel_new1);
+    return NSProgress._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSProgress alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSProgress1, _lib._sel_alloc1);
+    return NSProgress._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSProgress1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSProgress1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSProgress1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSProgress1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSProgress1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSProgress1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSProgress1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSProgress1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSProgress1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef NSProgressUserInfoKey = ffi.Pointer<ObjCObject>;
+void _ObjCBlock19_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(ffi.Pointer<ObjCObject> arg0,
+                  ffi.Pointer<ObjCObject> arg1)>>()
+      .asFunction<
+          void Function(ffi.Pointer<ObjCObject> arg0,
+              ffi.Pointer<ObjCObject> arg1)>()(arg0, arg1);
+}
+
+final _ObjCBlock19_closureRegistry = <int, Function>{};
+int _ObjCBlock19_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock19_registerClosure(Function fn) {
+  final id = ++_ObjCBlock19_closureRegistryIndex;
+  _ObjCBlock19_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock19_closureTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1) {
+  return _ObjCBlock19_closureRegistry[block.ref.target.address]!(arg0, arg1);
+}
+
+class ObjCBlock19 extends _ObjCBlockBase {
+  ObjCBlock19._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock19.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0,
+                      ffi.Pointer<ObjCObject> arg1)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1)>(
+                        _ObjCBlock19_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock19.fromFunction(
+      SwiftLibrary lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1)>(
+                        _ObjCBlock19_closureTrampoline)
+                    .cast(),
+                _ObjCBlock19_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    ffi.Pointer<ObjCObject> arg1)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                ffi.Pointer<ObjCObject> arg1)>()(_id, arg0, arg1);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+abstract class NSItemProviderFileOptions {
+  static const int NSItemProviderFileOptionOpenInPlace = 1;
+}
+
+ffi.Pointer<ObjCObject> _ObjCBlock20_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<_ObjCBlock> arg0) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Pointer<ObjCObject> Function(ffi.Pointer<_ObjCBlock> arg0)>>()
+      .asFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<_ObjCBlock> arg0)>()(arg0);
+}
+
+final _ObjCBlock20_closureRegistry = <int, Function>{};
+int _ObjCBlock20_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock20_registerClosure(Function fn) {
+  final id = ++_ObjCBlock20_closureRegistryIndex;
+  _ObjCBlock20_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+ffi.Pointer<ObjCObject> _ObjCBlock20_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<_ObjCBlock> arg0) {
+  return _ObjCBlock20_closureRegistry[block.ref.target.address]!(arg0);
+}
+
+class ObjCBlock20 extends _ObjCBlockBase {
+  ObjCBlock20._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock20.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Pointer<ObjCObject> Function(
+                      ffi.Pointer<_ObjCBlock> arg0)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Pointer<ObjCObject> Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<_ObjCBlock> arg0)>(
+                        _ObjCBlock20_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock20.fromFunction(SwiftLibrary lib,
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<_ObjCBlock> arg0) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Pointer<ObjCObject> Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<_ObjCBlock> arg0)>(
+                        _ObjCBlock20_closureTrampoline)
+                    .cast(),
+                _ObjCBlock20_registerClosure(fn)),
+            lib);
+  ffi.Pointer<ObjCObject> call(ffi.Pointer<_ObjCBlock> arg0) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Pointer<ObjCObject> Function(ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<_ObjCBlock> arg0)>>()
+        .asFunction<
+            ffi.Pointer<ObjCObject> Function(ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<_ObjCBlock> arg0)>()(_id, arg0);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+void _ObjCBlock21_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, bool arg1, ffi.Pointer<ObjCObject> arg2) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(ffi.Pointer<ObjCObject> arg0, ffi.Bool arg1,
+                  ffi.Pointer<ObjCObject> arg2)>>()
+      .asFunction<
+          void Function(ffi.Pointer<ObjCObject> arg0, bool arg1,
+              ffi.Pointer<ObjCObject> arg2)>()(arg0, arg1, arg2);
+}
+
+final _ObjCBlock21_closureRegistry = <int, Function>{};
+int _ObjCBlock21_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock21_registerClosure(Function fn) {
+  final id = ++_ObjCBlock21_closureRegistryIndex;
+  _ObjCBlock21_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock21_closureTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, bool arg1, ffi.Pointer<ObjCObject> arg2) {
+  return _ObjCBlock21_closureRegistry[block.ref.target.address]!(
+      arg0, arg1, arg2);
+}
+
+class ObjCBlock21 extends _ObjCBlockBase {
+  ObjCBlock21._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock21.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0, ffi.Bool arg1,
+                      ffi.Pointer<ObjCObject> arg2)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Bool arg1,
+                                ffi.Pointer<ObjCObject> arg2)>(
+                        _ObjCBlock21_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock21.fromFunction(
+      SwiftLibrary lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, bool arg1,
+              ffi.Pointer<ObjCObject> arg2)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Bool arg1,
+                                ffi.Pointer<ObjCObject> arg2)>(
+                        _ObjCBlock21_closureTrampoline)
+                    .cast(),
+                _ObjCBlock21_registerClosure(fn)),
+            lib);
+  void call(
+      ffi.Pointer<ObjCObject> arg0, bool arg1, ffi.Pointer<ObjCObject> arg2) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    ffi.Bool arg1,
+                    ffi.Pointer<ObjCObject> arg2)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                bool arg1,
+                ffi.Pointer<ObjCObject> arg2)>()(_id, arg0, arg1, arg2);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+void _ObjCBlock22_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(ffi.Pointer<ObjCObject> arg0,
+                  ffi.Pointer<ObjCObject> arg1)>>()
+      .asFunction<
+          void Function(ffi.Pointer<ObjCObject> arg0,
+              ffi.Pointer<ObjCObject> arg1)>()(arg0, arg1);
+}
+
+final _ObjCBlock22_closureRegistry = <int, Function>{};
+int _ObjCBlock22_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock22_registerClosure(Function fn) {
+  final id = ++_ObjCBlock22_closureRegistryIndex;
+  _ObjCBlock22_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock22_closureTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1) {
+  return _ObjCBlock22_closureRegistry[block.ref.target.address]!(arg0, arg1);
+}
+
+class ObjCBlock22 extends _ObjCBlockBase {
+  ObjCBlock22._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock22.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0,
+                      ffi.Pointer<ObjCObject> arg1)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1)>(
+                        _ObjCBlock22_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock22.fromFunction(
+      SwiftLibrary lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1)>(
+                        _ObjCBlock22_closureTrampoline)
+                    .cast(),
+                _ObjCBlock22_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    ffi.Pointer<ObjCObject> arg1)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                ffi.Pointer<ObjCObject> arg1)>()(_id, arg0, arg1);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+ffi.Pointer<ObjCObject> _ObjCBlock23_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<_ObjCBlock> arg0) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Pointer<ObjCObject> Function(ffi.Pointer<_ObjCBlock> arg0)>>()
+      .asFunction<
+          ffi.Pointer<ObjCObject> Function(
+              ffi.Pointer<_ObjCBlock> arg0)>()(arg0);
+}
+
+final _ObjCBlock23_closureRegistry = <int, Function>{};
+int _ObjCBlock23_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock23_registerClosure(Function fn) {
+  final id = ++_ObjCBlock23_closureRegistryIndex;
+  _ObjCBlock23_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+ffi.Pointer<ObjCObject> _ObjCBlock23_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<_ObjCBlock> arg0) {
+  return _ObjCBlock23_closureRegistry[block.ref.target.address]!(arg0);
+}
+
+class ObjCBlock23 extends _ObjCBlockBase {
+  ObjCBlock23._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock23.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Pointer<ObjCObject> Function(
+                      ffi.Pointer<_ObjCBlock> arg0)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Pointer<ObjCObject> Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<_ObjCBlock> arg0)>(
+                        _ObjCBlock23_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock23.fromFunction(SwiftLibrary lib,
+      ffi.Pointer<ObjCObject> Function(ffi.Pointer<_ObjCBlock> arg0) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Pointer<ObjCObject> Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<_ObjCBlock> arg0)>(
+                        _ObjCBlock23_closureTrampoline)
+                    .cast(),
+                _ObjCBlock23_registerClosure(fn)),
+            lib);
+  ffi.Pointer<ObjCObject> call(ffi.Pointer<_ObjCBlock> arg0) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Pointer<ObjCObject> Function(ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<_ObjCBlock> arg0)>>()
+        .asFunction<
+            ffi.Pointer<ObjCObject> Function(ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<_ObjCBlock> arg0)>()(_id, arg0);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+void _ObjCBlock24_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(ffi.Pointer<ObjCObject> arg0,
+                  ffi.Pointer<ObjCObject> arg1)>>()
+      .asFunction<
+          void Function(ffi.Pointer<ObjCObject> arg0,
+              ffi.Pointer<ObjCObject> arg1)>()(arg0, arg1);
+}
+
+final _ObjCBlock24_closureRegistry = <int, Function>{};
+int _ObjCBlock24_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock24_registerClosure(Function fn) {
+  final id = ++_ObjCBlock24_closureRegistryIndex;
+  _ObjCBlock24_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock24_closureTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1) {
+  return _ObjCBlock24_closureRegistry[block.ref.target.address]!(arg0, arg1);
+}
+
+class ObjCBlock24 extends _ObjCBlockBase {
+  ObjCBlock24._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock24.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0,
+                      ffi.Pointer<ObjCObject> arg1)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1)>(
+                        _ObjCBlock24_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock24.fromFunction(
+      SwiftLibrary lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1)>(
+                        _ObjCBlock24_closureTrampoline)
+                    .cast(),
+                _ObjCBlock24_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    ffi.Pointer<ObjCObject> arg1)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                ffi.Pointer<ObjCObject> arg1)>()(_id, arg0, arg1);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+typedef NSItemProviderLoadHandler = ffi.Pointer<_ObjCBlock>;
+void _ObjCBlock25_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block,
+    NSItemProviderCompletionHandler arg0,
+    ffi.Pointer<ObjCObject> arg1,
+    ffi.Pointer<ObjCObject> arg2) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(
+                  NSItemProviderCompletionHandler arg0,
+                  ffi.Pointer<ObjCObject> arg1,
+                  ffi.Pointer<ObjCObject> arg2)>>()
+      .asFunction<
+          void Function(
+              NSItemProviderCompletionHandler arg0,
+              ffi.Pointer<ObjCObject> arg1,
+              ffi.Pointer<ObjCObject> arg2)>()(arg0, arg1, arg2);
+}
+
+final _ObjCBlock25_closureRegistry = <int, Function>{};
+int _ObjCBlock25_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock25_registerClosure(Function fn) {
+  final id = ++_ObjCBlock25_closureRegistryIndex;
+  _ObjCBlock25_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock25_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block,
+    NSItemProviderCompletionHandler arg0,
+    ffi.Pointer<ObjCObject> arg1,
+    ffi.Pointer<ObjCObject> arg2) {
+  return _ObjCBlock25_closureRegistry[block.ref.target.address]!(
+      arg0, arg1, arg2);
+}
+
+class ObjCBlock25 extends _ObjCBlockBase {
+  ObjCBlock25._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock25.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(
+                      NSItemProviderCompletionHandler arg0,
+                      ffi.Pointer<ObjCObject> arg1,
+                      ffi.Pointer<ObjCObject> arg2)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                NSItemProviderCompletionHandler arg0,
+                                ffi.Pointer<ObjCObject> arg1,
+                                ffi.Pointer<ObjCObject> arg2)>(
+                        _ObjCBlock25_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock25.fromFunction(
+      SwiftLibrary lib,
+      void Function(NSItemProviderCompletionHandler arg0,
+              ffi.Pointer<ObjCObject> arg1, ffi.Pointer<ObjCObject> arg2)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                NSItemProviderCompletionHandler arg0,
+                                ffi.Pointer<ObjCObject> arg1,
+                                ffi.Pointer<ObjCObject> arg2)>(
+                        _ObjCBlock25_closureTrampoline)
+                    .cast(),
+                _ObjCBlock25_registerClosure(fn)),
+            lib);
+  void call(NSItemProviderCompletionHandler arg0, ffi.Pointer<ObjCObject> arg1,
+      ffi.Pointer<ObjCObject> arg2) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    NSItemProviderCompletionHandler arg0,
+                    ffi.Pointer<ObjCObject> arg1,
+                    ffi.Pointer<ObjCObject> arg2)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                NSItemProviderCompletionHandler arg0,
+                ffi.Pointer<ObjCObject> arg1,
+                ffi.Pointer<ObjCObject> arg2)>()(_id, arg0, arg1, arg2);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+typedef NSItemProviderCompletionHandler = ffi.Pointer<_ObjCBlock>;
+
+class NSMutableString extends NSString {
+  NSMutableString._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSMutableString] that points to the same underlying object as [other].
+  static NSMutableString castFrom<T extends _ObjCWrapper>(T other) {
+    return NSMutableString._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSMutableString] that wraps the given raw object pointer.
+  static NSMutableString castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSMutableString._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSMutableString].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSMutableString1);
+  }
+
+  void replaceCharactersInRange_withString_(NSRange range, NSString? aString) {
+    return _lib._objc_msgSend_603(
+        _id,
+        _lib._sel_replaceCharactersInRange_withString_1,
+        range,
+        aString?._id ?? ffi.nullptr);
+  }
+
+  void insertString_atIndex_(NSString? aString, int loc) {
+    return _lib._objc_msgSend_604(_id, _lib._sel_insertString_atIndex_1,
+        aString?._id ?? ffi.nullptr, loc);
+  }
+
+  void deleteCharactersInRange_(NSRange range) {
+    return _lib._objc_msgSend_416(
+        _id, _lib._sel_deleteCharactersInRange_1, range);
+  }
+
+  void appendString_(NSString? aString) {
+    return _lib._objc_msgSend_186(
+        _id, _lib._sel_appendString_1, aString?._id ?? ffi.nullptr);
+  }
+
+  void appendFormat_(NSString? format) {
+    return _lib._objc_msgSend_186(
+        _id, _lib._sel_appendFormat_1, format?._id ?? ffi.nullptr);
+  }
+
+  void setString_(NSString? aString) {
+    return _lib._objc_msgSend_186(
+        _id, _lib._sel_setString_1, aString?._id ?? ffi.nullptr);
+  }
+
+  int replaceOccurrencesOfString_withString_options_range_(NSString? target,
+      NSString? replacement, int options, NSRange searchRange) {
+    return _lib._objc_msgSend_605(
+        _id,
+        _lib._sel_replaceOccurrencesOfString_withString_options_range_1,
+        target?._id ?? ffi.nullptr,
+        replacement?._id ?? ffi.nullptr,
+        options,
+        searchRange);
+  }
+
+  bool applyTransform_reverse_range_updatedRange_(NSStringTransform transform,
+      bool reverse, NSRange range, NSRangePointer resultingRange) {
+    return _lib._objc_msgSend_606(
+        _id,
+        _lib._sel_applyTransform_reverse_range_updatedRange_1,
+        transform,
+        reverse,
+        range,
+        resultingRange);
+  }
+
+  NSMutableString initWithCapacity_(int capacity) {
+    final _ret =
+        _lib._objc_msgSend_607(_id, _lib._sel_initWithCapacity_1, capacity);
+    return NSMutableString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableString stringWithCapacity_(SwiftLibrary _lib, int capacity) {
+    final _ret = _lib._objc_msgSend_607(
+        _lib._class_NSMutableString1, _lib._sel_stringWithCapacity_1, capacity);
+    return NSMutableString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static ffi.Pointer<NSStringEncoding> getAvailableStringEncodings(
+      SwiftLibrary _lib) {
+    return _lib._objc_msgSend_318(
+        _lib._class_NSMutableString1, _lib._sel_availableStringEncodings1);
+  }
+
+  static NSString localizedNameOfStringEncoding_(
+      SwiftLibrary _lib, int encoding) {
+    final _ret = _lib._objc_msgSend_293(_lib._class_NSMutableString1,
+        _lib._sel_localizedNameOfStringEncoding_1, encoding);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static int getDefaultCStringEncoding(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_10(
+        _lib._class_NSMutableString1, _lib._sel_defaultCStringEncoding1);
+  }
+
+  static NSMutableString string(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMutableString1, _lib._sel_string1);
+    return NSMutableString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableString stringWithString_(
+      SwiftLibrary _lib, NSString? string) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSMutableString1,
+        _lib._sel_stringWithString_1, string?._id ?? ffi.nullptr);
+    return NSMutableString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableString stringWithCharacters_length_(
+      SwiftLibrary _lib, ffi.Pointer<unichar> characters, int length) {
+    final _ret = _lib._objc_msgSend_331(_lib._class_NSMutableString1,
+        _lib._sel_stringWithCharacters_length_1, characters, length);
+    return NSMutableString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableString stringWithUTF8String_(
+      SwiftLibrary _lib, ffi.Pointer<ffi.Char> nullTerminatedCString) {
+    final _ret = _lib._objc_msgSend_332(_lib._class_NSMutableString1,
+        _lib._sel_stringWithUTF8String_1, nullTerminatedCString);
+    return NSMutableString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableString stringWithFormat_(
+      SwiftLibrary _lib, NSString? format) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSMutableString1,
+        _lib._sel_stringWithFormat_1, format?._id ?? ffi.nullptr);
+    return NSMutableString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableString localizedStringWithFormat_(
+      SwiftLibrary _lib, NSString? format) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSMutableString1,
+        _lib._sel_localizedStringWithFormat_1, format?._id ?? ffi.nullptr);
+    return NSMutableString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableString stringWithCString_encoding_(
+      SwiftLibrary _lib, ffi.Pointer<ffi.Char> cString, int enc) {
+    final _ret = _lib._objc_msgSend_339(_lib._class_NSMutableString1,
+        _lib._sel_stringWithCString_encoding_1, cString, enc);
+    return NSMutableString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableString stringWithContentsOfURL_encoding_error_(
+      SwiftLibrary _lib,
+      NSURL? url,
+      int enc,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_340(
+        _lib._class_NSMutableString1,
+        _lib._sel_stringWithContentsOfURL_encoding_error_1,
+        url?._id ?? ffi.nullptr,
+        enc,
+        error);
+    return NSMutableString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableString stringWithContentsOfFile_encoding_error_(
+      SwiftLibrary _lib,
+      NSString? path,
+      int enc,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_341(
+        _lib._class_NSMutableString1,
+        _lib._sel_stringWithContentsOfFile_encoding_error_1,
+        path?._id ?? ffi.nullptr,
+        enc,
+        error);
+    return NSMutableString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableString stringWithContentsOfURL_usedEncoding_error_(
+      SwiftLibrary _lib,
+      NSURL? url,
+      ffi.Pointer<NSStringEncoding> enc,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_342(
+        _lib._class_NSMutableString1,
+        _lib._sel_stringWithContentsOfURL_usedEncoding_error_1,
+        url?._id ?? ffi.nullptr,
+        enc,
+        error);
+    return NSMutableString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableString stringWithContentsOfFile_usedEncoding_error_(
+      SwiftLibrary _lib,
+      NSString? path,
+      ffi.Pointer<NSStringEncoding> enc,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_343(
+        _lib._class_NSMutableString1,
+        _lib._sel_stringWithContentsOfFile_usedEncoding_error_1,
+        path?._id ?? ffi.nullptr,
+        enc,
+        error);
+    return NSMutableString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static int
+      stringEncodingForData_encodingOptions_convertedString_usedLossyConversion_(
+          SwiftLibrary _lib,
+          NSData? data,
+          NSDictionary? opts,
+          ffi.Pointer<ffi.Pointer<ObjCObject>> string,
+          ffi.Pointer<ffi.Bool> usedLossyConversion) {
+    return _lib._objc_msgSend_344(
+        _lib._class_NSMutableString1,
+        _lib._sel_stringEncodingForData_encodingOptions_convertedString_usedLossyConversion_1,
+        data?._id ?? ffi.nullptr,
+        opts?._id ?? ffi.nullptr,
+        string,
+        usedLossyConversion);
+  }
+
+  static NSObject stringWithContentsOfFile_(SwiftLibrary _lib, NSString? path) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSMutableString1,
+        _lib._sel_stringWithContentsOfFile_1, path?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject stringWithContentsOfURL_(SwiftLibrary _lib, NSURL? url) {
+    final _ret = _lib._objc_msgSend_226(_lib._class_NSMutableString1,
+        _lib._sel_stringWithContentsOfURL_1, url?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject stringWithCString_length_(
+      SwiftLibrary _lib, ffi.Pointer<ffi.Char> bytes, int length) {
+    final _ret = _lib._objc_msgSend_339(_lib._class_NSMutableString1,
+        _lib._sel_stringWithCString_length_1, bytes, length);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject stringWithCString_(
+      SwiftLibrary _lib, ffi.Pointer<ffi.Char> bytes) {
+    final _ret = _lib._objc_msgSend_332(
+        _lib._class_NSMutableString1, _lib._sel_stringWithCString_1, bytes);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString pathWithComponents_(SwiftLibrary _lib, NSArray? components) {
+    final _ret = _lib._objc_msgSend_350(_lib._class_NSMutableString1,
+        _lib._sel_pathWithComponents_1, components?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableString new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMutableString1, _lib._sel_new1);
+    return NSMutableString._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSMutableString alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMutableString1, _lib._sel_alloc1);
+    return NSMutableString._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSMutableString1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSMutableString1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSMutableString1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSMutableString1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSMutableString1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSMutableString1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSMutableString1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSMutableString1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSMutableString1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSNotification extends NSObject {
+  NSNotification._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSNotification] that points to the same underlying object as [other].
+  static NSNotification castFrom<T extends _ObjCWrapper>(T other) {
+    return NSNotification._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSNotification] that wraps the given raw object pointer.
+  static NSNotification castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSNotification._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSNotification].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSNotification1);
+  }
+
+  NSNotificationName get name {
+    return _lib._objc_msgSend_20(_id, _lib._sel_name1);
+  }
+
+  NSObject get object {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_object1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary? get userInfo {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_userInfo1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNotification initWithName_object_userInfo_(
+      NSNotificationName name, NSObject object, NSDictionary? userInfo) {
+    final _ret = _lib._objc_msgSend_608(
+        _id,
+        _lib._sel_initWithName_object_userInfo_1,
+        name,
+        object._id,
+        userInfo?._id ?? ffi.nullptr);
+    return NSNotification._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNotification initWithCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr);
+    return NSNotification._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNotification notificationWithName_object_(
+      SwiftLibrary _lib, NSNotificationName aName, NSObject anObject) {
+    final _ret = _lib._objc_msgSend_157(_lib._class_NSNotification1,
+        _lib._sel_notificationWithName_object_1, aName, anObject._id);
+    return NSNotification._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNotification notificationWithName_object_userInfo_(SwiftLibrary _lib,
+      NSNotificationName aName, NSObject anObject, NSDictionary? aUserInfo) {
+    final _ret = _lib._objc_msgSend_608(
+        _lib._class_NSNotification1,
+        _lib._sel_notificationWithName_object_userInfo_1,
+        aName,
+        anObject._id,
+        aUserInfo?._id ?? ffi.nullptr);
+    return NSNotification._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSNotification init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSNotification._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSNotification new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSNotification1, _lib._sel_new1);
+    return NSNotification._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSNotification alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSNotification1, _lib._sel_alloc1);
+    return NSNotification._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSNotification1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSNotification1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSNotification1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSNotification1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSNotification1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSNotification1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSNotification1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSNotification1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSNotification1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef NSNotificationName = ffi.Pointer<ObjCObject>;
+
+class NSBundle extends NSObject {
+  NSBundle._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSBundle] that points to the same underlying object as [other].
+  static NSBundle castFrom<T extends _ObjCWrapper>(T other) {
+    return NSBundle._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSBundle] that wraps the given raw object pointer.
+  static NSBundle castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSBundle._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSBundle].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSBundle1);
+  }
+
+  static NSBundle? getMainBundle(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_609(_lib._class_NSBundle1, _lib._sel_mainBundle1);
+    return _ret.address == 0
+        ? null
+        : NSBundle._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSBundle bundleWithPath_(SwiftLibrary _lib, NSString? path) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSBundle1,
+        _lib._sel_bundleWithPath_1, path?._id ?? ffi.nullptr);
+    return NSBundle._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSBundle initWithPath_(NSString? path) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initWithPath_1, path?._id ?? ffi.nullptr);
+    return NSBundle._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSBundle bundleWithURL_(SwiftLibrary _lib, NSURL? url) {
+    final _ret = _lib._objc_msgSend_226(_lib._class_NSBundle1,
+        _lib._sel_bundleWithURL_1, url?._id ?? ffi.nullptr);
+    return NSBundle._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSBundle initWithURL_(NSURL? url) {
+    final _ret = _lib._objc_msgSend_226(
+        _id, _lib._sel_initWithURL_1, url?._id ?? ffi.nullptr);
+    return NSBundle._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSBundle bundleForClass_(SwiftLibrary _lib, NSObject aClass) {
+    final _ret = _lib._objc_msgSend_610(
+        _lib._class_NSBundle1, _lib._sel_bundleForClass_1, aClass._id);
+    return NSBundle._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSBundle bundleWithIdentifier_(
+      SwiftLibrary _lib, NSString? identifier) {
+    final _ret = _lib._objc_msgSend_611(_lib._class_NSBundle1,
+        _lib._sel_bundleWithIdentifier_1, identifier?._id ?? ffi.nullptr);
+    return NSBundle._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray? getAllBundles(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_80(_lib._class_NSBundle1, _lib._sel_allBundles1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray? getAllFrameworks(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_80(_lib._class_NSBundle1, _lib._sel_allFrameworks1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool load() {
+    return _lib._objc_msgSend_12(_id, _lib._sel_load1);
+  }
+
+  bool get loaded {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isLoaded1);
+  }
+
+  bool unload() {
+    return _lib._objc_msgSend_12(_id, _lib._sel_unload1);
+  }
+
+  bool preflightAndReturnError_(ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_219(
+        _id, _lib._sel_preflightAndReturnError_1, error);
+  }
+
+  bool loadAndReturnError_(ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_219(_id, _lib._sel_loadAndReturnError_1, error);
+  }
+
+  NSURL? get bundleURL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_bundleURL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get resourceURL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_resourceURL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get executableURL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_executableURL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL URLForAuxiliaryExecutable_(NSString? executableName) {
+    final _ret = _lib._objc_msgSend_34(
+        _id,
+        _lib._sel_URLForAuxiliaryExecutable_1,
+        executableName?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get privateFrameworksURL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_privateFrameworksURL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get sharedFrameworksURL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_sharedFrameworksURL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get sharedSupportURL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_sharedSupportURL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get builtInPlugInsURL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_builtInPlugInsURL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get appStoreReceiptURL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_appStoreReceiptURL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get bundlePath {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_bundlePath1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get resourcePath {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_resourcePath1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get executablePath {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_executablePath1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString pathForAuxiliaryExecutable_(NSString? executableName) {
+    final _ret = _lib._objc_msgSend_64(
+        _id,
+        _lib._sel_pathForAuxiliaryExecutable_1,
+        executableName?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get privateFrameworksPath {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_privateFrameworksPath1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get sharedFrameworksPath {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_sharedFrameworksPath1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get sharedSupportPath {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_sharedSupportPath1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get builtInPlugInsPath {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_builtInPlugInsPath1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURL URLForResource_withExtension_subdirectory_inBundleWithURL_(
+      SwiftLibrary _lib,
+      NSString? name,
+      NSString? ext,
+      NSString? subpath,
+      NSURL? bundleURL) {
+    final _ret = _lib._objc_msgSend_612(
+        _lib._class_NSBundle1,
+        _lib._sel_URLForResource_withExtension_subdirectory_inBundleWithURL_1,
+        name?._id ?? ffi.nullptr,
+        ext?._id ?? ffi.nullptr,
+        subpath?._id ?? ffi.nullptr,
+        bundleURL?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray URLsForResourcesWithExtension_subdirectory_inBundleWithURL_(
+      SwiftLibrary _lib, NSString? ext, NSString? subpath, NSURL? bundleURL) {
+    final _ret = _lib._objc_msgSend_613(
+        _lib._class_NSBundle1,
+        _lib._sel_URLsForResourcesWithExtension_subdirectory_inBundleWithURL_1,
+        ext?._id ?? ffi.nullptr,
+        subpath?._id ?? ffi.nullptr,
+        bundleURL?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL URLForResource_withExtension_(NSString? name, NSString? ext) {
+    final _ret = _lib._objc_msgSend_614(
+        _id,
+        _lib._sel_URLForResource_withExtension_1,
+        name?._id ?? ffi.nullptr,
+        ext?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL URLForResource_withExtension_subdirectory_(
+      NSString? name, NSString? ext, NSString? subpath) {
+    final _ret = _lib._objc_msgSend_615(
+        _id,
+        _lib._sel_URLForResource_withExtension_subdirectory_1,
+        name?._id ?? ffi.nullptr,
+        ext?._id ?? ffi.nullptr,
+        subpath?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL URLForResource_withExtension_subdirectory_localization_(NSString? name,
+      NSString? ext, NSString? subpath, NSString? localizationName) {
+    final _ret = _lib._objc_msgSend_616(
+        _id,
+        _lib._sel_URLForResource_withExtension_subdirectory_localization_1,
+        name?._id ?? ffi.nullptr,
+        ext?._id ?? ffi.nullptr,
+        subpath?._id ?? ffi.nullptr,
+        localizationName?._id ?? ffi.nullptr);
+    return NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray URLsForResourcesWithExtension_subdirectory_(
+      NSString? ext, NSString? subpath) {
+    final _ret = _lib._objc_msgSend_617(
+        _id,
+        _lib._sel_URLsForResourcesWithExtension_subdirectory_1,
+        ext?._id ?? ffi.nullptr,
+        subpath?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray URLsForResourcesWithExtension_subdirectory_localization_(
+      NSString? ext, NSString? subpath, NSString? localizationName) {
+    final _ret = _lib._objc_msgSend_618(
+        _id,
+        _lib._sel_URLsForResourcesWithExtension_subdirectory_localization_1,
+        ext?._id ?? ffi.nullptr,
+        subpath?._id ?? ffi.nullptr,
+        localizationName?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString pathForResource_ofType_inDirectory_(
+      SwiftLibrary _lib, NSString? name, NSString? ext, NSString? bundlePath) {
+    final _ret = _lib._objc_msgSend_619(
+        _lib._class_NSBundle1,
+        _lib._sel_pathForResource_ofType_inDirectory_1,
+        name?._id ?? ffi.nullptr,
+        ext?._id ?? ffi.nullptr,
+        bundlePath?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray pathsForResourcesOfType_inDirectory_(
+      SwiftLibrary _lib, NSString? ext, NSString? bundlePath) {
+    final _ret = _lib._objc_msgSend_617(
+        _lib._class_NSBundle1,
+        _lib._sel_pathsForResourcesOfType_inDirectory_1,
+        ext?._id ?? ffi.nullptr,
+        bundlePath?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString pathForResource_ofType_(NSString? name, NSString? ext) {
+    final _ret = _lib._objc_msgSend_324(_id, _lib._sel_pathForResource_ofType_1,
+        name?._id ?? ffi.nullptr, ext?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString pathForResource_ofType_inDirectory_forLocalization_(NSString? name,
+      NSString? ext, NSString? subpath, NSString? localizationName) {
+    final _ret = _lib._objc_msgSend_620(
+        _id,
+        _lib._sel_pathForResource_ofType_inDirectory_forLocalization_1,
+        name?._id ?? ffi.nullptr,
+        ext?._id ?? ffi.nullptr,
+        subpath?._id ?? ffi.nullptr,
+        localizationName?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray pathsForResourcesOfType_inDirectory_forLocalization_(
+      NSString? ext, NSString? subpath, NSString? localizationName) {
+    final _ret = _lib._objc_msgSend_618(
+        _id,
+        _lib._sel_pathsForResourcesOfType_inDirectory_forLocalization_1,
+        ext?._id ?? ffi.nullptr,
+        subpath?._id ?? ffi.nullptr,
+        localizationName?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString localizedStringForKey_value_table_(
+      NSString? key, NSString? value, NSString? tableName) {
+    final _ret = _lib._objc_msgSend_619(
+        _id,
+        _lib._sel_localizedStringForKey_value_table_1,
+        key?._id ?? ffi.nullptr,
+        value?._id ?? ffi.nullptr,
+        tableName?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSAttributedString localizedAttributedStringForKey_value_table_(
+      NSString? key, NSString? value, NSString? tableName) {
+    final _ret = _lib._objc_msgSend_641(
+        _id,
+        _lib._sel_localizedAttributedStringForKey_value_table_1,
+        key?._id ?? ffi.nullptr,
+        value?._id ?? ffi.nullptr,
+        tableName?._id ?? ffi.nullptr);
+    return NSAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get bundleIdentifier {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_bundleIdentifier1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary? get infoDictionary {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_infoDictionary1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary? get localizedInfoDictionary {
+    final _ret =
+        _lib._objc_msgSend_164(_id, _lib._sel_localizedInfoDictionary1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject objectForInfoDictionaryKey_(NSString? key) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_objectForInfoDictionaryKey_1, key?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject classNamed_(NSString? className) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_classNamed_1, className?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject get principalClass {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_principalClass1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get preferredLocalizations {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_preferredLocalizations1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get localizations {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_localizations1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get developmentLocalization {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_developmentLocalization1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray preferredLocalizationsFromArray_(
+      SwiftLibrary _lib, NSArray? localizationsArray) {
+    final _ret = _lib._objc_msgSend_63(
+        _lib._class_NSBundle1,
+        _lib._sel_preferredLocalizationsFromArray_1,
+        localizationsArray?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray preferredLocalizationsFromArray_forPreferences_(
+      SwiftLibrary _lib,
+      NSArray? localizationsArray,
+      NSArray? preferencesArray) {
+    final _ret = _lib._objc_msgSend_642(
+        _lib._class_NSBundle1,
+        _lib._sel_preferredLocalizationsFromArray_forPreferences_1,
+        localizationsArray?._id ?? ffi.nullptr,
+        preferencesArray?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get executableArchitectures {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_executableArchitectures1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  void setPreservationPriority_forTags_(double priority, NSSet? tags) {
+    return _lib._objc_msgSend_643(
+        _id,
+        _lib._sel_setPreservationPriority_forTags_1,
+        priority,
+        tags?._id ?? ffi.nullptr);
+  }
+
+  double preservationPriorityForTag_(NSString? tag) {
+    return _lib._objc_msgSend_269(
+        _id, _lib._sel_preservationPriorityForTag_1, tag?._id ?? ffi.nullptr);
+  }
+
+  static NSBundle new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSBundle1, _lib._sel_new1);
+    return NSBundle._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSBundle alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSBundle1, _lib._sel_alloc1);
+    return NSBundle._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSBundle1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSBundle1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSBundle1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSBundle1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSBundle1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSBundle1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSBundle1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSBundle1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSBundle1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSAttributedString extends NSObject {
+  NSAttributedString._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSAttributedString] that points to the same underlying object as [other].
+  static NSAttributedString castFrom<T extends _ObjCWrapper>(T other) {
+    return NSAttributedString._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSAttributedString] that wraps the given raw object pointer.
+  static NSAttributedString castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSAttributedString._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSAttributedString].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSAttributedString1);
+  }
+
+  NSString? get string {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_string1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary attributesAtIndex_effectiveRange_(
+      int location, NSRangePointer range) {
+    final _ret = _lib._objc_msgSend_621(
+        _id, _lib._sel_attributesAtIndex_effectiveRange_1, location, range);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get length {
+    return _lib._objc_msgSend_10(_id, _lib._sel_length1);
+  }
+
+  NSObject attribute_atIndex_effectiveRange_(
+      NSAttributedStringKey attrName, int location, NSRangePointer range) {
+    final _ret = _lib._objc_msgSend_622(
+        _id,
+        _lib._sel_attribute_atIndex_effectiveRange_1,
+        attrName,
+        location,
+        range);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSAttributedString attributedSubstringFromRange_(NSRange range) {
+    final _ret = _lib._objc_msgSend_623(
+        _id, _lib._sel_attributedSubstringFromRange_1, range);
+    return NSAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary attributesAtIndex_longestEffectiveRange_inRange_(
+      int location, NSRangePointer range, NSRange rangeLimit) {
+    final _ret = _lib._objc_msgSend_624(
+        _id,
+        _lib._sel_attributesAtIndex_longestEffectiveRange_inRange_1,
+        location,
+        range,
+        rangeLimit);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject attribute_atIndex_longestEffectiveRange_inRange_(
+      NSAttributedStringKey attrName,
+      int location,
+      NSRangePointer range,
+      NSRange rangeLimit) {
+    final _ret = _lib._objc_msgSend_625(
+        _id,
+        _lib._sel_attribute_atIndex_longestEffectiveRange_inRange_1,
+        attrName,
+        location,
+        range,
+        rangeLimit);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool isEqualToAttributedString_(NSAttributedString? other) {
+    return _lib._objc_msgSend_626(
+        _id, _lib._sel_isEqualToAttributedString_1, other?._id ?? ffi.nullptr);
+  }
+
+  NSAttributedString initWithString_(NSString? str) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initWithString_1, str?._id ?? ffi.nullptr);
+    return NSAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSAttributedString initWithString_attributes_(
+      NSString? str, NSDictionary? attrs) {
+    final _ret = _lib._objc_msgSend_352(
+        _id,
+        _lib._sel_initWithString_attributes_1,
+        str?._id ?? ffi.nullptr,
+        attrs?._id ?? ffi.nullptr);
+    return NSAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSAttributedString initWithAttributedString_(NSAttributedString? attrStr) {
+    final _ret = _lib._objc_msgSend_627(
+        _id, _lib._sel_initWithAttributedString_1, attrStr?._id ?? ffi.nullptr);
+    return NSAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  void enumerateAttributesInRange_options_usingBlock_(
+      NSRange enumerationRange, int opts, ObjCBlock26 block) {
+    return _lib._objc_msgSend_628(
+        _id,
+        _lib._sel_enumerateAttributesInRange_options_usingBlock_1,
+        enumerationRange,
+        opts,
+        block._id);
+  }
+
+  void enumerateAttribute_inRange_options_usingBlock_(
+      NSAttributedStringKey attrName,
+      NSRange enumerationRange,
+      int opts,
+      ObjCBlock27 block) {
+    return _lib._objc_msgSend_629(
+        _id,
+        _lib._sel_enumerateAttribute_inRange_options_usingBlock_1,
+        attrName,
+        enumerationRange,
+        opts,
+        block._id);
+  }
+
+  NSAttributedString initWithContentsOfMarkdownFileAtURL_options_baseURL_error_(
+      NSURL? markdownFile,
+      NSAttributedStringMarkdownParsingOptions? options,
+      NSURL? baseURL,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_634(
+        _id,
+        _lib._sel_initWithContentsOfMarkdownFileAtURL_options_baseURL_error_1,
+        markdownFile?._id ?? ffi.nullptr,
+        options?._id ?? ffi.nullptr,
+        baseURL?._id ?? ffi.nullptr,
+        error);
+    return NSAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSAttributedString initWithMarkdown_options_baseURL_error_(
+      NSData? markdown,
+      NSAttributedStringMarkdownParsingOptions? options,
+      NSURL? baseURL,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_635(
+        _id,
+        _lib._sel_initWithMarkdown_options_baseURL_error_1,
+        markdown?._id ?? ffi.nullptr,
+        options?._id ?? ffi.nullptr,
+        baseURL?._id ?? ffi.nullptr,
+        error);
+    return NSAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSAttributedString initWithMarkdownString_options_baseURL_error_(
+      NSString? markdownString,
+      NSAttributedStringMarkdownParsingOptions? options,
+      NSURL? baseURL,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_636(
+        _id,
+        _lib._sel_initWithMarkdownString_options_baseURL_error_1,
+        markdownString?._id ?? ffi.nullptr,
+        options?._id ?? ffi.nullptr,
+        baseURL?._id ?? ffi.nullptr,
+        error);
+    return NSAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSAttributedString initWithFormat_options_locale_(
+      NSAttributedString? format, int options, NSLocale? locale) {
+    final _ret = _lib._objc_msgSend_637(
+        _id,
+        _lib._sel_initWithFormat_options_locale_1,
+        format?._id ?? ffi.nullptr,
+        options,
+        locale?._id ?? ffi.nullptr);
+    return NSAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSAttributedString initWithFormat_options_locale_arguments_(
+      NSAttributedString? format,
+      int options,
+      NSLocale? locale,
+      ffi.Pointer<__va_list_tag> arguments) {
+    final _ret = _lib._objc_msgSend_638(
+        _id,
+        _lib._sel_initWithFormat_options_locale_arguments_1,
+        format?._id ?? ffi.nullptr,
+        options,
+        locale?._id ?? ffi.nullptr,
+        arguments);
+    return NSAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAttributedString localizedAttributedStringWithFormat_(
+      SwiftLibrary _lib, NSAttributedString? format) {
+    final _ret = _lib._objc_msgSend_627(
+        _lib._class_NSAttributedString1,
+        _lib._sel_localizedAttributedStringWithFormat_1,
+        format?._id ?? ffi.nullptr);
+    return NSAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAttributedString localizedAttributedStringWithFormat_options_(
+      SwiftLibrary _lib, NSAttributedString? format, int options) {
+    final _ret = _lib._objc_msgSend_639(
+        _lib._class_NSAttributedString1,
+        _lib._sel_localizedAttributedStringWithFormat_options_1,
+        format?._id ?? ffi.nullptr,
+        options);
+    return NSAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSAttributedString attributedStringByInflectingString() {
+    final _ret = _lib._objc_msgSend_640(
+        _id, _lib._sel_attributedStringByInflectingString1);
+    return NSAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSAttributedString new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSAttributedString1, _lib._sel_new1);
+    return NSAttributedString._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSAttributedString alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSAttributedString1, _lib._sel_alloc1);
+    return NSAttributedString._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSAttributedString1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSAttributedString1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSAttributedString1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSAttributedString1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSAttributedString1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSAttributedString1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSAttributedString1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSAttributedString1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSAttributedString1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef NSAttributedStringKey = ffi.Pointer<ObjCObject>;
+
+abstract class NSAttributedStringEnumerationOptions {
+  static const int NSAttributedStringEnumerationReverse = 2;
+  static const int
+      NSAttributedStringEnumerationLongestEffectiveRangeNotRequired = 1048576;
+}
+
+void _ObjCBlock26_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, NSRange arg1, ffi.Pointer<ffi.Bool> arg2) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(ffi.Pointer<ObjCObject> arg0, NSRange arg1,
+                  ffi.Pointer<ffi.Bool> arg2)>>()
+      .asFunction<
+          void Function(ffi.Pointer<ObjCObject> arg0, NSRange arg1,
+              ffi.Pointer<ffi.Bool> arg2)>()(arg0, arg1, arg2);
+}
+
+final _ObjCBlock26_closureRegistry = <int, Function>{};
+int _ObjCBlock26_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock26_registerClosure(Function fn) {
+  final id = ++_ObjCBlock26_closureRegistryIndex;
+  _ObjCBlock26_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock26_closureTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, NSRange arg1, ffi.Pointer<ffi.Bool> arg2) {
+  return _ObjCBlock26_closureRegistry[block.ref.target.address]!(
+      arg0, arg1, arg2);
+}
+
+class ObjCBlock26 extends _ObjCBlockBase {
+  ObjCBlock26._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock26.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0, NSRange arg1,
+                      ffi.Pointer<ffi.Bool> arg2)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                NSRange arg1,
+                                ffi.Pointer<ffi.Bool> arg2)>(
+                        _ObjCBlock26_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock26.fromFunction(
+      SwiftLibrary lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, NSRange arg1,
+              ffi.Pointer<ffi.Bool> arg2)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                NSRange arg1,
+                                ffi.Pointer<ffi.Bool> arg2)>(
+                        _ObjCBlock26_closureTrampoline)
+                    .cast(),
+                _ObjCBlock26_registerClosure(fn)),
+            lib);
+  void call(
+      ffi.Pointer<ObjCObject> arg0, NSRange arg1, ffi.Pointer<ffi.Bool> arg2) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    NSRange arg1,
+                    ffi.Pointer<ffi.Bool> arg2)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                NSRange arg1,
+                ffi.Pointer<ffi.Bool> arg2)>()(_id, arg0, arg1, arg2);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+void _ObjCBlock27_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, NSRange arg1, ffi.Pointer<ffi.Bool> arg2) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(ffi.Pointer<ObjCObject> arg0, NSRange arg1,
+                  ffi.Pointer<ffi.Bool> arg2)>>()
+      .asFunction<
+          void Function(ffi.Pointer<ObjCObject> arg0, NSRange arg1,
+              ffi.Pointer<ffi.Bool> arg2)>()(arg0, arg1, arg2);
+}
+
+final _ObjCBlock27_closureRegistry = <int, Function>{};
+int _ObjCBlock27_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock27_registerClosure(Function fn) {
+  final id = ++_ObjCBlock27_closureRegistryIndex;
+  _ObjCBlock27_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock27_closureTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, NSRange arg1, ffi.Pointer<ffi.Bool> arg2) {
+  return _ObjCBlock27_closureRegistry[block.ref.target.address]!(
+      arg0, arg1, arg2);
+}
+
+class ObjCBlock27 extends _ObjCBlockBase {
+  ObjCBlock27._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock27.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0, NSRange arg1,
+                      ffi.Pointer<ffi.Bool> arg2)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                NSRange arg1,
+                                ffi.Pointer<ffi.Bool> arg2)>(
+                        _ObjCBlock27_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock27.fromFunction(
+      SwiftLibrary lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, NSRange arg1,
+              ffi.Pointer<ffi.Bool> arg2)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                NSRange arg1,
+                                ffi.Pointer<ffi.Bool> arg2)>(
+                        _ObjCBlock27_closureTrampoline)
+                    .cast(),
+                _ObjCBlock27_registerClosure(fn)),
+            lib);
+  void call(
+      ffi.Pointer<ObjCObject> arg0, NSRange arg1, ffi.Pointer<ffi.Bool> arg2) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    NSRange arg1,
+                    ffi.Pointer<ffi.Bool> arg2)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                NSRange arg1,
+                ffi.Pointer<ffi.Bool> arg2)>()(_id, arg0, arg1, arg2);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class NSAttributedStringMarkdownParsingOptions extends NSObject {
+  NSAttributedStringMarkdownParsingOptions._(
+      ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSAttributedStringMarkdownParsingOptions] that points to the same underlying object as [other].
+  static NSAttributedStringMarkdownParsingOptions
+      castFrom<T extends _ObjCWrapper>(T other) {
+    return NSAttributedStringMarkdownParsingOptions._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSAttributedStringMarkdownParsingOptions] that wraps the given raw object pointer.
+  static NSAttributedStringMarkdownParsingOptions castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSAttributedStringMarkdownParsingOptions._(other, lib,
+        retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSAttributedStringMarkdownParsingOptions].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSAttributedStringMarkdownParsingOptions1);
+  }
+
+  @override
+  NSAttributedStringMarkdownParsingOptions init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSAttributedStringMarkdownParsingOptions._(_ret, _lib,
+        retain: true, release: true);
+  }
+
+  bool get allowsExtendedAttributes {
+    return _lib._objc_msgSend_12(_id, _lib._sel_allowsExtendedAttributes1);
+  }
+
+  set allowsExtendedAttributes(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setAllowsExtendedAttributes_1, value);
+  }
+
+  int get interpretedSyntax {
+    return _lib._objc_msgSend_630(_id, _lib._sel_interpretedSyntax1);
+  }
+
+  set interpretedSyntax(int value) {
+    _lib._objc_msgSend_631(_id, _lib._sel_setInterpretedSyntax_1, value);
+  }
+
+  int get failurePolicy {
+    return _lib._objc_msgSend_632(_id, _lib._sel_failurePolicy1);
+  }
+
+  set failurePolicy(int value) {
+    _lib._objc_msgSend_633(_id, _lib._sel_setFailurePolicy_1, value);
+  }
+
+  NSString? get languageCode {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_languageCode1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set languageCode(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setLanguageCode_1, value?._id ?? ffi.nullptr);
+  }
+
+  static NSAttributedStringMarkdownParsingOptions new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSAttributedStringMarkdownParsingOptions1, _lib._sel_new1);
+    return NSAttributedStringMarkdownParsingOptions._(_ret, _lib,
+        retain: false, release: true);
+  }
+
+  static NSAttributedStringMarkdownParsingOptions alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSAttributedStringMarkdownParsingOptions1,
+        _lib._sel_alloc1);
+    return NSAttributedStringMarkdownParsingOptions._(_ret, _lib,
+        retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSAttributedStringMarkdownParsingOptions1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(
+        _lib._class_NSAttributedStringMarkdownParsingOptions1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1,
+        aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSAttributedStringMarkdownParsingOptions1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSAttributedStringMarkdownParsingOptions1,
+        _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSAttributedStringMarkdownParsingOptions1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSAttributedStringMarkdownParsingOptions1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSAttributedStringMarkdownParsingOptions1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSAttributedStringMarkdownParsingOptions1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSAttributedStringMarkdownParsingOptions1,
+        _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSAttributedStringMarkdownInterpretedSyntax {
+  static const int NSAttributedStringMarkdownInterpretedSyntaxFull = 0;
+  static const int NSAttributedStringMarkdownInterpretedSyntaxInlineOnly = 1;
+  static const int
+      NSAttributedStringMarkdownInterpretedSyntaxInlineOnlyPreservingWhitespace =
+      2;
+}
+
+abstract class NSAttributedStringMarkdownParsingFailurePolicy {
+  static const int NSAttributedStringMarkdownParsingFailureReturnError = 0;
+  static const int
+      NSAttributedStringMarkdownParsingFailureReturnPartiallyParsedIfPossible =
+      1;
+}
+
+abstract class NSAttributedStringFormattingOptions {
+  static const int
+      NSAttributedStringFormattingInsertArgumentAttributesWithoutMerging = 1;
+  static const int NSAttributedStringFormattingApplyReplacementIndexAttribute =
+      2;
+}
+
+class NSMutableAttributedString extends NSAttributedString {
+  NSMutableAttributedString._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSMutableAttributedString] that points to the same underlying object as [other].
+  static NSMutableAttributedString castFrom<T extends _ObjCWrapper>(T other) {
+    return NSMutableAttributedString._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSMutableAttributedString] that wraps the given raw object pointer.
+  static NSMutableAttributedString castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSMutableAttributedString._(other, lib,
+        retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSMutableAttributedString].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSMutableAttributedString1);
+  }
+
+  void replaceCharactersInRange_withString_(NSRange range, NSString? str) {
+    return _lib._objc_msgSend_603(
+        _id,
+        _lib._sel_replaceCharactersInRange_withString_1,
+        range,
+        str?._id ?? ffi.nullptr);
+  }
+
+  void setAttributes_range_(NSDictionary? attrs, NSRange range) {
+    return _lib._objc_msgSend_644(
+        _id, _lib._sel_setAttributes_range_1, attrs?._id ?? ffi.nullptr, range);
+  }
+
+  NSMutableString? get mutableString {
+    final _ret = _lib._objc_msgSend_645(_id, _lib._sel_mutableString1);
+    return _ret.address == 0
+        ? null
+        : NSMutableString._(_ret, _lib, retain: true, release: true);
+  }
+
+  void addAttribute_value_range_(
+      NSAttributedStringKey name, NSObject value, NSRange range) {
+    return _lib._objc_msgSend_646(
+        _id, _lib._sel_addAttribute_value_range_1, name, value._id, range);
+  }
+
+  void addAttributes_range_(NSDictionary? attrs, NSRange range) {
+    return _lib._objc_msgSend_644(
+        _id, _lib._sel_addAttributes_range_1, attrs?._id ?? ffi.nullptr, range);
+  }
+
+  void removeAttribute_range_(NSAttributedStringKey name, NSRange range) {
+    return _lib._objc_msgSend_647(
+        _id, _lib._sel_removeAttribute_range_1, name, range);
+  }
+
+  void replaceCharactersInRange_withAttributedString_(
+      NSRange range, NSAttributedString? attrString) {
+    return _lib._objc_msgSend_648(
+        _id,
+        _lib._sel_replaceCharactersInRange_withAttributedString_1,
+        range,
+        attrString?._id ?? ffi.nullptr);
+  }
+
+  void insertAttributedString_atIndex_(
+      NSAttributedString? attrString, int loc) {
+    return _lib._objc_msgSend_649(
+        _id,
+        _lib._sel_insertAttributedString_atIndex_1,
+        attrString?._id ?? ffi.nullptr,
+        loc);
+  }
+
+  void appendAttributedString_(NSAttributedString? attrString) {
+    return _lib._objc_msgSend_650(_id, _lib._sel_appendAttributedString_1,
+        attrString?._id ?? ffi.nullptr);
+  }
+
+  void deleteCharactersInRange_(NSRange range) {
+    return _lib._objc_msgSend_416(
+        _id, _lib._sel_deleteCharactersInRange_1, range);
+  }
+
+  void setAttributedString_(NSAttributedString? attrString) {
+    return _lib._objc_msgSend_650(
+        _id, _lib._sel_setAttributedString_1, attrString?._id ?? ffi.nullptr);
+  }
+
+  void beginEditing() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_beginEditing1);
+  }
+
+  void endEditing() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_endEditing1);
+  }
+
+  void appendLocalizedFormat_(NSAttributedString? format) {
+    return _lib._objc_msgSend_650(
+        _id, _lib._sel_appendLocalizedFormat_1, format?._id ?? ffi.nullptr);
+  }
+
+  static NSMutableAttributedString localizedAttributedStringWithFormat_(
+      SwiftLibrary _lib, NSAttributedString? format) {
+    final _ret = _lib._objc_msgSend_627(
+        _lib._class_NSMutableAttributedString1,
+        _lib._sel_localizedAttributedStringWithFormat_1,
+        format?._id ?? ffi.nullptr);
+    return NSMutableAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableAttributedString localizedAttributedStringWithFormat_options_(
+      SwiftLibrary _lib, NSAttributedString? format, int options) {
+    final _ret = _lib._objc_msgSend_639(
+        _lib._class_NSMutableAttributedString1,
+        _lib._sel_localizedAttributedStringWithFormat_options_1,
+        format?._id ?? ffi.nullptr,
+        options);
+    return NSMutableAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableAttributedString new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSMutableAttributedString1, _lib._sel_new1);
+    return NSMutableAttributedString._(_ret, _lib,
+        retain: false, release: true);
+  }
+
+  static NSMutableAttributedString alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSMutableAttributedString1, _lib._sel_alloc1);
+    return NSMutableAttributedString._(_ret, _lib,
+        retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSMutableAttributedString1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSMutableAttributedString1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSMutableAttributedString1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSMutableAttributedString1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSMutableAttributedString1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSMutableAttributedString1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSMutableAttributedString1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSMutableAttributedString1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSMutableAttributedString1,
+        _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSDateFormatter extends NSFormatter {
+  NSDateFormatter._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSDateFormatter] that points to the same underlying object as [other].
+  static NSDateFormatter castFrom<T extends _ObjCWrapper>(T other) {
+    return NSDateFormatter._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSDateFormatter] that wraps the given raw object pointer.
+  static NSDateFormatter castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSDateFormatter._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSDateFormatter].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSDateFormatter1);
+  }
+
+  int get formattingContext {
+    return _lib._objc_msgSend_655(_id, _lib._sel_formattingContext1);
+  }
+
+  set formattingContext(int value) {
+    _lib._objc_msgSend_656(_id, _lib._sel_setFormattingContext_1, value);
+  }
+
+  bool getObjectValue_forString_range_error_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> obj,
+      NSString? string,
+      ffi.Pointer<NSRange> rangep,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_657(
+        _id,
+        _lib._sel_getObjectValue_forString_range_error_1,
+        obj,
+        string?._id ?? ffi.nullptr,
+        rangep,
+        error);
+  }
+
+  NSString stringFromDate_(NSDate? date) {
+    final _ret = _lib._objc_msgSend_161(
+        _id, _lib._sel_stringFromDate_1, date?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate dateFromString_(NSString? string) {
+    final _ret = _lib._objc_msgSend_496(
+        _id, _lib._sel_dateFromString_1, string?._id ?? ffi.nullptr);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString localizedStringFromDate_dateStyle_timeStyle_(
+      SwiftLibrary _lib, NSDate? date, int dstyle, int tstyle) {
+    final _ret = _lib._objc_msgSend_658(
+        _lib._class_NSDateFormatter1,
+        _lib._sel_localizedStringFromDate_dateStyle_timeStyle_1,
+        date?._id ?? ffi.nullptr,
+        dstyle,
+        tstyle);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString dateFormatFromTemplate_options_locale_(
+      SwiftLibrary _lib, NSString? tmplate, int opts, NSLocale? locale) {
+    final _ret = _lib._objc_msgSend_659(
+        _lib._class_NSDateFormatter1,
+        _lib._sel_dateFormatFromTemplate_options_locale_1,
+        tmplate?._id ?? ffi.nullptr,
+        opts,
+        locale?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static int getDefaultFormatterBehavior(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_660(
+        _lib._class_NSDateFormatter1, _lib._sel_defaultFormatterBehavior1);
+  }
+
+  static void setDefaultFormatterBehavior(SwiftLibrary _lib, int value) {
+    _lib._objc_msgSend_661(_lib._class_NSDateFormatter1,
+        _lib._sel_setDefaultFormatterBehavior_1, value);
+  }
+
+  void setLocalizedDateFormatFromTemplate_(NSString? dateFormatTemplate) {
+    return _lib._objc_msgSend_186(
+        _id,
+        _lib._sel_setLocalizedDateFormatFromTemplate_1,
+        dateFormatTemplate?._id ?? ffi.nullptr);
+  }
+
+  NSString? get dateFormat {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_dateFormat1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set dateFormat(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setDateFormat_1, value?._id ?? ffi.nullptr);
+  }
+
+  int get dateStyle {
+    return _lib._objc_msgSend_662(_id, _lib._sel_dateStyle1);
+  }
+
+  set dateStyle(int value) {
+    _lib._objc_msgSend_663(_id, _lib._sel_setDateStyle_1, value);
+  }
+
+  int get timeStyle {
+    return _lib._objc_msgSend_662(_id, _lib._sel_timeStyle1);
+  }
+
+  set timeStyle(int value) {
+    _lib._objc_msgSend_663(_id, _lib._sel_setTimeStyle_1, value);
+  }
+
+  NSLocale? get locale {
+    final _ret = _lib._objc_msgSend_176(_id, _lib._sel_locale1);
+    return _ret.address == 0
+        ? null
+        : NSLocale._(_ret, _lib, retain: true, release: true);
+  }
+
+  set locale(NSLocale? value) {
+    _lib._objc_msgSend_664(
+        _id, _lib._sel_setLocale_1, value?._id ?? ffi.nullptr);
+  }
+
+  bool get generatesCalendarDates {
+    return _lib._objc_msgSend_12(_id, _lib._sel_generatesCalendarDates1);
+  }
+
+  set generatesCalendarDates(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setGeneratesCalendarDates_1, value);
+  }
+
+  int get formatterBehavior {
+    return _lib._objc_msgSend_660(_id, _lib._sel_formatterBehavior1);
+  }
+
+  set formatterBehavior(int value) {
+    _lib._objc_msgSend_661(_id, _lib._sel_setFormatterBehavior_1, value);
+  }
+
+  NSTimeZone? get timeZone {
+    final _ret = _lib._objc_msgSend_162(_id, _lib._sel_timeZone1);
+    return _ret.address == 0
+        ? null
+        : NSTimeZone._(_ret, _lib, retain: true, release: true);
+  }
+
+  set timeZone(NSTimeZone? value) {
+    _lib._objc_msgSend_163(
+        _id, _lib._sel_setTimeZone_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSCalendar? get calendar {
+    final _ret = _lib._objc_msgSend_665(_id, _lib._sel_calendar1);
+    return _ret.address == 0
+        ? null
+        : NSCalendar._(_ret, _lib, retain: true, release: true);
+  }
+
+  set calendar(NSCalendar? value) {
+    _lib._objc_msgSend_671(
+        _id, _lib._sel_setCalendar_1, value?._id ?? ffi.nullptr);
+  }
+
+  bool get lenient {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isLenient1);
+  }
+
+  set lenient(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setLenient_1, value);
+  }
+
+  NSDate? get twoDigitStartDate {
+    final _ret = _lib._objc_msgSend_156(_id, _lib._sel_twoDigitStartDate1);
+    return _ret.address == 0
+        ? null
+        : NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  set twoDigitStartDate(NSDate? value) {
+    _lib._objc_msgSend_493(
+        _id, _lib._sel_setTwoDigitStartDate_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSDate? get defaultDate {
+    final _ret = _lib._objc_msgSend_156(_id, _lib._sel_defaultDate1);
+    return _ret.address == 0
+        ? null
+        : NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  set defaultDate(NSDate? value) {
+    _lib._objc_msgSend_493(
+        _id, _lib._sel_setDefaultDate_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get eraSymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_eraSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set eraSymbols(NSArray? value) {
+    _lib._objc_msgSend_696(
+        _id, _lib._sel_setEraSymbols_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get monthSymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_monthSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set monthSymbols(NSArray? value) {
+    _lib._objc_msgSend_696(
+        _id, _lib._sel_setMonthSymbols_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get shortMonthSymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_shortMonthSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set shortMonthSymbols(NSArray? value) {
+    _lib._objc_msgSend_696(
+        _id, _lib._sel_setShortMonthSymbols_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get weekdaySymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_weekdaySymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set weekdaySymbols(NSArray? value) {
+    _lib._objc_msgSend_696(
+        _id, _lib._sel_setWeekdaySymbols_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get shortWeekdaySymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_shortWeekdaySymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set shortWeekdaySymbols(NSArray? value) {
+    _lib._objc_msgSend_696(
+        _id, _lib._sel_setShortWeekdaySymbols_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get AMSymbol {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_AMSymbol1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set AMSymbol(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setAMSymbol_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get PMSymbol {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_PMSymbol1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set PMSymbol(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setPMSymbol_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get longEraSymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_longEraSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set longEraSymbols(NSArray? value) {
+    _lib._objc_msgSend_696(
+        _id, _lib._sel_setLongEraSymbols_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get veryShortMonthSymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_veryShortMonthSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set veryShortMonthSymbols(NSArray? value) {
+    _lib._objc_msgSend_696(
+        _id, _lib._sel_setVeryShortMonthSymbols_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get standaloneMonthSymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_standaloneMonthSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set standaloneMonthSymbols(NSArray? value) {
+    _lib._objc_msgSend_696(
+        _id, _lib._sel_setStandaloneMonthSymbols_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get shortStandaloneMonthSymbols {
+    final _ret =
+        _lib._objc_msgSend_80(_id, _lib._sel_shortStandaloneMonthSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set shortStandaloneMonthSymbols(NSArray? value) {
+    _lib._objc_msgSend_696(_id, _lib._sel_setShortStandaloneMonthSymbols_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get veryShortStandaloneMonthSymbols {
+    final _ret =
+        _lib._objc_msgSend_80(_id, _lib._sel_veryShortStandaloneMonthSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set veryShortStandaloneMonthSymbols(NSArray? value) {
+    _lib._objc_msgSend_696(_id, _lib._sel_setVeryShortStandaloneMonthSymbols_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get veryShortWeekdaySymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_veryShortWeekdaySymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set veryShortWeekdaySymbols(NSArray? value) {
+    _lib._objc_msgSend_696(
+        _id, _lib._sel_setVeryShortWeekdaySymbols_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get standaloneWeekdaySymbols {
+    final _ret =
+        _lib._objc_msgSend_80(_id, _lib._sel_standaloneWeekdaySymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set standaloneWeekdaySymbols(NSArray? value) {
+    _lib._objc_msgSend_696(_id, _lib._sel_setStandaloneWeekdaySymbols_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get shortStandaloneWeekdaySymbols {
+    final _ret =
+        _lib._objc_msgSend_80(_id, _lib._sel_shortStandaloneWeekdaySymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set shortStandaloneWeekdaySymbols(NSArray? value) {
+    _lib._objc_msgSend_696(_id, _lib._sel_setShortStandaloneWeekdaySymbols_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get veryShortStandaloneWeekdaySymbols {
+    final _ret = _lib._objc_msgSend_80(
+        _id, _lib._sel_veryShortStandaloneWeekdaySymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set veryShortStandaloneWeekdaySymbols(NSArray? value) {
+    _lib._objc_msgSend_696(
+        _id,
+        _lib._sel_setVeryShortStandaloneWeekdaySymbols_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get quarterSymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_quarterSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set quarterSymbols(NSArray? value) {
+    _lib._objc_msgSend_696(
+        _id, _lib._sel_setQuarterSymbols_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get shortQuarterSymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_shortQuarterSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set shortQuarterSymbols(NSArray? value) {
+    _lib._objc_msgSend_696(
+        _id, _lib._sel_setShortQuarterSymbols_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get standaloneQuarterSymbols {
+    final _ret =
+        _lib._objc_msgSend_80(_id, _lib._sel_standaloneQuarterSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set standaloneQuarterSymbols(NSArray? value) {
+    _lib._objc_msgSend_696(_id, _lib._sel_setStandaloneQuarterSymbols_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get shortStandaloneQuarterSymbols {
+    final _ret =
+        _lib._objc_msgSend_80(_id, _lib._sel_shortStandaloneQuarterSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set shortStandaloneQuarterSymbols(NSArray? value) {
+    _lib._objc_msgSend_696(_id, _lib._sel_setShortStandaloneQuarterSymbols_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  NSDate? get gregorianStartDate {
+    final _ret = _lib._objc_msgSend_156(_id, _lib._sel_gregorianStartDate1);
+    return _ret.address == 0
+        ? null
+        : NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  set gregorianStartDate(NSDate? value) {
+    _lib._objc_msgSend_493(
+        _id, _lib._sel_setGregorianStartDate_1, value?._id ?? ffi.nullptr);
+  }
+
+  bool get doesRelativeDateFormatting {
+    return _lib._objc_msgSend_12(_id, _lib._sel_doesRelativeDateFormatting1);
+  }
+
+  set doesRelativeDateFormatting(bool value) {
+    _lib._objc_msgSend_460(
+        _id, _lib._sel_setDoesRelativeDateFormatting_1, value);
+  }
+
+  NSObject initWithDateFormat_allowNaturalLanguage_(
+      NSString? format, bool flag) {
+    final _ret = _lib._objc_msgSend_29(
+        _id,
+        _lib._sel_initWithDateFormat_allowNaturalLanguage_1,
+        format?._id ?? ffi.nullptr,
+        flag);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool allowsNaturalLanguage() {
+    return _lib._objc_msgSend_12(_id, _lib._sel_allowsNaturalLanguage1);
+  }
+
+  static NSDateFormatter new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSDateFormatter1, _lib._sel_new1);
+    return NSDateFormatter._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSDateFormatter alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSDateFormatter1, _lib._sel_alloc1);
+    return NSDateFormatter._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSDateFormatter1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSDateFormatter1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSDateFormatter1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSDateFormatter1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSDateFormatter1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSDateFormatter1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSDateFormatter1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSDateFormatter1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSDateFormatter1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSFormatter extends NSObject {
+  NSFormatter._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSFormatter] that points to the same underlying object as [other].
+  static NSFormatter castFrom<T extends _ObjCWrapper>(T other) {
+    return NSFormatter._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSFormatter] that wraps the given raw object pointer.
+  static NSFormatter castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSFormatter._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSFormatter].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSFormatter1);
+  }
+
+  NSString stringForObjectValue_(NSObject obj) {
+    final _ret =
+        _lib._objc_msgSend_65(_id, _lib._sel_stringForObjectValue_1, obj._id);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSAttributedString attributedStringForObjectValue_withDefaultAttributes_(
+      NSObject obj, NSDictionary? attrs) {
+    final _ret = _lib._objc_msgSend_651(
+        _id,
+        _lib._sel_attributedStringForObjectValue_withDefaultAttributes_1,
+        obj._id,
+        attrs?._id ?? ffi.nullptr);
+    return NSAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString editingStringForObjectValue_(NSObject obj) {
+    final _ret = _lib._objc_msgSend_65(
+        _id, _lib._sel_editingStringForObjectValue_1, obj._id);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool getObjectValue_forString_errorDescription_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> obj,
+      NSString? string,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_652(
+        _id,
+        _lib._sel_getObjectValue_forString_errorDescription_1,
+        obj,
+        string?._id ?? ffi.nullptr,
+        error);
+  }
+
+  bool isPartialStringValid_newEditingString_errorDescription_(
+      NSString? partialString,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> newString,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_653(
+        _id,
+        _lib._sel_isPartialStringValid_newEditingString_errorDescription_1,
+        partialString?._id ?? ffi.nullptr,
+        newString,
+        error);
+  }
+
+  bool
+      isPartialStringValid_proposedSelectedRange_originalString_originalSelectedRange_errorDescription_(
+          ffi.Pointer<ffi.Pointer<ObjCObject>> partialStringPtr,
+          NSRangePointer proposedSelRangePtr,
+          NSString? origString,
+          NSRange origSelRange,
+          ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_654(
+        _id,
+        _lib._sel_isPartialStringValid_proposedSelectedRange_originalString_originalSelectedRange_errorDescription_1,
+        partialStringPtr,
+        proposedSelRangePtr,
+        origString?._id ?? ffi.nullptr,
+        origSelRange,
+        error);
+  }
+
+  static NSFormatter new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSFormatter1, _lib._sel_new1);
+    return NSFormatter._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSFormatter alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSFormatter1, _lib._sel_alloc1);
+    return NSFormatter._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSFormatter1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSFormatter1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSFormatter1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSFormatter1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSFormatter1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSFormatter1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSFormatter1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSFormatter1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSFormatter1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSFormattingContext {
+  static const int NSFormattingContextUnknown = 0;
+  static const int NSFormattingContextDynamic = 1;
+  static const int NSFormattingContextStandalone = 2;
+  static const int NSFormattingContextListItem = 3;
+  static const int NSFormattingContextBeginningOfSentence = 4;
+  static const int NSFormattingContextMiddleOfSentence = 5;
+}
+
+abstract class NSDateFormatterStyle {
+  static const int NSDateFormatterNoStyle = 0;
+  static const int NSDateFormatterShortStyle = 1;
+  static const int NSDateFormatterMediumStyle = 2;
+  static const int NSDateFormatterLongStyle = 3;
+  static const int NSDateFormatterFullStyle = 4;
+}
+
+abstract class NSDateFormatterBehavior {
+  static const int NSDateFormatterBehaviorDefault = 0;
+  static const int NSDateFormatterBehavior10_0 = 1000;
+  static const int NSDateFormatterBehavior10_4 = 1040;
+}
+
+class NSCalendar extends NSObject {
+  NSCalendar._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSCalendar] that points to the same underlying object as [other].
+  static NSCalendar castFrom<T extends _ObjCWrapper>(T other) {
+    return NSCalendar._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSCalendar] that wraps the given raw object pointer.
+  static NSCalendar castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSCalendar._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSCalendar].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSCalendar1);
+  }
+
+  static NSCalendar? getCurrentCalendar(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_665(
+        _lib._class_NSCalendar1, _lib._sel_currentCalendar1);
+    return _ret.address == 0
+        ? null
+        : NSCalendar._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCalendar? getAutoupdatingCurrentCalendar(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_665(
+        _lib._class_NSCalendar1, _lib._sel_autoupdatingCurrentCalendar1);
+    return _ret.address == 0
+        ? null
+        : NSCalendar._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSCalendar calendarWithIdentifier_(
+      SwiftLibrary _lib, NSCalendarIdentifier calendarIdentifierConstant) {
+    final _ret = _lib._objc_msgSend_666(_lib._class_NSCalendar1,
+        _lib._sel_calendarWithIdentifier_1, calendarIdentifierConstant);
+    return NSCalendar._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSCalendar init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSCalendar._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject initWithCalendarIdentifier_(NSCalendarIdentifier ident) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initWithCalendarIdentifier_1, ident);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSCalendarIdentifier get calendarIdentifier {
+    return _lib._objc_msgSend_20(_id, _lib._sel_calendarIdentifier1);
+  }
+
+  NSLocale? get locale {
+    final _ret = _lib._objc_msgSend_176(_id, _lib._sel_locale1);
+    return _ret.address == 0
+        ? null
+        : NSLocale._(_ret, _lib, retain: true, release: true);
+  }
+
+  set locale(NSLocale? value) {
+    _lib._objc_msgSend_664(
+        _id, _lib._sel_setLocale_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSTimeZone? get timeZone {
+    final _ret = _lib._objc_msgSend_162(_id, _lib._sel_timeZone1);
+    return _ret.address == 0
+        ? null
+        : NSTimeZone._(_ret, _lib, retain: true, release: true);
+  }
+
+  set timeZone(NSTimeZone? value) {
+    _lib._objc_msgSend_163(
+        _id, _lib._sel_setTimeZone_1, value?._id ?? ffi.nullptr);
+  }
+
+  int get firstWeekday {
+    return _lib._objc_msgSend_10(_id, _lib._sel_firstWeekday1);
+  }
+
+  set firstWeekday(int value) {
+    _lib._objc_msgSend_451(_id, _lib._sel_setFirstWeekday_1, value);
+  }
+
+  int get minimumDaysInFirstWeek {
+    return _lib._objc_msgSend_10(_id, _lib._sel_minimumDaysInFirstWeek1);
+  }
+
+  set minimumDaysInFirstWeek(int value) {
+    _lib._objc_msgSend_451(_id, _lib._sel_setMinimumDaysInFirstWeek_1, value);
+  }
+
+  NSArray? get eraSymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_eraSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get longEraSymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_longEraSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get monthSymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_monthSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get shortMonthSymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_shortMonthSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get veryShortMonthSymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_veryShortMonthSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get standaloneMonthSymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_standaloneMonthSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get shortStandaloneMonthSymbols {
+    final _ret =
+        _lib._objc_msgSend_80(_id, _lib._sel_shortStandaloneMonthSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get veryShortStandaloneMonthSymbols {
+    final _ret =
+        _lib._objc_msgSend_80(_id, _lib._sel_veryShortStandaloneMonthSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get weekdaySymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_weekdaySymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get shortWeekdaySymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_shortWeekdaySymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get veryShortWeekdaySymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_veryShortWeekdaySymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get standaloneWeekdaySymbols {
+    final _ret =
+        _lib._objc_msgSend_80(_id, _lib._sel_standaloneWeekdaySymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get shortStandaloneWeekdaySymbols {
+    final _ret =
+        _lib._objc_msgSend_80(_id, _lib._sel_shortStandaloneWeekdaySymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get veryShortStandaloneWeekdaySymbols {
+    final _ret = _lib._objc_msgSend_80(
+        _id, _lib._sel_veryShortStandaloneWeekdaySymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get quarterSymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_quarterSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get shortQuarterSymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_shortQuarterSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get standaloneQuarterSymbols {
+    final _ret =
+        _lib._objc_msgSend_80(_id, _lib._sel_standaloneQuarterSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get shortStandaloneQuarterSymbols {
+    final _ret =
+        _lib._objc_msgSend_80(_id, _lib._sel_shortStandaloneQuarterSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get AMSymbol {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_AMSymbol1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get PMSymbol {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_PMSymbol1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSRange minimumRangeOfUnit_(int unit) {
+    return _lib._objc_msgSend_667(_id, _lib._sel_minimumRangeOfUnit_1, unit);
+  }
+
+  NSRange maximumRangeOfUnit_(int unit) {
+    return _lib._objc_msgSend_667(_id, _lib._sel_maximumRangeOfUnit_1, unit);
+  }
+
+  NSRange rangeOfUnit_inUnit_forDate_(int smaller, int larger, NSDate? date) {
+    return _lib._objc_msgSend_668(_id, _lib._sel_rangeOfUnit_inUnit_forDate_1,
+        smaller, larger, date?._id ?? ffi.nullptr);
+  }
+
+  int ordinalityOfUnit_inUnit_forDate_(int smaller, int larger, NSDate? date) {
+    return _lib._objc_msgSend_669(
+        _id,
+        _lib._sel_ordinalityOfUnit_inUnit_forDate_1,
+        smaller,
+        larger,
+        date?._id ?? ffi.nullptr);
+  }
+
+  bool rangeOfUnit_startDate_interval_forDate_(
+      int unit,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> datep,
+      ffi.Pointer<NSTimeInterval> tip,
+      NSDate? date) {
+    return _lib._objc_msgSend_670(
+        _id,
+        _lib._sel_rangeOfUnit_startDate_interval_forDate_1,
+        unit,
+        datep,
+        tip,
+        date?._id ?? ffi.nullptr);
+  }
+
+  NSDate dateFromComponents_(NSDateComponents? comps) {
+    final _ret = _lib._objc_msgSend_675(
+        _id, _lib._sel_dateFromComponents_1, comps?._id ?? ffi.nullptr);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDateComponents components_fromDate_(int unitFlags, NSDate? date) {
+    final _ret = _lib._objc_msgSend_676(_id, _lib._sel_components_fromDate_1,
+        unitFlags, date?._id ?? ffi.nullptr);
+    return NSDateComponents._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate dateByAddingComponents_toDate_options_(
+      NSDateComponents? comps, NSDate? date, int opts) {
+    final _ret = _lib._objc_msgSend_677(
+        _id,
+        _lib._sel_dateByAddingComponents_toDate_options_1,
+        comps?._id ?? ffi.nullptr,
+        date?._id ?? ffi.nullptr,
+        opts);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDateComponents components_fromDate_toDate_options_(
+      int unitFlags, NSDate? startingDate, NSDate? resultDate, int opts) {
+    final _ret = _lib._objc_msgSend_678(
+        _id,
+        _lib._sel_components_fromDate_toDate_options_1,
+        unitFlags,
+        startingDate?._id ?? ffi.nullptr,
+        resultDate?._id ?? ffi.nullptr,
+        opts);
+    return NSDateComponents._(_ret, _lib, retain: true, release: true);
+  }
+
+  void getEra_year_month_day_fromDate_(
+      ffi.Pointer<NSInteger> eraValuePointer,
+      ffi.Pointer<NSInteger> yearValuePointer,
+      ffi.Pointer<NSInteger> monthValuePointer,
+      ffi.Pointer<NSInteger> dayValuePointer,
+      NSDate? date) {
+    return _lib._objc_msgSend_679(
+        _id,
+        _lib._sel_getEra_year_month_day_fromDate_1,
+        eraValuePointer,
+        yearValuePointer,
+        monthValuePointer,
+        dayValuePointer,
+        date?._id ?? ffi.nullptr);
+  }
+
+  void getEra_yearForWeekOfYear_weekOfYear_weekday_fromDate_(
+      ffi.Pointer<NSInteger> eraValuePointer,
+      ffi.Pointer<NSInteger> yearValuePointer,
+      ffi.Pointer<NSInteger> weekValuePointer,
+      ffi.Pointer<NSInteger> weekdayValuePointer,
+      NSDate? date) {
+    return _lib._objc_msgSend_679(
+        _id,
+        _lib._sel_getEra_yearForWeekOfYear_weekOfYear_weekday_fromDate_1,
+        eraValuePointer,
+        yearValuePointer,
+        weekValuePointer,
+        weekdayValuePointer,
+        date?._id ?? ffi.nullptr);
+  }
+
+  void getHour_minute_second_nanosecond_fromDate_(
+      ffi.Pointer<NSInteger> hourValuePointer,
+      ffi.Pointer<NSInteger> minuteValuePointer,
+      ffi.Pointer<NSInteger> secondValuePointer,
+      ffi.Pointer<NSInteger> nanosecondValuePointer,
+      NSDate? date) {
+    return _lib._objc_msgSend_679(
+        _id,
+        _lib._sel_getHour_minute_second_nanosecond_fromDate_1,
+        hourValuePointer,
+        minuteValuePointer,
+        secondValuePointer,
+        nanosecondValuePointer,
+        date?._id ?? ffi.nullptr);
+  }
+
+  int component_fromDate_(int unit, NSDate? date) {
+    return _lib._objc_msgSend_680(
+        _id, _lib._sel_component_fromDate_1, unit, date?._id ?? ffi.nullptr);
+  }
+
+  NSDate dateWithEra_year_month_day_hour_minute_second_nanosecond_(
+      int eraValue,
+      int yearValue,
+      int monthValue,
+      int dayValue,
+      int hourValue,
+      int minuteValue,
+      int secondValue,
+      int nanosecondValue) {
+    final _ret = _lib._objc_msgSend_681(
+        _id,
+        _lib._sel_dateWithEra_year_month_day_hour_minute_second_nanosecond_1,
+        eraValue,
+        yearValue,
+        monthValue,
+        dayValue,
+        hourValue,
+        minuteValue,
+        secondValue,
+        nanosecondValue);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate
+      dateWithEra_yearForWeekOfYear_weekOfYear_weekday_hour_minute_second_nanosecond_(
+          int eraValue,
+          int yearValue,
+          int weekValue,
+          int weekdayValue,
+          int hourValue,
+          int minuteValue,
+          int secondValue,
+          int nanosecondValue) {
+    final _ret = _lib._objc_msgSend_681(
+        _id,
+        _lib._sel_dateWithEra_yearForWeekOfYear_weekOfYear_weekday_hour_minute_second_nanosecond_1,
+        eraValue,
+        yearValue,
+        weekValue,
+        weekdayValue,
+        hourValue,
+        minuteValue,
+        secondValue,
+        nanosecondValue);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate startOfDayForDate_(NSDate? date) {
+    final _ret = _lib._objc_msgSend_152(
+        _id, _lib._sel_startOfDayForDate_1, date?._id ?? ffi.nullptr);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDateComponents componentsInTimeZone_fromDate_(
+      NSTimeZone? timezone, NSDate? date) {
+    final _ret = _lib._objc_msgSend_682(
+        _id,
+        _lib._sel_componentsInTimeZone_fromDate_1,
+        timezone?._id ?? ffi.nullptr,
+        date?._id ?? ffi.nullptr);
+    return NSDateComponents._(_ret, _lib, retain: true, release: true);
+  }
+
+  int compareDate_toDate_toUnitGranularity_(
+      NSDate? date1, NSDate? date2, int unit) {
+    return _lib._objc_msgSend_683(
+        _id,
+        _lib._sel_compareDate_toDate_toUnitGranularity_1,
+        date1?._id ?? ffi.nullptr,
+        date2?._id ?? ffi.nullptr,
+        unit);
+  }
+
+  bool isDate_equalToDate_toUnitGranularity_(
+      NSDate? date1, NSDate? date2, int unit) {
+    return _lib._objc_msgSend_684(
+        _id,
+        _lib._sel_isDate_equalToDate_toUnitGranularity_1,
+        date1?._id ?? ffi.nullptr,
+        date2?._id ?? ffi.nullptr,
+        unit);
+  }
+
+  bool isDate_inSameDayAsDate_(NSDate? date1, NSDate? date2) {
+    return _lib._objc_msgSend_685(_id, _lib._sel_isDate_inSameDayAsDate_1,
+        date1?._id ?? ffi.nullptr, date2?._id ?? ffi.nullptr);
+  }
+
+  bool isDateInToday_(NSDate? date) {
+    return _lib._objc_msgSend_154(
+        _id, _lib._sel_isDateInToday_1, date?._id ?? ffi.nullptr);
+  }
+
+  bool isDateInYesterday_(NSDate? date) {
+    return _lib._objc_msgSend_154(
+        _id, _lib._sel_isDateInYesterday_1, date?._id ?? ffi.nullptr);
+  }
+
+  bool isDateInTomorrow_(NSDate? date) {
+    return _lib._objc_msgSend_154(
+        _id, _lib._sel_isDateInTomorrow_1, date?._id ?? ffi.nullptr);
+  }
+
+  bool isDateInWeekend_(NSDate? date) {
+    return _lib._objc_msgSend_154(
+        _id, _lib._sel_isDateInWeekend_1, date?._id ?? ffi.nullptr);
+  }
+
+  bool rangeOfWeekendStartDate_interval_containingDate_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> datep,
+      ffi.Pointer<NSTimeInterval> tip,
+      NSDate? date) {
+    return _lib._objc_msgSend_686(
+        _id,
+        _lib._sel_rangeOfWeekendStartDate_interval_containingDate_1,
+        datep,
+        tip,
+        date?._id ?? ffi.nullptr);
+  }
+
+  bool nextWeekendStartDate_interval_options_afterDate_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> datep,
+      ffi.Pointer<NSTimeInterval> tip,
+      int options,
+      NSDate? date) {
+    return _lib._objc_msgSend_687(
+        _id,
+        _lib._sel_nextWeekendStartDate_interval_options_afterDate_1,
+        datep,
+        tip,
+        options,
+        date?._id ?? ffi.nullptr);
+  }
+
+  NSDateComponents components_fromDateComponents_toDateComponents_options_(
+      int unitFlags,
+      NSDateComponents? startingDateComp,
+      NSDateComponents? resultDateComp,
+      int options) {
+    final _ret = _lib._objc_msgSend_688(
+        _id,
+        _lib._sel_components_fromDateComponents_toDateComponents_options_1,
+        unitFlags,
+        startingDateComp?._id ?? ffi.nullptr,
+        resultDateComp?._id ?? ffi.nullptr,
+        options);
+    return NSDateComponents._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate dateByAddingUnit_value_toDate_options_(
+      int unit, int value, NSDate? date, int options) {
+    final _ret = _lib._objc_msgSend_689(
+        _id,
+        _lib._sel_dateByAddingUnit_value_toDate_options_1,
+        unit,
+        value,
+        date?._id ?? ffi.nullptr,
+        options);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  void enumerateDatesStartingAfterDate_matchingComponents_options_usingBlock_(
+      NSDate? start, NSDateComponents? comps, int opts, ObjCBlock28 block) {
+    return _lib._objc_msgSend_690(
+        _id,
+        _lib._sel_enumerateDatesStartingAfterDate_matchingComponents_options_usingBlock_1,
+        start?._id ?? ffi.nullptr,
+        comps?._id ?? ffi.nullptr,
+        opts,
+        block._id);
+  }
+
+  NSDate nextDateAfterDate_matchingComponents_options_(
+      NSDate? date, NSDateComponents? comps, int options) {
+    final _ret = _lib._objc_msgSend_691(
+        _id,
+        _lib._sel_nextDateAfterDate_matchingComponents_options_1,
+        date?._id ?? ffi.nullptr,
+        comps?._id ?? ffi.nullptr,
+        options);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate nextDateAfterDate_matchingUnit_value_options_(
+      NSDate? date, int unit, int value, int options) {
+    final _ret = _lib._objc_msgSend_692(
+        _id,
+        _lib._sel_nextDateAfterDate_matchingUnit_value_options_1,
+        date?._id ?? ffi.nullptr,
+        unit,
+        value,
+        options);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate nextDateAfterDate_matchingHour_minute_second_options_(NSDate? date,
+      int hourValue, int minuteValue, int secondValue, int options) {
+    final _ret = _lib._objc_msgSend_693(
+        _id,
+        _lib._sel_nextDateAfterDate_matchingHour_minute_second_options_1,
+        date?._id ?? ffi.nullptr,
+        hourValue,
+        minuteValue,
+        secondValue,
+        options);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate dateBySettingUnit_value_ofDate_options_(
+      int unit, int v, NSDate? date, int opts) {
+    final _ret = _lib._objc_msgSend_689(
+        _id,
+        _lib._sel_dateBySettingUnit_value_ofDate_options_1,
+        unit,
+        v,
+        date?._id ?? ffi.nullptr,
+        opts);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate dateBySettingHour_minute_second_ofDate_options_(
+      int h, int m, int s, NSDate? date, int opts) {
+    final _ret = _lib._objc_msgSend_694(
+        _id,
+        _lib._sel_dateBySettingHour_minute_second_ofDate_options_1,
+        h,
+        m,
+        s,
+        date?._id ?? ffi.nullptr,
+        opts);
+    return NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool date_matchesComponents_(NSDate? date, NSDateComponents? components) {
+    return _lib._objc_msgSend_695(_id, _lib._sel_date_matchesComponents_1,
+        date?._id ?? ffi.nullptr, components?._id ?? ffi.nullptr);
+  }
+
+  static NSCalendar new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSCalendar1, _lib._sel_new1);
+    return NSCalendar._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSCalendar alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSCalendar1, _lib._sel_alloc1);
+    return NSCalendar._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSCalendar1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSCalendar1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSCalendar1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSCalendar1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSCalendar1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSCalendar1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSCalendar1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSCalendar1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSCalendar1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef NSCalendarIdentifier = ffi.Pointer<ObjCObject>;
+
+abstract class NSCalendarUnit {
+  static const int NSCalendarUnitEra = 2;
+  static const int NSCalendarUnitYear = 4;
+  static const int NSCalendarUnitMonth = 8;
+  static const int NSCalendarUnitDay = 16;
+  static const int NSCalendarUnitHour = 32;
+  static const int NSCalendarUnitMinute = 64;
+  static const int NSCalendarUnitSecond = 128;
+  static const int NSCalendarUnitWeekday = 512;
+  static const int NSCalendarUnitWeekdayOrdinal = 1024;
+  static const int NSCalendarUnitQuarter = 2048;
+  static const int NSCalendarUnitWeekOfMonth = 4096;
+  static const int NSCalendarUnitWeekOfYear = 8192;
+  static const int NSCalendarUnitYearForWeekOfYear = 16384;
+  static const int NSCalendarUnitNanosecond = 32768;
+  static const int NSCalendarUnitCalendar = 1048576;
+  static const int NSCalendarUnitTimeZone = 2097152;
+  static const int NSEraCalendarUnit = 2;
+  static const int NSYearCalendarUnit = 4;
+  static const int NSMonthCalendarUnit = 8;
+  static const int NSDayCalendarUnit = 16;
+  static const int NSHourCalendarUnit = 32;
+  static const int NSMinuteCalendarUnit = 64;
+  static const int NSSecondCalendarUnit = 128;
+  static const int NSWeekCalendarUnit = 256;
+  static const int NSWeekdayCalendarUnit = 512;
+  static const int NSWeekdayOrdinalCalendarUnit = 1024;
+  static const int NSQuarterCalendarUnit = 2048;
+  static const int NSWeekOfMonthCalendarUnit = 4096;
+  static const int NSWeekOfYearCalendarUnit = 8192;
+  static const int NSYearForWeekOfYearCalendarUnit = 16384;
+  static const int NSCalendarCalendarUnit = 1048576;
+  static const int NSTimeZoneCalendarUnit = 2097152;
+}
+
+class NSDateComponents extends NSObject {
+  NSDateComponents._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSDateComponents] that points to the same underlying object as [other].
+  static NSDateComponents castFrom<T extends _ObjCWrapper>(T other) {
+    return NSDateComponents._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSDateComponents] that wraps the given raw object pointer.
+  static NSDateComponents castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSDateComponents._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSDateComponents].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSDateComponents1);
+  }
+
+  NSCalendar? get calendar {
+    final _ret = _lib._objc_msgSend_665(_id, _lib._sel_calendar1);
+    return _ret.address == 0
+        ? null
+        : NSCalendar._(_ret, _lib, retain: true, release: true);
+  }
+
+  set calendar(NSCalendar? value) {
+    _lib._objc_msgSend_671(
+        _id, _lib._sel_setCalendar_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSTimeZone? get timeZone {
+    final _ret = _lib._objc_msgSend_162(_id, _lib._sel_timeZone1);
+    return _ret.address == 0
+        ? null
+        : NSTimeZone._(_ret, _lib, retain: true, release: true);
+  }
+
+  set timeZone(NSTimeZone? value) {
+    _lib._objc_msgSend_163(
+        _id, _lib._sel_setTimeZone_1, value?._id ?? ffi.nullptr);
+  }
+
+  int get era {
+    return _lib._objc_msgSend_78(_id, _lib._sel_era1);
+  }
+
+  set era(int value) {
+    _lib._objc_msgSend_558(_id, _lib._sel_setEra_1, value);
+  }
+
+  int get year {
+    return _lib._objc_msgSend_78(_id, _lib._sel_year1);
+  }
+
+  set year(int value) {
+    _lib._objc_msgSend_558(_id, _lib._sel_setYear_1, value);
+  }
+
+  int get month {
+    return _lib._objc_msgSend_78(_id, _lib._sel_month1);
+  }
+
+  set month(int value) {
+    _lib._objc_msgSend_558(_id, _lib._sel_setMonth_1, value);
+  }
+
+  int get day {
+    return _lib._objc_msgSend_78(_id, _lib._sel_day1);
+  }
+
+  set day(int value) {
+    _lib._objc_msgSend_558(_id, _lib._sel_setDay_1, value);
+  }
+
+  int get hour {
+    return _lib._objc_msgSend_78(_id, _lib._sel_hour1);
+  }
+
+  set hour(int value) {
+    _lib._objc_msgSend_558(_id, _lib._sel_setHour_1, value);
+  }
+
+  int get minute {
+    return _lib._objc_msgSend_78(_id, _lib._sel_minute1);
+  }
+
+  set minute(int value) {
+    _lib._objc_msgSend_558(_id, _lib._sel_setMinute_1, value);
+  }
+
+  int get second {
+    return _lib._objc_msgSend_78(_id, _lib._sel_second1);
+  }
+
+  set second(int value) {
+    _lib._objc_msgSend_558(_id, _lib._sel_setSecond_1, value);
+  }
+
+  int get nanosecond {
+    return _lib._objc_msgSend_78(_id, _lib._sel_nanosecond1);
+  }
+
+  set nanosecond(int value) {
+    _lib._objc_msgSend_558(_id, _lib._sel_setNanosecond_1, value);
+  }
+
+  int get weekday {
+    return _lib._objc_msgSend_78(_id, _lib._sel_weekday1);
+  }
+
+  set weekday(int value) {
+    _lib._objc_msgSend_558(_id, _lib._sel_setWeekday_1, value);
+  }
+
+  int get weekdayOrdinal {
+    return _lib._objc_msgSend_78(_id, _lib._sel_weekdayOrdinal1);
+  }
+
+  set weekdayOrdinal(int value) {
+    _lib._objc_msgSend_558(_id, _lib._sel_setWeekdayOrdinal_1, value);
+  }
+
+  int get quarter {
+    return _lib._objc_msgSend_78(_id, _lib._sel_quarter1);
+  }
+
+  set quarter(int value) {
+    _lib._objc_msgSend_558(_id, _lib._sel_setQuarter_1, value);
+  }
+
+  int get weekOfMonth {
+    return _lib._objc_msgSend_78(_id, _lib._sel_weekOfMonth1);
+  }
+
+  set weekOfMonth(int value) {
+    _lib._objc_msgSend_558(_id, _lib._sel_setWeekOfMonth_1, value);
+  }
+
+  int get weekOfYear {
+    return _lib._objc_msgSend_78(_id, _lib._sel_weekOfYear1);
+  }
+
+  set weekOfYear(int value) {
+    _lib._objc_msgSend_558(_id, _lib._sel_setWeekOfYear_1, value);
+  }
+
+  int get yearForWeekOfYear {
+    return _lib._objc_msgSend_78(_id, _lib._sel_yearForWeekOfYear1);
+  }
+
+  set yearForWeekOfYear(int value) {
+    _lib._objc_msgSend_558(_id, _lib._sel_setYearForWeekOfYear_1, value);
+  }
+
+  bool get leapMonth {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isLeapMonth1);
+  }
+
+  set leapMonth(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setLeapMonth_1, value);
+  }
+
+  NSDate? get date {
+    final _ret = _lib._objc_msgSend_156(_id, _lib._sel_date1);
+    return _ret.address == 0
+        ? null
+        : NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  int week() {
+    return _lib._objc_msgSend_78(_id, _lib._sel_week1);
+  }
+
+  void setWeek_(int v) {
+    return _lib._objc_msgSend_374(_id, _lib._sel_setWeek_1, v);
+  }
+
+  void setValue_forComponent_(int value, int unit) {
+    return _lib._objc_msgSend_672(
+        _id, _lib._sel_setValue_forComponent_1, value, unit);
+  }
+
+  int valueForComponent_(int unit) {
+    return _lib._objc_msgSend_673(_id, _lib._sel_valueForComponent_1, unit);
+  }
+
+  bool get validDate {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isValidDate1);
+  }
+
+  bool isValidDateInCalendar_(NSCalendar? calendar) {
+    return _lib._objc_msgSend_674(
+        _id, _lib._sel_isValidDateInCalendar_1, calendar?._id ?? ffi.nullptr);
+  }
+
+  static NSDateComponents new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSDateComponents1, _lib._sel_new1);
+    return NSDateComponents._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSDateComponents alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSDateComponents1, _lib._sel_alloc1);
+    return NSDateComponents._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSDateComponents1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSDateComponents1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSDateComponents1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSDateComponents1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSDateComponents1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSDateComponents1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSDateComponents1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSDateComponents1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSDateComponents1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSCalendarOptions {
+  static const int NSCalendarWrapComponents = 1;
+  static const int NSCalendarMatchStrictly = 2;
+  static const int NSCalendarSearchBackwards = 4;
+  static const int NSCalendarMatchPreviousTimePreservingSmallerUnits = 256;
+  static const int NSCalendarMatchNextTimePreservingSmallerUnits = 512;
+  static const int NSCalendarMatchNextTime = 1024;
+  static const int NSCalendarMatchFirst = 4096;
+  static const int NSCalendarMatchLast = 8192;
+}
+
+void _ObjCBlock28_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, bool arg1, ffi.Pointer<ffi.Bool> arg2) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(ffi.Pointer<ObjCObject> arg0, ffi.Bool arg1,
+                  ffi.Pointer<ffi.Bool> arg2)>>()
+      .asFunction<
+          void Function(ffi.Pointer<ObjCObject> arg0, bool arg1,
+              ffi.Pointer<ffi.Bool> arg2)>()(arg0, arg1, arg2);
+}
+
+final _ObjCBlock28_closureRegistry = <int, Function>{};
+int _ObjCBlock28_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock28_registerClosure(Function fn) {
+  final id = ++_ObjCBlock28_closureRegistryIndex;
+  _ObjCBlock28_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock28_closureTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, bool arg1, ffi.Pointer<ffi.Bool> arg2) {
+  return _ObjCBlock28_closureRegistry[block.ref.target.address]!(
+      arg0, arg1, arg2);
+}
+
+class ObjCBlock28 extends _ObjCBlockBase {
+  ObjCBlock28._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock28.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0, ffi.Bool arg1,
+                      ffi.Pointer<ffi.Bool> arg2)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Bool arg1,
+                                ffi.Pointer<ffi.Bool> arg2)>(
+                        _ObjCBlock28_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock28.fromFunction(
+      SwiftLibrary lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, bool arg1, ffi.Pointer<ffi.Bool> arg2)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Bool arg1,
+                                ffi.Pointer<ffi.Bool> arg2)>(
+                        _ObjCBlock28_closureTrampoline)
+                    .cast(),
+                _ObjCBlock28_registerClosure(fn)),
+            lib);
+  void call(
+      ffi.Pointer<ObjCObject> arg0, bool arg1, ffi.Pointer<ffi.Bool> arg2) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    ffi.Bool arg1,
+                    ffi.Pointer<ffi.Bool> arg2)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                bool arg1,
+                ffi.Pointer<ffi.Bool> arg2)>()(_id, arg0, arg1, arg2);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class NSNumberFormatter extends NSFormatter {
+  NSNumberFormatter._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSNumberFormatter] that points to the same underlying object as [other].
+  static NSNumberFormatter castFrom<T extends _ObjCWrapper>(T other) {
+    return NSNumberFormatter._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSNumberFormatter] that wraps the given raw object pointer.
+  static NSNumberFormatter castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSNumberFormatter._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSNumberFormatter].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSNumberFormatter1);
+  }
+
+  int get formattingContext {
+    return _lib._objc_msgSend_655(_id, _lib._sel_formattingContext1);
+  }
+
+  set formattingContext(int value) {
+    _lib._objc_msgSend_656(_id, _lib._sel_setFormattingContext_1, value);
+  }
+
+  bool getObjectValue_forString_range_error_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> obj,
+      NSString? string,
+      ffi.Pointer<NSRange> rangep,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_657(
+        _id,
+        _lib._sel_getObjectValue_forString_range_error_1,
+        obj,
+        string?._id ?? ffi.nullptr,
+        rangep,
+        error);
+  }
+
+  NSString stringFromNumber_(NSNumber? number) {
+    final _ret = _lib._objc_msgSend_697(
+        _id, _lib._sel_stringFromNumber_1, number?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNumber numberFromString_(NSString? string) {
+    final _ret = _lib._objc_msgSend_698(
+        _id, _lib._sel_numberFromString_1, string?._id ?? ffi.nullptr);
+    return NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString localizedStringFromNumber_numberStyle_(
+      SwiftLibrary _lib, NSNumber? num, int nstyle) {
+    final _ret = _lib._objc_msgSend_699(
+        _lib._class_NSNumberFormatter1,
+        _lib._sel_localizedStringFromNumber_numberStyle_1,
+        num?._id ?? ffi.nullptr,
+        nstyle);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static int defaultFormatterBehavior(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_700(
+        _lib._class_NSNumberFormatter1, _lib._sel_defaultFormatterBehavior1);
+  }
+
+  static void setDefaultFormatterBehavior_(SwiftLibrary _lib, int behavior) {
+    return _lib._objc_msgSend_701(_lib._class_NSNumberFormatter1,
+        _lib._sel_setDefaultFormatterBehavior_1, behavior);
+  }
+
+  int get numberStyle {
+    return _lib._objc_msgSend_702(_id, _lib._sel_numberStyle1);
+  }
+
+  set numberStyle(int value) {
+    _lib._objc_msgSend_703(_id, _lib._sel_setNumberStyle_1, value);
+  }
+
+  NSLocale? get locale {
+    final _ret = _lib._objc_msgSend_176(_id, _lib._sel_locale1);
+    return _ret.address == 0
+        ? null
+        : NSLocale._(_ret, _lib, retain: true, release: true);
+  }
+
+  set locale(NSLocale? value) {
+    _lib._objc_msgSend_664(
+        _id, _lib._sel_setLocale_1, value?._id ?? ffi.nullptr);
+  }
+
+  bool get generatesDecimalNumbers {
+    return _lib._objc_msgSend_12(_id, _lib._sel_generatesDecimalNumbers1);
+  }
+
+  set generatesDecimalNumbers(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setGeneratesDecimalNumbers_1, value);
+  }
+
+  int get formatterBehavior {
+    return _lib._objc_msgSend_700(_id, _lib._sel_formatterBehavior1);
+  }
+
+  set formatterBehavior(int value) {
+    _lib._objc_msgSend_704(_id, _lib._sel_setFormatterBehavior_1, value);
+  }
+
+  NSString? get negativeFormat {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_negativeFormat1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set negativeFormat(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setNegativeFormat_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSDictionary? get textAttributesForNegativeValues {
+    final _ret =
+        _lib._objc_msgSend_164(_id, _lib._sel_textAttributesForNegativeValues1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  set textAttributesForNegativeValues(NSDictionary? value) {
+    _lib._objc_msgSend_165(_id, _lib._sel_setTextAttributesForNegativeValues_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get positiveFormat {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_positiveFormat1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set positiveFormat(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setPositiveFormat_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSDictionary? get textAttributesForPositiveValues {
+    final _ret =
+        _lib._objc_msgSend_164(_id, _lib._sel_textAttributesForPositiveValues1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  set textAttributesForPositiveValues(NSDictionary? value) {
+    _lib._objc_msgSend_165(_id, _lib._sel_setTextAttributesForPositiveValues_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  bool get allowsFloats {
+    return _lib._objc_msgSend_12(_id, _lib._sel_allowsFloats1);
+  }
+
+  set allowsFloats(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setAllowsFloats_1, value);
+  }
+
+  NSString? get decimalSeparator {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_decimalSeparator1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set decimalSeparator(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setDecimalSeparator_1, value?._id ?? ffi.nullptr);
+  }
+
+  bool get alwaysShowsDecimalSeparator {
+    return _lib._objc_msgSend_12(_id, _lib._sel_alwaysShowsDecimalSeparator1);
+  }
+
+  set alwaysShowsDecimalSeparator(bool value) {
+    _lib._objc_msgSend_460(
+        _id, _lib._sel_setAlwaysShowsDecimalSeparator_1, value);
+  }
+
+  NSString? get currencyDecimalSeparator {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_currencyDecimalSeparator1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set currencyDecimalSeparator(NSString? value) {
+    _lib._objc_msgSend_477(_id, _lib._sel_setCurrencyDecimalSeparator_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  bool get usesGroupingSeparator {
+    return _lib._objc_msgSend_12(_id, _lib._sel_usesGroupingSeparator1);
+  }
+
+  set usesGroupingSeparator(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setUsesGroupingSeparator_1, value);
+  }
+
+  NSString? get groupingSeparator {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_groupingSeparator1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set groupingSeparator(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setGroupingSeparator_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get zeroSymbol {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_zeroSymbol1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set zeroSymbol(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setZeroSymbol_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSDictionary? get textAttributesForZero {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_textAttributesForZero1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  set textAttributesForZero(NSDictionary? value) {
+    _lib._objc_msgSend_165(
+        _id, _lib._sel_setTextAttributesForZero_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get nilSymbol {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_nilSymbol1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set nilSymbol(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setNilSymbol_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSDictionary? get textAttributesForNil {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_textAttributesForNil1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  set textAttributesForNil(NSDictionary? value) {
+    _lib._objc_msgSend_165(
+        _id, _lib._sel_setTextAttributesForNil_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get notANumberSymbol {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_notANumberSymbol1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set notANumberSymbol(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setNotANumberSymbol_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSDictionary? get textAttributesForNotANumber {
+    final _ret =
+        _lib._objc_msgSend_164(_id, _lib._sel_textAttributesForNotANumber1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  set textAttributesForNotANumber(NSDictionary? value) {
+    _lib._objc_msgSend_165(_id, _lib._sel_setTextAttributesForNotANumber_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get positiveInfinitySymbol {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_positiveInfinitySymbol1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set positiveInfinitySymbol(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setPositiveInfinitySymbol_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSDictionary? get textAttributesForPositiveInfinity {
+    final _ret = _lib._objc_msgSend_164(
+        _id, _lib._sel_textAttributesForPositiveInfinity1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  set textAttributesForPositiveInfinity(NSDictionary? value) {
+    _lib._objc_msgSend_165(
+        _id,
+        _lib._sel_setTextAttributesForPositiveInfinity_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get negativeInfinitySymbol {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_negativeInfinitySymbol1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set negativeInfinitySymbol(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setNegativeInfinitySymbol_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSDictionary? get textAttributesForNegativeInfinity {
+    final _ret = _lib._objc_msgSend_164(
+        _id, _lib._sel_textAttributesForNegativeInfinity1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  set textAttributesForNegativeInfinity(NSDictionary? value) {
+    _lib._objc_msgSend_165(
+        _id,
+        _lib._sel_setTextAttributesForNegativeInfinity_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get positivePrefix {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_positivePrefix1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set positivePrefix(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setPositivePrefix_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get positiveSuffix {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_positiveSuffix1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set positiveSuffix(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setPositiveSuffix_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get negativePrefix {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_negativePrefix1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set negativePrefix(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setNegativePrefix_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get negativeSuffix {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_negativeSuffix1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set negativeSuffix(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setNegativeSuffix_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get currencyCode {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_currencyCode1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set currencyCode(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setCurrencyCode_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get currencySymbol {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_currencySymbol1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set currencySymbol(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setCurrencySymbol_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get internationalCurrencySymbol {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_internationalCurrencySymbol1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set internationalCurrencySymbol(NSString? value) {
+    _lib._objc_msgSend_477(_id, _lib._sel_setInternationalCurrencySymbol_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get percentSymbol {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_percentSymbol1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set percentSymbol(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setPercentSymbol_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get perMillSymbol {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_perMillSymbol1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set perMillSymbol(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setPerMillSymbol_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get minusSign {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_minusSign1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set minusSign(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setMinusSign_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get plusSign {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_plusSign1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set plusSign(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setPlusSign_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get exponentSymbol {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_exponentSymbol1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set exponentSymbol(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setExponentSymbol_1, value?._id ?? ffi.nullptr);
+  }
+
+  int get groupingSize {
+    return _lib._objc_msgSend_10(_id, _lib._sel_groupingSize1);
+  }
+
+  set groupingSize(int value) {
+    _lib._objc_msgSend_451(_id, _lib._sel_setGroupingSize_1, value);
+  }
+
+  int get secondaryGroupingSize {
+    return _lib._objc_msgSend_10(_id, _lib._sel_secondaryGroupingSize1);
+  }
+
+  set secondaryGroupingSize(int value) {
+    _lib._objc_msgSend_451(_id, _lib._sel_setSecondaryGroupingSize_1, value);
+  }
+
+  NSNumber? get multiplier {
+    final _ret = _lib._objc_msgSend_192(_id, _lib._sel_multiplier1);
+    return _ret.address == 0
+        ? null
+        : NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  set multiplier(NSNumber? value) {
+    _lib._objc_msgSend_705(
+        _id, _lib._sel_setMultiplier_1, value?._id ?? ffi.nullptr);
+  }
+
+  int get formatWidth {
+    return _lib._objc_msgSend_10(_id, _lib._sel_formatWidth1);
+  }
+
+  set formatWidth(int value) {
+    _lib._objc_msgSend_451(_id, _lib._sel_setFormatWidth_1, value);
+  }
+
+  NSString? get paddingCharacter {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_paddingCharacter1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set paddingCharacter(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setPaddingCharacter_1, value?._id ?? ffi.nullptr);
+  }
+
+  int get paddingPosition {
+    return _lib._objc_msgSend_706(_id, _lib._sel_paddingPosition1);
+  }
+
+  set paddingPosition(int value) {
+    _lib._objc_msgSend_707(_id, _lib._sel_setPaddingPosition_1, value);
+  }
+
+  int get roundingMode {
+    return _lib._objc_msgSend_708(_id, _lib._sel_roundingMode1);
+  }
+
+  set roundingMode(int value) {
+    _lib._objc_msgSend_709(_id, _lib._sel_setRoundingMode_1, value);
+  }
+
+  NSNumber? get roundingIncrement {
+    final _ret = _lib._objc_msgSend_192(_id, _lib._sel_roundingIncrement1);
+    return _ret.address == 0
+        ? null
+        : NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  set roundingIncrement(NSNumber? value) {
+    _lib._objc_msgSend_705(
+        _id, _lib._sel_setRoundingIncrement_1, value?._id ?? ffi.nullptr);
+  }
+
+  int get minimumIntegerDigits {
+    return _lib._objc_msgSend_10(_id, _lib._sel_minimumIntegerDigits1);
+  }
+
+  set minimumIntegerDigits(int value) {
+    _lib._objc_msgSend_451(_id, _lib._sel_setMinimumIntegerDigits_1, value);
+  }
+
+  int get maximumIntegerDigits {
+    return _lib._objc_msgSend_10(_id, _lib._sel_maximumIntegerDigits1);
+  }
+
+  set maximumIntegerDigits(int value) {
+    _lib._objc_msgSend_451(_id, _lib._sel_setMaximumIntegerDigits_1, value);
+  }
+
+  int get minimumFractionDigits {
+    return _lib._objc_msgSend_10(_id, _lib._sel_minimumFractionDigits1);
+  }
+
+  set minimumFractionDigits(int value) {
+    _lib._objc_msgSend_451(_id, _lib._sel_setMinimumFractionDigits_1, value);
+  }
+
+  int get maximumFractionDigits {
+    return _lib._objc_msgSend_10(_id, _lib._sel_maximumFractionDigits1);
+  }
+
+  set maximumFractionDigits(int value) {
+    _lib._objc_msgSend_451(_id, _lib._sel_setMaximumFractionDigits_1, value);
+  }
+
+  NSNumber? get minimum {
+    final _ret = _lib._objc_msgSend_192(_id, _lib._sel_minimum1);
+    return _ret.address == 0
+        ? null
+        : NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  set minimum(NSNumber? value) {
+    _lib._objc_msgSend_705(
+        _id, _lib._sel_setMinimum_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSNumber? get maximum {
+    final _ret = _lib._objc_msgSend_192(_id, _lib._sel_maximum1);
+    return _ret.address == 0
+        ? null
+        : NSNumber._(_ret, _lib, retain: true, release: true);
+  }
+
+  set maximum(NSNumber? value) {
+    _lib._objc_msgSend_705(
+        _id, _lib._sel_setMaximum_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get currencyGroupingSeparator {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_currencyGroupingSeparator1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set currencyGroupingSeparator(NSString? value) {
+    _lib._objc_msgSend_477(_id, _lib._sel_setCurrencyGroupingSeparator_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  bool get lenient {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isLenient1);
+  }
+
+  set lenient(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setLenient_1, value);
+  }
+
+  bool get usesSignificantDigits {
+    return _lib._objc_msgSend_12(_id, _lib._sel_usesSignificantDigits1);
+  }
+
+  set usesSignificantDigits(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setUsesSignificantDigits_1, value);
+  }
+
+  int get minimumSignificantDigits {
+    return _lib._objc_msgSend_10(_id, _lib._sel_minimumSignificantDigits1);
+  }
+
+  set minimumSignificantDigits(int value) {
+    _lib._objc_msgSend_451(_id, _lib._sel_setMinimumSignificantDigits_1, value);
+  }
+
+  int get maximumSignificantDigits {
+    return _lib._objc_msgSend_10(_id, _lib._sel_maximumSignificantDigits1);
+  }
+
+  set maximumSignificantDigits(int value) {
+    _lib._objc_msgSend_451(_id, _lib._sel_setMaximumSignificantDigits_1, value);
+  }
+
+  bool get partialStringValidationEnabled {
+    return _lib._objc_msgSend_12(
+        _id, _lib._sel_isPartialStringValidationEnabled1);
+  }
+
+  set partialStringValidationEnabled(bool value) {
+    _lib._objc_msgSend_460(
+        _id, _lib._sel_setPartialStringValidationEnabled_1, value);
+  }
+
+  bool get hasThousandSeparators {
+    return _lib._objc_msgSend_12(_id, _lib._sel_hasThousandSeparators1);
+  }
+
+  set hasThousandSeparators(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setHasThousandSeparators_1, value);
+  }
+
+  NSString? get thousandSeparator {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_thousandSeparator1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set thousandSeparator(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setThousandSeparator_1, value?._id ?? ffi.nullptr);
+  }
+
+  bool get localizesFormat {
+    return _lib._objc_msgSend_12(_id, _lib._sel_localizesFormat1);
+  }
+
+  set localizesFormat(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setLocalizesFormat_1, value);
+  }
+
+  NSString? get format {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_format1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set format(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setFormat_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSAttributedString? get attributedStringForZero {
+    final _ret =
+        _lib._objc_msgSend_640(_id, _lib._sel_attributedStringForZero1);
+    return _ret.address == 0
+        ? null
+        : NSAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set attributedStringForZero(NSAttributedString? value) {
+    _lib._objc_msgSend_710(
+        _id, _lib._sel_setAttributedStringForZero_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSAttributedString? get attributedStringForNil {
+    final _ret = _lib._objc_msgSend_640(_id, _lib._sel_attributedStringForNil1);
+    return _ret.address == 0
+        ? null
+        : NSAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set attributedStringForNil(NSAttributedString? value) {
+    _lib._objc_msgSend_710(
+        _id, _lib._sel_setAttributedStringForNil_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSAttributedString? get attributedStringForNotANumber {
+    final _ret =
+        _lib._objc_msgSend_640(_id, _lib._sel_attributedStringForNotANumber1);
+    return _ret.address == 0
+        ? null
+        : NSAttributedString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set attributedStringForNotANumber(NSAttributedString? value) {
+    _lib._objc_msgSend_710(_id, _lib._sel_setAttributedStringForNotANumber_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  NSDecimalNumberHandler? get roundingBehavior {
+    final _ret = _lib._objc_msgSend_711(_id, _lib._sel_roundingBehavior1);
+    return _ret.address == 0
+        ? null
+        : NSDecimalNumberHandler._(_ret, _lib, retain: true, release: true);
+  }
+
+  set roundingBehavior(NSDecimalNumberHandler? value) {
+    _lib._objc_msgSend_713(
+        _id, _lib._sel_setRoundingBehavior_1, value?._id ?? ffi.nullptr);
+  }
+
+  static NSNumberFormatter new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSNumberFormatter1, _lib._sel_new1);
+    return NSNumberFormatter._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSNumberFormatter alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSNumberFormatter1, _lib._sel_alloc1);
+    return NSNumberFormatter._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSNumberFormatter1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSNumberFormatter1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSNumberFormatter1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSNumberFormatter1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSNumberFormatter1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSNumberFormatter1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSNumberFormatter1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSNumberFormatter1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSNumberFormatter1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSNumberFormatterStyle {
+  static const int NSNumberFormatterNoStyle = 0;
+  static const int NSNumberFormatterDecimalStyle = 1;
+  static const int NSNumberFormatterCurrencyStyle = 2;
+  static const int NSNumberFormatterPercentStyle = 3;
+  static const int NSNumberFormatterScientificStyle = 4;
+  static const int NSNumberFormatterSpellOutStyle = 5;
+  static const int NSNumberFormatterOrdinalStyle = 6;
+  static const int NSNumberFormatterCurrencyISOCodeStyle = 8;
+  static const int NSNumberFormatterCurrencyPluralStyle = 9;
+  static const int NSNumberFormatterCurrencyAccountingStyle = 10;
+}
+
+abstract class NSNumberFormatterBehavior {
+  static const int NSNumberFormatterBehaviorDefault = 0;
+  static const int NSNumberFormatterBehavior10_0 = 1000;
+  static const int NSNumberFormatterBehavior10_4 = 1040;
+}
+
+abstract class NSNumberFormatterPadPosition {
+  static const int NSNumberFormatterPadBeforePrefix = 0;
+  static const int NSNumberFormatterPadAfterPrefix = 1;
+  static const int NSNumberFormatterPadBeforeSuffix = 2;
+  static const int NSNumberFormatterPadAfterSuffix = 3;
+}
+
+abstract class NSNumberFormatterRoundingMode {
+  static const int NSNumberFormatterRoundCeiling = 0;
+  static const int NSNumberFormatterRoundFloor = 1;
+  static const int NSNumberFormatterRoundDown = 2;
+  static const int NSNumberFormatterRoundUp = 3;
+  static const int NSNumberFormatterRoundHalfEven = 4;
+  static const int NSNumberFormatterRoundHalfDown = 5;
+  static const int NSNumberFormatterRoundHalfUp = 6;
+}
+
+class NSDecimalNumberHandler extends NSObject {
+  NSDecimalNumberHandler._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSDecimalNumberHandler] that points to the same underlying object as [other].
+  static NSDecimalNumberHandler castFrom<T extends _ObjCWrapper>(T other) {
+    return NSDecimalNumberHandler._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSDecimalNumberHandler] that wraps the given raw object pointer.
+  static NSDecimalNumberHandler castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSDecimalNumberHandler._(other, lib,
+        retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSDecimalNumberHandler].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSDecimalNumberHandler1);
+  }
+
+  static NSDecimalNumberHandler? getDefaultDecimalNumberHandler(
+      SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_711(_lib._class_NSDecimalNumberHandler1,
+        _lib._sel_defaultDecimalNumberHandler1);
+    return _ret.address == 0
+        ? null
+        : NSDecimalNumberHandler._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDecimalNumberHandler
+      initWithRoundingMode_scale_raiseOnExactness_raiseOnOverflow_raiseOnUnderflow_raiseOnDivideByZero_(
+          int roundingMode,
+          int scale,
+          bool exact,
+          bool overflow,
+          bool underflow,
+          bool divideByZero) {
+    final _ret = _lib._objc_msgSend_712(
+        _id,
+        _lib._sel_initWithRoundingMode_scale_raiseOnExactness_raiseOnOverflow_raiseOnUnderflow_raiseOnDivideByZero_1,
+        roundingMode,
+        scale,
+        exact,
+        overflow,
+        underflow,
+        divideByZero);
+    return NSDecimalNumberHandler._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDecimalNumberHandler
+      decimalNumberHandlerWithRoundingMode_scale_raiseOnExactness_raiseOnOverflow_raiseOnUnderflow_raiseOnDivideByZero_(
+          SwiftLibrary _lib,
+          int roundingMode,
+          int scale,
+          bool exact,
+          bool overflow,
+          bool underflow,
+          bool divideByZero) {
+    final _ret = _lib._objc_msgSend_712(
+        _lib._class_NSDecimalNumberHandler1,
+        _lib._sel_decimalNumberHandlerWithRoundingMode_scale_raiseOnExactness_raiseOnOverflow_raiseOnUnderflow_raiseOnDivideByZero_1,
+        roundingMode,
+        scale,
+        exact,
+        overflow,
+        underflow,
+        divideByZero);
+    return NSDecimalNumberHandler._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDecimalNumberHandler new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSDecimalNumberHandler1, _lib._sel_new1);
+    return NSDecimalNumberHandler._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSDecimalNumberHandler alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSDecimalNumberHandler1, _lib._sel_alloc1);
+    return NSDecimalNumberHandler._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSDecimalNumberHandler1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSDecimalNumberHandler1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSDecimalNumberHandler1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSDecimalNumberHandler1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSDecimalNumberHandler1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSDecimalNumberHandler1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSDecimalNumberHandler1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSDecimalNumberHandler1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSDecimalNumberHandler1,
+        _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSRoundingMode {
+  static const int NSRoundPlain = 0;
+  static const int NSRoundDown = 1;
+  static const int NSRoundUp = 2;
+  static const int NSRoundBankers = 3;
+}
+
+class NSScanner extends NSObject {
+  NSScanner._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSScanner] that points to the same underlying object as [other].
+  static NSScanner castFrom<T extends _ObjCWrapper>(T other) {
+    return NSScanner._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSScanner] that wraps the given raw object pointer.
+  static NSScanner castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSScanner._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSScanner].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSScanner1);
+  }
+
+  NSString? get string {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_string1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get scanLocation {
+    return _lib._objc_msgSend_10(_id, _lib._sel_scanLocation1);
+  }
+
+  set scanLocation(int value) {
+    _lib._objc_msgSend_451(_id, _lib._sel_setScanLocation_1, value);
+  }
+
+  NSCharacterSet? get charactersToBeSkipped {
+    final _ret = _lib._objc_msgSend_168(_id, _lib._sel_charactersToBeSkipped1);
+    return _ret.address == 0
+        ? null
+        : NSCharacterSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  set charactersToBeSkipped(NSCharacterSet? value) {
+    _lib._objc_msgSend_714(
+        _id, _lib._sel_setCharactersToBeSkipped_1, value?._id ?? ffi.nullptr);
+  }
+
+  bool get caseSensitive {
+    return _lib._objc_msgSend_12(_id, _lib._sel_caseSensitive1);
+  }
+
+  set caseSensitive(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setCaseSensitive_1, value);
+  }
+
+  NSObject get locale {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_locale1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  set locale(NSObject value) {
+    _lib._objc_msgSend_368(_id, _lib._sel_setLocale_1, value._id);
+  }
+
+  NSScanner initWithString_(NSString? string) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initWithString_1, string?._id ?? ffi.nullptr);
+    return NSScanner._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool scanInt_(ffi.Pointer<ffi.Int> result) {
+    return _lib._objc_msgSend_715(_id, _lib._sel_scanInt_1, result);
+  }
+
+  bool scanInteger_(ffi.Pointer<NSInteger> result) {
+    return _lib._objc_msgSend_716(_id, _lib._sel_scanInteger_1, result);
+  }
+
+  bool scanLongLong_(ffi.Pointer<ffi.LongLong> result) {
+    return _lib._objc_msgSend_717(_id, _lib._sel_scanLongLong_1, result);
+  }
+
+  bool scanUnsignedLongLong_(ffi.Pointer<ffi.UnsignedLongLong> result) {
+    return _lib._objc_msgSend_718(
+        _id, _lib._sel_scanUnsignedLongLong_1, result);
+  }
+
+  bool scanFloat_(ffi.Pointer<ffi.Float> result) {
+    return _lib._objc_msgSend_719(_id, _lib._sel_scanFloat_1, result);
+  }
+
+  bool scanDouble_(ffi.Pointer<ffi.Double> result) {
+    return _lib._objc_msgSend_720(_id, _lib._sel_scanDouble_1, result);
+  }
+
+  bool scanHexInt_(ffi.Pointer<ffi.UnsignedInt> result) {
+    return _lib._objc_msgSend_721(_id, _lib._sel_scanHexInt_1, result);
+  }
+
+  bool scanHexLongLong_(ffi.Pointer<ffi.UnsignedLongLong> result) {
+    return _lib._objc_msgSend_718(_id, _lib._sel_scanHexLongLong_1, result);
+  }
+
+  bool scanHexFloat_(ffi.Pointer<ffi.Float> result) {
+    return _lib._objc_msgSend_719(_id, _lib._sel_scanHexFloat_1, result);
+  }
+
+  bool scanHexDouble_(ffi.Pointer<ffi.Double> result) {
+    return _lib._objc_msgSend_720(_id, _lib._sel_scanHexDouble_1, result);
+  }
+
+  bool scanString_intoString_(
+      NSString? string, ffi.Pointer<ffi.Pointer<ObjCObject>> result) {
+    return _lib._objc_msgSend_722(_id, _lib._sel_scanString_intoString_1,
+        string?._id ?? ffi.nullptr, result);
+  }
+
+  bool scanCharactersFromSet_intoString_(
+      NSCharacterSet? set, ffi.Pointer<ffi.Pointer<ObjCObject>> result) {
+    return _lib._objc_msgSend_723(
+        _id,
+        _lib._sel_scanCharactersFromSet_intoString_1,
+        set?._id ?? ffi.nullptr,
+        result);
+  }
+
+  bool scanUpToString_intoString_(
+      NSString? string, ffi.Pointer<ffi.Pointer<ObjCObject>> result) {
+    return _lib._objc_msgSend_722(_id, _lib._sel_scanUpToString_intoString_1,
+        string?._id ?? ffi.nullptr, result);
+  }
+
+  bool scanUpToCharactersFromSet_intoString_(
+      NSCharacterSet? set, ffi.Pointer<ffi.Pointer<ObjCObject>> result) {
+    return _lib._objc_msgSend_723(
+        _id,
+        _lib._sel_scanUpToCharactersFromSet_intoString_1,
+        set?._id ?? ffi.nullptr,
+        result);
+  }
+
+  bool get atEnd {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isAtEnd1);
+  }
+
+  static NSScanner scannerWithString_(SwiftLibrary _lib, NSString? string) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSScanner1,
+        _lib._sel_scannerWithString_1, string?._id ?? ffi.nullptr);
+    return NSScanner._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject localizedScannerWithString_(
+      SwiftLibrary _lib, NSString? string) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSScanner1,
+        _lib._sel_localizedScannerWithString_1, string?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool scanDecimal_(ffi.Pointer<NSDecimal> dcm) {
+    return _lib._objc_msgSend_724(_id, _lib._sel_scanDecimal_1, dcm);
+  }
+
+  static NSScanner new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSScanner1, _lib._sel_new1);
+    return NSScanner._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSScanner alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSScanner1, _lib._sel_alloc1);
+    return NSScanner._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSScanner1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSScanner1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSScanner1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSScanner1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSScanner1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSScanner1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSScanner1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSScanner1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSScanner1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSDecimal extends ffi.Opaque {}
+
+class NSException extends NSObject {
+  NSException._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSException] that points to the same underlying object as [other].
+  static NSException castFrom<T extends _ObjCWrapper>(T other) {
+    return NSException._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSException] that wraps the given raw object pointer.
+  static NSException castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSException._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSException].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSException1);
+  }
+
+  static NSException exceptionWithName_reason_userInfo_(SwiftLibrary _lib,
+      NSExceptionName name, NSString? reason, NSDictionary? userInfo) {
+    final _ret = _lib._objc_msgSend_725(
+        _lib._class_NSException1,
+        _lib._sel_exceptionWithName_reason_userInfo_1,
+        name,
+        reason?._id ?? ffi.nullptr,
+        userInfo?._id ?? ffi.nullptr);
+    return NSException._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSException initWithName_reason_userInfo_(
+      NSExceptionName aName, NSString? aReason, NSDictionary? aUserInfo) {
+    final _ret = _lib._objc_msgSend_551(
+        _id,
+        _lib._sel_initWithName_reason_userInfo_1,
+        aName,
+        aReason?._id ?? ffi.nullptr,
+        aUserInfo?._id ?? ffi.nullptr);
+    return NSException._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSExceptionName get name {
+    return _lib._objc_msgSend_20(_id, _lib._sel_name1);
+  }
+
+  NSString? get reason {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_reason1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary? get userInfo {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_userInfo1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get callStackReturnAddresses {
+    final _ret =
+        _lib._objc_msgSend_80(_id, _lib._sel_callStackReturnAddresses1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get callStackSymbols {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_callStackSymbols1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  void raise() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_raise1);
+  }
+
+  static void raise_format_(
+      SwiftLibrary _lib, NSExceptionName name, NSString? format) {
+    return _lib._objc_msgSend_483(_lib._class_NSException1,
+        _lib._sel_raise_format_1, name, format?._id ?? ffi.nullptr);
+  }
+
+  static void raise_format_arguments_(SwiftLibrary _lib, NSExceptionName name,
+      NSString? format, ffi.Pointer<__va_list_tag> argList) {
+    return _lib._objc_msgSend_726(
+        _lib._class_NSException1,
+        _lib._sel_raise_format_arguments_1,
+        name,
+        format?._id ?? ffi.nullptr,
+        argList);
+  }
+
+  static NSException new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSException1, _lib._sel_new1);
+    return NSException._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSException alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSException1, _lib._sel_alloc1);
+    return NSException._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSException1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSException1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSException1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSException1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSException1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSException1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSException1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSException1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSException1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef NSExceptionName = ffi.Pointer<ObjCObject>;
+
+class NSFileHandle extends NSObject {
+  NSFileHandle._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSFileHandle] that points to the same underlying object as [other].
+  static NSFileHandle castFrom<T extends _ObjCWrapper>(T other) {
+    return NSFileHandle._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSFileHandle] that wraps the given raw object pointer.
+  static NSFileHandle castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSFileHandle._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSFileHandle].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSFileHandle1);
+  }
+
+  NSData? get availableData {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_availableData1);
+    return _ret.address == 0
+        ? null
+        : NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSFileHandle initWithFileDescriptor_closeOnDealloc_(int fd, bool closeopt) {
+    final _ret = _lib._objc_msgSend_727(
+        _id, _lib._sel_initWithFileDescriptor_closeOnDealloc_1, fd, closeopt);
+    return NSFileHandle._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSFileHandle initWithCoder_(NSCoder? coder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr);
+    return NSFileHandle._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData readDataToEndOfFileAndReturnError_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_728(
+        _id, _lib._sel_readDataToEndOfFileAndReturnError_1, error);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData readDataUpToLength_error_(
+      int length, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_729(
+        _id, _lib._sel_readDataUpToLength_error_1, length, error);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool writeData_error_(
+      NSData? data, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_730(
+        _id, _lib._sel_writeData_error_1, data?._id ?? ffi.nullptr, error);
+  }
+
+  bool getOffset_error_(ffi.Pointer<ffi.UnsignedLongLong> offsetInFile,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_731(
+        _id, _lib._sel_getOffset_error_1, offsetInFile, error);
+  }
+
+  bool seekToEndReturningOffset_error_(
+      ffi.Pointer<ffi.UnsignedLongLong> offsetInFile,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_731(
+        _id, _lib._sel_seekToEndReturningOffset_error_1, offsetInFile, error);
+  }
+
+  bool seekToOffset_error_(
+      int offset, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_732(
+        _id, _lib._sel_seekToOffset_error_1, offset, error);
+  }
+
+  bool truncateAtOffset_error_(
+      int offset, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_732(
+        _id, _lib._sel_truncateAtOffset_error_1, offset, error);
+  }
+
+  bool synchronizeAndReturnError_(ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_219(
+        _id, _lib._sel_synchronizeAndReturnError_1, error);
+  }
+
+  bool closeAndReturnError_(ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_219(_id, _lib._sel_closeAndReturnError_1, error);
+  }
+
+  static NSFileHandle? getFileHandleWithStandardInput(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_733(
+        _lib._class_NSFileHandle1, _lib._sel_fileHandleWithStandardInput1);
+    return _ret.address == 0
+        ? null
+        : NSFileHandle._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSFileHandle? getFileHandleWithStandardOutput(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_733(
+        _lib._class_NSFileHandle1, _lib._sel_fileHandleWithStandardOutput1);
+    return _ret.address == 0
+        ? null
+        : NSFileHandle._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSFileHandle? getFileHandleWithStandardError(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_733(
+        _lib._class_NSFileHandle1, _lib._sel_fileHandleWithStandardError1);
+    return _ret.address == 0
+        ? null
+        : NSFileHandle._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSFileHandle? getFileHandleWithNullDevice(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_733(
+        _lib._class_NSFileHandle1, _lib._sel_fileHandleWithNullDevice1);
+    return _ret.address == 0
+        ? null
+        : NSFileHandle._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSFileHandle fileHandleForReadingAtPath_(
+      SwiftLibrary _lib, NSString? path) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSFileHandle1,
+        _lib._sel_fileHandleForReadingAtPath_1, path?._id ?? ffi.nullptr);
+    return NSFileHandle._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSFileHandle fileHandleForWritingAtPath_(
+      SwiftLibrary _lib, NSString? path) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSFileHandle1,
+        _lib._sel_fileHandleForWritingAtPath_1, path?._id ?? ffi.nullptr);
+    return NSFileHandle._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSFileHandle fileHandleForUpdatingAtPath_(
+      SwiftLibrary _lib, NSString? path) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSFileHandle1,
+        _lib._sel_fileHandleForUpdatingAtPath_1, path?._id ?? ffi.nullptr);
+    return NSFileHandle._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSFileHandle fileHandleForReadingFromURL_error_(SwiftLibrary _lib,
+      NSURL? url, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_734(
+        _lib._class_NSFileHandle1,
+        _lib._sel_fileHandleForReadingFromURL_error_1,
+        url?._id ?? ffi.nullptr,
+        error);
+    return NSFileHandle._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSFileHandle fileHandleForWritingToURL_error_(SwiftLibrary _lib,
+      NSURL? url, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_734(
+        _lib._class_NSFileHandle1,
+        _lib._sel_fileHandleForWritingToURL_error_1,
+        url?._id ?? ffi.nullptr,
+        error);
+    return NSFileHandle._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSFileHandle fileHandleForUpdatingURL_error_(SwiftLibrary _lib,
+      NSURL? url, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_734(
+        _lib._class_NSFileHandle1,
+        _lib._sel_fileHandleForUpdatingURL_error_1,
+        url?._id ?? ffi.nullptr,
+        error);
+    return NSFileHandle._(_ret, _lib, retain: true, release: true);
+  }
+
+  void readInBackgroundAndNotifyForModes_(NSArray? modes) {
+    return _lib._objc_msgSend_412(
+        _id,
+        _lib._sel_readInBackgroundAndNotifyForModes_1,
+        modes?._id ?? ffi.nullptr);
+  }
+
+  void readInBackgroundAndNotify() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_readInBackgroundAndNotify1);
+  }
+
+  void readToEndOfFileInBackgroundAndNotifyForModes_(NSArray? modes) {
+    return _lib._objc_msgSend_412(
+        _id,
+        _lib._sel_readToEndOfFileInBackgroundAndNotifyForModes_1,
+        modes?._id ?? ffi.nullptr);
+  }
+
+  void readToEndOfFileInBackgroundAndNotify() {
+    return _lib._objc_msgSend_1(
+        _id, _lib._sel_readToEndOfFileInBackgroundAndNotify1);
+  }
+
+  void acceptConnectionInBackgroundAndNotifyForModes_(NSArray? modes) {
+    return _lib._objc_msgSend_412(
+        _id,
+        _lib._sel_acceptConnectionInBackgroundAndNotifyForModes_1,
+        modes?._id ?? ffi.nullptr);
+  }
+
+  void acceptConnectionInBackgroundAndNotify() {
+    return _lib._objc_msgSend_1(
+        _id, _lib._sel_acceptConnectionInBackgroundAndNotify1);
+  }
+
+  void waitForDataInBackgroundAndNotifyForModes_(NSArray? modes) {
+    return _lib._objc_msgSend_412(
+        _id,
+        _lib._sel_waitForDataInBackgroundAndNotifyForModes_1,
+        modes?._id ?? ffi.nullptr);
+  }
+
+  void waitForDataInBackgroundAndNotify() {
+    return _lib._objc_msgSend_1(
+        _id, _lib._sel_waitForDataInBackgroundAndNotify1);
+  }
+
+  ObjCBlock29 get readabilityHandler {
+    final _ret = _lib._objc_msgSend_735(_id, _lib._sel_readabilityHandler1);
+    return ObjCBlock29._(_ret, _lib);
+  }
+
+  set readabilityHandler(ObjCBlock29 value) {
+    _lib._objc_msgSend_736(_id, _lib._sel_setReadabilityHandler_1, value._id);
+  }
+
+  ObjCBlock29 get writeabilityHandler {
+    final _ret = _lib._objc_msgSend_735(_id, _lib._sel_writeabilityHandler1);
+    return ObjCBlock29._(_ret, _lib);
+  }
+
+  set writeabilityHandler(ObjCBlock29 value) {
+    _lib._objc_msgSend_736(_id, _lib._sel_setWriteabilityHandler_1, value._id);
+  }
+
+  NSFileHandle initWithFileDescriptor_(int fd) {
+    final _ret =
+        _lib._objc_msgSend_737(_id, _lib._sel_initWithFileDescriptor_1, fd);
+    return NSFileHandle._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get fileDescriptor {
+    return _lib._objc_msgSend_213(_id, _lib._sel_fileDescriptor1);
+  }
+
+  NSData readDataToEndOfFile() {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_readDataToEndOfFile1);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData readDataOfLength_(int length) {
+    final _ret =
+        _lib._objc_msgSend_315(_id, _lib._sel_readDataOfLength_1, length);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  void writeData_(NSData? data) {
+    return _lib._objc_msgSend_248(
+        _id, _lib._sel_writeData_1, data?._id ?? ffi.nullptr);
+  }
+
+  int get offsetInFile {
+    return _lib._objc_msgSend_148(_id, _lib._sel_offsetInFile1);
+  }
+
+  int seekToEndOfFile() {
+    return _lib._objc_msgSend_148(_id, _lib._sel_seekToEndOfFile1);
+  }
+
+  void seekToFileOffset_(int offset) {
+    return _lib._objc_msgSend_738(_id, _lib._sel_seekToFileOffset_1, offset);
+  }
+
+  void truncateFileAtOffset_(int offset) {
+    return _lib._objc_msgSend_738(
+        _id, _lib._sel_truncateFileAtOffset_1, offset);
+  }
+
+  void synchronizeFile() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_synchronizeFile1);
+  }
+
+  void closeFile() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_closeFile1);
+  }
+
+  static NSFileHandle new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSFileHandle1, _lib._sel_new1);
+    return NSFileHandle._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSFileHandle alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSFileHandle1, _lib._sel_alloc1);
+    return NSFileHandle._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSFileHandle1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSFileHandle1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSFileHandle1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSFileHandle1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSFileHandle1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSFileHandle1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSFileHandle1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSFileHandle1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSFileHandle1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+void _ObjCBlock29_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ObjCObject> arg0) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ObjCObject> arg0)>>()
+      .asFunction<void Function(ffi.Pointer<ObjCObject> arg0)>()(arg0);
+}
+
+final _ObjCBlock29_closureRegistry = <int, Function>{};
+int _ObjCBlock29_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock29_registerClosure(Function fn) {
+  final id = ++_ObjCBlock29_closureRegistryIndex;
+  _ObjCBlock29_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock29_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ObjCObject> arg0) {
+  return _ObjCBlock29_closureRegistry[block.ref.target.address]!(arg0);
+}
+
+class ObjCBlock29 extends _ObjCBlockBase {
+  ObjCBlock29._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock29.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0)>(
+                        _ObjCBlock29_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock29.fromFunction(
+      SwiftLibrary lib, void Function(ffi.Pointer<ObjCObject> arg0) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0)>(
+                        _ObjCBlock29_closureTrampoline)
+                    .cast(),
+                _ObjCBlock29_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0)>>()
+        .asFunction<
+            void Function(ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0)>()(_id, arg0);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class NSHTTPCookieStorage extends NSObject {
+  NSHTTPCookieStorage._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSHTTPCookieStorage] that points to the same underlying object as [other].
+  static NSHTTPCookieStorage castFrom<T extends _ObjCWrapper>(T other) {
+    return NSHTTPCookieStorage._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSHTTPCookieStorage] that wraps the given raw object pointer.
+  static NSHTTPCookieStorage castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSHTTPCookieStorage._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSHTTPCookieStorage].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSHTTPCookieStorage1);
+  }
+
+  static NSHTTPCookieStorage? getSharedHTTPCookieStorage(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_739(
+        _lib._class_NSHTTPCookieStorage1, _lib._sel_sharedHTTPCookieStorage1);
+    return _ret.address == 0
+        ? null
+        : NSHTTPCookieStorage._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSHTTPCookieStorage sharedCookieStorageForGroupContainerIdentifier_(
+      SwiftLibrary _lib, NSString? identifier) {
+    final _ret = _lib._objc_msgSend_740(
+        _lib._class_NSHTTPCookieStorage1,
+        _lib._sel_sharedCookieStorageForGroupContainerIdentifier_1,
+        identifier?._id ?? ffi.nullptr);
+    return NSHTTPCookieStorage._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get cookies {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_cookies1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  void setCookie_(NSHTTPCookie? cookie) {
+    return _lib._objc_msgSend_743(
+        _id, _lib._sel_setCookie_1, cookie?._id ?? ffi.nullptr);
+  }
+
+  void deleteCookie_(NSHTTPCookie? cookie) {
+    return _lib._objc_msgSend_743(
+        _id, _lib._sel_deleteCookie_1, cookie?._id ?? ffi.nullptr);
+  }
+
+  void removeCookiesSinceDate_(NSDate? date) {
+    return _lib._objc_msgSend_472(
+        _id, _lib._sel_removeCookiesSinceDate_1, date?._id ?? ffi.nullptr);
+  }
+
+  NSArray cookiesForURL_(NSURL? URL) {
+    final _ret = _lib._objc_msgSend_120(
+        _id, _lib._sel_cookiesForURL_1, URL?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  void setCookies_forURL_mainDocumentURL_(
+      NSArray? cookies, NSURL? URL, NSURL? mainDocumentURL) {
+    return _lib._objc_msgSend_744(
+        _id,
+        _lib._sel_setCookies_forURL_mainDocumentURL_1,
+        cookies?._id ?? ffi.nullptr,
+        URL?._id ?? ffi.nullptr,
+        mainDocumentURL?._id ?? ffi.nullptr);
+  }
+
+  int get cookieAcceptPolicy {
+    return _lib._objc_msgSend_745(_id, _lib._sel_cookieAcceptPolicy1);
+  }
+
+  set cookieAcceptPolicy(int value) {
+    _lib._objc_msgSend_746(_id, _lib._sel_setCookieAcceptPolicy_1, value);
+  }
+
+  NSArray sortedCookiesUsingDescriptors_(NSArray? sortOrder) {
+    final _ret = _lib._objc_msgSend_63(
+        _id,
+        _lib._sel_sortedCookiesUsingDescriptors_1,
+        sortOrder?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  void storeCookies_forTask_(NSArray? cookies, NSURLSessionTask? task) {
+    return _lib._objc_msgSend_766(_id, _lib._sel_storeCookies_forTask_1,
+        cookies?._id ?? ffi.nullptr, task?._id ?? ffi.nullptr);
+  }
+
+  void getCookiesForTask_completionHandler_(
+      NSURLSessionTask? task, ObjCBlock30 completionHandler) {
+    return _lib._objc_msgSend_767(
+        _id,
+        _lib._sel_getCookiesForTask_completionHandler_1,
+        task?._id ?? ffi.nullptr,
+        completionHandler._id);
+  }
+
+  static NSHTTPCookieStorage new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSHTTPCookieStorage1, _lib._sel_new1);
+    return NSHTTPCookieStorage._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSHTTPCookieStorage alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSHTTPCookieStorage1, _lib._sel_alloc1);
+    return NSHTTPCookieStorage._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSHTTPCookieStorage1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSHTTPCookieStorage1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSHTTPCookieStorage1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSHTTPCookieStorage1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSHTTPCookieStorage1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSHTTPCookieStorage1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSHTTPCookieStorage1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSHTTPCookieStorage1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSHTTPCookieStorage1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSHTTPCookie extends NSObject {
+  NSHTTPCookie._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSHTTPCookie] that points to the same underlying object as [other].
+  static NSHTTPCookie castFrom<T extends _ObjCWrapper>(T other) {
+    return NSHTTPCookie._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSHTTPCookie] that wraps the given raw object pointer.
+  static NSHTTPCookie castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSHTTPCookie._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSHTTPCookie].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSHTTPCookie1);
+  }
+
+  NSHTTPCookie initWithProperties_(NSDictionary? properties) {
+    final _ret = _lib._objc_msgSend_143(
+        _id, _lib._sel_initWithProperties_1, properties?._id ?? ffi.nullptr);
+    return NSHTTPCookie._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSHTTPCookie cookieWithProperties_(
+      SwiftLibrary _lib, NSDictionary? properties) {
+    final _ret = _lib._objc_msgSend_741(_lib._class_NSHTTPCookie1,
+        _lib._sel_cookieWithProperties_1, properties?._id ?? ffi.nullptr);
+    return NSHTTPCookie._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSDictionary requestHeaderFieldsWithCookies_(
+      SwiftLibrary _lib, NSArray? cookies) {
+    final _ret = _lib._objc_msgSend_443(
+        _lib._class_NSHTTPCookie1,
+        _lib._sel_requestHeaderFieldsWithCookies_1,
+        cookies?._id ?? ffi.nullptr);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSArray cookiesWithResponseHeaderFields_forURL_(
+      SwiftLibrary _lib, NSDictionary? headerFields, NSURL? URL) {
+    final _ret = _lib._objc_msgSend_742(
+        _lib._class_NSHTTPCookie1,
+        _lib._sel_cookiesWithResponseHeaderFields_forURL_1,
+        headerFields?._id ?? ffi.nullptr,
+        URL?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary? get properties {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_properties1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get version {
+    return _lib._objc_msgSend_10(_id, _lib._sel_version1);
+  }
+
+  NSString? get name {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_name1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get value {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_value1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate? get expiresDate {
+    final _ret = _lib._objc_msgSend_156(_id, _lib._sel_expiresDate1);
+    return _ret.address == 0
+        ? null
+        : NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool get sessionOnly {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isSessionOnly1);
+  }
+
+  NSString? get domain {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_domain1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get path {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_path1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool get secure {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isSecure1);
+  }
+
+  bool get HTTPOnly {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isHTTPOnly1);
+  }
+
+  NSString? get comment {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_comment1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get commentURL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_commentURL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get portList {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_portList1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSHTTPCookieStringPolicy get sameSitePolicy {
+    return _lib._objc_msgSend_20(_id, _lib._sel_sameSitePolicy1);
+  }
+
+  static NSHTTPCookie new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSHTTPCookie1, _lib._sel_new1);
+    return NSHTTPCookie._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSHTTPCookie alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSHTTPCookie1, _lib._sel_alloc1);
+    return NSHTTPCookie._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSHTTPCookie1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSHTTPCookie1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSHTTPCookie1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSHTTPCookie1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSHTTPCookie1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSHTTPCookie1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSHTTPCookie1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSHTTPCookie1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSHTTPCookie1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef NSHTTPCookieStringPolicy = ffi.Pointer<ObjCObject>;
+
+abstract class NSHTTPCookieAcceptPolicy {
+  static const int NSHTTPCookieAcceptPolicyAlways = 0;
+  static const int NSHTTPCookieAcceptPolicyNever = 1;
+  static const int NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain = 2;
+}
+
+class NSURLSessionTask extends NSObject {
+  NSURLSessionTask._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURLSessionTask] that points to the same underlying object as [other].
+  static NSURLSessionTask castFrom<T extends _ObjCWrapper>(T other) {
+    return NSURLSessionTask._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSURLSessionTask] that wraps the given raw object pointer.
+  static NSURLSessionTask castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURLSessionTask._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURLSessionTask].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSURLSessionTask1);
+  }
+
+  int get taskIdentifier {
+    return _lib._objc_msgSend_10(_id, _lib._sel_taskIdentifier1);
+  }
+
+  NSURLRequest? get originalRequest {
+    final _ret = _lib._objc_msgSend_761(_id, _lib._sel_originalRequest1);
+    return _ret.address == 0
+        ? null
+        : NSURLRequest._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLRequest? get currentRequest {
+    final _ret = _lib._objc_msgSend_761(_id, _lib._sel_currentRequest1);
+    return _ret.address == 0
+        ? null
+        : NSURLRequest._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLResponse? get response {
+    final _ret = _lib._objc_msgSend_763(_id, _lib._sel_response1);
+    return _ret.address == 0
+        ? null
+        : NSURLResponse._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject? get delegate {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_delegate1);
+    return _ret.address == 0
+        ? null
+        : NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  set delegate(NSObject? value) {
+    _lib._objc_msgSend_368(
+        _id, _lib._sel_setDelegate_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSProgress? get progress {
+    final _ret = _lib._objc_msgSend_577(_id, _lib._sel_progress1);
+    return _ret.address == 0
+        ? null
+        : NSProgress._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate? get earliestBeginDate {
+    final _ret = _lib._objc_msgSend_156(_id, _lib._sel_earliestBeginDate1);
+    return _ret.address == 0
+        ? null
+        : NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  set earliestBeginDate(NSDate? value) {
+    _lib._objc_msgSend_493(
+        _id, _lib._sel_setEarliestBeginDate_1, value?._id ?? ffi.nullptr);
+  }
+
+  int get countOfBytesClientExpectsToSend {
+    return _lib._objc_msgSend_584(
+        _id, _lib._sel_countOfBytesClientExpectsToSend1);
+  }
+
+  set countOfBytesClientExpectsToSend(int value) {
+    _lib._objc_msgSend_585(
+        _id, _lib._sel_setCountOfBytesClientExpectsToSend_1, value);
+  }
+
+  int get countOfBytesClientExpectsToReceive {
+    return _lib._objc_msgSend_584(
+        _id, _lib._sel_countOfBytesClientExpectsToReceive1);
+  }
+
+  set countOfBytesClientExpectsToReceive(int value) {
+    _lib._objc_msgSend_585(
+        _id, _lib._sel_setCountOfBytesClientExpectsToReceive_1, value);
+  }
+
+  int get countOfBytesSent {
+    return _lib._objc_msgSend_584(_id, _lib._sel_countOfBytesSent1);
+  }
+
+  int get countOfBytesReceived {
+    return _lib._objc_msgSend_584(_id, _lib._sel_countOfBytesReceived1);
+  }
+
+  int get countOfBytesExpectedToSend {
+    return _lib._objc_msgSend_584(_id, _lib._sel_countOfBytesExpectedToSend1);
+  }
+
+  int get countOfBytesExpectedToReceive {
+    return _lib._objc_msgSend_584(
+        _id, _lib._sel_countOfBytesExpectedToReceive1);
+  }
+
+  NSString? get taskDescription {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_taskDescription1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set taskDescription(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setTaskDescription_1, value?._id ?? ffi.nullptr);
+  }
+
+  void cancel() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_cancel1);
+  }
+
+  int get state {
+    return _lib._objc_msgSend_764(_id, _lib._sel_state1);
+  }
+
+  NSError? get error {
+    final _ret = _lib._objc_msgSend_283(_id, _lib._sel_error1);
+    return _ret.address == 0
+        ? null
+        : NSError._(_ret, _lib, retain: true, release: true);
+  }
+
+  void suspend() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_suspend1);
+  }
+
+  void resume() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_resume1);
+  }
+
+  double get priority {
+    return _lib._objc_msgSend_215(_id, _lib._sel_priority1);
+  }
+
+  set priority(double value) {
+    _lib._objc_msgSend_765(_id, _lib._sel_setPriority_1, value);
+  }
+
+  bool get prefersIncrementalDelivery {
+    return _lib._objc_msgSend_12(_id, _lib._sel_prefersIncrementalDelivery1);
+  }
+
+  set prefersIncrementalDelivery(bool value) {
+    _lib._objc_msgSend_460(
+        _id, _lib._sel_setPrefersIncrementalDelivery_1, value);
+  }
+
+  @override
+  NSURLSessionTask init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSURLSessionTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLSessionTask new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSURLSessionTask1, _lib._sel_new1);
+    return NSURLSessionTask._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSURLSessionTask alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSURLSessionTask1, _lib._sel_alloc1);
+    return NSURLSessionTask._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURLSessionTask1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLSessionTask1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSURLSessionTask1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLSessionTask1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURLSessionTask1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURLSessionTask1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURLSessionTask1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSURLSessionTask1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLSessionTask1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSURLRequest extends NSObject {
+  NSURLRequest._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURLRequest] that points to the same underlying object as [other].
+  static NSURLRequest castFrom<T extends _ObjCWrapper>(T other) {
+    return NSURLRequest._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSURLRequest] that wraps the given raw object pointer.
+  static NSURLRequest castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURLRequest._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURLRequest].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSURLRequest1);
+  }
+
+  static NSURLRequest requestWithURL_(SwiftLibrary _lib, NSURL? URL) {
+    final _ret = _lib._objc_msgSend_226(_lib._class_NSURLRequest1,
+        _lib._sel_requestWithURL_1, URL?._id ?? ffi.nullptr);
+    return NSURLRequest._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool getSupportsSecureCoding(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLRequest1, _lib._sel_supportsSecureCoding1);
+  }
+
+  static NSURLRequest requestWithURL_cachePolicy_timeoutInterval_(
+      SwiftLibrary _lib, NSURL? URL, int cachePolicy, double timeoutInterval) {
+    final _ret = _lib._objc_msgSend_747(
+        _lib._class_NSURLRequest1,
+        _lib._sel_requestWithURL_cachePolicy_timeoutInterval_1,
+        URL?._id ?? ffi.nullptr,
+        cachePolicy,
+        timeoutInterval);
+    return NSURLRequest._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLRequest initWithURL_(NSURL? URL) {
+    final _ret = _lib._objc_msgSend_226(
+        _id, _lib._sel_initWithURL_1, URL?._id ?? ffi.nullptr);
+    return NSURLRequest._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLRequest initWithURL_cachePolicy_timeoutInterval_(
+      NSURL? URL, int cachePolicy, double timeoutInterval) {
+    final _ret = _lib._objc_msgSend_747(
+        _id,
+        _lib._sel_initWithURL_cachePolicy_timeoutInterval_1,
+        URL?._id ?? ffi.nullptr,
+        cachePolicy,
+        timeoutInterval);
+    return NSURLRequest._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get URL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_URL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get cachePolicy {
+    return _lib._objc_msgSend_748(_id, _lib._sel_cachePolicy1);
+  }
+
+  double get timeoutInterval {
+    return _lib._objc_msgSend_149(_id, _lib._sel_timeoutInterval1);
+  }
+
+  NSURL? get mainDocumentURL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_mainDocumentURL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get networkServiceType {
+    return _lib._objc_msgSend_749(_id, _lib._sel_networkServiceType1);
+  }
+
+  bool get allowsCellularAccess {
+    return _lib._objc_msgSend_12(_id, _lib._sel_allowsCellularAccess1);
+  }
+
+  bool get allowsExpensiveNetworkAccess {
+    return _lib._objc_msgSend_12(_id, _lib._sel_allowsExpensiveNetworkAccess1);
+  }
+
+  bool get allowsConstrainedNetworkAccess {
+    return _lib._objc_msgSend_12(
+        _id, _lib._sel_allowsConstrainedNetworkAccess1);
+  }
+
+  bool get assumesHTTP3Capable {
+    return _lib._objc_msgSend_12(_id, _lib._sel_assumesHTTP3Capable1);
+  }
+
+  int get attribution {
+    return _lib._objc_msgSend_750(_id, _lib._sel_attribution1);
+  }
+
+  NSString? get HTTPMethod {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_HTTPMethod1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary? get allHTTPHeaderFields {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_allHTTPHeaderFields1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString valueForHTTPHeaderField_(NSString? field) {
+    final _ret = _lib._objc_msgSend_64(
+        _id, _lib._sel_valueForHTTPHeaderField_1, field?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData? get HTTPBody {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_HTTPBody1);
+    return _ret.address == 0
+        ? null
+        : NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSInputStream? get HTTPBodyStream {
+    final _ret = _lib._objc_msgSend_760(_id, _lib._sel_HTTPBodyStream1);
+    return _ret.address == 0
+        ? null
+        : NSInputStream._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool get HTTPShouldHandleCookies {
+    return _lib._objc_msgSend_12(_id, _lib._sel_HTTPShouldHandleCookies1);
+  }
+
+  bool get HTTPShouldUsePipelining {
+    return _lib._objc_msgSend_12(_id, _lib._sel_HTTPShouldUsePipelining1);
+  }
+
+  static NSURLRequest new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSURLRequest1, _lib._sel_new1);
+    return NSURLRequest._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSURLRequest alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSURLRequest1, _lib._sel_alloc1);
+    return NSURLRequest._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURLRequest1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLRequest1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLRequest1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLRequest1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURLRequest1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURLRequest1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURLRequest1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSURLRequest1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLRequest1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSURLRequestCachePolicy {
+  static const int NSURLRequestUseProtocolCachePolicy = 0;
+  static const int NSURLRequestReloadIgnoringLocalCacheData = 1;
+  static const int NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4;
+  static const int NSURLRequestReloadIgnoringCacheData = 1;
+  static const int NSURLRequestReturnCacheDataElseLoad = 2;
+  static const int NSURLRequestReturnCacheDataDontLoad = 3;
+  static const int NSURLRequestReloadRevalidatingCacheData = 5;
+}
+
+abstract class NSURLRequestNetworkServiceType {
+  static const int NSURLNetworkServiceTypeDefault = 0;
+  static const int NSURLNetworkServiceTypeVoIP = 1;
+  static const int NSURLNetworkServiceTypeVideo = 2;
+  static const int NSURLNetworkServiceTypeBackground = 3;
+  static const int NSURLNetworkServiceTypeVoice = 4;
+  static const int NSURLNetworkServiceTypeResponsiveData = 6;
+  static const int NSURLNetworkServiceTypeAVStreaming = 8;
+  static const int NSURLNetworkServiceTypeResponsiveAV = 9;
+  static const int NSURLNetworkServiceTypeCallSignaling = 11;
+}
+
+abstract class NSURLRequestAttribution {
+  static const int NSURLRequestAttributionDeveloper = 0;
+  static const int NSURLRequestAttributionUser = 1;
+}
+
+class NSInputStream extends NSStream {
+  NSInputStream._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSInputStream] that points to the same underlying object as [other].
+  static NSInputStream castFrom<T extends _ObjCWrapper>(T other) {
+    return NSInputStream._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSInputStream] that wraps the given raw object pointer.
+  static NSInputStream castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSInputStream._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSInputStream].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSInputStream1);
+  }
+
+  int read_maxLength_(ffi.Pointer<ffi.Uint8> buffer, int len) {
+    return _lib._objc_msgSend_752(_id, _lib._sel_read_maxLength_1, buffer, len);
+  }
+
+  bool getBuffer_length_(
+      ffi.Pointer<ffi.Pointer<ffi.Uint8>> buffer, ffi.Pointer<NSUInteger> len) {
+    return _lib._objc_msgSend_759(
+        _id, _lib._sel_getBuffer_length_1, buffer, len);
+  }
+
+  bool get hasBytesAvailable {
+    return _lib._objc_msgSend_12(_id, _lib._sel_hasBytesAvailable1);
+  }
+
+  NSInputStream initWithData_(NSData? data) {
+    final _ret = _lib._objc_msgSend_242(
+        _id, _lib._sel_initWithData_1, data?._id ?? ffi.nullptr);
+    return NSInputStream._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSInputStream initWithURL_(NSURL? url) {
+    final _ret = _lib._objc_msgSend_226(
+        _id, _lib._sel_initWithURL_1, url?._id ?? ffi.nullptr);
+    return NSInputStream._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSInputStream initWithFileAtPath_(NSString? path) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initWithFileAtPath_1, path?._id ?? ffi.nullptr);
+    return NSInputStream._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSInputStream inputStreamWithData_(SwiftLibrary _lib, NSData? data) {
+    final _ret = _lib._objc_msgSend_242(_lib._class_NSInputStream1,
+        _lib._sel_inputStreamWithData_1, data?._id ?? ffi.nullptr);
+    return NSInputStream._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSInputStream inputStreamWithFileAtPath_(
+      SwiftLibrary _lib, NSString? path) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSInputStream1,
+        _lib._sel_inputStreamWithFileAtPath_1, path?._id ?? ffi.nullptr);
+    return NSInputStream._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSInputStream inputStreamWithURL_(SwiftLibrary _lib, NSURL? url) {
+    final _ret = _lib._objc_msgSend_226(_lib._class_NSInputStream1,
+        _lib._sel_inputStreamWithURL_1, url?._id ?? ffi.nullptr);
+    return NSInputStream._(_ret, _lib, retain: true, release: true);
+  }
+
+  static void getStreamsToHostWithName_port_inputStream_outputStream_(
+      SwiftLibrary _lib,
+      NSString? hostname,
+      int port,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> inputStream,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outputStream) {
+    return _lib._objc_msgSend_754(
+        _lib._class_NSInputStream1,
+        _lib._sel_getStreamsToHostWithName_port_inputStream_outputStream_1,
+        hostname?._id ?? ffi.nullptr,
+        port,
+        inputStream,
+        outputStream);
+  }
+
+  static void getStreamsToHost_port_inputStream_outputStream_(
+      SwiftLibrary _lib,
+      NSHost? host,
+      int port,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> inputStream,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outputStream) {
+    return _lib._objc_msgSend_757(
+        _lib._class_NSInputStream1,
+        _lib._sel_getStreamsToHost_port_inputStream_outputStream_1,
+        host?._id ?? ffi.nullptr,
+        port,
+        inputStream,
+        outputStream);
+  }
+
+  static void getBoundStreamsWithBufferSize_inputStream_outputStream_(
+      SwiftLibrary _lib,
+      int bufferSize,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> inputStream,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outputStream) {
+    return _lib._objc_msgSend_758(
+        _lib._class_NSInputStream1,
+        _lib._sel_getBoundStreamsWithBufferSize_inputStream_outputStream_1,
+        bufferSize,
+        inputStream,
+        outputStream);
+  }
+
+  static NSInputStream new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSInputStream1, _lib._sel_new1);
+    return NSInputStream._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSInputStream alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSInputStream1, _lib._sel_alloc1);
+    return NSInputStream._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSInputStream1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSInputStream1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSInputStream1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSInputStream1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSInputStream1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSInputStream1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSInputStream1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSInputStream1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSInputStream1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSStream extends NSObject {
+  NSStream._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSStream] that points to the same underlying object as [other].
+  static NSStream castFrom<T extends _ObjCWrapper>(T other) {
+    return NSStream._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSStream] that wraps the given raw object pointer.
+  static NSStream castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSStream._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSStream].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSStream1);
+  }
+
+  void open() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_open1);
+  }
+
+  void close() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_close1);
+  }
+
+  NSObject? get delegate {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_delegate1);
+    return _ret.address == 0
+        ? null
+        : NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  set delegate(NSObject? value) {
+    _lib._objc_msgSend_368(
+        _id, _lib._sel_setDelegate_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSObject propertyForKey_(NSStreamPropertyKey key) {
+    final _ret = _lib._objc_msgSend_30(_id, _lib._sel_propertyForKey_1, key);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool setProperty_forKey_(NSObject property, NSStreamPropertyKey key) {
+    return _lib._objc_msgSend_225(
+        _id, _lib._sel_setProperty_forKey_1, property._id, key);
+  }
+
+  void scheduleInRunLoop_forMode_(NSRunLoop? aRunLoop, NSRunLoopMode mode) {
+    return _lib._objc_msgSend_501(_id, _lib._sel_scheduleInRunLoop_forMode_1,
+        aRunLoop?._id ?? ffi.nullptr, mode);
+  }
+
+  void removeFromRunLoop_forMode_(NSRunLoop? aRunLoop, NSRunLoopMode mode) {
+    return _lib._objc_msgSend_501(_id, _lib._sel_removeFromRunLoop_forMode_1,
+        aRunLoop?._id ?? ffi.nullptr, mode);
+  }
+
+  int get streamStatus {
+    return _lib._objc_msgSend_751(_id, _lib._sel_streamStatus1);
+  }
+
+  NSError? get streamError {
+    final _ret = _lib._objc_msgSend_283(_id, _lib._sel_streamError1);
+    return _ret.address == 0
+        ? null
+        : NSError._(_ret, _lib, retain: true, release: true);
+  }
+
+  static void getStreamsToHostWithName_port_inputStream_outputStream_(
+      SwiftLibrary _lib,
+      NSString? hostname,
+      int port,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> inputStream,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outputStream) {
+    return _lib._objc_msgSend_754(
+        _lib._class_NSStream1,
+        _lib._sel_getStreamsToHostWithName_port_inputStream_outputStream_1,
+        hostname?._id ?? ffi.nullptr,
+        port,
+        inputStream,
+        outputStream);
+  }
+
+  static void getStreamsToHost_port_inputStream_outputStream_(
+      SwiftLibrary _lib,
+      NSHost? host,
+      int port,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> inputStream,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outputStream) {
+    return _lib._objc_msgSend_757(
+        _lib._class_NSStream1,
+        _lib._sel_getStreamsToHost_port_inputStream_outputStream_1,
+        host?._id ?? ffi.nullptr,
+        port,
+        inputStream,
+        outputStream);
+  }
+
+  static void getBoundStreamsWithBufferSize_inputStream_outputStream_(
+      SwiftLibrary _lib,
+      int bufferSize,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> inputStream,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outputStream) {
+    return _lib._objc_msgSend_758(
+        _lib._class_NSStream1,
+        _lib._sel_getBoundStreamsWithBufferSize_inputStream_outputStream_1,
+        bufferSize,
+        inputStream,
+        outputStream);
+  }
+
+  static NSStream new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSStream1, _lib._sel_new1);
+    return NSStream._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSStream alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSStream1, _lib._sel_alloc1);
+    return NSStream._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSStream1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSStream1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSStream1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSStream1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSStream1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSStream1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSStream1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSStream1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSStream1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+typedef NSStreamPropertyKey = ffi.Pointer<ObjCObject>;
+
+abstract class NSStreamStatus {
+  static const int NSStreamStatusNotOpen = 0;
+  static const int NSStreamStatusOpening = 1;
+  static const int NSStreamStatusOpen = 2;
+  static const int NSStreamStatusReading = 3;
+  static const int NSStreamStatusWriting = 4;
+  static const int NSStreamStatusAtEnd = 5;
+  static const int NSStreamStatusClosed = 6;
+  static const int NSStreamStatusError = 7;
+}
+
+class NSOutputStream extends NSStream {
+  NSOutputStream._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSOutputStream] that points to the same underlying object as [other].
+  static NSOutputStream castFrom<T extends _ObjCWrapper>(T other) {
+    return NSOutputStream._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSOutputStream] that wraps the given raw object pointer.
+  static NSOutputStream castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSOutputStream._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSOutputStream].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSOutputStream1);
+  }
+
+  int write_maxLength_(ffi.Pointer<ffi.Uint8> buffer, int len) {
+    return _lib._objc_msgSend_752(
+        _id, _lib._sel_write_maxLength_1, buffer, len);
+  }
+
+  bool get hasSpaceAvailable {
+    return _lib._objc_msgSend_12(_id, _lib._sel_hasSpaceAvailable1);
+  }
+
+  NSOutputStream initToMemory() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_initToMemory1);
+    return NSOutputStream._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSOutputStream initToBuffer_capacity_(
+      ffi.Pointer<ffi.Uint8> buffer, int capacity) {
+    final _ret = _lib._objc_msgSend_753(
+        _id, _lib._sel_initToBuffer_capacity_1, buffer, capacity);
+    return NSOutputStream._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSOutputStream initWithURL_append_(NSURL? url, bool shouldAppend) {
+    final _ret = _lib._objc_msgSend_231(_id, _lib._sel_initWithURL_append_1,
+        url?._id ?? ffi.nullptr, shouldAppend);
+    return NSOutputStream._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSOutputStream initToFileAtPath_append_(NSString? path, bool shouldAppend) {
+    final _ret = _lib._objc_msgSend_29(_id, _lib._sel_initToFileAtPath_append_1,
+        path?._id ?? ffi.nullptr, shouldAppend);
+    return NSOutputStream._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSOutputStream outputStreamToMemory(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSOutputStream1, _lib._sel_outputStreamToMemory1);
+    return NSOutputStream._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSOutputStream outputStreamToBuffer_capacity_(
+      SwiftLibrary _lib, ffi.Pointer<ffi.Uint8> buffer, int capacity) {
+    final _ret = _lib._objc_msgSend_753(_lib._class_NSOutputStream1,
+        _lib._sel_outputStreamToBuffer_capacity_1, buffer, capacity);
+    return NSOutputStream._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSOutputStream outputStreamToFileAtPath_append_(
+      SwiftLibrary _lib, NSString? path, bool shouldAppend) {
+    final _ret = _lib._objc_msgSend_29(
+        _lib._class_NSOutputStream1,
+        _lib._sel_outputStreamToFileAtPath_append_1,
+        path?._id ?? ffi.nullptr,
+        shouldAppend);
+    return NSOutputStream._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSOutputStream outputStreamWithURL_append_(
+      SwiftLibrary _lib, NSURL? url, bool shouldAppend) {
+    final _ret = _lib._objc_msgSend_231(
+        _lib._class_NSOutputStream1,
+        _lib._sel_outputStreamWithURL_append_1,
+        url?._id ?? ffi.nullptr,
+        shouldAppend);
+    return NSOutputStream._(_ret, _lib, retain: true, release: true);
+  }
+
+  static void getStreamsToHostWithName_port_inputStream_outputStream_(
+      SwiftLibrary _lib,
+      NSString? hostname,
+      int port,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> inputStream,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outputStream) {
+    return _lib._objc_msgSend_754(
+        _lib._class_NSOutputStream1,
+        _lib._sel_getStreamsToHostWithName_port_inputStream_outputStream_1,
+        hostname?._id ?? ffi.nullptr,
+        port,
+        inputStream,
+        outputStream);
+  }
+
+  static void getStreamsToHost_port_inputStream_outputStream_(
+      SwiftLibrary _lib,
+      NSHost? host,
+      int port,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> inputStream,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outputStream) {
+    return _lib._objc_msgSend_757(
+        _lib._class_NSOutputStream1,
+        _lib._sel_getStreamsToHost_port_inputStream_outputStream_1,
+        host?._id ?? ffi.nullptr,
+        port,
+        inputStream,
+        outputStream);
+  }
+
+  static void getBoundStreamsWithBufferSize_inputStream_outputStream_(
+      SwiftLibrary _lib,
+      int bufferSize,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> inputStream,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outputStream) {
+    return _lib._objc_msgSend_758(
+        _lib._class_NSOutputStream1,
+        _lib._sel_getBoundStreamsWithBufferSize_inputStream_outputStream_1,
+        bufferSize,
+        inputStream,
+        outputStream);
+  }
+
+  static NSOutputStream new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSOutputStream1, _lib._sel_new1);
+    return NSOutputStream._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSOutputStream alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSOutputStream1, _lib._sel_alloc1);
+    return NSOutputStream._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSOutputStream1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSOutputStream1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSOutputStream1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSOutputStream1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSOutputStream1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSOutputStream1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSOutputStream1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSOutputStream1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSOutputStream1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSHost extends NSObject {
+  NSHost._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSHost] that points to the same underlying object as [other].
+  static NSHost castFrom<T extends _ObjCWrapper>(T other) {
+    return NSHost._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSHost] that wraps the given raw object pointer.
+  static NSHost castFromPointer(SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSHost._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSHost].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSHost1);
+  }
+
+  static NSHost currentHost(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSHost1, _lib._sel_currentHost1);
+    return NSHost._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSHost hostWithName_(SwiftLibrary _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSHost1,
+        _lib._sel_hostWithName_1, name?._id ?? ffi.nullptr);
+    return NSHost._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSHost hostWithAddress_(SwiftLibrary _lib, NSString? address) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSHost1,
+        _lib._sel_hostWithAddress_1, address?._id ?? ffi.nullptr);
+    return NSHost._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool isEqualToHost_(NSHost? aHost) {
+    return _lib._objc_msgSend_755(
+        _id, _lib._sel_isEqualToHost_1, aHost?._id ?? ffi.nullptr);
+  }
+
+  NSString? get name {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_name1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get names {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_names1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get address {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_address1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get addresses {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_addresses1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get localizedName {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_localizedName1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static void setHostCacheEnabled_(SwiftLibrary _lib, bool flag) {
+    return _lib._objc_msgSend_756(
+        _lib._class_NSHost1, _lib._sel_setHostCacheEnabled_1, flag);
+  }
+
+  static bool isHostCacheEnabled(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSHost1, _lib._sel_isHostCacheEnabled1);
+  }
+
+  static void flushHostCache(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_1(_lib._class_NSHost1, _lib._sel_flushHostCache1);
+  }
+
+  static NSHost new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSHost1, _lib._sel_new1);
+    return NSHost._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSHost alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSHost1, _lib._sel_alloc1);
+    return NSHost._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSHost1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSHost1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSHost1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSHost1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSHost1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSHost1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSHost1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSHost1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSHost1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSURLResponse extends NSObject {
+  NSURLResponse._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURLResponse] that points to the same underlying object as [other].
+  static NSURLResponse castFrom<T extends _ObjCWrapper>(T other) {
+    return NSURLResponse._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSURLResponse] that wraps the given raw object pointer.
+  static NSURLResponse castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURLResponse._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURLResponse].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSURLResponse1);
+  }
+
+  NSURLResponse initWithURL_MIMEType_expectedContentLength_textEncodingName_(
+      NSURL? URL, NSString? MIMEType, int length, NSString? name) {
+    final _ret = _lib._objc_msgSend_762(
+        _id,
+        _lib._sel_initWithURL_MIMEType_expectedContentLength_textEncodingName_1,
+        URL?._id ?? ffi.nullptr,
+        MIMEType?._id ?? ffi.nullptr,
+        length,
+        name?._id ?? ffi.nullptr);
+    return NSURLResponse._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get URL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_URL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get MIMEType {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_MIMEType1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get expectedContentLength {
+    return _lib._objc_msgSend_214(_id, _lib._sel_expectedContentLength1);
+  }
+
+  NSString? get textEncodingName {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_textEncodingName1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get suggestedFilename {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_suggestedFilename1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLResponse new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSURLResponse1, _lib._sel_new1);
+    return NSURLResponse._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSURLResponse alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSURLResponse1, _lib._sel_alloc1);
+    return NSURLResponse._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURLResponse1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLResponse1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLResponse1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLResponse1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURLResponse1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURLResponse1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURLResponse1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSURLResponse1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLResponse1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSURLSessionTaskState {
+  static const int NSURLSessionTaskStateRunning = 0;
+  static const int NSURLSessionTaskStateSuspended = 1;
+  static const int NSURLSessionTaskStateCanceling = 2;
+  static const int NSURLSessionTaskStateCompleted = 3;
+}
+
+void _ObjCBlock30_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ObjCObject> arg0) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ObjCObject> arg0)>>()
+      .asFunction<void Function(ffi.Pointer<ObjCObject> arg0)>()(arg0);
+}
+
+final _ObjCBlock30_closureRegistry = <int, Function>{};
+int _ObjCBlock30_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock30_registerClosure(Function fn) {
+  final id = ++_ObjCBlock30_closureRegistryIndex;
+  _ObjCBlock30_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock30_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ObjCObject> arg0) {
+  return _ObjCBlock30_closureRegistry[block.ref.target.address]!(arg0);
+}
+
+class ObjCBlock30 extends _ObjCBlockBase {
+  ObjCBlock30._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock30.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0)>(
+                        _ObjCBlock30_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock30.fromFunction(
+      SwiftLibrary lib, void Function(ffi.Pointer<ObjCObject> arg0) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0)>(
+                        _ObjCBlock30_closureTrampoline)
+                    .cast(),
+                _ObjCBlock30_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0)>>()
+        .asFunction<
+            void Function(ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0)>()(_id, arg0);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class NSIndexPath extends NSObject {
+  NSIndexPath._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSIndexPath] that points to the same underlying object as [other].
+  static NSIndexPath castFrom<T extends _ObjCWrapper>(T other) {
+    return NSIndexPath._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSIndexPath] that wraps the given raw object pointer.
+  static NSIndexPath castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSIndexPath._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSIndexPath].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSIndexPath1);
+  }
+
+  static NSIndexPath indexPathWithIndex_(SwiftLibrary _lib, int index) {
+    final _ret = _lib._objc_msgSend_60(
+        _lib._class_NSIndexPath1, _lib._sel_indexPathWithIndex_1, index);
+    return NSIndexPath._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSIndexPath indexPathWithIndexes_length_(
+      SwiftLibrary _lib, ffi.Pointer<NSUInteger> indexes, int length) {
+    final _ret = _lib._objc_msgSend_768(_lib._class_NSIndexPath1,
+        _lib._sel_indexPathWithIndexes_length_1, indexes, length);
+    return NSIndexPath._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSIndexPath initWithIndexes_length_(
+      ffi.Pointer<NSUInteger> indexes, int length) {
+    final _ret = _lib._objc_msgSend_768(
+        _id, _lib._sel_initWithIndexes_length_1, indexes, length);
+    return NSIndexPath._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSIndexPath initWithIndex_(int index) {
+    final _ret = _lib._objc_msgSend_60(_id, _lib._sel_initWithIndex_1, index);
+    return NSIndexPath._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSIndexPath indexPathByAddingIndex_(int index) {
+    final _ret =
+        _lib._objc_msgSend_769(_id, _lib._sel_indexPathByAddingIndex_1, index);
+    return NSIndexPath._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSIndexPath indexPathByRemovingLastIndex() {
+    final _ret =
+        _lib._objc_msgSend_770(_id, _lib._sel_indexPathByRemovingLastIndex1);
+    return NSIndexPath._(_ret, _lib, retain: true, release: true);
+  }
+
+  int indexAtPosition_(int position) {
+    return _lib._objc_msgSend_86(_id, _lib._sel_indexAtPosition_1, position);
+  }
+
+  int get length {
+    return _lib._objc_msgSend_10(_id, _lib._sel_length1);
+  }
+
+  void getIndexes_range_(
+      ffi.Pointer<NSUInteger> indexes, NSRange positionRange) {
+    return _lib._objc_msgSend_771(
+        _id, _lib._sel_getIndexes_range_1, indexes, positionRange);
+  }
+
+  int compare_(NSIndexPath? otherObject) {
+    return _lib._objc_msgSend_772(
+        _id, _lib._sel_compare_1, otherObject?._id ?? ffi.nullptr);
+  }
+
+  void getIndexes_(ffi.Pointer<NSUInteger> indexes) {
+    return _lib._objc_msgSend_773(_id, _lib._sel_getIndexes_1, indexes);
+  }
+
+  static NSIndexPath new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSIndexPath1, _lib._sel_new1);
+    return NSIndexPath._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSIndexPath alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSIndexPath1, _lib._sel_alloc1);
+    return NSIndexPath._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSIndexPath1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSIndexPath1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSIndexPath1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSIndexPath1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSIndexPath1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSIndexPath1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSIndexPath1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSIndexPath1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSIndexPath1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSInflectionRule extends NSObject {
+  NSInflectionRule._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSInflectionRule] that points to the same underlying object as [other].
+  static NSInflectionRule castFrom<T extends _ObjCWrapper>(T other) {
+    return NSInflectionRule._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSInflectionRule] that wraps the given raw object pointer.
+  static NSInflectionRule castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSInflectionRule._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSInflectionRule].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSInflectionRule1);
+  }
+
+  @override
+  NSObject init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSInflectionRule? getAutomaticRule(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_774(
+        _lib._class_NSInflectionRule1, _lib._sel_automaticRule1);
+    return _ret.address == 0
+        ? null
+        : NSInflectionRule._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool canInflectLanguage_(SwiftLibrary _lib, NSString? language) {
+    return _lib._objc_msgSend_59(_lib._class_NSInflectionRule1,
+        _lib._sel_canInflectLanguage_1, language?._id ?? ffi.nullptr);
+  }
+
+  static bool getCanInflectPreferredLocalization(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSInflectionRule1,
+        _lib._sel_canInflectPreferredLocalization1);
+  }
+
+  static NSInflectionRule new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSInflectionRule1, _lib._sel_new1);
+    return NSInflectionRule._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSInflectionRule alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSInflectionRule1, _lib._sel_alloc1);
+    return NSInflectionRule._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSInflectionRule1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSInflectionRule1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSInflectionRule1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSInflectionRule1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSInflectionRule1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSInflectionRule1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSInflectionRule1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSInflectionRule1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSInflectionRule1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSMorphology extends NSObject {
+  NSMorphology._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSMorphology] that points to the same underlying object as [other].
+  static NSMorphology castFrom<T extends _ObjCWrapper>(T other) {
+    return NSMorphology._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSMorphology] that wraps the given raw object pointer.
+  static NSMorphology castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSMorphology._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSMorphology].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSMorphology1);
+  }
+
+  int get grammaticalGender {
+    return _lib._objc_msgSend_775(_id, _lib._sel_grammaticalGender1);
+  }
+
+  set grammaticalGender(int value) {
+    _lib._objc_msgSend_776(_id, _lib._sel_setGrammaticalGender_1, value);
+  }
+
+  int get partOfSpeech {
+    return _lib._objc_msgSend_777(_id, _lib._sel_partOfSpeech1);
+  }
+
+  set partOfSpeech(int value) {
+    _lib._objc_msgSend_778(_id, _lib._sel_setPartOfSpeech_1, value);
+  }
+
+  int get number {
+    return _lib._objc_msgSend_779(_id, _lib._sel_number1);
+  }
+
+  set number(int value) {
+    _lib._objc_msgSend_780(_id, _lib._sel_setNumber_1, value);
+  }
+
+  NSMorphologyCustomPronoun customPronounForLanguage_(NSString? language) {
+    final _ret = _lib._objc_msgSend_781(_id,
+        _lib._sel_customPronounForLanguage_1, language?._id ?? ffi.nullptr);
+    return NSMorphologyCustomPronoun._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool setCustomPronoun_forLanguage_error_(NSMorphologyCustomPronoun? features,
+      NSString? language, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_782(
+        _id,
+        _lib._sel_setCustomPronoun_forLanguage_error_1,
+        features?._id ?? ffi.nullptr,
+        language?._id ?? ffi.nullptr,
+        error);
+  }
+
+  bool get unspecified {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isUnspecified1);
+  }
+
+  static NSMorphology? getUserMorphology(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_783(
+        _lib._class_NSMorphology1, _lib._sel_userMorphology1);
+    return _ret.address == 0
+        ? null
+        : NSMorphology._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMorphology new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMorphology1, _lib._sel_new1);
+    return NSMorphology._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSMorphology alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMorphology1, _lib._sel_alloc1);
+    return NSMorphology._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSMorphology1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSMorphology1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSMorphology1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSMorphology1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSMorphology1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSMorphology1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSMorphology1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSMorphology1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSMorphology1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSGrammaticalGender {
+  static const int NSGrammaticalGenderNotSet = 0;
+  static const int NSGrammaticalGenderFeminine = 1;
+  static const int NSGrammaticalGenderMasculine = 2;
+  static const int NSGrammaticalGenderNeuter = 3;
+}
+
+abstract class NSGrammaticalPartOfSpeech {
+  static const int NSGrammaticalPartOfSpeechNotSet = 0;
+  static const int NSGrammaticalPartOfSpeechDeterminer = 1;
+  static const int NSGrammaticalPartOfSpeechPronoun = 2;
+  static const int NSGrammaticalPartOfSpeechLetter = 3;
+  static const int NSGrammaticalPartOfSpeechAdverb = 4;
+  static const int NSGrammaticalPartOfSpeechParticle = 5;
+  static const int NSGrammaticalPartOfSpeechAdjective = 6;
+  static const int NSGrammaticalPartOfSpeechAdposition = 7;
+  static const int NSGrammaticalPartOfSpeechVerb = 8;
+  static const int NSGrammaticalPartOfSpeechNoun = 9;
+  static const int NSGrammaticalPartOfSpeechConjunction = 10;
+  static const int NSGrammaticalPartOfSpeechNumeral = 11;
+  static const int NSGrammaticalPartOfSpeechInterjection = 12;
+  static const int NSGrammaticalPartOfSpeechPreposition = 13;
+  static const int NSGrammaticalPartOfSpeechAbbreviation = 14;
+}
+
+abstract class NSGrammaticalNumber {
+  static const int NSGrammaticalNumberNotSet = 0;
+  static const int NSGrammaticalNumberSingular = 1;
+  static const int NSGrammaticalNumberZero = 2;
+  static const int NSGrammaticalNumberPlural = 3;
+  static const int NSGrammaticalNumberPluralTwo = 4;
+  static const int NSGrammaticalNumberPluralFew = 5;
+  static const int NSGrammaticalNumberPluralMany = 6;
+}
+
+class NSMorphologyCustomPronoun extends NSObject {
+  NSMorphologyCustomPronoun._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSMorphologyCustomPronoun] that points to the same underlying object as [other].
+  static NSMorphologyCustomPronoun castFrom<T extends _ObjCWrapper>(T other) {
+    return NSMorphologyCustomPronoun._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSMorphologyCustomPronoun] that wraps the given raw object pointer.
+  static NSMorphologyCustomPronoun castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSMorphologyCustomPronoun._(other, lib,
+        retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSMorphologyCustomPronoun].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSMorphologyCustomPronoun1);
+  }
+
+  static bool isSupportedForLanguage_(SwiftLibrary _lib, NSString? language) {
+    return _lib._objc_msgSend_59(_lib._class_NSMorphologyCustomPronoun1,
+        _lib._sel_isSupportedForLanguage_1, language?._id ?? ffi.nullptr);
+  }
+
+  static NSArray requiredKeysForLanguage_(
+      SwiftLibrary _lib, NSString? language) {
+    final _ret = _lib._objc_msgSend_119(_lib._class_NSMorphologyCustomPronoun1,
+        _lib._sel_requiredKeysForLanguage_1, language?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get subjectForm {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_subjectForm1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set subjectForm(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setSubjectForm_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get objectForm {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_objectForm1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set objectForm(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setObjectForm_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get possessiveForm {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_possessiveForm1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set possessiveForm(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setPossessiveForm_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get possessiveAdjectiveForm {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_possessiveAdjectiveForm1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set possessiveAdjectiveForm(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setPossessiveAdjectiveForm_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get reflexiveForm {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_reflexiveForm1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set reflexiveForm(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setReflexiveForm_1, value?._id ?? ffi.nullptr);
+  }
+
+  static NSMorphologyCustomPronoun new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSMorphologyCustomPronoun1, _lib._sel_new1);
+    return NSMorphologyCustomPronoun._(_ret, _lib,
+        retain: false, release: true);
+  }
+
+  static NSMorphologyCustomPronoun alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSMorphologyCustomPronoun1, _lib._sel_alloc1);
+    return NSMorphologyCustomPronoun._(_ret, _lib,
+        retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSMorphologyCustomPronoun1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSMorphologyCustomPronoun1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSMorphologyCustomPronoun1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSMorphologyCustomPronoun1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSMorphologyCustomPronoun1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSMorphologyCustomPronoun1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSMorphologyCustomPronoun1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSMorphologyCustomPronoun1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSMorphologyCustomPronoun1,
+        _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSOperationQueue extends NSObject {
+  NSOperationQueue._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSOperationQueue] that points to the same underlying object as [other].
+  static NSOperationQueue castFrom<T extends _ObjCWrapper>(T other) {
+    return NSOperationQueue._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSOperationQueue] that wraps the given raw object pointer.
+  static NSOperationQueue castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSOperationQueue._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSOperationQueue].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSOperationQueue1);
+  }
+
+  NSProgress? get progress {
+    final _ret = _lib._objc_msgSend_577(_id, _lib._sel_progress1);
+    return _ret.address == 0
+        ? null
+        : NSProgress._(_ret, _lib, retain: true, release: true);
+  }
+
+  void addOperation_(NSOperation? op) {
+    return _lib._objc_msgSend_784(
+        _id, _lib._sel_addOperation_1, op?._id ?? ffi.nullptr);
+  }
+
+  void addOperations_waitUntilFinished_(NSArray? ops, bool wait) {
+    return _lib._objc_msgSend_787(
+        _id,
+        _lib._sel_addOperations_waitUntilFinished_1,
+        ops?._id ?? ffi.nullptr,
+        wait);
+  }
+
+  void addOperationWithBlock_(ObjCBlock16 block) {
+    return _lib._objc_msgSend_465(
+        _id, _lib._sel_addOperationWithBlock_1, block._id);
+  }
+
+  void addBarrierBlock_(ObjCBlock16 barrier) {
+    return _lib._objc_msgSend_465(
+        _id, _lib._sel_addBarrierBlock_1, barrier._id);
+  }
+
+  int get maxConcurrentOperationCount {
+    return _lib._objc_msgSend_78(_id, _lib._sel_maxConcurrentOperationCount1);
+  }
+
+  set maxConcurrentOperationCount(int value) {
+    _lib._objc_msgSend_558(
+        _id, _lib._sel_setMaxConcurrentOperationCount_1, value);
+  }
+
+  bool get suspended {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isSuspended1);
+  }
+
+  set suspended(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setSuspended_1, value);
+  }
+
+  NSString? get name {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_name1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set name(NSString? value) {
+    _lib._objc_msgSend_477(_id, _lib._sel_setName_1, value?._id ?? ffi.nullptr);
+  }
+
+  int get qualityOfService {
+    return _lib._objc_msgSend_475(_id, _lib._sel_qualityOfService1);
+  }
+
+  set qualityOfService(int value) {
+    _lib._objc_msgSend_476(_id, _lib._sel_setQualityOfService_1, value);
+  }
+
+  dispatch_queue_t get underlyingQueue {
+    return _lib._objc_msgSend_788(_id, _lib._sel_underlyingQueue1);
+  }
+
+  set underlyingQueue(dispatch_queue_t value) {
+    _lib._objc_msgSend_789(_id, _lib._sel_setUnderlyingQueue_1, value);
+  }
+
+  void cancelAllOperations() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_cancelAllOperations1);
+  }
+
+  void waitUntilAllOperationsAreFinished() {
+    return _lib._objc_msgSend_1(
+        _id, _lib._sel_waitUntilAllOperationsAreFinished1);
+  }
+
+  static NSOperationQueue? getCurrentQueue(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_790(
+        _lib._class_NSOperationQueue1, _lib._sel_currentQueue1);
+    return _ret.address == 0
+        ? null
+        : NSOperationQueue._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSOperationQueue? getMainQueue(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_790(
+        _lib._class_NSOperationQueue1, _lib._sel_mainQueue1);
+    return _ret.address == 0
+        ? null
+        : NSOperationQueue._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get operations {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_operations1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get operationCount {
+    return _lib._objc_msgSend_10(_id, _lib._sel_operationCount1);
+  }
+
+  static NSOperationQueue new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSOperationQueue1, _lib._sel_new1);
+    return NSOperationQueue._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSOperationQueue alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSOperationQueue1, _lib._sel_alloc1);
+    return NSOperationQueue._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSOperationQueue1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSOperationQueue1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSOperationQueue1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSOperationQueue1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSOperationQueue1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSOperationQueue1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSOperationQueue1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSOperationQueue1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSOperationQueue1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSOperation extends NSObject {
+  NSOperation._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSOperation] that points to the same underlying object as [other].
+  static NSOperation castFrom<T extends _ObjCWrapper>(T other) {
+    return NSOperation._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSOperation] that wraps the given raw object pointer.
+  static NSOperation castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSOperation._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSOperation].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSOperation1);
+  }
+
+  void start() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_start1);
+  }
+
+  void main() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_main1);
+  }
+
+  bool get cancelled {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isCancelled1);
+  }
+
+  void cancel() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_cancel1);
+  }
+
+  bool get executing {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isExecuting1);
+  }
+
+  bool get finished {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isFinished1);
+  }
+
+  bool get concurrent {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isConcurrent1);
+  }
+
+  bool get asynchronous {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isAsynchronous1);
+  }
+
+  bool get ready {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isReady1);
+  }
+
+  void addDependency_(NSOperation? op) {
+    return _lib._objc_msgSend_784(
+        _id, _lib._sel_addDependency_1, op?._id ?? ffi.nullptr);
+  }
+
+  void removeDependency_(NSOperation? op) {
+    return _lib._objc_msgSend_784(
+        _id, _lib._sel_removeDependency_1, op?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get dependencies {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_dependencies1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get queuePriority {
+    return _lib._objc_msgSend_785(_id, _lib._sel_queuePriority1);
+  }
+
+  set queuePriority(int value) {
+    _lib._objc_msgSend_786(_id, _lib._sel_setQueuePriority_1, value);
+  }
+
+  ObjCBlock16 get completionBlock {
+    final _ret = _lib._objc_msgSend_586(_id, _lib._sel_completionBlock1);
+    return ObjCBlock16._(_ret, _lib);
+  }
+
+  set completionBlock(ObjCBlock16 value) {
+    _lib._objc_msgSend_587(_id, _lib._sel_setCompletionBlock_1, value._id);
+  }
+
+  void waitUntilFinished() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_waitUntilFinished1);
+  }
+
+  double get threadPriority {
+    return _lib._objc_msgSend_149(_id, _lib._sel_threadPriority1);
+  }
+
+  set threadPriority(double value) {
+    _lib._objc_msgSend_474(_id, _lib._sel_setThreadPriority_1, value);
+  }
+
+  int get qualityOfService {
+    return _lib._objc_msgSend_475(_id, _lib._sel_qualityOfService1);
+  }
+
+  set qualityOfService(int value) {
+    _lib._objc_msgSend_476(_id, _lib._sel_setQualityOfService_1, value);
+  }
+
+  NSString? get name {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_name1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set name(NSString? value) {
+    _lib._objc_msgSend_477(_id, _lib._sel_setName_1, value?._id ?? ffi.nullptr);
+  }
+
+  static NSOperation new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSOperation1, _lib._sel_new1);
+    return NSOperation._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSOperation alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSOperation1, _lib._sel_alloc1);
+    return NSOperation._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSOperation1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSOperation1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSOperation1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSOperation1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSOperation1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSOperation1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSOperation1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSOperation1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSOperation1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSOperationQueuePriority {
+  static const int NSOperationQueuePriorityVeryLow = -8;
+  static const int NSOperationQueuePriorityLow = -4;
+  static const int NSOperationQueuePriorityNormal = 0;
+  static const int NSOperationQueuePriorityHigh = 4;
+  static const int NSOperationQueuePriorityVeryHigh = 8;
+}
+
+typedef dispatch_queue_t = ffi.Pointer<ObjCObject>;
+
+class NSPointerArray extends NSObject {
+  NSPointerArray._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSPointerArray] that points to the same underlying object as [other].
+  static NSPointerArray castFrom<T extends _ObjCWrapper>(T other) {
+    return NSPointerArray._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSPointerArray] that wraps the given raw object pointer.
+  static NSPointerArray castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSPointerArray._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSPointerArray].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSPointerArray1);
+  }
+
+  NSPointerArray initWithOptions_(int options) {
+    final _ret =
+        _lib._objc_msgSend_791(_id, _lib._sel_initWithOptions_1, options);
+    return NSPointerArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSPointerArray initWithPointerFunctions_(NSPointerFunctions? functions) {
+    final _ret = _lib._objc_msgSend_805(_id,
+        _lib._sel_initWithPointerFunctions_1, functions?._id ?? ffi.nullptr);
+    return NSPointerArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSPointerArray pointerArrayWithOptions_(
+      SwiftLibrary _lib, int options) {
+    final _ret = _lib._objc_msgSend_806(_lib._class_NSPointerArray1,
+        _lib._sel_pointerArrayWithOptions_1, options);
+    return NSPointerArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSPointerArray pointerArrayWithPointerFunctions_(
+      SwiftLibrary _lib, NSPointerFunctions? functions) {
+    final _ret = _lib._objc_msgSend_807(
+        _lib._class_NSPointerArray1,
+        _lib._sel_pointerArrayWithPointerFunctions_1,
+        functions?._id ?? ffi.nullptr);
+    return NSPointerArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSPointerFunctions? get pointerFunctions {
+    final _ret = _lib._objc_msgSend_808(_id, _lib._sel_pointerFunctions1);
+    return _ret.address == 0
+        ? null
+        : NSPointerFunctions._(_ret, _lib, retain: true, release: true);
+  }
+
+  ffi.Pointer<ffi.Void> pointerAtIndex_(int index) {
+    return _lib._objc_msgSend_809(_id, _lib._sel_pointerAtIndex_1, index);
+  }
+
+  void addPointer_(ffi.Pointer<ffi.Void> pointer) {
+    return _lib._objc_msgSend_47(_id, _lib._sel_addPointer_1, pointer);
+  }
+
+  void removePointerAtIndex_(int index) {
+    return _lib._objc_msgSend_410(_id, _lib._sel_removePointerAtIndex_1, index);
+  }
+
+  void insertPointer_atIndex_(ffi.Pointer<ffi.Void> item, int index) {
+    return _lib._objc_msgSend_21(
+        _id, _lib._sel_insertPointer_atIndex_1, item, index);
+  }
+
+  void replacePointerAtIndex_withPointer_(
+      int index, ffi.Pointer<ffi.Void> item) {
+    return _lib._objc_msgSend_810(
+        _id, _lib._sel_replacePointerAtIndex_withPointer_1, index, item);
+  }
+
+  void compact() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_compact1);
+  }
+
+  int get count {
+    return _lib._objc_msgSend_10(_id, _lib._sel_count1);
+  }
+
+  set count(int value) {
+    _lib._objc_msgSend_451(_id, _lib._sel_setCount_1, value);
+  }
+
+  static NSObject pointerArrayWithStrongObjects(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSPointerArray1, _lib._sel_pointerArrayWithStrongObjects1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject pointerArrayWithWeakObjects(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSPointerArray1, _lib._sel_pointerArrayWithWeakObjects1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSPointerArray strongObjectsPointerArray(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_811(
+        _lib._class_NSPointerArray1, _lib._sel_strongObjectsPointerArray1);
+    return NSPointerArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSPointerArray weakObjectsPointerArray(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_811(
+        _lib._class_NSPointerArray1, _lib._sel_weakObjectsPointerArray1);
+    return NSPointerArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get allObjects {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_allObjects1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSPointerArray new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSPointerArray1, _lib._sel_new1);
+    return NSPointerArray._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSPointerArray alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSPointerArray1, _lib._sel_alloc1);
+    return NSPointerArray._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSPointerArray1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSPointerArray1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSPointerArray1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSPointerArray1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSPointerArray1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSPointerArray1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSPointerArray1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSPointerArray1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSPointerArray1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSPointerFunctionsOptions {
+  static const int NSPointerFunctionsStrongMemory = 0;
+  static const int NSPointerFunctionsZeroingWeakMemory = 1;
+  static const int NSPointerFunctionsOpaqueMemory = 2;
+  static const int NSPointerFunctionsMallocMemory = 3;
+  static const int NSPointerFunctionsMachVirtualMemory = 4;
+  static const int NSPointerFunctionsWeakMemory = 5;
+  static const int NSPointerFunctionsObjectPersonality = 0;
+  static const int NSPointerFunctionsOpaquePersonality = 256;
+  static const int NSPointerFunctionsObjectPointerPersonality = 512;
+  static const int NSPointerFunctionsCStringPersonality = 768;
+  static const int NSPointerFunctionsStructPersonality = 1024;
+  static const int NSPointerFunctionsIntegerPersonality = 1280;
+  static const int NSPointerFunctionsCopyIn = 65536;
+}
+
+class NSPointerFunctions extends NSObject {
+  NSPointerFunctions._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSPointerFunctions] that points to the same underlying object as [other].
+  static NSPointerFunctions castFrom<T extends _ObjCWrapper>(T other) {
+    return NSPointerFunctions._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSPointerFunctions] that wraps the given raw object pointer.
+  static NSPointerFunctions castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSPointerFunctions._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSPointerFunctions].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSPointerFunctions1);
+  }
+
+  NSPointerFunctions initWithOptions_(int options) {
+    final _ret =
+        _lib._objc_msgSend_791(_id, _lib._sel_initWithOptions_1, options);
+    return NSPointerFunctions._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSPointerFunctions pointerFunctionsWithOptions_(
+      SwiftLibrary _lib, int options) {
+    final _ret = _lib._objc_msgSend_792(_lib._class_NSPointerFunctions1,
+        _lib._sel_pointerFunctionsWithOptions_1, options);
+    return NSPointerFunctions._(_ret, _lib, retain: true, release: true);
+  }
+
+  ffi.Pointer<
+          ffi.NativeFunction<
+              NSUInteger Function(
+                  ffi.Pointer<ffi.Void>,
+                  ffi.Pointer<
+                      ffi.NativeFunction<
+                          NSUInteger Function(ffi.Pointer<ffi.Void>)>>)>>
+      get hashFunction {
+    return _lib._objc_msgSend_793(_id, _lib._sel_hashFunction1);
+  }
+
+  set hashFunction(
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  NSUInteger Function(
+                      ffi.Pointer<ffi.Void>,
+                      ffi.Pointer<
+                          ffi.NativeFunction<
+                              NSUInteger Function(ffi.Pointer<ffi.Void>)>>)>>
+          value) {
+    _lib._objc_msgSend_794(_id, _lib._sel_setHashFunction_1, value);
+  }
+
+  ffi.Pointer<
+          ffi.NativeFunction<
+              ffi.Bool Function(
+                  ffi.Pointer<ffi.Void>,
+                  ffi.Pointer<ffi.Void>,
+                  ffi.Pointer<
+                      ffi.NativeFunction<
+                          NSUInteger Function(ffi.Pointer<ffi.Void>)>>)>>
+      get isEqualFunction {
+    return _lib._objc_msgSend_795(_id, _lib._sel_isEqualFunction1);
+  }
+
+  set isEqualFunction(
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Bool Function(
+                      ffi.Pointer<ffi.Void>,
+                      ffi.Pointer<ffi.Void>,
+                      ffi.Pointer<
+                          ffi.NativeFunction<
+                              NSUInteger Function(ffi.Pointer<ffi.Void>)>>)>>
+          value) {
+    _lib._objc_msgSend_796(_id, _lib._sel_setIsEqualFunction_1, value);
+  }
+
+  ffi.Pointer<ffi.NativeFunction<NSUInteger Function(ffi.Pointer<ffi.Void>)>>
+      get sizeFunction {
+    return _lib._objc_msgSend_797(_id, _lib._sel_sizeFunction1);
+  }
+
+  set sizeFunction(
+      ffi.Pointer<
+              ffi.NativeFunction<NSUInteger Function(ffi.Pointer<ffi.Void>)>>
+          value) {
+    _lib._objc_msgSend_798(_id, _lib._sel_setSizeFunction_1, value);
+  }
+
+  ffi.Pointer<
+          ffi.NativeFunction<
+              ffi.Pointer<ObjCObject> Function(ffi.Pointer<ffi.Void>)>>
+      get descriptionFunction {
+    return _lib._objc_msgSend_799(_id, _lib._sel_descriptionFunction1);
+  }
+
+  set descriptionFunction(
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Pointer<ObjCObject> Function(ffi.Pointer<ffi.Void>)>>
+          value) {
+    _lib._objc_msgSend_800(_id, _lib._sel_setDescriptionFunction_1, value);
+  }
+
+  ffi.Pointer<
+          ffi.NativeFunction<
+              ffi.Void Function(
+                  ffi.Pointer<ffi.Void>,
+                  ffi.Pointer<
+                      ffi.NativeFunction<
+                          NSUInteger Function(ffi.Pointer<ffi.Void>)>>)>>
+      get relinquishFunction {
+    return _lib._objc_msgSend_801(_id, _lib._sel_relinquishFunction1);
+  }
+
+  set relinquishFunction(
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(
+                      ffi.Pointer<ffi.Void>,
+                      ffi.Pointer<
+                          ffi.NativeFunction<
+                              NSUInteger Function(ffi.Pointer<ffi.Void>)>>)>>
+          value) {
+    _lib._objc_msgSend_802(_id, _lib._sel_setRelinquishFunction_1, value);
+  }
+
+  ffi.Pointer<
+      ffi.NativeFunction<
+          ffi.Pointer<ffi.Void> Function(
+              ffi.Pointer<ffi.Void>,
+              ffi.Pointer<
+                  ffi.NativeFunction<
+                      NSUInteger Function(ffi.Pointer<ffi.Void>)>>,
+              ffi.Bool)>> get acquireFunction {
+    return _lib._objc_msgSend_803(_id, _lib._sel_acquireFunction1);
+  }
+
+  set acquireFunction(
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Pointer<ffi.Void> Function(
+                      ffi.Pointer<ffi.Void>,
+                      ffi.Pointer<
+                          ffi.NativeFunction<
+                              NSUInteger Function(ffi.Pointer<ffi.Void>)>>,
+                      ffi.Bool)>>
+          value) {
+    _lib._objc_msgSend_804(_id, _lib._sel_setAcquireFunction_1, value);
+  }
+
+  bool get usesStrongWriteBarrier {
+    return _lib._objc_msgSend_12(_id, _lib._sel_usesStrongWriteBarrier1);
+  }
+
+  set usesStrongWriteBarrier(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setUsesStrongWriteBarrier_1, value);
+  }
+
+  bool get usesWeakReadAndWriteBarriers {
+    return _lib._objc_msgSend_12(_id, _lib._sel_usesWeakReadAndWriteBarriers1);
+  }
+
+  set usesWeakReadAndWriteBarriers(bool value) {
+    _lib._objc_msgSend_460(
+        _id, _lib._sel_setUsesWeakReadAndWriteBarriers_1, value);
+  }
+
+  static NSPointerFunctions new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSPointerFunctions1, _lib._sel_new1);
+    return NSPointerFunctions._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSPointerFunctions alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSPointerFunctions1, _lib._sel_alloc1);
+    return NSPointerFunctions._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSPointerFunctions1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSPointerFunctions1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSPointerFunctions1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSPointerFunctions1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSPointerFunctions1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSPointerFunctions1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSPointerFunctions1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSPointerFunctions1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSPointerFunctions1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSProcessInfo extends NSObject {
+  NSProcessInfo._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSProcessInfo] that points to the same underlying object as [other].
+  static NSProcessInfo castFrom<T extends _ObjCWrapper>(T other) {
+    return NSProcessInfo._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSProcessInfo] that wraps the given raw object pointer.
+  static NSProcessInfo castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSProcessInfo._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSProcessInfo].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSProcessInfo1);
+  }
+
+  static NSProcessInfo? getProcessInfo(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_812(
+        _lib._class_NSProcessInfo1, _lib._sel_processInfo1);
+    return _ret.address == 0
+        ? null
+        : NSProcessInfo._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary? get environment {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_environment1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get arguments {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_arguments1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get hostName {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_hostName1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get processName {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_processName1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set processName(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setProcessName_1, value?._id ?? ffi.nullptr);
+  }
+
+  int get processIdentifier {
+    return _lib._objc_msgSend_213(_id, _lib._sel_processIdentifier1);
+  }
+
+  NSString? get globallyUniqueString {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_globallyUniqueString1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int operatingSystem() {
+    return _lib._objc_msgSend_10(_id, _lib._sel_operatingSystem1);
+  }
+
+  NSString operatingSystemName() {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_operatingSystemName1);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get operatingSystemVersionString {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_operatingSystemVersionString1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSOperatingSystemVersion get operatingSystemVersion {
+    return _lib._objc_msgSend_813(_id, _lib._sel_operatingSystemVersion1);
+  }
+
+  int get processorCount {
+    return _lib._objc_msgSend_10(_id, _lib._sel_processorCount1);
+  }
+
+  int get activeProcessorCount {
+    return _lib._objc_msgSend_10(_id, _lib._sel_activeProcessorCount1);
+  }
+
+  int get physicalMemory {
+    return _lib._objc_msgSend_148(_id, _lib._sel_physicalMemory1);
+  }
+
+  bool isOperatingSystemAtLeastVersion_(NSOperatingSystemVersion version) {
+    return _lib._objc_msgSend_814(
+        _id, _lib._sel_isOperatingSystemAtLeastVersion_1, version);
+  }
+
+  double get systemUptime {
+    return _lib._objc_msgSend_149(_id, _lib._sel_systemUptime1);
+  }
+
+  void disableSuddenTermination() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_disableSuddenTermination1);
+  }
+
+  void enableSuddenTermination() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_enableSuddenTermination1);
+  }
+
+  void disableAutomaticTermination_(NSString? reason) {
+    return _lib._objc_msgSend_186(_id, _lib._sel_disableAutomaticTermination_1,
+        reason?._id ?? ffi.nullptr);
+  }
+
+  void enableAutomaticTermination_(NSString? reason) {
+    return _lib._objc_msgSend_186(_id, _lib._sel_enableAutomaticTermination_1,
+        reason?._id ?? ffi.nullptr);
+  }
+
+  bool get automaticTerminationSupportEnabled {
+    return _lib._objc_msgSend_12(
+        _id, _lib._sel_automaticTerminationSupportEnabled1);
+  }
+
+  set automaticTerminationSupportEnabled(bool value) {
+    _lib._objc_msgSend_460(
+        _id, _lib._sel_setAutomaticTerminationSupportEnabled_1, value);
+  }
+
+  NSObject beginActivityWithOptions_reason_(int options, NSString? reason) {
+    final _ret = _lib._objc_msgSend_815(
+        _id,
+        _lib._sel_beginActivityWithOptions_reason_1,
+        options,
+        reason?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  void endActivity_(NSObject? activity) {
+    return _lib._objc_msgSend_15(
+        _id, _lib._sel_endActivity_1, activity?._id ?? ffi.nullptr);
+  }
+
+  void performActivityWithOptions_reason_usingBlock_(
+      int options, NSString? reason, ObjCBlock16 block) {
+    return _lib._objc_msgSend_816(
+        _id,
+        _lib._sel_performActivityWithOptions_reason_usingBlock_1,
+        options,
+        reason?._id ?? ffi.nullptr,
+        block._id);
+  }
+
+  void performExpiringActivityWithReason_usingBlock_(
+      NSString? reason, ObjCBlock31 block) {
+    return _lib._objc_msgSend_817(
+        _id,
+        _lib._sel_performExpiringActivityWithReason_usingBlock_1,
+        reason?._id ?? ffi.nullptr,
+        block._id);
+  }
+
+  NSString? get userName {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_userName1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get fullUserName {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_fullUserName1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get thermalState {
+    return _lib._objc_msgSend_818(_id, _lib._sel_thermalState1);
+  }
+
+  bool get lowPowerModeEnabled {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isLowPowerModeEnabled1);
+  }
+
+  bool get macCatalystApp {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isMacCatalystApp1);
+  }
+
+  bool get iOSAppOnMac {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isiOSAppOnMac1);
+  }
+
+  static NSProcessInfo new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSProcessInfo1, _lib._sel_new1);
+    return NSProcessInfo._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSProcessInfo alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSProcessInfo1, _lib._sel_alloc1);
+    return NSProcessInfo._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSProcessInfo1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSProcessInfo1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSProcessInfo1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSProcessInfo1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSProcessInfo1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSProcessInfo1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSProcessInfo1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSProcessInfo1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSProcessInfo1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSOperatingSystemVersion extends ffi.Struct {
+  @NSInteger()
+  external int majorVersion;
+
+  @NSInteger()
+  external int minorVersion;
+
+  @NSInteger()
+  external int patchVersion;
+}
+
+abstract class NSActivityOptions {
+  static const int NSActivityIdleDisplaySleepDisabled = 1099511627776;
+  static const int NSActivityIdleSystemSleepDisabled = 1048576;
+  static const int NSActivitySuddenTerminationDisabled = 16384;
+  static const int NSActivityAutomaticTerminationDisabled = 32768;
+  static const int NSActivityUserInitiated = 16777215;
+  static const int NSActivityUserInitiatedAllowingIdleSystemSleep = 15728639;
+  static const int NSActivityBackground = 255;
+  static const int NSActivityLatencyCritical = 1095216660480;
+}
+
+void _ObjCBlock31_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block, bool arg0) {
+  return block.ref.target
+      .cast<ffi.NativeFunction<ffi.Void Function(ffi.Bool arg0)>>()
+      .asFunction<void Function(bool arg0)>()(arg0);
+}
+
+final _ObjCBlock31_closureRegistry = <int, Function>{};
+int _ObjCBlock31_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock31_registerClosure(Function fn) {
+  final id = ++_ObjCBlock31_closureRegistryIndex;
+  _ObjCBlock31_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock31_closureTrampoline(ffi.Pointer<_ObjCBlock> block, bool arg0) {
+  return _ObjCBlock31_closureRegistry[block.ref.target.address]!(arg0);
+}
+
+class ObjCBlock31 extends _ObjCBlockBase {
+  ObjCBlock31._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock31.fromFunctionPointer(SwiftLibrary lib,
+      ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Bool arg0)>> ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                        ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                            ffi.Bool arg0)>(_ObjCBlock31_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock31.fromFunction(SwiftLibrary lib, void Function(bool arg0) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                        ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                            ffi.Bool arg0)>(_ObjCBlock31_closureTrampoline)
+                    .cast(),
+                _ObjCBlock31_registerClosure(fn)),
+            lib);
+  void call(bool arg0) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block, ffi.Bool arg0)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block, bool arg0)>()(_id, arg0);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+abstract class NSProcessInfoThermalState {
+  static const int NSProcessInfoThermalStateNominal = 0;
+  static const int NSProcessInfoThermalStateFair = 1;
+  static const int NSProcessInfoThermalStateSerious = 2;
+  static const int NSProcessInfoThermalStateCritical = 3;
+}
+
+class NSTextCheckingResult extends NSObject {
+  NSTextCheckingResult._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSTextCheckingResult] that points to the same underlying object as [other].
+  static NSTextCheckingResult castFrom<T extends _ObjCWrapper>(T other) {
+    return NSTextCheckingResult._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSTextCheckingResult] that wraps the given raw object pointer.
+  static NSTextCheckingResult castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSTextCheckingResult._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSTextCheckingResult].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSTextCheckingResult1);
+  }
+
+  int get resultType {
+    return _lib._objc_msgSend_819(_id, _lib._sel_resultType1);
+  }
+
+  NSRange get range {
+    return _lib._objc_msgSend_49(_id, _lib._sel_range1);
+  }
+
+  NSOrthography? get orthography {
+    final _ret = _lib._objc_msgSend_820(_id, _lib._sel_orthography1);
+    return _ret.address == 0
+        ? null
+        : NSOrthography._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get grammarDetails {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_grammarDetails1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDate? get date {
+    final _ret = _lib._objc_msgSend_156(_id, _lib._sel_date1);
+    return _ret.address == 0
+        ? null
+        : NSDate._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSTimeZone? get timeZone {
+    final _ret = _lib._objc_msgSend_162(_id, _lib._sel_timeZone1);
+    return _ret.address == 0
+        ? null
+        : NSTimeZone._(_ret, _lib, retain: true, release: true);
+  }
+
+  double get duration {
+    return _lib._objc_msgSend_149(_id, _lib._sel_duration1);
+  }
+
+  NSDictionary? get components {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_components1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get URL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_URL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get replacementString {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_replacementString1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get alternativeStrings {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_alternativeStrings1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSRegularExpression? get regularExpression {
+    final _ret = _lib._objc_msgSend_832(_id, _lib._sel_regularExpression1);
+    return _ret.address == 0
+        ? null
+        : NSRegularExpression._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get phoneNumber {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_phoneNumber1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get numberOfRanges {
+    return _lib._objc_msgSend_10(_id, _lib._sel_numberOfRanges1);
+  }
+
+  NSRange rangeAtIndex_(int idx) {
+    return _lib._objc_msgSend_308(_id, _lib._sel_rangeAtIndex_1, idx);
+  }
+
+  NSRange rangeWithName_(NSString? name) {
+    return _lib._objc_msgSend_301(
+        _id, _lib._sel_rangeWithName_1, name?._id ?? ffi.nullptr);
+  }
+
+  NSTextCheckingResult resultByAdjustingRangesWithOffset_(int offset) {
+    final _ret = _lib._objc_msgSend_833(
+        _id, _lib._sel_resultByAdjustingRangesWithOffset_1, offset);
+    return NSTextCheckingResult._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary? get addressComponents {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_addressComponents1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTextCheckingResult orthographyCheckingResultWithRange_orthography_(
+      SwiftLibrary _lib, NSRange range, NSOrthography? orthography) {
+    final _ret = _lib._objc_msgSend_834(
+        _lib._class_NSTextCheckingResult1,
+        _lib._sel_orthographyCheckingResultWithRange_orthography_1,
+        range,
+        orthography?._id ?? ffi.nullptr);
+    return NSTextCheckingResult._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTextCheckingResult spellCheckingResultWithRange_(
+      SwiftLibrary _lib, NSRange range) {
+    final _ret = _lib._objc_msgSend_835(_lib._class_NSTextCheckingResult1,
+        _lib._sel_spellCheckingResultWithRange_1, range);
+    return NSTextCheckingResult._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTextCheckingResult grammarCheckingResultWithRange_details_(
+      SwiftLibrary _lib, NSRange range, NSArray? details) {
+    final _ret = _lib._objc_msgSend_836(
+        _lib._class_NSTextCheckingResult1,
+        _lib._sel_grammarCheckingResultWithRange_details_1,
+        range,
+        details?._id ?? ffi.nullptr);
+    return NSTextCheckingResult._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTextCheckingResult dateCheckingResultWithRange_date_(
+      SwiftLibrary _lib, NSRange range, NSDate? date) {
+    final _ret = _lib._objc_msgSend_837(
+        _lib._class_NSTextCheckingResult1,
+        _lib._sel_dateCheckingResultWithRange_date_1,
+        range,
+        date?._id ?? ffi.nullptr);
+    return NSTextCheckingResult._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTextCheckingResult
+      dateCheckingResultWithRange_date_timeZone_duration_(SwiftLibrary _lib,
+          NSRange range, NSDate? date, NSTimeZone? timeZone, double duration) {
+    final _ret = _lib._objc_msgSend_838(
+        _lib._class_NSTextCheckingResult1,
+        _lib._sel_dateCheckingResultWithRange_date_timeZone_duration_1,
+        range,
+        date?._id ?? ffi.nullptr,
+        timeZone?._id ?? ffi.nullptr,
+        duration);
+    return NSTextCheckingResult._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTextCheckingResult addressCheckingResultWithRange_components_(
+      SwiftLibrary _lib, NSRange range, NSDictionary? components) {
+    final _ret = _lib._objc_msgSend_839(
+        _lib._class_NSTextCheckingResult1,
+        _lib._sel_addressCheckingResultWithRange_components_1,
+        range,
+        components?._id ?? ffi.nullptr);
+    return NSTextCheckingResult._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTextCheckingResult linkCheckingResultWithRange_URL_(
+      SwiftLibrary _lib, NSRange range, NSURL? url) {
+    final _ret = _lib._objc_msgSend_840(
+        _lib._class_NSTextCheckingResult1,
+        _lib._sel_linkCheckingResultWithRange_URL_1,
+        range,
+        url?._id ?? ffi.nullptr);
+    return NSTextCheckingResult._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTextCheckingResult quoteCheckingResultWithRange_replacementString_(
+      SwiftLibrary _lib, NSRange range, NSString? replacementString) {
+    final _ret = _lib._objc_msgSend_841(
+        _lib._class_NSTextCheckingResult1,
+        _lib._sel_quoteCheckingResultWithRange_replacementString_1,
+        range,
+        replacementString?._id ?? ffi.nullptr);
+    return NSTextCheckingResult._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTextCheckingResult dashCheckingResultWithRange_replacementString_(
+      SwiftLibrary _lib, NSRange range, NSString? replacementString) {
+    final _ret = _lib._objc_msgSend_841(
+        _lib._class_NSTextCheckingResult1,
+        _lib._sel_dashCheckingResultWithRange_replacementString_1,
+        range,
+        replacementString?._id ?? ffi.nullptr);
+    return NSTextCheckingResult._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTextCheckingResult
+      replacementCheckingResultWithRange_replacementString_(
+          SwiftLibrary _lib, NSRange range, NSString? replacementString) {
+    final _ret = _lib._objc_msgSend_841(
+        _lib._class_NSTextCheckingResult1,
+        _lib._sel_replacementCheckingResultWithRange_replacementString_1,
+        range,
+        replacementString?._id ?? ffi.nullptr);
+    return NSTextCheckingResult._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTextCheckingResult
+      correctionCheckingResultWithRange_replacementString_(
+          SwiftLibrary _lib, NSRange range, NSString? replacementString) {
+    final _ret = _lib._objc_msgSend_841(
+        _lib._class_NSTextCheckingResult1,
+        _lib._sel_correctionCheckingResultWithRange_replacementString_1,
+        range,
+        replacementString?._id ?? ffi.nullptr);
+    return NSTextCheckingResult._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTextCheckingResult
+      correctionCheckingResultWithRange_replacementString_alternativeStrings_(
+          SwiftLibrary _lib,
+          NSRange range,
+          NSString? replacementString,
+          NSArray? alternativeStrings) {
+    final _ret = _lib._objc_msgSend_842(
+        _lib._class_NSTextCheckingResult1,
+        _lib._sel_correctionCheckingResultWithRange_replacementString_alternativeStrings_1,
+        range,
+        replacementString?._id ?? ffi.nullptr,
+        alternativeStrings?._id ?? ffi.nullptr);
+    return NSTextCheckingResult._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTextCheckingResult
+      regularExpressionCheckingResultWithRanges_count_regularExpression_(
+          SwiftLibrary _lib,
+          NSRangePointer ranges,
+          int count,
+          NSRegularExpression? regularExpression) {
+    final _ret = _lib._objc_msgSend_843(
+        _lib._class_NSTextCheckingResult1,
+        _lib._sel_regularExpressionCheckingResultWithRanges_count_regularExpression_1,
+        ranges,
+        count,
+        regularExpression?._id ?? ffi.nullptr);
+    return NSTextCheckingResult._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTextCheckingResult phoneNumberCheckingResultWithRange_phoneNumber_(
+      SwiftLibrary _lib, NSRange range, NSString? phoneNumber) {
+    final _ret = _lib._objc_msgSend_841(
+        _lib._class_NSTextCheckingResult1,
+        _lib._sel_phoneNumberCheckingResultWithRange_phoneNumber_1,
+        range,
+        phoneNumber?._id ?? ffi.nullptr);
+    return NSTextCheckingResult._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTextCheckingResult
+      transitInformationCheckingResultWithRange_components_(
+          SwiftLibrary _lib, NSRange range, NSDictionary? components) {
+    final _ret = _lib._objc_msgSend_839(
+        _lib._class_NSTextCheckingResult1,
+        _lib._sel_transitInformationCheckingResultWithRange_components_1,
+        range,
+        components?._id ?? ffi.nullptr);
+    return NSTextCheckingResult._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTextCheckingResult new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSTextCheckingResult1, _lib._sel_new1);
+    return NSTextCheckingResult._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSTextCheckingResult alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSTextCheckingResult1, _lib._sel_alloc1);
+    return NSTextCheckingResult._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSTextCheckingResult1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSTextCheckingResult1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSTextCheckingResult1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSTextCheckingResult1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSTextCheckingResult1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSTextCheckingResult1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSTextCheckingResult1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSTextCheckingResult1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSTextCheckingResult1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSTextCheckingType {
+  static const int NSTextCheckingTypeOrthography = 1;
+  static const int NSTextCheckingTypeSpelling = 2;
+  static const int NSTextCheckingTypeGrammar = 4;
+  static const int NSTextCheckingTypeDate = 8;
+  static const int NSTextCheckingTypeAddress = 16;
+  static const int NSTextCheckingTypeLink = 32;
+  static const int NSTextCheckingTypeQuote = 64;
+  static const int NSTextCheckingTypeDash = 128;
+  static const int NSTextCheckingTypeReplacement = 256;
+  static const int NSTextCheckingTypeCorrection = 512;
+  static const int NSTextCheckingTypeRegularExpression = 1024;
+  static const int NSTextCheckingTypePhoneNumber = 2048;
+  static const int NSTextCheckingTypeTransitInformation = 4096;
+}
+
+class NSRegularExpression extends NSObject {
+  NSRegularExpression._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSRegularExpression] that points to the same underlying object as [other].
+  static NSRegularExpression castFrom<T extends _ObjCWrapper>(T other) {
+    return NSRegularExpression._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSRegularExpression] that wraps the given raw object pointer.
+  static NSRegularExpression castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSRegularExpression._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSRegularExpression].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSRegularExpression1);
+  }
+
+  static NSRegularExpression regularExpressionWithPattern_options_error_(
+      SwiftLibrary _lib,
+      NSString? pattern,
+      int options,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_821(
+        _lib._class_NSRegularExpression1,
+        _lib._sel_regularExpressionWithPattern_options_error_1,
+        pattern?._id ?? ffi.nullptr,
+        options,
+        error);
+    return NSRegularExpression._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSRegularExpression initWithPattern_options_error_(NSString? pattern,
+      int options, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_822(
+        _id,
+        _lib._sel_initWithPattern_options_error_1,
+        pattern?._id ?? ffi.nullptr,
+        options,
+        error);
+    return NSRegularExpression._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get pattern {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_pattern1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get options {
+    return _lib._objc_msgSend_823(_id, _lib._sel_options1);
+  }
+
+  int get numberOfCaptureGroups {
+    return _lib._objc_msgSend_10(_id, _lib._sel_numberOfCaptureGroups1);
+  }
+
+  static NSString escapedPatternForString_(
+      SwiftLibrary _lib, NSString? string) {
+    final _ret = _lib._objc_msgSend_64(_lib._class_NSRegularExpression1,
+        _lib._sel_escapedPatternForString_1, string?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  void enumerateMatchesInString_options_range_usingBlock_(
+      NSString? string, int options, NSRange range, ObjCBlock32 block) {
+    return _lib._objc_msgSend_824(
+        _id,
+        _lib._sel_enumerateMatchesInString_options_range_usingBlock_1,
+        string?._id ?? ffi.nullptr,
+        options,
+        range,
+        block._id);
+  }
+
+  NSArray matchesInString_options_range_(
+      NSString? string, int options, NSRange range) {
+    final _ret = _lib._objc_msgSend_825(
+        _id,
+        _lib._sel_matchesInString_options_range_1,
+        string?._id ?? ffi.nullptr,
+        options,
+        range);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  int numberOfMatchesInString_options_range_(
+      NSString? string, int options, NSRange range) {
+    return _lib._objc_msgSend_826(
+        _id,
+        _lib._sel_numberOfMatchesInString_options_range_1,
+        string?._id ?? ffi.nullptr,
+        options,
+        range);
+  }
+
+  NSTextCheckingResult firstMatchInString_options_range_(
+      NSString? string, int options, NSRange range) {
+    final _ret = _lib._objc_msgSend_827(
+        _id,
+        _lib._sel_firstMatchInString_options_range_1,
+        string?._id ?? ffi.nullptr,
+        options,
+        range);
+    return NSTextCheckingResult._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSRange rangeOfFirstMatchInString_options_range_(
+      NSString? string, int options, NSRange range) {
+    return _lib._objc_msgSend_828(
+        _id,
+        _lib._sel_rangeOfFirstMatchInString_options_range_1,
+        string?._id ?? ffi.nullptr,
+        options,
+        range);
+  }
+
+  NSString stringByReplacingMatchesInString_options_range_withTemplate_(
+      NSString? string, int options, NSRange range, NSString? templ) {
+    final _ret = _lib._objc_msgSend_829(
+        _id,
+        _lib._sel_stringByReplacingMatchesInString_options_range_withTemplate_1,
+        string?._id ?? ffi.nullptr,
+        options,
+        range,
+        templ?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int replaceMatchesInString_options_range_withTemplate_(
+      NSMutableString? string, int options, NSRange range, NSString? templ) {
+    return _lib._objc_msgSend_830(
+        _id,
+        _lib._sel_replaceMatchesInString_options_range_withTemplate_1,
+        string?._id ?? ffi.nullptr,
+        options,
+        range,
+        templ?._id ?? ffi.nullptr);
+  }
+
+  NSString replacementStringForResult_inString_offset_template_(
+      NSTextCheckingResult? result,
+      NSString? string,
+      int offset,
+      NSString? templ) {
+    final _ret = _lib._objc_msgSend_831(
+        _id,
+        _lib._sel_replacementStringForResult_inString_offset_template_1,
+        result?._id ?? ffi.nullptr,
+        string?._id ?? ffi.nullptr,
+        offset,
+        templ?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString escapedTemplateForString_(
+      SwiftLibrary _lib, NSString? string) {
+    final _ret = _lib._objc_msgSend_64(_lib._class_NSRegularExpression1,
+        _lib._sel_escapedTemplateForString_1, string?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSRegularExpression new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSRegularExpression1, _lib._sel_new1);
+    return NSRegularExpression._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSRegularExpression alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSRegularExpression1, _lib._sel_alloc1);
+    return NSRegularExpression._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSRegularExpression1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSRegularExpression1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSRegularExpression1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSRegularExpression1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSRegularExpression1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSRegularExpression1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSRegularExpression1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSRegularExpression1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSRegularExpression1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSRegularExpressionOptions {
+  static const int NSRegularExpressionCaseInsensitive = 1;
+  static const int NSRegularExpressionAllowCommentsAndWhitespace = 2;
+  static const int NSRegularExpressionIgnoreMetacharacters = 4;
+  static const int NSRegularExpressionDotMatchesLineSeparators = 8;
+  static const int NSRegularExpressionAnchorsMatchLines = 16;
+  static const int NSRegularExpressionUseUnixLineSeparators = 32;
+  static const int NSRegularExpressionUseUnicodeWordBoundaries = 64;
+}
+
+abstract class NSMatchingOptions {
+  static const int NSMatchingReportProgress = 1;
+  static const int NSMatchingReportCompletion = 2;
+  static const int NSMatchingAnchored = 4;
+  static const int NSMatchingWithTransparentBounds = 8;
+  static const int NSMatchingWithoutAnchoringBounds = 16;
+}
+
+void _ObjCBlock32_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, int arg1, ffi.Pointer<ffi.Bool> arg2) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(ffi.Pointer<ObjCObject> arg0, ffi.Int32 arg1,
+                  ffi.Pointer<ffi.Bool> arg2)>>()
+      .asFunction<
+          void Function(ffi.Pointer<ObjCObject> arg0, int arg1,
+              ffi.Pointer<ffi.Bool> arg2)>()(arg0, arg1, arg2);
+}
+
+final _ObjCBlock32_closureRegistry = <int, Function>{};
+int _ObjCBlock32_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock32_registerClosure(Function fn) {
+  final id = ++_ObjCBlock32_closureRegistryIndex;
+  _ObjCBlock32_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock32_closureTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, int arg1, ffi.Pointer<ffi.Bool> arg2) {
+  return _ObjCBlock32_closureRegistry[block.ref.target.address]!(
+      arg0, arg1, arg2);
+}
+
+class ObjCBlock32 extends _ObjCBlockBase {
+  ObjCBlock32._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock32.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0,
+                      ffi.Int32 arg1, ffi.Pointer<ffi.Bool> arg2)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Int32 arg1,
+                                ffi.Pointer<ffi.Bool> arg2)>(
+                        _ObjCBlock32_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock32.fromFunction(
+      SwiftLibrary lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, int arg1,
+              ffi.Pointer<ffi.Bool> arg2)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Int32 arg1,
+                                ffi.Pointer<ffi.Bool> arg2)>(
+                        _ObjCBlock32_closureTrampoline)
+                    .cast(),
+                _ObjCBlock32_registerClosure(fn)),
+            lib);
+  void call(
+      ffi.Pointer<ObjCObject> arg0, int arg1, ffi.Pointer<ffi.Bool> arg2) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    ffi.Int32 arg1,
+                    ffi.Pointer<ffi.Bool> arg2)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                int arg1,
+                ffi.Pointer<ffi.Bool> arg2)>()(_id, arg0, arg1, arg2);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+abstract class NSMatchingFlags {
+  static const int NSMatchingProgress = 1;
+  static const int NSMatchingCompleted = 2;
+  static const int NSMatchingHitEnd = 4;
+  static const int NSMatchingRequiredEnd = 8;
+  static const int NSMatchingInternalError = 16;
+}
+
+class NSURLCache extends NSObject {
+  NSURLCache._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURLCache] that points to the same underlying object as [other].
+  static NSURLCache castFrom<T extends _ObjCWrapper>(T other) {
+    return NSURLCache._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSURLCache] that wraps the given raw object pointer.
+  static NSURLCache castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURLCache._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURLCache].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSURLCache1);
+  }
+
+  static NSURLCache? getSharedURLCache(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_844(
+        _lib._class_NSURLCache1, _lib._sel_sharedURLCache1);
+    return _ret.address == 0
+        ? null
+        : NSURLCache._(_ret, _lib, retain: true, release: true);
+  }
+
+  static void setSharedURLCache(SwiftLibrary _lib, NSURLCache? value) {
+    _lib._objc_msgSend_845(_lib._class_NSURLCache1,
+        _lib._sel_setSharedURLCache_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSURLCache initWithMemoryCapacity_diskCapacity_diskPath_(
+      int memoryCapacity, int diskCapacity, NSString? path) {
+    final _ret = _lib._objc_msgSend_846(
+        _id,
+        _lib._sel_initWithMemoryCapacity_diskCapacity_diskPath_1,
+        memoryCapacity,
+        diskCapacity,
+        path?._id ?? ffi.nullptr);
+    return NSURLCache._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLCache initWithMemoryCapacity_diskCapacity_directoryURL_(
+      int memoryCapacity, int diskCapacity, NSURL? directoryURL) {
+    final _ret = _lib._objc_msgSend_847(
+        _id,
+        _lib._sel_initWithMemoryCapacity_diskCapacity_directoryURL_1,
+        memoryCapacity,
+        diskCapacity,
+        directoryURL?._id ?? ffi.nullptr);
+    return NSURLCache._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSCachedURLResponse cachedResponseForRequest_(NSURLRequest? request) {
+    final _ret = _lib._objc_msgSend_851(
+        _id, _lib._sel_cachedResponseForRequest_1, request?._id ?? ffi.nullptr);
+    return NSCachedURLResponse._(_ret, _lib, retain: true, release: true);
+  }
+
+  void storeCachedResponse_forRequest_(
+      NSCachedURLResponse? cachedResponse, NSURLRequest? request) {
+    return _lib._objc_msgSend_852(
+        _id,
+        _lib._sel_storeCachedResponse_forRequest_1,
+        cachedResponse?._id ?? ffi.nullptr,
+        request?._id ?? ffi.nullptr);
+  }
+
+  void removeCachedResponseForRequest_(NSURLRequest? request) {
+    return _lib._objc_msgSend_853(
+        _id,
+        _lib._sel_removeCachedResponseForRequest_1,
+        request?._id ?? ffi.nullptr);
+  }
+
+  void removeAllCachedResponses() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_removeAllCachedResponses1);
+  }
+
+  void removeCachedResponsesSinceDate_(NSDate? date) {
+    return _lib._objc_msgSend_472(_id,
+        _lib._sel_removeCachedResponsesSinceDate_1, date?._id ?? ffi.nullptr);
+  }
+
+  int get memoryCapacity {
+    return _lib._objc_msgSend_10(_id, _lib._sel_memoryCapacity1);
+  }
+
+  set memoryCapacity(int value) {
+    _lib._objc_msgSend_451(_id, _lib._sel_setMemoryCapacity_1, value);
+  }
+
+  int get diskCapacity {
+    return _lib._objc_msgSend_10(_id, _lib._sel_diskCapacity1);
+  }
+
+  set diskCapacity(int value) {
+    _lib._objc_msgSend_451(_id, _lib._sel_setDiskCapacity_1, value);
+  }
+
+  int get currentMemoryUsage {
+    return _lib._objc_msgSend_10(_id, _lib._sel_currentMemoryUsage1);
+  }
+
+  int get currentDiskUsage {
+    return _lib._objc_msgSend_10(_id, _lib._sel_currentDiskUsage1);
+  }
+
+  void storeCachedResponse_forDataTask_(
+      NSCachedURLResponse? cachedResponse, NSURLSessionDataTask? dataTask) {
+    return _lib._objc_msgSend_854(
+        _id,
+        _lib._sel_storeCachedResponse_forDataTask_1,
+        cachedResponse?._id ?? ffi.nullptr,
+        dataTask?._id ?? ffi.nullptr);
+  }
+
+  void getCachedResponseForDataTask_completionHandler_(
+      NSURLSessionDataTask? dataTask, ObjCBlock33 completionHandler) {
+    return _lib._objc_msgSend_855(
+        _id,
+        _lib._sel_getCachedResponseForDataTask_completionHandler_1,
+        dataTask?._id ?? ffi.nullptr,
+        completionHandler._id);
+  }
+
+  void removeCachedResponseForDataTask_(NSURLSessionDataTask? dataTask) {
+    return _lib._objc_msgSend_856(
+        _id,
+        _lib._sel_removeCachedResponseForDataTask_1,
+        dataTask?._id ?? ffi.nullptr);
+  }
+
+  static NSURLCache new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSURLCache1, _lib._sel_new1);
+    return NSURLCache._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSURLCache alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSURLCache1, _lib._sel_alloc1);
+    return NSURLCache._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURLCache1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLCache1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLCache1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLCache1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURLCache1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURLCache1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURLCache1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSURLCache1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLCache1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSCachedURLResponse extends NSObject {
+  NSCachedURLResponse._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSCachedURLResponse] that points to the same underlying object as [other].
+  static NSCachedURLResponse castFrom<T extends _ObjCWrapper>(T other) {
+    return NSCachedURLResponse._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSCachedURLResponse] that wraps the given raw object pointer.
+  static NSCachedURLResponse castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSCachedURLResponse._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSCachedURLResponse].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSCachedURLResponse1);
+  }
+
+  NSCachedURLResponse initWithResponse_data_(
+      NSURLResponse? response, NSData? data) {
+    final _ret = _lib._objc_msgSend_848(_id, _lib._sel_initWithResponse_data_1,
+        response?._id ?? ffi.nullptr, data?._id ?? ffi.nullptr);
+    return NSCachedURLResponse._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSCachedURLResponse initWithResponse_data_userInfo_storagePolicy_(
+      NSURLResponse? response,
+      NSData? data,
+      NSDictionary? userInfo,
+      int storagePolicy) {
+    final _ret = _lib._objc_msgSend_849(
+        _id,
+        _lib._sel_initWithResponse_data_userInfo_storagePolicy_1,
+        response?._id ?? ffi.nullptr,
+        data?._id ?? ffi.nullptr,
+        userInfo?._id ?? ffi.nullptr,
+        storagePolicy);
+    return NSCachedURLResponse._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLResponse? get response {
+    final _ret = _lib._objc_msgSend_763(_id, _lib._sel_response1);
+    return _ret.address == 0
+        ? null
+        : NSURLResponse._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData? get data {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_data1);
+    return _ret.address == 0
+        ? null
+        : NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary? get userInfo {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_userInfo1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get storagePolicy {
+    return _lib._objc_msgSend_850(_id, _lib._sel_storagePolicy1);
+  }
+
+  static NSCachedURLResponse new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSCachedURLResponse1, _lib._sel_new1);
+    return NSCachedURLResponse._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSCachedURLResponse alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSCachedURLResponse1, _lib._sel_alloc1);
+    return NSCachedURLResponse._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSCachedURLResponse1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSCachedURLResponse1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSCachedURLResponse1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSCachedURLResponse1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSCachedURLResponse1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSCachedURLResponse1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSCachedURLResponse1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSCachedURLResponse1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSCachedURLResponse1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSURLCacheStoragePolicy {
+  static const int NSURLCacheStorageAllowed = 0;
+  static const int NSURLCacheStorageAllowedInMemoryOnly = 1;
+  static const int NSURLCacheStorageNotAllowed = 2;
+}
+
+class NSURLSessionDataTask extends NSURLSessionTask {
+  NSURLSessionDataTask._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURLSessionDataTask] that points to the same underlying object as [other].
+  static NSURLSessionDataTask castFrom<T extends _ObjCWrapper>(T other) {
+    return NSURLSessionDataTask._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSURLSessionDataTask] that wraps the given raw object pointer.
+  static NSURLSessionDataTask castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURLSessionDataTask._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURLSessionDataTask].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSURLSessionDataTask1);
+  }
+
+  @override
+  NSURLSessionDataTask init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSURLSessionDataTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLSessionDataTask new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSURLSessionDataTask1, _lib._sel_new1);
+    return NSURLSessionDataTask._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSURLSessionDataTask alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLSessionDataTask1, _lib._sel_alloc1);
+    return NSURLSessionDataTask._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURLSessionDataTask1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLSessionDataTask1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSURLSessionDataTask1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLSessionDataTask1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURLSessionDataTask1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURLSessionDataTask1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURLSessionDataTask1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSURLSessionDataTask1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLSessionDataTask1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+void _ObjCBlock33_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ObjCObject> arg0) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ObjCObject> arg0)>>()
+      .asFunction<void Function(ffi.Pointer<ObjCObject> arg0)>()(arg0);
+}
+
+final _ObjCBlock33_closureRegistry = <int, Function>{};
+int _ObjCBlock33_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock33_registerClosure(Function fn) {
+  final id = ++_ObjCBlock33_closureRegistryIndex;
+  _ObjCBlock33_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock33_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ObjCObject> arg0) {
+  return _ObjCBlock33_closureRegistry[block.ref.target.address]!(arg0);
+}
+
+class ObjCBlock33 extends _ObjCBlockBase {
+  ObjCBlock33._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock33.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0)>(
+                        _ObjCBlock33_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock33.fromFunction(
+      SwiftLibrary lib, void Function(ffi.Pointer<ObjCObject> arg0) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0)>(
+                        _ObjCBlock33_closureTrampoline)
+                    .cast(),
+                _ObjCBlock33_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0)>>()
+        .asFunction<
+            void Function(ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0)>()(_id, arg0);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class NSURLConnection extends NSObject {
+  NSURLConnection._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURLConnection] that points to the same underlying object as [other].
+  static NSURLConnection castFrom<T extends _ObjCWrapper>(T other) {
+    return NSURLConnection._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSURLConnection] that wraps the given raw object pointer.
+  static NSURLConnection castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURLConnection._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURLConnection].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSURLConnection1);
+  }
+
+  NSURLConnection initWithRequest_delegate_startImmediately_(
+      NSURLRequest? request, NSObject delegate, bool startImmediately) {
+    final _ret = _lib._objc_msgSend_857(
+        _id,
+        _lib._sel_initWithRequest_delegate_startImmediately_1,
+        request?._id ?? ffi.nullptr,
+        delegate._id,
+        startImmediately);
+    return NSURLConnection._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLConnection initWithRequest_delegate_(
+      NSURLRequest? request, NSObject delegate) {
+    final _ret = _lib._objc_msgSend_858(
+        _id,
+        _lib._sel_initWithRequest_delegate_1,
+        request?._id ?? ffi.nullptr,
+        delegate._id);
+    return NSURLConnection._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLConnection connectionWithRequest_delegate_(
+      SwiftLibrary _lib, NSURLRequest? request, NSObject delegate) {
+    final _ret = _lib._objc_msgSend_859(
+        _lib._class_NSURLConnection1,
+        _lib._sel_connectionWithRequest_delegate_1,
+        request?._id ?? ffi.nullptr,
+        delegate._id);
+    return NSURLConnection._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLRequest? get originalRequest {
+    final _ret = _lib._objc_msgSend_761(_id, _lib._sel_originalRequest1);
+    return _ret.address == 0
+        ? null
+        : NSURLRequest._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLRequest? get currentRequest {
+    final _ret = _lib._objc_msgSend_761(_id, _lib._sel_currentRequest1);
+    return _ret.address == 0
+        ? null
+        : NSURLRequest._(_ret, _lib, retain: true, release: true);
+  }
+
+  void start() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_start1);
+  }
+
+  void cancel() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_cancel1);
+  }
+
+  void scheduleInRunLoop_forMode_(NSRunLoop? aRunLoop, NSRunLoopMode mode) {
+    return _lib._objc_msgSend_501(_id, _lib._sel_scheduleInRunLoop_forMode_1,
+        aRunLoop?._id ?? ffi.nullptr, mode);
+  }
+
+  void unscheduleFromRunLoop_forMode_(NSRunLoop? aRunLoop, NSRunLoopMode mode) {
+    return _lib._objc_msgSend_501(
+        _id,
+        _lib._sel_unscheduleFromRunLoop_forMode_1,
+        aRunLoop?._id ?? ffi.nullptr,
+        mode);
+  }
+
+  void setDelegateQueue_(NSOperationQueue? queue) {
+    return _lib._objc_msgSend_860(
+        _id, _lib._sel_setDelegateQueue_1, queue?._id ?? ffi.nullptr);
+  }
+
+  static bool canHandleRequest_(SwiftLibrary _lib, NSURLRequest? request) {
+    return _lib._objc_msgSend_861(_lib._class_NSURLConnection1,
+        _lib._sel_canHandleRequest_1, request?._id ?? ffi.nullptr);
+  }
+
+  static NSData sendSynchronousRequest_returningResponse_error_(
+      SwiftLibrary _lib,
+      NSURLRequest? request,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> response,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_862(
+        _lib._class_NSURLConnection1,
+        _lib._sel_sendSynchronousRequest_returningResponse_error_1,
+        request?._id ?? ffi.nullptr,
+        response,
+        error);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  static void sendAsynchronousRequest_queue_completionHandler_(
+      SwiftLibrary _lib,
+      NSURLRequest? request,
+      NSOperationQueue? queue,
+      ObjCBlock34 handler) {
+    return _lib._objc_msgSend_863(
+        _lib._class_NSURLConnection1,
+        _lib._sel_sendAsynchronousRequest_queue_completionHandler_1,
+        request?._id ?? ffi.nullptr,
+        queue?._id ?? ffi.nullptr,
+        handler._id);
+  }
+
+  static NSURLConnection new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSURLConnection1, _lib._sel_new1);
+    return NSURLConnection._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSURLConnection alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSURLConnection1, _lib._sel_alloc1);
+    return NSURLConnection._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURLConnection1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLConnection1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSURLConnection1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLConnection1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURLConnection1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURLConnection1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURLConnection1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSURLConnection1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLConnection1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+void _ObjCBlock34_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0,
+    ffi.Pointer<ObjCObject> arg1,
+    ffi.Pointer<ObjCObject> arg2) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(
+                  ffi.Pointer<ObjCObject> arg0,
+                  ffi.Pointer<ObjCObject> arg1,
+                  ffi.Pointer<ObjCObject> arg2)>>()
+      .asFunction<
+          void Function(
+              ffi.Pointer<ObjCObject> arg0,
+              ffi.Pointer<ObjCObject> arg1,
+              ffi.Pointer<ObjCObject> arg2)>()(arg0, arg1, arg2);
+}
+
+final _ObjCBlock34_closureRegistry = <int, Function>{};
+int _ObjCBlock34_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock34_registerClosure(Function fn) {
+  final id = ++_ObjCBlock34_closureRegistryIndex;
+  _ObjCBlock34_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock34_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0,
+    ffi.Pointer<ObjCObject> arg1,
+    ffi.Pointer<ObjCObject> arg2) {
+  return _ObjCBlock34_closureRegistry[block.ref.target.address]!(
+      arg0, arg1, arg2);
+}
+
+class ObjCBlock34 extends _ObjCBlockBase {
+  ObjCBlock34._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock34.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(
+                      ffi.Pointer<ObjCObject> arg0,
+                      ffi.Pointer<ObjCObject> arg1,
+                      ffi.Pointer<ObjCObject> arg2)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1,
+                                ffi.Pointer<ObjCObject> arg2)>(
+                        _ObjCBlock34_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock34.fromFunction(
+      SwiftLibrary lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1,
+              ffi.Pointer<ObjCObject> arg2)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1,
+                                ffi.Pointer<ObjCObject> arg2)>(
+                        _ObjCBlock34_closureTrampoline)
+                    .cast(),
+                _ObjCBlock34_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1,
+      ffi.Pointer<ObjCObject> arg2) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    ffi.Pointer<ObjCObject> arg1,
+                    ffi.Pointer<ObjCObject> arg2)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                ffi.Pointer<ObjCObject> arg1,
+                ffi.Pointer<ObjCObject> arg2)>()(_id, arg0, arg1, arg2);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class NSURLCredential extends NSObject {
+  NSURLCredential._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURLCredential] that points to the same underlying object as [other].
+  static NSURLCredential castFrom<T extends _ObjCWrapper>(T other) {
+    return NSURLCredential._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSURLCredential] that wraps the given raw object pointer.
+  static NSURLCredential castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURLCredential._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURLCredential].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSURLCredential1);
+  }
+
+  int get persistence {
+    return _lib._objc_msgSend_864(_id, _lib._sel_persistence1);
+  }
+
+  NSURLCredential initWithUser_password_persistence_(
+      NSString? user, NSString? password, int persistence) {
+    final _ret = _lib._objc_msgSend_865(
+        _id,
+        _lib._sel_initWithUser_password_persistence_1,
+        user?._id ?? ffi.nullptr,
+        password?._id ?? ffi.nullptr,
+        persistence);
+    return NSURLCredential._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLCredential credentialWithUser_password_persistence_(
+      SwiftLibrary _lib, NSString? user, NSString? password, int persistence) {
+    final _ret = _lib._objc_msgSend_866(
+        _lib._class_NSURLCredential1,
+        _lib._sel_credentialWithUser_password_persistence_1,
+        user?._id ?? ffi.nullptr,
+        password?._id ?? ffi.nullptr,
+        persistence);
+    return NSURLCredential._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get user {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_user1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get password {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_password1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool get hasPassword {
+    return _lib._objc_msgSend_12(_id, _lib._sel_hasPassword1);
+  }
+
+  NSURLCredential initWithIdentity_certificates_persistence_(
+      SecIdentityRef identity, NSArray? certArray, int persistence) {
+    final _ret = _lib._objc_msgSend_867(
+        _id,
+        _lib._sel_initWithIdentity_certificates_persistence_1,
+        identity,
+        certArray?._id ?? ffi.nullptr,
+        persistence);
+    return NSURLCredential._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLCredential credentialWithIdentity_certificates_persistence_(
+      SwiftLibrary _lib,
+      SecIdentityRef identity,
+      NSArray? certArray,
+      int persistence) {
+    final _ret = _lib._objc_msgSend_868(
+        _lib._class_NSURLCredential1,
+        _lib._sel_credentialWithIdentity_certificates_persistence_1,
+        identity,
+        certArray?._id ?? ffi.nullptr,
+        persistence);
+    return NSURLCredential._(_ret, _lib, retain: true, release: true);
+  }
+
+  SecIdentityRef get identity {
+    return _lib._objc_msgSend_869(_id, _lib._sel_identity1);
+  }
+
+  NSArray? get certificates {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_certificates1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLCredential initWithTrust_(SecTrustRef trust) {
+    final _ret = _lib._objc_msgSend_870(_id, _lib._sel_initWithTrust_1, trust);
+    return NSURLCredential._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLCredential credentialForTrust_(
+      SwiftLibrary _lib, SecTrustRef trust) {
+    final _ret = _lib._objc_msgSend_871(
+        _lib._class_NSURLCredential1, _lib._sel_credentialForTrust_1, trust);
+    return NSURLCredential._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLCredential new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSURLCredential1, _lib._sel_new1);
+    return NSURLCredential._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSURLCredential alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSURLCredential1, _lib._sel_alloc1);
+    return NSURLCredential._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURLCredential1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLCredential1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSURLCredential1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLCredential1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURLCredential1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURLCredential1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURLCredential1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSURLCredential1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLCredential1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSURLCredentialPersistence {
+  static const int NSURLCredentialPersistenceNone = 0;
+  static const int NSURLCredentialPersistenceForSession = 1;
+  static const int NSURLCredentialPersistencePermanent = 2;
+  static const int NSURLCredentialPersistenceSynchronizable = 3;
+}
+
+typedef SecIdentityRef = ffi.Pointer<__SecIdentity>;
+
+class __SecIdentity extends ffi.Opaque {}
+
+typedef SecTrustRef = ffi.Pointer<__SecTrust>;
+
+class __SecTrust extends ffi.Opaque {}
+
+class NSURLProtectionSpace extends NSObject {
+  NSURLProtectionSpace._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURLProtectionSpace] that points to the same underlying object as [other].
+  static NSURLProtectionSpace castFrom<T extends _ObjCWrapper>(T other) {
+    return NSURLProtectionSpace._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSURLProtectionSpace] that wraps the given raw object pointer.
+  static NSURLProtectionSpace castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURLProtectionSpace._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURLProtectionSpace].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSURLProtectionSpace1);
+  }
+
+  NSURLProtectionSpace initWithHost_port_protocol_realm_authenticationMethod_(
+      NSString? host,
+      int port,
+      NSString? protocol,
+      NSString? realm,
+      NSString? authenticationMethod) {
+    final _ret = _lib._objc_msgSend_872(
+        _id,
+        _lib._sel_initWithHost_port_protocol_realm_authenticationMethod_1,
+        host?._id ?? ffi.nullptr,
+        port,
+        protocol?._id ?? ffi.nullptr,
+        realm?._id ?? ffi.nullptr,
+        authenticationMethod?._id ?? ffi.nullptr);
+    return NSURLProtectionSpace._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLProtectionSpace initWithProxyHost_port_type_realm_authenticationMethod_(
+      NSString? host,
+      int port,
+      NSString? type,
+      NSString? realm,
+      NSString? authenticationMethod) {
+    final _ret = _lib._objc_msgSend_872(
+        _id,
+        _lib._sel_initWithProxyHost_port_type_realm_authenticationMethod_1,
+        host?._id ?? ffi.nullptr,
+        port,
+        type?._id ?? ffi.nullptr,
+        realm?._id ?? ffi.nullptr,
+        authenticationMethod?._id ?? ffi.nullptr);
+    return NSURLProtectionSpace._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get realm {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_realm1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool get receivesCredentialSecurely {
+    return _lib._objc_msgSend_12(_id, _lib._sel_receivesCredentialSecurely1);
+  }
+
+  bool get isProxy {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isProxy1);
+  }
+
+  NSString? get host {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_host1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get port {
+    return _lib._objc_msgSend_78(_id, _lib._sel_port1);
+  }
+
+  NSString? get proxyType {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_proxyType1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get protocol {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_protocol1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get authenticationMethod {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_authenticationMethod1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get distinguishedNames {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_distinguishedNames1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  SecTrustRef get serverTrust {
+    return _lib._objc_msgSend_873(_id, _lib._sel_serverTrust1);
+  }
+
+  static NSURLProtectionSpace new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSURLProtectionSpace1, _lib._sel_new1);
+    return NSURLProtectionSpace._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSURLProtectionSpace alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLProtectionSpace1, _lib._sel_alloc1);
+    return NSURLProtectionSpace._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURLProtectionSpace1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLProtectionSpace1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSURLProtectionSpace1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLProtectionSpace1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURLProtectionSpace1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURLProtectionSpace1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURLProtectionSpace1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSURLProtectionSpace1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLProtectionSpace1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSURLCredentialStorage extends NSObject {
+  NSURLCredentialStorage._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURLCredentialStorage] that points to the same underlying object as [other].
+  static NSURLCredentialStorage castFrom<T extends _ObjCWrapper>(T other) {
+    return NSURLCredentialStorage._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSURLCredentialStorage] that wraps the given raw object pointer.
+  static NSURLCredentialStorage castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURLCredentialStorage._(other, lib,
+        retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURLCredentialStorage].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSURLCredentialStorage1);
+  }
+
+  static NSURLCredentialStorage? getSharedCredentialStorage(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_874(_lib._class_NSURLCredentialStorage1,
+        _lib._sel_sharedCredentialStorage1);
+    return _ret.address == 0
+        ? null
+        : NSURLCredentialStorage._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary credentialsForProtectionSpace_(NSURLProtectionSpace? space) {
+    final _ret = _lib._objc_msgSend_875(_id,
+        _lib._sel_credentialsForProtectionSpace_1, space?._id ?? ffi.nullptr);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSDictionary? get allCredentials {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_allCredentials1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  void setCredential_forProtectionSpace_(
+      NSURLCredential? credential, NSURLProtectionSpace? space) {
+    return _lib._objc_msgSend_876(
+        _id,
+        _lib._sel_setCredential_forProtectionSpace_1,
+        credential?._id ?? ffi.nullptr,
+        space?._id ?? ffi.nullptr);
+  }
+
+  void removeCredential_forProtectionSpace_(
+      NSURLCredential? credential, NSURLProtectionSpace? space) {
+    return _lib._objc_msgSend_876(
+        _id,
+        _lib._sel_removeCredential_forProtectionSpace_1,
+        credential?._id ?? ffi.nullptr,
+        space?._id ?? ffi.nullptr);
+  }
+
+  void removeCredential_forProtectionSpace_options_(NSURLCredential? credential,
+      NSURLProtectionSpace? space, NSDictionary? options) {
+    return _lib._objc_msgSend_877(
+        _id,
+        _lib._sel_removeCredential_forProtectionSpace_options_1,
+        credential?._id ?? ffi.nullptr,
+        space?._id ?? ffi.nullptr,
+        options?._id ?? ffi.nullptr);
+  }
+
+  NSURLCredential defaultCredentialForProtectionSpace_(
+      NSURLProtectionSpace? space) {
+    final _ret = _lib._objc_msgSend_878(
+        _id,
+        _lib._sel_defaultCredentialForProtectionSpace_1,
+        space?._id ?? ffi.nullptr);
+    return NSURLCredential._(_ret, _lib, retain: true, release: true);
+  }
+
+  void setDefaultCredential_forProtectionSpace_(
+      NSURLCredential? credential, NSURLProtectionSpace? space) {
+    return _lib._objc_msgSend_876(
+        _id,
+        _lib._sel_setDefaultCredential_forProtectionSpace_1,
+        credential?._id ?? ffi.nullptr,
+        space?._id ?? ffi.nullptr);
+  }
+
+  void getCredentialsForProtectionSpace_task_completionHandler_(
+      NSURLProtectionSpace? protectionSpace,
+      NSURLSessionTask? task,
+      ObjCBlock35 completionHandler) {
+    return _lib._objc_msgSend_879(
+        _id,
+        _lib._sel_getCredentialsForProtectionSpace_task_completionHandler_1,
+        protectionSpace?._id ?? ffi.nullptr,
+        task?._id ?? ffi.nullptr,
+        completionHandler._id);
+  }
+
+  void setCredential_forProtectionSpace_task_(NSURLCredential? credential,
+      NSURLProtectionSpace? protectionSpace, NSURLSessionTask? task) {
+    return _lib._objc_msgSend_880(
+        _id,
+        _lib._sel_setCredential_forProtectionSpace_task_1,
+        credential?._id ?? ffi.nullptr,
+        protectionSpace?._id ?? ffi.nullptr,
+        task?._id ?? ffi.nullptr);
+  }
+
+  void removeCredential_forProtectionSpace_options_task_(
+      NSURLCredential? credential,
+      NSURLProtectionSpace? protectionSpace,
+      NSDictionary? options,
+      NSURLSessionTask? task) {
+    return _lib._objc_msgSend_881(
+        _id,
+        _lib._sel_removeCredential_forProtectionSpace_options_task_1,
+        credential?._id ?? ffi.nullptr,
+        protectionSpace?._id ?? ffi.nullptr,
+        options?._id ?? ffi.nullptr,
+        task?._id ?? ffi.nullptr);
+  }
+
+  void getDefaultCredentialForProtectionSpace_task_completionHandler_(
+      NSURLProtectionSpace? space,
+      NSURLSessionTask? task,
+      ObjCBlock36 completionHandler) {
+    return _lib._objc_msgSend_882(
+        _id,
+        _lib._sel_getDefaultCredentialForProtectionSpace_task_completionHandler_1,
+        space?._id ?? ffi.nullptr,
+        task?._id ?? ffi.nullptr,
+        completionHandler._id);
+  }
+
+  void setDefaultCredential_forProtectionSpace_task_(
+      NSURLCredential? credential,
+      NSURLProtectionSpace? protectionSpace,
+      NSURLSessionTask? task) {
+    return _lib._objc_msgSend_880(
+        _id,
+        _lib._sel_setDefaultCredential_forProtectionSpace_task_1,
+        credential?._id ?? ffi.nullptr,
+        protectionSpace?._id ?? ffi.nullptr,
+        task?._id ?? ffi.nullptr);
+  }
+
+  static NSURLCredentialStorage new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLCredentialStorage1, _lib._sel_new1);
+    return NSURLCredentialStorage._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSURLCredentialStorage alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLCredentialStorage1, _lib._sel_alloc1);
+    return NSURLCredentialStorage._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURLCredentialStorage1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLCredentialStorage1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSURLCredentialStorage1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLCredentialStorage1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURLCredentialStorage1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURLCredentialStorage1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURLCredentialStorage1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSURLCredentialStorage1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSURLCredentialStorage1,
+        _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+void _ObjCBlock35_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ObjCObject> arg0) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ObjCObject> arg0)>>()
+      .asFunction<void Function(ffi.Pointer<ObjCObject> arg0)>()(arg0);
+}
+
+final _ObjCBlock35_closureRegistry = <int, Function>{};
+int _ObjCBlock35_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock35_registerClosure(Function fn) {
+  final id = ++_ObjCBlock35_closureRegistryIndex;
+  _ObjCBlock35_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock35_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ObjCObject> arg0) {
+  return _ObjCBlock35_closureRegistry[block.ref.target.address]!(arg0);
+}
+
+class ObjCBlock35 extends _ObjCBlockBase {
+  ObjCBlock35._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock35.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0)>(
+                        _ObjCBlock35_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock35.fromFunction(
+      SwiftLibrary lib, void Function(ffi.Pointer<ObjCObject> arg0) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0)>(
+                        _ObjCBlock35_closureTrampoline)
+                    .cast(),
+                _ObjCBlock35_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0)>>()
+        .asFunction<
+            void Function(ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0)>()(_id, arg0);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+void _ObjCBlock36_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ObjCObject> arg0) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ObjCObject> arg0)>>()
+      .asFunction<void Function(ffi.Pointer<ObjCObject> arg0)>()(arg0);
+}
+
+final _ObjCBlock36_closureRegistry = <int, Function>{};
+int _ObjCBlock36_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock36_registerClosure(Function fn) {
+  final id = ++_ObjCBlock36_closureRegistryIndex;
+  _ObjCBlock36_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock36_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ObjCObject> arg0) {
+  return _ObjCBlock36_closureRegistry[block.ref.target.address]!(arg0);
+}
+
+class ObjCBlock36 extends _ObjCBlockBase {
+  ObjCBlock36._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock36.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0)>(
+                        _ObjCBlock36_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock36.fromFunction(
+      SwiftLibrary lib, void Function(ffi.Pointer<ObjCObject> arg0) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0)>(
+                        _ObjCBlock36_closureTrampoline)
+                    .cast(),
+                _ObjCBlock36_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0)>>()
+        .asFunction<
+            void Function(ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0)>()(_id, arg0);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class NSURLProtocol extends NSObject {
+  NSURLProtocol._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURLProtocol] that points to the same underlying object as [other].
+  static NSURLProtocol castFrom<T extends _ObjCWrapper>(T other) {
+    return NSURLProtocol._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSURLProtocol] that wraps the given raw object pointer.
+  static NSURLProtocol castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURLProtocol._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURLProtocol].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSURLProtocol1);
+  }
+
+  NSURLProtocol initWithRequest_cachedResponse_client_(NSURLRequest? request,
+      NSCachedURLResponse? cachedResponse, NSObject? client) {
+    final _ret = _lib._objc_msgSend_883(
+        _id,
+        _lib._sel_initWithRequest_cachedResponse_client_1,
+        request?._id ?? ffi.nullptr,
+        cachedResponse?._id ?? ffi.nullptr,
+        client?._id ?? ffi.nullptr);
+    return NSURLProtocol._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject? get client {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_client1);
+    return _ret.address == 0
+        ? null
+        : NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLRequest? get request {
+    final _ret = _lib._objc_msgSend_761(_id, _lib._sel_request1);
+    return _ret.address == 0
+        ? null
+        : NSURLRequest._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSCachedURLResponse? get cachedResponse {
+    final _ret = _lib._objc_msgSend_884(_id, _lib._sel_cachedResponse1);
+    return _ret.address == 0
+        ? null
+        : NSCachedURLResponse._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool canInitWithRequest_(SwiftLibrary _lib, NSURLRequest? request) {
+    return _lib._objc_msgSend_861(_lib._class_NSURLProtocol1,
+        _lib._sel_canInitWithRequest_1, request?._id ?? ffi.nullptr);
+  }
+
+  static NSURLRequest canonicalRequestForRequest_(
+      SwiftLibrary _lib, NSURLRequest? request) {
+    final _ret = _lib._objc_msgSend_885(_lib._class_NSURLProtocol1,
+        _lib._sel_canonicalRequestForRequest_1, request?._id ?? ffi.nullptr);
+    return NSURLRequest._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool requestIsCacheEquivalent_toRequest_(
+      SwiftLibrary _lib, NSURLRequest? a, NSURLRequest? b) {
+    return _lib._objc_msgSend_886(
+        _lib._class_NSURLProtocol1,
+        _lib._sel_requestIsCacheEquivalent_toRequest_1,
+        a?._id ?? ffi.nullptr,
+        b?._id ?? ffi.nullptr);
+  }
+
+  void startLoading() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_startLoading1);
+  }
+
+  void stopLoading() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_stopLoading1);
+  }
+
+  static NSObject propertyForKey_inRequest_(
+      SwiftLibrary _lib, NSString? key, NSURLRequest? request) {
+    final _ret = _lib._objc_msgSend_887(
+        _lib._class_NSURLProtocol1,
+        _lib._sel_propertyForKey_inRequest_1,
+        key?._id ?? ffi.nullptr,
+        request?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static void setProperty_forKey_inRequest_(SwiftLibrary _lib, NSObject value,
+      NSString? key, NSMutableURLRequest? request) {
+    return _lib._objc_msgSend_894(
+        _lib._class_NSURLProtocol1,
+        _lib._sel_setProperty_forKey_inRequest_1,
+        value._id,
+        key?._id ?? ffi.nullptr,
+        request?._id ?? ffi.nullptr);
+  }
+
+  static void removePropertyForKey_inRequest_(
+      SwiftLibrary _lib, NSString? key, NSMutableURLRequest? request) {
+    return _lib._objc_msgSend_895(
+        _lib._class_NSURLProtocol1,
+        _lib._sel_removePropertyForKey_inRequest_1,
+        key?._id ?? ffi.nullptr,
+        request?._id ?? ffi.nullptr);
+  }
+
+  static bool registerClass_(SwiftLibrary _lib, NSObject protocolClass) {
+    return _lib._objc_msgSend_0(_lib._class_NSURLProtocol1,
+        _lib._sel_registerClass_1, protocolClass._id);
+  }
+
+  static void unregisterClass_(SwiftLibrary _lib, NSObject protocolClass) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLProtocol1,
+        _lib._sel_unregisterClass_1, protocolClass._id);
+  }
+
+  static bool canInitWithTask_(SwiftLibrary _lib, NSURLSessionTask? task) {
+    return _lib._objc_msgSend_896(_lib._class_NSURLProtocol1,
+        _lib._sel_canInitWithTask_1, task?._id ?? ffi.nullptr);
+  }
+
+  NSURLProtocol initWithTask_cachedResponse_client_(NSURLSessionTask? task,
+      NSCachedURLResponse? cachedResponse, NSObject? client) {
+    final _ret = _lib._objc_msgSend_897(
+        _id,
+        _lib._sel_initWithTask_cachedResponse_client_1,
+        task?._id ?? ffi.nullptr,
+        cachedResponse?._id ?? ffi.nullptr,
+        client?._id ?? ffi.nullptr);
+    return NSURLProtocol._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionTask? get task {
+    final _ret = _lib._objc_msgSend_898(_id, _lib._sel_task1);
+    return _ret.address == 0
+        ? null
+        : NSURLSessionTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLProtocol new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSURLProtocol1, _lib._sel_new1);
+    return NSURLProtocol._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSURLProtocol alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSURLProtocol1, _lib._sel_alloc1);
+    return NSURLProtocol._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURLProtocol1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLProtocol1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLProtocol1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLProtocol1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURLProtocol1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURLProtocol1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURLProtocol1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSURLProtocol1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLProtocol1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSMutableURLRequest extends NSURLRequest {
+  NSMutableURLRequest._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSMutableURLRequest] that points to the same underlying object as [other].
+  static NSMutableURLRequest castFrom<T extends _ObjCWrapper>(T other) {
+    return NSMutableURLRequest._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSMutableURLRequest] that wraps the given raw object pointer.
+  static NSMutableURLRequest castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSMutableURLRequest._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSMutableURLRequest].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSMutableURLRequest1);
+  }
+
+  @override
+  NSURL? get URL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_URL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  set URL(NSURL? value) {
+    _lib._objc_msgSend_888(_id, _lib._sel_setURL_1, value?._id ?? ffi.nullptr);
+  }
+
+  @override
+  int get cachePolicy {
+    return _lib._objc_msgSend_748(_id, _lib._sel_cachePolicy1);
+  }
+
+  set cachePolicy(int value) {
+    _lib._objc_msgSend_889(_id, _lib._sel_setCachePolicy_1, value);
+  }
+
+  @override
+  double get timeoutInterval {
+    return _lib._objc_msgSend_149(_id, _lib._sel_timeoutInterval1);
+  }
+
+  set timeoutInterval(double value) {
+    _lib._objc_msgSend_474(_id, _lib._sel_setTimeoutInterval_1, value);
+  }
+
+  @override
+  NSURL? get mainDocumentURL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_mainDocumentURL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  set mainDocumentURL(NSURL? value) {
+    _lib._objc_msgSend_888(
+        _id, _lib._sel_setMainDocumentURL_1, value?._id ?? ffi.nullptr);
+  }
+
+  @override
+  int get networkServiceType {
+    return _lib._objc_msgSend_749(_id, _lib._sel_networkServiceType1);
+  }
+
+  set networkServiceType(int value) {
+    _lib._objc_msgSend_890(_id, _lib._sel_setNetworkServiceType_1, value);
+  }
+
+  @override
+  bool get allowsCellularAccess {
+    return _lib._objc_msgSend_12(_id, _lib._sel_allowsCellularAccess1);
+  }
+
+  set allowsCellularAccess(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setAllowsCellularAccess_1, value);
+  }
+
+  @override
+  bool get allowsExpensiveNetworkAccess {
+    return _lib._objc_msgSend_12(_id, _lib._sel_allowsExpensiveNetworkAccess1);
+  }
+
+  set allowsExpensiveNetworkAccess(bool value) {
+    _lib._objc_msgSend_460(
+        _id, _lib._sel_setAllowsExpensiveNetworkAccess_1, value);
+  }
+
+  @override
+  bool get allowsConstrainedNetworkAccess {
+    return _lib._objc_msgSend_12(
+        _id, _lib._sel_allowsConstrainedNetworkAccess1);
+  }
+
+  set allowsConstrainedNetworkAccess(bool value) {
+    _lib._objc_msgSend_460(
+        _id, _lib._sel_setAllowsConstrainedNetworkAccess_1, value);
+  }
+
+  @override
+  bool get assumesHTTP3Capable {
+    return _lib._objc_msgSend_12(_id, _lib._sel_assumesHTTP3Capable1);
+  }
+
+  set assumesHTTP3Capable(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setAssumesHTTP3Capable_1, value);
+  }
+
+  @override
+  int get attribution {
+    return _lib._objc_msgSend_750(_id, _lib._sel_attribution1);
+  }
+
+  set attribution(int value) {
+    _lib._objc_msgSend_891(_id, _lib._sel_setAttribution_1, value);
+  }
+
+  @override
+  NSString? get HTTPMethod {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_HTTPMethod1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set HTTPMethod(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setHTTPMethod_1, value?._id ?? ffi.nullptr);
+  }
+
+  @override
+  NSDictionary? get allHTTPHeaderFields {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_allHTTPHeaderFields1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  set allHTTPHeaderFields(NSDictionary? value) {
+    _lib._objc_msgSend_165(
+        _id, _lib._sel_setAllHTTPHeaderFields_1, value?._id ?? ffi.nullptr);
+  }
+
+  void setValue_forHTTPHeaderField_(NSString? value, NSString? field) {
+    return _lib._objc_msgSend_483(_id, _lib._sel_setValue_forHTTPHeaderField_1,
+        value?._id ?? ffi.nullptr, field?._id ?? ffi.nullptr);
+  }
+
+  void addValue_forHTTPHeaderField_(NSString? value, NSString? field) {
+    return _lib._objc_msgSend_483(_id, _lib._sel_addValue_forHTTPHeaderField_1,
+        value?._id ?? ffi.nullptr, field?._id ?? ffi.nullptr);
+  }
+
+  @override
+  NSData? get HTTPBody {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_HTTPBody1);
+    return _ret.address == 0
+        ? null
+        : NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  set HTTPBody(NSData? value) {
+    _lib._objc_msgSend_892(
+        _id, _lib._sel_setHTTPBody_1, value?._id ?? ffi.nullptr);
+  }
+
+  @override
+  NSInputStream? get HTTPBodyStream {
+    final _ret = _lib._objc_msgSend_760(_id, _lib._sel_HTTPBodyStream1);
+    return _ret.address == 0
+        ? null
+        : NSInputStream._(_ret, _lib, retain: true, release: true);
+  }
+
+  set HTTPBodyStream(NSInputStream? value) {
+    _lib._objc_msgSend_893(
+        _id, _lib._sel_setHTTPBodyStream_1, value?._id ?? ffi.nullptr);
+  }
+
+  @override
+  bool get HTTPShouldHandleCookies {
+    return _lib._objc_msgSend_12(_id, _lib._sel_HTTPShouldHandleCookies1);
+  }
+
+  set HTTPShouldHandleCookies(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setHTTPShouldHandleCookies_1, value);
+  }
+
+  @override
+  bool get HTTPShouldUsePipelining {
+    return _lib._objc_msgSend_12(_id, _lib._sel_HTTPShouldUsePipelining1);
+  }
+
+  set HTTPShouldUsePipelining(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setHTTPShouldUsePipelining_1, value);
+  }
+
+  static NSMutableURLRequest requestWithURL_(SwiftLibrary _lib, NSURL? URL) {
+    final _ret = _lib._objc_msgSend_226(_lib._class_NSMutableURLRequest1,
+        _lib._sel_requestWithURL_1, URL?._id ?? ffi.nullptr);
+    return NSMutableURLRequest._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool getSupportsSecureCoding(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSMutableURLRequest1, _lib._sel_supportsSecureCoding1);
+  }
+
+  static NSMutableURLRequest requestWithURL_cachePolicy_timeoutInterval_(
+      SwiftLibrary _lib, NSURL? URL, int cachePolicy, double timeoutInterval) {
+    final _ret = _lib._objc_msgSend_747(
+        _lib._class_NSMutableURLRequest1,
+        _lib._sel_requestWithURL_cachePolicy_timeoutInterval_1,
+        URL?._id ?? ffi.nullptr,
+        cachePolicy,
+        timeoutInterval);
+    return NSMutableURLRequest._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSMutableURLRequest new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSMutableURLRequest1, _lib._sel_new1);
+    return NSMutableURLRequest._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSMutableURLRequest alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSMutableURLRequest1, _lib._sel_alloc1);
+    return NSMutableURLRequest._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSMutableURLRequest1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSMutableURLRequest1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSMutableURLRequest1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSMutableURLRequest1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSMutableURLRequest1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSMutableURLRequest1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSMutableURLRequest1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSMutableURLRequest1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSMutableURLRequest1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSXMLParser extends NSObject {
+  NSXMLParser._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSXMLParser] that points to the same underlying object as [other].
+  static NSXMLParser castFrom<T extends _ObjCWrapper>(T other) {
+    return NSXMLParser._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSXMLParser] that wraps the given raw object pointer.
+  static NSXMLParser castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSXMLParser._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSXMLParser].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSXMLParser1);
+  }
+
+  NSXMLParser initWithContentsOfURL_(NSURL? url) {
+    final _ret = _lib._objc_msgSend_226(
+        _id, _lib._sel_initWithContentsOfURL_1, url?._id ?? ffi.nullptr);
+    return NSXMLParser._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLParser initWithData_(NSData? data) {
+    final _ret = _lib._objc_msgSend_242(
+        _id, _lib._sel_initWithData_1, data?._id ?? ffi.nullptr);
+    return NSXMLParser._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLParser initWithStream_(NSInputStream? stream) {
+    final _ret = _lib._objc_msgSend_899(
+        _id, _lib._sel_initWithStream_1, stream?._id ?? ffi.nullptr);
+    return NSXMLParser._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject? get delegate {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_delegate1);
+    return _ret.address == 0
+        ? null
+        : NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  set delegate(NSObject? value) {
+    _lib._objc_msgSend_368(
+        _id, _lib._sel_setDelegate_1, value?._id ?? ffi.nullptr);
+  }
+
+  bool get shouldProcessNamespaces {
+    return _lib._objc_msgSend_12(_id, _lib._sel_shouldProcessNamespaces1);
+  }
+
+  set shouldProcessNamespaces(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setShouldProcessNamespaces_1, value);
+  }
+
+  bool get shouldReportNamespacePrefixes {
+    return _lib._objc_msgSend_12(_id, _lib._sel_shouldReportNamespacePrefixes1);
+  }
+
+  set shouldReportNamespacePrefixes(bool value) {
+    _lib._objc_msgSend_460(
+        _id, _lib._sel_setShouldReportNamespacePrefixes_1, value);
+  }
+
+  int get externalEntityResolvingPolicy {
+    return _lib._objc_msgSend_900(
+        _id, _lib._sel_externalEntityResolvingPolicy1);
+  }
+
+  set externalEntityResolvingPolicy(int value) {
+    _lib._objc_msgSend_901(
+        _id, _lib._sel_setExternalEntityResolvingPolicy_1, value);
+  }
+
+  NSSet? get allowedExternalEntityURLs {
+    final _ret =
+        _lib._objc_msgSend_280(_id, _lib._sel_allowedExternalEntityURLs1);
+    return _ret.address == 0
+        ? null
+        : NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  set allowedExternalEntityURLs(NSSet? value) {
+    _lib._objc_msgSend_902(_id, _lib._sel_setAllowedExternalEntityURLs_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  bool parse() {
+    return _lib._objc_msgSend_12(_id, _lib._sel_parse1);
+  }
+
+  void abortParsing() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_abortParsing1);
+  }
+
+  NSError? get parserError {
+    final _ret = _lib._objc_msgSend_283(_id, _lib._sel_parserError1);
+    return _ret.address == 0
+        ? null
+        : NSError._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool get shouldResolveExternalEntities {
+    return _lib._objc_msgSend_12(_id, _lib._sel_shouldResolveExternalEntities1);
+  }
+
+  set shouldResolveExternalEntities(bool value) {
+    _lib._objc_msgSend_460(
+        _id, _lib._sel_setShouldResolveExternalEntities_1, value);
+  }
+
+  NSString? get publicID {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_publicID1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get systemID {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_systemID1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get lineNumber {
+    return _lib._objc_msgSend_78(_id, _lib._sel_lineNumber1);
+  }
+
+  int get columnNumber {
+    return _lib._objc_msgSend_78(_id, _lib._sel_columnNumber1);
+  }
+
+  static NSXMLParser new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSXMLParser1, _lib._sel_new1);
+    return NSXMLParser._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSXMLParser alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSXMLParser1, _lib._sel_alloc1);
+    return NSXMLParser._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSXMLParser1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSXMLParser1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSXMLParser1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSXMLParser1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSXMLParser1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSXMLParser1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSXMLParser1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSXMLParser1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSXMLParser1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSXMLParserExternalEntityResolvingPolicy {
+  static const int NSXMLParserResolveExternalEntitiesNever = 0;
+  static const int NSXMLParserResolveExternalEntitiesNoNetwork = 1;
+  static const int NSXMLParserResolveExternalEntitiesSameOriginOnly = 2;
+  static const int NSXMLParserResolveExternalEntitiesAlways = 3;
+}
+
+class NSFileWrapper extends NSObject {
+  NSFileWrapper._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSFileWrapper] that points to the same underlying object as [other].
+  static NSFileWrapper castFrom<T extends _ObjCWrapper>(T other) {
+    return NSFileWrapper._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSFileWrapper] that wraps the given raw object pointer.
+  static NSFileWrapper castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSFileWrapper._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSFileWrapper].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSFileWrapper1);
+  }
+
+  NSFileWrapper initWithURL_options_error_(
+      NSURL? url, int options, ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    final _ret = _lib._objc_msgSend_903(
+        _id,
+        _lib._sel_initWithURL_options_error_1,
+        url?._id ?? ffi.nullptr,
+        options,
+        outError);
+    return NSFileWrapper._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSFileWrapper initDirectoryWithFileWrappers_(
+      NSDictionary? childrenByPreferredName) {
+    final _ret = _lib._objc_msgSend_143(
+        _id,
+        _lib._sel_initDirectoryWithFileWrappers_1,
+        childrenByPreferredName?._id ?? ffi.nullptr);
+    return NSFileWrapper._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSFileWrapper initRegularFileWithContents_(NSData? contents) {
+    final _ret = _lib._objc_msgSend_242(_id,
+        _lib._sel_initRegularFileWithContents_1, contents?._id ?? ffi.nullptr);
+    return NSFileWrapper._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSFileWrapper initSymbolicLinkWithDestinationURL_(NSURL? url) {
+    final _ret = _lib._objc_msgSend_226(
+        _id,
+        _lib._sel_initSymbolicLinkWithDestinationURL_1,
+        url?._id ?? ffi.nullptr);
+    return NSFileWrapper._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSFileWrapper initWithSerializedRepresentation_(
+      NSData? serializeRepresentation) {
+    final _ret = _lib._objc_msgSend_242(
+        _id,
+        _lib._sel_initWithSerializedRepresentation_1,
+        serializeRepresentation?._id ?? ffi.nullptr);
+    return NSFileWrapper._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSFileWrapper initWithCoder_(NSCoder? inCoder) {
+    final _ret = _lib._objc_msgSend_42(
+        _id, _lib._sel_initWithCoder_1, inCoder?._id ?? ffi.nullptr);
+    return NSFileWrapper._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool get directory {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isDirectory1);
+  }
+
+  bool get regularFile {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isRegularFile1);
+  }
+
+  bool get symbolicLink {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isSymbolicLink1);
+  }
+
+  NSString? get preferredFilename {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_preferredFilename1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set preferredFilename(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setPreferredFilename_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get filename {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_filename1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set filename(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setFilename_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSDictionary? get fileAttributes {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_fileAttributes1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  set fileAttributes(NSDictionary? value) {
+    _lib._objc_msgSend_165(
+        _id, _lib._sel_setFileAttributes_1, value?._id ?? ffi.nullptr);
+  }
+
+  bool matchesContentsOfURL_(NSURL? url) {
+    return _lib._objc_msgSend_229(
+        _id, _lib._sel_matchesContentsOfURL_1, url?._id ?? ffi.nullptr);
+  }
+
+  bool readFromURL_options_error_(
+      NSURL? url, int options, ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    return _lib._objc_msgSend_904(_id, _lib._sel_readFromURL_options_error_1,
+        url?._id ?? ffi.nullptr, options, outError);
+  }
+
+  bool writeToURL_options_originalContentsURL_error_(
+      NSURL? url,
+      int options,
+      NSURL? originalContentsURL,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {
+    return _lib._objc_msgSend_905(
+        _id,
+        _lib._sel_writeToURL_options_originalContentsURL_error_1,
+        url?._id ?? ffi.nullptr,
+        options,
+        originalContentsURL?._id ?? ffi.nullptr,
+        outError);
+  }
+
+  NSData? get serializedRepresentation {
+    final _ret =
+        _lib._objc_msgSend_39(_id, _lib._sel_serializedRepresentation1);
+    return _ret.address == 0
+        ? null
+        : NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString addFileWrapper_(NSFileWrapper? child) {
+    final _ret = _lib._objc_msgSend_906(
+        _id, _lib._sel_addFileWrapper_1, child?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString addRegularFileWithContents_preferredFilename_(
+      NSData? data, NSString? fileName) {
+    final _ret = _lib._objc_msgSend_907(
+        _id,
+        _lib._sel_addRegularFileWithContents_preferredFilename_1,
+        data?._id ?? ffi.nullptr,
+        fileName?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  void removeFileWrapper_(NSFileWrapper? child) {
+    return _lib._objc_msgSend_908(
+        _id, _lib._sel_removeFileWrapper_1, child?._id ?? ffi.nullptr);
+  }
+
+  NSDictionary? get fileWrappers {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_fileWrappers1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString keyForFileWrapper_(NSFileWrapper? child) {
+    final _ret = _lib._objc_msgSend_906(
+        _id, _lib._sel_keyForFileWrapper_1, child?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData? get regularFileContents {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_regularFileContents1);
+    return _ret.address == 0
+        ? null
+        : NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get symbolicLinkDestinationURL {
+    final _ret =
+        _lib._objc_msgSend_40(_id, _lib._sel_symbolicLinkDestinationURL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject initWithPath_(NSString? path) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initWithPath_1, path?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject initSymbolicLinkWithDestination_(NSString? path) {
+    final _ret = _lib._objc_msgSend_30(_id,
+        _lib._sel_initSymbolicLinkWithDestination_1, path?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool needsToBeUpdatedFromPath_(NSString? path) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_needsToBeUpdatedFromPath_1, path?._id ?? ffi.nullptr);
+  }
+
+  bool updateFromPath_(NSString? path) {
+    return _lib._objc_msgSend_59(
+        _id, _lib._sel_updateFromPath_1, path?._id ?? ffi.nullptr);
+  }
+
+  bool writeToFile_atomically_updateFilenames_(
+      NSString? path, bool atomicFlag, bool updateFilenamesFlag) {
+    return _lib._objc_msgSend_909(
+        _id,
+        _lib._sel_writeToFile_atomically_updateFilenames_1,
+        path?._id ?? ffi.nullptr,
+        atomicFlag,
+        updateFilenamesFlag);
+  }
+
+  NSString addFileWithPath_(NSString? path) {
+    final _ret = _lib._objc_msgSend_64(
+        _id, _lib._sel_addFileWithPath_1, path?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString addSymbolicLinkWithDestination_preferredFilename_(
+      NSString? path, NSString? filename) {
+    final _ret = _lib._objc_msgSend_324(
+        _id,
+        _lib._sel_addSymbolicLinkWithDestination_preferredFilename_1,
+        path?._id ?? ffi.nullptr,
+        filename?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString symbolicLinkDestination() {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_symbolicLinkDestination1);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSFileWrapper new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSFileWrapper1, _lib._sel_new1);
+    return NSFileWrapper._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSFileWrapper alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSFileWrapper1, _lib._sel_alloc1);
+    return NSFileWrapper._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSFileWrapper1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSFileWrapper1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSFileWrapper1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSFileWrapper1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSFileWrapper1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSFileWrapper1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSFileWrapper1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSFileWrapper1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSFileWrapper1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSFileWrapperReadingOptions {
+  static const int NSFileWrapperReadingImmediate = 1;
+  static const int NSFileWrapperReadingWithoutMapping = 2;
+}
+
+abstract class NSFileWrapperWritingOptions {
+  static const int NSFileWrapperWritingAtomic = 1;
+  static const int NSFileWrapperWritingWithNameUpdating = 2;
+}
+
+class NSURLSession extends NSObject {
+  NSURLSession._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURLSession] that points to the same underlying object as [other].
+  static NSURLSession castFrom<T extends _ObjCWrapper>(T other) {
+    return NSURLSession._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSURLSession] that wraps the given raw object pointer.
+  static NSURLSession castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURLSession._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURLSession].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSURLSession1);
+  }
+
+  static NSURLSession? getSharedSession(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_910(
+        _lib._class_NSURLSession1, _lib._sel_sharedSession1);
+    return _ret.address == 0
+        ? null
+        : NSURLSession._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLSession sessionWithConfiguration_(
+      SwiftLibrary _lib, NSURLSessionConfiguration? configuration) {
+    final _ret = _lib._objc_msgSend_921(
+        _lib._class_NSURLSession1,
+        _lib._sel_sessionWithConfiguration_1,
+        configuration?._id ?? ffi.nullptr);
+    return NSURLSession._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLSession sessionWithConfiguration_delegate_delegateQueue_(
+      SwiftLibrary _lib,
+      NSURLSessionConfiguration? configuration,
+      NSObject? delegate,
+      NSOperationQueue? queue) {
+    final _ret = _lib._objc_msgSend_922(
+        _lib._class_NSURLSession1,
+        _lib._sel_sessionWithConfiguration_delegate_delegateQueue_1,
+        configuration?._id ?? ffi.nullptr,
+        delegate?._id ?? ffi.nullptr,
+        queue?._id ?? ffi.nullptr);
+    return NSURLSession._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSOperationQueue? get delegateQueue {
+    final _ret = _lib._objc_msgSend_790(_id, _lib._sel_delegateQueue1);
+    return _ret.address == 0
+        ? null
+        : NSOperationQueue._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject? get delegate {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_delegate1);
+    return _ret.address == 0
+        ? null
+        : NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionConfiguration? get configuration {
+    final _ret = _lib._objc_msgSend_911(_id, _lib._sel_configuration1);
+    return _ret.address == 0
+        ? null
+        : NSURLSessionConfiguration._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get sessionDescription {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_sessionDescription1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set sessionDescription(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setSessionDescription_1, value?._id ?? ffi.nullptr);
+  }
+
+  void finishTasksAndInvalidate() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_finishTasksAndInvalidate1);
+  }
+
+  void invalidateAndCancel() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_invalidateAndCancel1);
+  }
+
+  void resetWithCompletionHandler_(ObjCBlock16 completionHandler) {
+    return _lib._objc_msgSend_465(
+        _id, _lib._sel_resetWithCompletionHandler_1, completionHandler._id);
+  }
+
+  void flushWithCompletionHandler_(ObjCBlock16 completionHandler) {
+    return _lib._objc_msgSend_465(
+        _id, _lib._sel_flushWithCompletionHandler_1, completionHandler._id);
+  }
+
+  void getTasksWithCompletionHandler_(ObjCBlock37 completionHandler) {
+    return _lib._objc_msgSend_923(
+        _id, _lib._sel_getTasksWithCompletionHandler_1, completionHandler._id);
+  }
+
+  void getAllTasksWithCompletionHandler_(ObjCBlock30 completionHandler) {
+    return _lib._objc_msgSend_924(_id,
+        _lib._sel_getAllTasksWithCompletionHandler_1, completionHandler._id);
+  }
+
+  NSURLSessionDataTask dataTaskWithRequest_(NSURLRequest? request) {
+    final _ret = _lib._objc_msgSend_925(
+        _id, _lib._sel_dataTaskWithRequest_1, request?._id ?? ffi.nullptr);
+    return NSURLSessionDataTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionDataTask dataTaskWithURL_(NSURL? url) {
+    final _ret = _lib._objc_msgSend_926(
+        _id, _lib._sel_dataTaskWithURL_1, url?._id ?? ffi.nullptr);
+    return NSURLSessionDataTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionUploadTask uploadTaskWithRequest_fromFile_(
+      NSURLRequest? request, NSURL? fileURL) {
+    final _ret = _lib._objc_msgSend_927(
+        _id,
+        _lib._sel_uploadTaskWithRequest_fromFile_1,
+        request?._id ?? ffi.nullptr,
+        fileURL?._id ?? ffi.nullptr);
+    return NSURLSessionUploadTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionUploadTask uploadTaskWithRequest_fromData_(
+      NSURLRequest? request, NSData? bodyData) {
+    final _ret = _lib._objc_msgSend_928(
+        _id,
+        _lib._sel_uploadTaskWithRequest_fromData_1,
+        request?._id ?? ffi.nullptr,
+        bodyData?._id ?? ffi.nullptr);
+    return NSURLSessionUploadTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionUploadTask uploadTaskWithStreamedRequest_(NSURLRequest? request) {
+    final _ret = _lib._objc_msgSend_929(_id,
+        _lib._sel_uploadTaskWithStreamedRequest_1, request?._id ?? ffi.nullptr);
+    return NSURLSessionUploadTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionDownloadTask downloadTaskWithRequest_(NSURLRequest? request) {
+    final _ret = _lib._objc_msgSend_931(
+        _id, _lib._sel_downloadTaskWithRequest_1, request?._id ?? ffi.nullptr);
+    return NSURLSessionDownloadTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionDownloadTask downloadTaskWithURL_(NSURL? url) {
+    final _ret = _lib._objc_msgSend_932(
+        _id, _lib._sel_downloadTaskWithURL_1, url?._id ?? ffi.nullptr);
+    return NSURLSessionDownloadTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionDownloadTask downloadTaskWithResumeData_(NSData? resumeData) {
+    final _ret = _lib._objc_msgSend_933(_id,
+        _lib._sel_downloadTaskWithResumeData_1, resumeData?._id ?? ffi.nullptr);
+    return NSURLSessionDownloadTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionStreamTask streamTaskWithHostName_port_(
+      NSString? hostname, int port) {
+    final _ret = _lib._objc_msgSend_936(
+        _id,
+        _lib._sel_streamTaskWithHostName_port_1,
+        hostname?._id ?? ffi.nullptr,
+        port);
+    return NSURLSessionStreamTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionStreamTask streamTaskWithNetService_(NSNetService? service) {
+    final _ret = _lib._objc_msgSend_942(
+        _id, _lib._sel_streamTaskWithNetService_1, service?._id ?? ffi.nullptr);
+    return NSURLSessionStreamTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionWebSocketTask webSocketTaskWithURL_(NSURL? url) {
+    final _ret = _lib._objc_msgSend_949(
+        _id, _lib._sel_webSocketTaskWithURL_1, url?._id ?? ffi.nullptr);
+    return NSURLSessionWebSocketTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionWebSocketTask webSocketTaskWithURL_protocols_(
+      NSURL? url, NSArray? protocols) {
+    final _ret = _lib._objc_msgSend_950(
+        _id,
+        _lib._sel_webSocketTaskWithURL_protocols_1,
+        url?._id ?? ffi.nullptr,
+        protocols?._id ?? ffi.nullptr);
+    return NSURLSessionWebSocketTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionWebSocketTask webSocketTaskWithRequest_(NSURLRequest? request) {
+    final _ret = _lib._objc_msgSend_951(
+        _id, _lib._sel_webSocketTaskWithRequest_1, request?._id ?? ffi.nullptr);
+    return NSURLSessionWebSocketTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSURLSession init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSURLSession._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLSession new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSURLSession1, _lib._sel_new1);
+    return NSURLSession._(_ret, _lib, retain: false, release: true);
+  }
+
+  NSURLSessionDataTask dataTaskWithRequest_completionHandler_(
+      NSURLRequest? request, ObjCBlock41 completionHandler) {
+    final _ret = _lib._objc_msgSend_952(
+        _id,
+        _lib._sel_dataTaskWithRequest_completionHandler_1,
+        request?._id ?? ffi.nullptr,
+        completionHandler._id);
+    return NSURLSessionDataTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionDataTask dataTaskWithURL_completionHandler_(
+      NSURL? url, ObjCBlock41 completionHandler) {
+    final _ret = _lib._objc_msgSend_953(
+        _id,
+        _lib._sel_dataTaskWithURL_completionHandler_1,
+        url?._id ?? ffi.nullptr,
+        completionHandler._id);
+    return NSURLSessionDataTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionUploadTask uploadTaskWithRequest_fromFile_completionHandler_(
+      NSURLRequest? request, NSURL? fileURL, ObjCBlock41 completionHandler) {
+    final _ret = _lib._objc_msgSend_954(
+        _id,
+        _lib._sel_uploadTaskWithRequest_fromFile_completionHandler_1,
+        request?._id ?? ffi.nullptr,
+        fileURL?._id ?? ffi.nullptr,
+        completionHandler._id);
+    return NSURLSessionUploadTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionUploadTask uploadTaskWithRequest_fromData_completionHandler_(
+      NSURLRequest? request, NSData? bodyData, ObjCBlock41 completionHandler) {
+    final _ret = _lib._objc_msgSend_955(
+        _id,
+        _lib._sel_uploadTaskWithRequest_fromData_completionHandler_1,
+        request?._id ?? ffi.nullptr,
+        bodyData?._id ?? ffi.nullptr,
+        completionHandler._id);
+    return NSURLSessionUploadTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionDownloadTask downloadTaskWithRequest_completionHandler_(
+      NSURLRequest? request, ObjCBlock42 completionHandler) {
+    final _ret = _lib._objc_msgSend_956(
+        _id,
+        _lib._sel_downloadTaskWithRequest_completionHandler_1,
+        request?._id ?? ffi.nullptr,
+        completionHandler._id);
+    return NSURLSessionDownloadTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionDownloadTask downloadTaskWithURL_completionHandler_(
+      NSURL? url, ObjCBlock42 completionHandler) {
+    final _ret = _lib._objc_msgSend_957(
+        _id,
+        _lib._sel_downloadTaskWithURL_completionHandler_1,
+        url?._id ?? ffi.nullptr,
+        completionHandler._id);
+    return NSURLSessionDownloadTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURLSessionDownloadTask downloadTaskWithResumeData_completionHandler_(
+      NSData? resumeData, ObjCBlock42 completionHandler) {
+    final _ret = _lib._objc_msgSend_958(
+        _id,
+        _lib._sel_downloadTaskWithResumeData_completionHandler_1,
+        resumeData?._id ?? ffi.nullptr,
+        completionHandler._id);
+    return NSURLSessionDownloadTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLSession alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSURLSession1, _lib._sel_alloc1);
+    return NSURLSession._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURLSession1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLSession1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLSession1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLSession1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURLSession1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURLSession1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURLSession1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSURLSession1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLSession1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSURLSessionConfiguration extends NSObject {
+  NSURLSessionConfiguration._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURLSessionConfiguration] that points to the same underlying object as [other].
+  static NSURLSessionConfiguration castFrom<T extends _ObjCWrapper>(T other) {
+    return NSURLSessionConfiguration._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSURLSessionConfiguration] that wraps the given raw object pointer.
+  static NSURLSessionConfiguration castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURLSessionConfiguration._(other, lib,
+        retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURLSessionConfiguration].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSURLSessionConfiguration1);
+  }
+
+  static NSURLSessionConfiguration? getDefaultSessionConfiguration(
+      SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_911(_lib._class_NSURLSessionConfiguration1,
+        _lib._sel_defaultSessionConfiguration1);
+    return _ret.address == 0
+        ? null
+        : NSURLSessionConfiguration._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLSessionConfiguration? getEphemeralSessionConfiguration(
+      SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_911(_lib._class_NSURLSessionConfiguration1,
+        _lib._sel_ephemeralSessionConfiguration1);
+    return _ret.address == 0
+        ? null
+        : NSURLSessionConfiguration._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLSessionConfiguration
+      backgroundSessionConfigurationWithIdentifier_(
+          SwiftLibrary _lib, NSString? identifier) {
+    final _ret = _lib._objc_msgSend_912(
+        _lib._class_NSURLSessionConfiguration1,
+        _lib._sel_backgroundSessionConfigurationWithIdentifier_1,
+        identifier?._id ?? ffi.nullptr);
+    return NSURLSessionConfiguration._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get identifier {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_identifier1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get requestCachePolicy {
+    return _lib._objc_msgSend_748(_id, _lib._sel_requestCachePolicy1);
+  }
+
+  set requestCachePolicy(int value) {
+    _lib._objc_msgSend_889(_id, _lib._sel_setRequestCachePolicy_1, value);
+  }
+
+  double get timeoutIntervalForRequest {
+    return _lib._objc_msgSend_149(_id, _lib._sel_timeoutIntervalForRequest1);
+  }
+
+  set timeoutIntervalForRequest(double value) {
+    _lib._objc_msgSend_474(
+        _id, _lib._sel_setTimeoutIntervalForRequest_1, value);
+  }
+
+  double get timeoutIntervalForResource {
+    return _lib._objc_msgSend_149(_id, _lib._sel_timeoutIntervalForResource1);
+  }
+
+  set timeoutIntervalForResource(double value) {
+    _lib._objc_msgSend_474(
+        _id, _lib._sel_setTimeoutIntervalForResource_1, value);
+  }
+
+  int get networkServiceType {
+    return _lib._objc_msgSend_749(_id, _lib._sel_networkServiceType1);
+  }
+
+  set networkServiceType(int value) {
+    _lib._objc_msgSend_890(_id, _lib._sel_setNetworkServiceType_1, value);
+  }
+
+  bool get allowsCellularAccess {
+    return _lib._objc_msgSend_12(_id, _lib._sel_allowsCellularAccess1);
+  }
+
+  set allowsCellularAccess(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setAllowsCellularAccess_1, value);
+  }
+
+  bool get allowsExpensiveNetworkAccess {
+    return _lib._objc_msgSend_12(_id, _lib._sel_allowsExpensiveNetworkAccess1);
+  }
+
+  set allowsExpensiveNetworkAccess(bool value) {
+    _lib._objc_msgSend_460(
+        _id, _lib._sel_setAllowsExpensiveNetworkAccess_1, value);
+  }
+
+  bool get allowsConstrainedNetworkAccess {
+    return _lib._objc_msgSend_12(
+        _id, _lib._sel_allowsConstrainedNetworkAccess1);
+  }
+
+  set allowsConstrainedNetworkAccess(bool value) {
+    _lib._objc_msgSend_460(
+        _id, _lib._sel_setAllowsConstrainedNetworkAccess_1, value);
+  }
+
+  bool get waitsForConnectivity {
+    return _lib._objc_msgSend_12(_id, _lib._sel_waitsForConnectivity1);
+  }
+
+  set waitsForConnectivity(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setWaitsForConnectivity_1, value);
+  }
+
+  bool get discretionary {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isDiscretionary1);
+  }
+
+  set discretionary(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setDiscretionary_1, value);
+  }
+
+  NSString? get sharedContainerIdentifier {
+    final _ret =
+        _lib._objc_msgSend_20(_id, _lib._sel_sharedContainerIdentifier1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set sharedContainerIdentifier(NSString? value) {
+    _lib._objc_msgSend_477(_id, _lib._sel_setSharedContainerIdentifier_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  bool get sessionSendsLaunchEvents {
+    return _lib._objc_msgSend_12(_id, _lib._sel_sessionSendsLaunchEvents1);
+  }
+
+  set sessionSendsLaunchEvents(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setSessionSendsLaunchEvents_1, value);
+  }
+
+  NSDictionary? get connectionProxyDictionary {
+    final _ret =
+        _lib._objc_msgSend_164(_id, _lib._sel_connectionProxyDictionary1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  set connectionProxyDictionary(NSDictionary? value) {
+    _lib._objc_msgSend_165(_id, _lib._sel_setConnectionProxyDictionary_1,
+        value?._id ?? ffi.nullptr);
+  }
+
+  int get TLSMinimumSupportedProtocol {
+    return _lib._objc_msgSend_913(_id, _lib._sel_TLSMinimumSupportedProtocol1);
+  }
+
+  set TLSMinimumSupportedProtocol(int value) {
+    _lib._objc_msgSend_914(
+        _id, _lib._sel_setTLSMinimumSupportedProtocol_1, value);
+  }
+
+  int get TLSMaximumSupportedProtocol {
+    return _lib._objc_msgSend_913(_id, _lib._sel_TLSMaximumSupportedProtocol1);
+  }
+
+  set TLSMaximumSupportedProtocol(int value) {
+    _lib._objc_msgSend_914(
+        _id, _lib._sel_setTLSMaximumSupportedProtocol_1, value);
+  }
+
+  int get TLSMinimumSupportedProtocolVersion {
+    return _lib._objc_msgSend_915(
+        _id, _lib._sel_TLSMinimumSupportedProtocolVersion1);
+  }
+
+  set TLSMinimumSupportedProtocolVersion(int value) {
+    _lib._objc_msgSend_916(
+        _id, _lib._sel_setTLSMinimumSupportedProtocolVersion_1, value);
+  }
+
+  int get TLSMaximumSupportedProtocolVersion {
+    return _lib._objc_msgSend_915(
+        _id, _lib._sel_TLSMaximumSupportedProtocolVersion1);
+  }
+
+  set TLSMaximumSupportedProtocolVersion(int value) {
+    _lib._objc_msgSend_916(
+        _id, _lib._sel_setTLSMaximumSupportedProtocolVersion_1, value);
+  }
+
+  bool get HTTPShouldUsePipelining {
+    return _lib._objc_msgSend_12(_id, _lib._sel_HTTPShouldUsePipelining1);
+  }
+
+  set HTTPShouldUsePipelining(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setHTTPShouldUsePipelining_1, value);
+  }
+
+  bool get HTTPShouldSetCookies {
+    return _lib._objc_msgSend_12(_id, _lib._sel_HTTPShouldSetCookies1);
+  }
+
+  set HTTPShouldSetCookies(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setHTTPShouldSetCookies_1, value);
+  }
+
+  int get HTTPCookieAcceptPolicy {
+    return _lib._objc_msgSend_745(_id, _lib._sel_HTTPCookieAcceptPolicy1);
+  }
+
+  set HTTPCookieAcceptPolicy(int value) {
+    _lib._objc_msgSend_746(_id, _lib._sel_setHTTPCookieAcceptPolicy_1, value);
+  }
+
+  NSDictionary? get HTTPAdditionalHeaders {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_HTTPAdditionalHeaders1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  set HTTPAdditionalHeaders(NSDictionary? value) {
+    _lib._objc_msgSend_165(
+        _id, _lib._sel_setHTTPAdditionalHeaders_1, value?._id ?? ffi.nullptr);
+  }
+
+  int get HTTPMaximumConnectionsPerHost {
+    return _lib._objc_msgSend_78(_id, _lib._sel_HTTPMaximumConnectionsPerHost1);
+  }
+
+  set HTTPMaximumConnectionsPerHost(int value) {
+    _lib._objc_msgSend_558(
+        _id, _lib._sel_setHTTPMaximumConnectionsPerHost_1, value);
+  }
+
+  NSHTTPCookieStorage? get HTTPCookieStorage {
+    final _ret = _lib._objc_msgSend_739(_id, _lib._sel_HTTPCookieStorage1);
+    return _ret.address == 0
+        ? null
+        : NSHTTPCookieStorage._(_ret, _lib, retain: true, release: true);
+  }
+
+  set HTTPCookieStorage(NSHTTPCookieStorage? value) {
+    _lib._objc_msgSend_917(
+        _id, _lib._sel_setHTTPCookieStorage_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSURLCredentialStorage? get URLCredentialStorage {
+    final _ret = _lib._objc_msgSend_874(_id, _lib._sel_URLCredentialStorage1);
+    return _ret.address == 0
+        ? null
+        : NSURLCredentialStorage._(_ret, _lib, retain: true, release: true);
+  }
+
+  set URLCredentialStorage(NSURLCredentialStorage? value) {
+    _lib._objc_msgSend_918(
+        _id, _lib._sel_setURLCredentialStorage_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSURLCache? get URLCache {
+    final _ret = _lib._objc_msgSend_844(_id, _lib._sel_URLCache1);
+    return _ret.address == 0
+        ? null
+        : NSURLCache._(_ret, _lib, retain: true, release: true);
+  }
+
+  set URLCache(NSURLCache? value) {
+    _lib._objc_msgSend_845(
+        _id, _lib._sel_setURLCache_1, value?._id ?? ffi.nullptr);
+  }
+
+  bool get shouldUseExtendedBackgroundIdleMode {
+    return _lib._objc_msgSend_12(
+        _id, _lib._sel_shouldUseExtendedBackgroundIdleMode1);
+  }
+
+  set shouldUseExtendedBackgroundIdleMode(bool value) {
+    _lib._objc_msgSend_460(
+        _id, _lib._sel_setShouldUseExtendedBackgroundIdleMode_1, value);
+  }
+
+  NSArray? get protocolClasses {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_protocolClasses1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set protocolClasses(NSArray? value) {
+    _lib._objc_msgSend_696(
+        _id, _lib._sel_setProtocolClasses_1, value?._id ?? ffi.nullptr);
+  }
+
+  int get multipathServiceType {
+    return _lib._objc_msgSend_919(_id, _lib._sel_multipathServiceType1);
+  }
+
+  set multipathServiceType(int value) {
+    _lib._objc_msgSend_920(_id, _lib._sel_setMultipathServiceType_1, value);
+  }
+
+  @override
+  NSURLSessionConfiguration init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSURLSessionConfiguration._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLSessionConfiguration new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLSessionConfiguration1, _lib._sel_new1);
+    return NSURLSessionConfiguration._(_ret, _lib,
+        retain: false, release: true);
+  }
+
+  static NSURLSessionConfiguration backgroundSessionConfiguration_(
+      SwiftLibrary _lib, NSString? identifier) {
+    final _ret = _lib._objc_msgSend_912(
+        _lib._class_NSURLSessionConfiguration1,
+        _lib._sel_backgroundSessionConfiguration_1,
+        identifier?._id ?? ffi.nullptr);
+    return NSURLSessionConfiguration._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLSessionConfiguration alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLSessionConfiguration1, _lib._sel_alloc1);
+    return NSURLSessionConfiguration._(_ret, _lib,
+        retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURLSessionConfiguration1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLSessionConfiguration1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSURLSessionConfiguration1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLSessionConfiguration1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURLSessionConfiguration1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURLSessionConfiguration1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURLSessionConfiguration1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSURLSessionConfiguration1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSURLSessionConfiguration1,
+        _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class SSLProtocol {
+  static const int kSSLProtocolUnknown = 0;
+  static const int kTLSProtocol1 = 4;
+  static const int kTLSProtocol11 = 7;
+  static const int kTLSProtocol12 = 8;
+  static const int kDTLSProtocol1 = 9;
+  static const int kTLSProtocol13 = 10;
+  static const int kDTLSProtocol12 = 11;
+  static const int kTLSProtocolMaxSupported = 999;
+  static const int kSSLProtocol2 = 1;
+  static const int kSSLProtocol3 = 2;
+  static const int kSSLProtocol3Only = 3;
+  static const int kTLSProtocol1Only = 5;
+  static const int kSSLProtocolAll = 6;
+}
+
+abstract class tls_protocol_version_t {
+  static const int tls_protocol_version_TLSv10 = 769;
+  static const int tls_protocol_version_TLSv11 = 770;
+  static const int tls_protocol_version_TLSv12 = 771;
+  static const int tls_protocol_version_TLSv13 = 772;
+  static const int tls_protocol_version_DTLSv10 = -257;
+  static const int tls_protocol_version_DTLSv12 = -259;
+}
+
+abstract class NSURLSessionMultipathServiceType {
+  static const int NSURLSessionMultipathServiceTypeNone = 0;
+  static const int NSURLSessionMultipathServiceTypeHandover = 1;
+  static const int NSURLSessionMultipathServiceTypeInteractive = 2;
+  static const int NSURLSessionMultipathServiceTypeAggregate = 3;
+}
+
+void _ObjCBlock37_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0,
+    ffi.Pointer<ObjCObject> arg1,
+    ffi.Pointer<ObjCObject> arg2) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(
+                  ffi.Pointer<ObjCObject> arg0,
+                  ffi.Pointer<ObjCObject> arg1,
+                  ffi.Pointer<ObjCObject> arg2)>>()
+      .asFunction<
+          void Function(
+              ffi.Pointer<ObjCObject> arg0,
+              ffi.Pointer<ObjCObject> arg1,
+              ffi.Pointer<ObjCObject> arg2)>()(arg0, arg1, arg2);
+}
+
+final _ObjCBlock37_closureRegistry = <int, Function>{};
+int _ObjCBlock37_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock37_registerClosure(Function fn) {
+  final id = ++_ObjCBlock37_closureRegistryIndex;
+  _ObjCBlock37_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock37_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0,
+    ffi.Pointer<ObjCObject> arg1,
+    ffi.Pointer<ObjCObject> arg2) {
+  return _ObjCBlock37_closureRegistry[block.ref.target.address]!(
+      arg0, arg1, arg2);
+}
+
+class ObjCBlock37 extends _ObjCBlockBase {
+  ObjCBlock37._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock37.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(
+                      ffi.Pointer<ObjCObject> arg0,
+                      ffi.Pointer<ObjCObject> arg1,
+                      ffi.Pointer<ObjCObject> arg2)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1,
+                                ffi.Pointer<ObjCObject> arg2)>(
+                        _ObjCBlock37_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock37.fromFunction(
+      SwiftLibrary lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1,
+              ffi.Pointer<ObjCObject> arg2)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1,
+                                ffi.Pointer<ObjCObject> arg2)>(
+                        _ObjCBlock37_closureTrampoline)
+                    .cast(),
+                _ObjCBlock37_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1,
+      ffi.Pointer<ObjCObject> arg2) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    ffi.Pointer<ObjCObject> arg1,
+                    ffi.Pointer<ObjCObject> arg2)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                ffi.Pointer<ObjCObject> arg1,
+                ffi.Pointer<ObjCObject> arg2)>()(_id, arg0, arg1, arg2);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class NSURLSessionUploadTask extends NSURLSessionDataTask {
+  NSURLSessionUploadTask._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURLSessionUploadTask] that points to the same underlying object as [other].
+  static NSURLSessionUploadTask castFrom<T extends _ObjCWrapper>(T other) {
+    return NSURLSessionUploadTask._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSURLSessionUploadTask] that wraps the given raw object pointer.
+  static NSURLSessionUploadTask castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURLSessionUploadTask._(other, lib,
+        retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURLSessionUploadTask].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSURLSessionUploadTask1);
+  }
+
+  @override
+  NSURLSessionUploadTask init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSURLSessionUploadTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLSessionUploadTask new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLSessionUploadTask1, _lib._sel_new1);
+    return NSURLSessionUploadTask._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSURLSessionUploadTask alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLSessionUploadTask1, _lib._sel_alloc1);
+    return NSURLSessionUploadTask._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURLSessionUploadTask1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLSessionUploadTask1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSURLSessionUploadTask1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLSessionUploadTask1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURLSessionUploadTask1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURLSessionUploadTask1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURLSessionUploadTask1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSURLSessionUploadTask1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSURLSessionUploadTask1,
+        _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSURLSessionDownloadTask extends NSURLSessionTask {
+  NSURLSessionDownloadTask._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURLSessionDownloadTask] that points to the same underlying object as [other].
+  static NSURLSessionDownloadTask castFrom<T extends _ObjCWrapper>(T other) {
+    return NSURLSessionDownloadTask._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSURLSessionDownloadTask] that wraps the given raw object pointer.
+  static NSURLSessionDownloadTask castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURLSessionDownloadTask._(other, lib,
+        retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURLSessionDownloadTask].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSURLSessionDownloadTask1);
+  }
+
+  void cancelByProducingResumeData_(ObjCBlock38 completionHandler) {
+    return _lib._objc_msgSend_930(
+        _id, _lib._sel_cancelByProducingResumeData_1, completionHandler._id);
+  }
+
+  @override
+  NSURLSessionDownloadTask init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSURLSessionDownloadTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLSessionDownloadTask new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLSessionDownloadTask1, _lib._sel_new1);
+    return NSURLSessionDownloadTask._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSURLSessionDownloadTask alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLSessionDownloadTask1, _lib._sel_alloc1);
+    return NSURLSessionDownloadTask._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURLSessionDownloadTask1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLSessionDownloadTask1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSURLSessionDownloadTask1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLSessionDownloadTask1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURLSessionDownloadTask1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURLSessionDownloadTask1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURLSessionDownloadTask1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSURLSessionDownloadTask1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSURLSessionDownloadTask1,
+        _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+void _ObjCBlock38_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ObjCObject> arg0) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ObjCObject> arg0)>>()
+      .asFunction<void Function(ffi.Pointer<ObjCObject> arg0)>()(arg0);
+}
+
+final _ObjCBlock38_closureRegistry = <int, Function>{};
+int _ObjCBlock38_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock38_registerClosure(Function fn) {
+  final id = ++_ObjCBlock38_closureRegistryIndex;
+  _ObjCBlock38_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock38_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ObjCObject> arg0) {
+  return _ObjCBlock38_closureRegistry[block.ref.target.address]!(arg0);
+}
+
+class ObjCBlock38 extends _ObjCBlockBase {
+  ObjCBlock38._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock38.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0)>(
+                        _ObjCBlock38_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock38.fromFunction(
+      SwiftLibrary lib, void Function(ffi.Pointer<ObjCObject> arg0) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0)>(
+                        _ObjCBlock38_closureTrampoline)
+                    .cast(),
+                _ObjCBlock38_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0)>>()
+        .asFunction<
+            void Function(ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0)>()(_id, arg0);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class NSURLSessionStreamTask extends NSURLSessionTask {
+  NSURLSessionStreamTask._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURLSessionStreamTask] that points to the same underlying object as [other].
+  static NSURLSessionStreamTask castFrom<T extends _ObjCWrapper>(T other) {
+    return NSURLSessionStreamTask._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSURLSessionStreamTask] that wraps the given raw object pointer.
+  static NSURLSessionStreamTask castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURLSessionStreamTask._(other, lib,
+        retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURLSessionStreamTask].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSURLSessionStreamTask1);
+  }
+
+  void readDataOfMinLength_maxLength_timeout_completionHandler_(int minBytes,
+      int maxBytes, double timeout, ObjCBlock39 completionHandler) {
+    return _lib._objc_msgSend_934(
+        _id,
+        _lib._sel_readDataOfMinLength_maxLength_timeout_completionHandler_1,
+        minBytes,
+        maxBytes,
+        timeout,
+        completionHandler._id);
+  }
+
+  void writeData_timeout_completionHandler_(
+      NSData? data, double timeout, ObjCBlock15 completionHandler) {
+    return _lib._objc_msgSend_935(
+        _id,
+        _lib._sel_writeData_timeout_completionHandler_1,
+        data?._id ?? ffi.nullptr,
+        timeout,
+        completionHandler._id);
+  }
+
+  void captureStreams() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_captureStreams1);
+  }
+
+  void closeWrite() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_closeWrite1);
+  }
+
+  void closeRead() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_closeRead1);
+  }
+
+  void startSecureConnection() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_startSecureConnection1);
+  }
+
+  void stopSecureConnection() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_stopSecureConnection1);
+  }
+
+  @override
+  NSURLSessionStreamTask init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSURLSessionStreamTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLSessionStreamTask new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLSessionStreamTask1, _lib._sel_new1);
+    return NSURLSessionStreamTask._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSURLSessionStreamTask alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLSessionStreamTask1, _lib._sel_alloc1);
+    return NSURLSessionStreamTask._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURLSessionStreamTask1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLSessionStreamTask1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSURLSessionStreamTask1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLSessionStreamTask1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURLSessionStreamTask1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURLSessionStreamTask1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURLSessionStreamTask1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSURLSessionStreamTask1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSURLSessionStreamTask1,
+        _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+void _ObjCBlock39_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, bool arg1, ffi.Pointer<ObjCObject> arg2) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(ffi.Pointer<ObjCObject> arg0, ffi.Bool arg1,
+                  ffi.Pointer<ObjCObject> arg2)>>()
+      .asFunction<
+          void Function(ffi.Pointer<ObjCObject> arg0, bool arg1,
+              ffi.Pointer<ObjCObject> arg2)>()(arg0, arg1, arg2);
+}
+
+final _ObjCBlock39_closureRegistry = <int, Function>{};
+int _ObjCBlock39_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock39_registerClosure(Function fn) {
+  final id = ++_ObjCBlock39_closureRegistryIndex;
+  _ObjCBlock39_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock39_closureTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, bool arg1, ffi.Pointer<ObjCObject> arg2) {
+  return _ObjCBlock39_closureRegistry[block.ref.target.address]!(
+      arg0, arg1, arg2);
+}
+
+class ObjCBlock39 extends _ObjCBlockBase {
+  ObjCBlock39._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock39.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0, ffi.Bool arg1,
+                      ffi.Pointer<ObjCObject> arg2)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Bool arg1,
+                                ffi.Pointer<ObjCObject> arg2)>(
+                        _ObjCBlock39_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock39.fromFunction(
+      SwiftLibrary lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, bool arg1,
+              ffi.Pointer<ObjCObject> arg2)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Bool arg1,
+                                ffi.Pointer<ObjCObject> arg2)>(
+                        _ObjCBlock39_closureTrampoline)
+                    .cast(),
+                _ObjCBlock39_registerClosure(fn)),
+            lib);
+  void call(
+      ffi.Pointer<ObjCObject> arg0, bool arg1, ffi.Pointer<ObjCObject> arg2) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    ffi.Bool arg1,
+                    ffi.Pointer<ObjCObject> arg2)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                bool arg1,
+                ffi.Pointer<ObjCObject> arg2)>()(_id, arg0, arg1, arg2);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class NSNetService extends NSObject {
+  NSNetService._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSNetService] that points to the same underlying object as [other].
+  static NSNetService castFrom<T extends _ObjCWrapper>(T other) {
+    return NSNetService._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSNetService] that wraps the given raw object pointer.
+  static NSNetService castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSNetService._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSNetService].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSNetService1);
+  }
+
+  NSNetService initWithDomain_type_name_port_(
+      NSString? domain, NSString? type, NSString? name, int port) {
+    final _ret = _lib._objc_msgSend_937(
+        _id,
+        _lib._sel_initWithDomain_type_name_port_1,
+        domain?._id ?? ffi.nullptr,
+        type?._id ?? ffi.nullptr,
+        name?._id ?? ffi.nullptr,
+        port);
+    return NSNetService._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSNetService initWithDomain_type_name_(
+      NSString? domain, NSString? type, NSString? name) {
+    final _ret = _lib._objc_msgSend_26(
+        _id,
+        _lib._sel_initWithDomain_type_name_1,
+        domain?._id ?? ffi.nullptr,
+        type?._id ?? ffi.nullptr,
+        name?._id ?? ffi.nullptr);
+    return NSNetService._(_ret, _lib, retain: true, release: true);
+  }
+
+  void scheduleInRunLoop_forMode_(NSRunLoop? aRunLoop, NSRunLoopMode mode) {
+    return _lib._objc_msgSend_501(_id, _lib._sel_scheduleInRunLoop_forMode_1,
+        aRunLoop?._id ?? ffi.nullptr, mode);
+  }
+
+  void removeFromRunLoop_forMode_(NSRunLoop? aRunLoop, NSRunLoopMode mode) {
+    return _lib._objc_msgSend_501(_id, _lib._sel_removeFromRunLoop_forMode_1,
+        aRunLoop?._id ?? ffi.nullptr, mode);
+  }
+
+  NSObject? get delegate {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_delegate1);
+    return _ret.address == 0
+        ? null
+        : NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  set delegate(NSObject? value) {
+    _lib._objc_msgSend_368(
+        _id, _lib._sel_setDelegate_1, value?._id ?? ffi.nullptr);
+  }
+
+  bool get includesPeerToPeer {
+    return _lib._objc_msgSend_12(_id, _lib._sel_includesPeerToPeer1);
+  }
+
+  set includesPeerToPeer(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setIncludesPeerToPeer_1, value);
+  }
+
+  NSString? get name {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_name1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get type {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_type1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get domain {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_domain1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get hostName {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_hostName1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray? get addresses {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_addresses1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get port {
+    return _lib._objc_msgSend_78(_id, _lib._sel_port1);
+  }
+
+  void publish() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_publish1);
+  }
+
+  void publishWithOptions_(int options) {
+    return _lib._objc_msgSend_938(_id, _lib._sel_publishWithOptions_1, options);
+  }
+
+  void resolve() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_resolve1);
+  }
+
+  void stop() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_stop1);
+  }
+
+  static NSDictionary dictionaryFromTXTRecordData_(
+      SwiftLibrary _lib, NSData? txtData) {
+    final _ret = _lib._objc_msgSend_939(_lib._class_NSNetService1,
+        _lib._sel_dictionaryFromTXTRecordData_1, txtData?._id ?? ffi.nullptr);
+    return NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSData dataFromTXTRecordDictionary_(
+      SwiftLibrary _lib, NSDictionary? txtDictionary) {
+    final _ret = _lib._objc_msgSend_940(
+        _lib._class_NSNetService1,
+        _lib._sel_dataFromTXTRecordDictionary_1,
+        txtDictionary?._id ?? ffi.nullptr);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  void resolveWithTimeout_(double timeout) {
+    return _lib._objc_msgSend_473(_id, _lib._sel_resolveWithTimeout_1, timeout);
+  }
+
+  bool getInputStream_outputStream_(
+      ffi.Pointer<ffi.Pointer<ObjCObject>> inputStream,
+      ffi.Pointer<ffi.Pointer<ObjCObject>> outputStream) {
+    return _lib._objc_msgSend_941(_id, _lib._sel_getInputStream_outputStream_1,
+        inputStream, outputStream);
+  }
+
+  bool setTXTRecordData_(NSData? recordData) {
+    return _lib._objc_msgSend_23(
+        _id, _lib._sel_setTXTRecordData_1, recordData?._id ?? ffi.nullptr);
+  }
+
+  NSData TXTRecordData() {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_TXTRecordData1);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  void startMonitoring() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_startMonitoring1);
+  }
+
+  void stopMonitoring() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_stopMonitoring1);
+  }
+
+  static NSNetService new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSNetService1, _lib._sel_new1);
+    return NSNetService._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSNetService alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSNetService1, _lib._sel_alloc1);
+    return NSNetService._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSNetService1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSNetService1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSNetService1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSNetService1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSNetService1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSNetService1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSNetService1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSNetService1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSNetService1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSNetServiceOptions {
+  static const int NSNetServiceNoAutoRename = 1;
+  static const int NSNetServiceListenForConnections = 2;
+}
+
+class NSURLSessionWebSocketTask extends NSURLSessionTask {
+  NSURLSessionWebSocketTask._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURLSessionWebSocketTask] that points to the same underlying object as [other].
+  static NSURLSessionWebSocketTask castFrom<T extends _ObjCWrapper>(T other) {
+    return NSURLSessionWebSocketTask._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSURLSessionWebSocketTask] that wraps the given raw object pointer.
+  static NSURLSessionWebSocketTask castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURLSessionWebSocketTask._(other, lib,
+        retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURLSessionWebSocketTask].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSURLSessionWebSocketTask1);
+  }
+
+  void sendMessage_completionHandler_(
+      NSURLSessionWebSocketMessage? message, ObjCBlock15 completionHandler) {
+    return _lib._objc_msgSend_944(
+        _id,
+        _lib._sel_sendMessage_completionHandler_1,
+        message?._id ?? ffi.nullptr,
+        completionHandler._id);
+  }
+
+  void receiveMessageWithCompletionHandler_(ObjCBlock40 completionHandler) {
+    return _lib._objc_msgSend_945(_id,
+        _lib._sel_receiveMessageWithCompletionHandler_1, completionHandler._id);
+  }
+
+  void sendPingWithPongReceiveHandler_(ObjCBlock15 pongReceiveHandler) {
+    return _lib._objc_msgSend_946(_id,
+        _lib._sel_sendPingWithPongReceiveHandler_1, pongReceiveHandler._id);
+  }
+
+  void cancelWithCloseCode_reason_(int closeCode, NSData? reason) {
+    return _lib._objc_msgSend_947(_id, _lib._sel_cancelWithCloseCode_reason_1,
+        closeCode, reason?._id ?? ffi.nullptr);
+  }
+
+  int get maximumMessageSize {
+    return _lib._objc_msgSend_78(_id, _lib._sel_maximumMessageSize1);
+  }
+
+  set maximumMessageSize(int value) {
+    _lib._objc_msgSend_558(_id, _lib._sel_setMaximumMessageSize_1, value);
+  }
+
+  int get closeCode {
+    return _lib._objc_msgSend_948(_id, _lib._sel_closeCode1);
+  }
+
+  NSData? get closeReason {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_closeReason1);
+    return _ret.address == 0
+        ? null
+        : NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSURLSessionWebSocketTask init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSURLSessionWebSocketTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSURLSessionWebSocketTask new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLSessionWebSocketTask1, _lib._sel_new1);
+    return NSURLSessionWebSocketTask._(_ret, _lib,
+        retain: false, release: true);
+  }
+
+  static NSURLSessionWebSocketTask alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLSessionWebSocketTask1, _lib._sel_alloc1);
+    return NSURLSessionWebSocketTask._(_ret, _lib,
+        retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURLSessionWebSocketTask1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLSessionWebSocketTask1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSURLSessionWebSocketTask1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSURLSessionWebSocketTask1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURLSessionWebSocketTask1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURLSessionWebSocketTask1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURLSessionWebSocketTask1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(_lib._class_NSURLSessionWebSocketTask1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSURLSessionWebSocketTask1,
+        _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSURLSessionWebSocketMessage extends NSObject {
+  NSURLSessionWebSocketMessage._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSURLSessionWebSocketMessage] that points to the same underlying object as [other].
+  static NSURLSessionWebSocketMessage castFrom<T extends _ObjCWrapper>(
+      T other) {
+    return NSURLSessionWebSocketMessage._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSURLSessionWebSocketMessage] that wraps the given raw object pointer.
+  static NSURLSessionWebSocketMessage castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSURLSessionWebSocketMessage._(other, lib,
+        retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSURLSessionWebSocketMessage].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSURLSessionWebSocketMessage1);
+  }
+
+  NSURLSessionWebSocketMessage initWithData_(NSData? data) {
+    final _ret = _lib._objc_msgSend_242(
+        _id, _lib._sel_initWithData_1, data?._id ?? ffi.nullptr);
+    return NSURLSessionWebSocketMessage._(_ret, _lib,
+        retain: true, release: true);
+  }
+
+  NSURLSessionWebSocketMessage initWithString_(NSString? string) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initWithString_1, string?._id ?? ffi.nullptr);
+    return NSURLSessionWebSocketMessage._(_ret, _lib,
+        retain: true, release: true);
+  }
+
+  int get type {
+    return _lib._objc_msgSend_943(_id, _lib._sel_type1);
+  }
+
+  NSData? get data {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_data1);
+    return _ret.address == 0
+        ? null
+        : NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get string {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_string1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSURLSessionWebSocketMessage init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSURLSessionWebSocketMessage._(_ret, _lib,
+        retain: true, release: true);
+  }
+
+  static NSURLSessionWebSocketMessage new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLSessionWebSocketMessage1, _lib._sel_new1);
+    return NSURLSessionWebSocketMessage._(_ret, _lib,
+        retain: false, release: true);
+  }
+
+  static NSURLSessionWebSocketMessage alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSURLSessionWebSocketMessage1, _lib._sel_alloc1);
+    return NSURLSessionWebSocketMessage._(_ret, _lib,
+        retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSURLSessionWebSocketMessage1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSURLSessionWebSocketMessage1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSURLSessionWebSocketMessage1,
+        _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(_lib._class_NSURLSessionWebSocketMessage1,
+        _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSURLSessionWebSocketMessage1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSURLSessionWebSocketMessage1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSURLSessionWebSocketMessage1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSURLSessionWebSocketMessage1,
+        _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSURLSessionWebSocketMessage1,
+        _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSURLSessionWebSocketMessageType {
+  static const int NSURLSessionWebSocketMessageTypeData = 0;
+  static const int NSURLSessionWebSocketMessageTypeString = 1;
+}
+
+void _ObjCBlock40_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(ffi.Pointer<ObjCObject> arg0,
+                  ffi.Pointer<ObjCObject> arg1)>>()
+      .asFunction<
+          void Function(ffi.Pointer<ObjCObject> arg0,
+              ffi.Pointer<ObjCObject> arg1)>()(arg0, arg1);
+}
+
+final _ObjCBlock40_closureRegistry = <int, Function>{};
+int _ObjCBlock40_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock40_registerClosure(Function fn) {
+  final id = ++_ObjCBlock40_closureRegistryIndex;
+  _ObjCBlock40_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock40_closureTrampoline(ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1) {
+  return _ObjCBlock40_closureRegistry[block.ref.target.address]!(arg0, arg1);
+}
+
+class ObjCBlock40 extends _ObjCBlockBase {
+  ObjCBlock40._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock40.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0,
+                      ffi.Pointer<ObjCObject> arg1)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1)>(
+                        _ObjCBlock40_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock40.fromFunction(
+      SwiftLibrary lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1)>(
+                        _ObjCBlock40_closureTrampoline)
+                    .cast(),
+                _ObjCBlock40_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    ffi.Pointer<ObjCObject> arg1)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                ffi.Pointer<ObjCObject> arg1)>()(_id, arg0, arg1);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+abstract class NSURLSessionWebSocketCloseCode {
+  static const int NSURLSessionWebSocketCloseCodeInvalid = 0;
+  static const int NSURLSessionWebSocketCloseCodeNormalClosure = 1000;
+  static const int NSURLSessionWebSocketCloseCodeGoingAway = 1001;
+  static const int NSURLSessionWebSocketCloseCodeProtocolError = 1002;
+  static const int NSURLSessionWebSocketCloseCodeUnsupportedData = 1003;
+  static const int NSURLSessionWebSocketCloseCodeNoStatusReceived = 1005;
+  static const int NSURLSessionWebSocketCloseCodeAbnormalClosure = 1006;
+  static const int NSURLSessionWebSocketCloseCodeInvalidFramePayloadData = 1007;
+  static const int NSURLSessionWebSocketCloseCodePolicyViolation = 1008;
+  static const int NSURLSessionWebSocketCloseCodeMessageTooBig = 1009;
+  static const int NSURLSessionWebSocketCloseCodeMandatoryExtensionMissing =
+      1010;
+  static const int NSURLSessionWebSocketCloseCodeInternalServerError = 1011;
+  static const int NSURLSessionWebSocketCloseCodeTLSHandshakeFailure = 1015;
+}
+
+void _ObjCBlock41_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0,
+    ffi.Pointer<ObjCObject> arg1,
+    ffi.Pointer<ObjCObject> arg2) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(
+                  ffi.Pointer<ObjCObject> arg0,
+                  ffi.Pointer<ObjCObject> arg1,
+                  ffi.Pointer<ObjCObject> arg2)>>()
+      .asFunction<
+          void Function(
+              ffi.Pointer<ObjCObject> arg0,
+              ffi.Pointer<ObjCObject> arg1,
+              ffi.Pointer<ObjCObject> arg2)>()(arg0, arg1, arg2);
+}
+
+final _ObjCBlock41_closureRegistry = <int, Function>{};
+int _ObjCBlock41_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock41_registerClosure(Function fn) {
+  final id = ++_ObjCBlock41_closureRegistryIndex;
+  _ObjCBlock41_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock41_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0,
+    ffi.Pointer<ObjCObject> arg1,
+    ffi.Pointer<ObjCObject> arg2) {
+  return _ObjCBlock41_closureRegistry[block.ref.target.address]!(
+      arg0, arg1, arg2);
+}
+
+class ObjCBlock41 extends _ObjCBlockBase {
+  ObjCBlock41._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock41.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(
+                      ffi.Pointer<ObjCObject> arg0,
+                      ffi.Pointer<ObjCObject> arg1,
+                      ffi.Pointer<ObjCObject> arg2)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1,
+                                ffi.Pointer<ObjCObject> arg2)>(
+                        _ObjCBlock41_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock41.fromFunction(
+      SwiftLibrary lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1,
+              ffi.Pointer<ObjCObject> arg2)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1,
+                                ffi.Pointer<ObjCObject> arg2)>(
+                        _ObjCBlock41_closureTrampoline)
+                    .cast(),
+                _ObjCBlock41_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1,
+      ffi.Pointer<ObjCObject> arg2) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    ffi.Pointer<ObjCObject> arg1,
+                    ffi.Pointer<ObjCObject> arg2)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                ffi.Pointer<ObjCObject> arg1,
+                ffi.Pointer<ObjCObject> arg2)>()(_id, arg0, arg1, arg2);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+void _ObjCBlock42_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0,
+    ffi.Pointer<ObjCObject> arg1,
+    ffi.Pointer<ObjCObject> arg2) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<
+              ffi.Void Function(
+                  ffi.Pointer<ObjCObject> arg0,
+                  ffi.Pointer<ObjCObject> arg1,
+                  ffi.Pointer<ObjCObject> arg2)>>()
+      .asFunction<
+          void Function(
+              ffi.Pointer<ObjCObject> arg0,
+              ffi.Pointer<ObjCObject> arg1,
+              ffi.Pointer<ObjCObject> arg2)>()(arg0, arg1, arg2);
+}
+
+final _ObjCBlock42_closureRegistry = <int, Function>{};
+int _ObjCBlock42_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock42_registerClosure(Function fn) {
+  final id = ++_ObjCBlock42_closureRegistryIndex;
+  _ObjCBlock42_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock42_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block,
+    ffi.Pointer<ObjCObject> arg0,
+    ffi.Pointer<ObjCObject> arg1,
+    ffi.Pointer<ObjCObject> arg2) {
+  return _ObjCBlock42_closureRegistry[block.ref.target.address]!(
+      arg0, arg1, arg2);
+}
+
+class ObjCBlock42 extends _ObjCBlockBase {
+  ObjCBlock42._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock42.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(
+                      ffi.Pointer<ObjCObject> arg0,
+                      ffi.Pointer<ObjCObject> arg1,
+                      ffi.Pointer<ObjCObject> arg2)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1,
+                                ffi.Pointer<ObjCObject> arg2)>(
+                        _ObjCBlock42_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock42.fromFunction(
+      SwiftLibrary lib,
+      void Function(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1,
+              ffi.Pointer<ObjCObject> arg2)
+          fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(
+                                ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0,
+                                ffi.Pointer<ObjCObject> arg1,
+                                ffi.Pointer<ObjCObject> arg2)>(
+                        _ObjCBlock42_closureTrampoline)
+                    .cast(),
+                _ObjCBlock42_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0, ffi.Pointer<ObjCObject> arg1,
+      ffi.Pointer<ObjCObject> arg2) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(
+                    ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0,
+                    ffi.Pointer<ObjCObject> arg1,
+                    ffi.Pointer<ObjCObject> arg2)>>()
+        .asFunction<
+            void Function(
+                ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0,
+                ffi.Pointer<ObjCObject> arg1,
+                ffi.Pointer<ObjCObject> arg2)>()(_id, arg0, arg1, arg2);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class NSProtocolChecker extends NSProxy {
+  NSProtocolChecker._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSProtocolChecker] that points to the same underlying object as [other].
+  static NSProtocolChecker castFrom<T extends _ObjCWrapper>(T other) {
+    return NSProtocolChecker._(other._id, other._lib,
+        retain: true, release: true);
+  }
+
+  /// Returns a [NSProtocolChecker] that wraps the given raw object pointer.
+  static NSProtocolChecker castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSProtocolChecker._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSProtocolChecker].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1,
+        obj._lib._class_NSProtocolChecker1);
+  }
+
+  Protocol? get protocol {
+    final _ret = _lib._objc_msgSend_959(_id, _lib._sel_protocol1);
+    return _ret.address == 0
+        ? null
+        : Protocol._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject? get target {
+    final _ret = _lib._objc_msgSend_788(_id, _lib._sel_target1);
+    return _ret.address == 0
+        ? null
+        : NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSProtocolChecker protocolCheckerWithTarget_protocol_(
+      SwiftLibrary _lib, NSObject? anObject, Protocol? aProtocol) {
+    final _ret = _lib._objc_msgSend_960(
+        _lib._class_NSProtocolChecker1,
+        _lib._sel_protocolCheckerWithTarget_protocol_1,
+        anObject?._id ?? ffi.nullptr,
+        aProtocol?._id ?? ffi.nullptr);
+    return NSProtocolChecker._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSProtocolChecker initWithTarget_protocol_(
+      NSObject? anObject, Protocol? aProtocol) {
+    final _ret = _lib._objc_msgSend_960(
+        _id,
+        _lib._sel_initWithTarget_protocol_1,
+        anObject?._id ?? ffi.nullptr,
+        aProtocol?._id ?? ffi.nullptr);
+    return NSProtocolChecker._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSProtocolChecker1, _lib._sel_alloc1);
+    return NSObject._(_ret, _lib, retain: false, release: true);
+  }
+
+  static bool respondsToSelector_(
+      SwiftLibrary _lib, ffi.Pointer<ObjCSel> aSelector) {
+    return _lib._objc_msgSend_4(_lib._class_NSProtocolChecker1,
+        _lib._sel_respondsToSelector_1, aSelector);
+  }
+}
+
+class NSTask extends NSObject {
+  NSTask._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSTask] that points to the same underlying object as [other].
+  static NSTask castFrom<T extends _ObjCWrapper>(T other) {
+    return NSTask._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSTask] that wraps the given raw object pointer.
+  static NSTask castFromPointer(SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSTask._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSTask].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSTask1);
+  }
+
+  @override
+  NSTask init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSURL? get executableURL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_executableURL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  set executableURL(NSURL? value) {
+    _lib._objc_msgSend_888(
+        _id, _lib._sel_setExecutableURL_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get arguments {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_arguments1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set arguments(NSArray? value) {
+    _lib._objc_msgSend_696(
+        _id, _lib._sel_setArguments_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSDictionary? get environment {
+    final _ret = _lib._objc_msgSend_164(_id, _lib._sel_environment1);
+    return _ret.address == 0
+        ? null
+        : NSDictionary._(_ret, _lib, retain: true, release: true);
+  }
+
+  set environment(NSDictionary? value) {
+    _lib._objc_msgSend_165(
+        _id, _lib._sel_setEnvironment_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSURL? get currentDirectoryURL {
+    final _ret = _lib._objc_msgSend_40(_id, _lib._sel_currentDirectoryURL1);
+    return _ret.address == 0
+        ? null
+        : NSURL._(_ret, _lib, retain: true, release: true);
+  }
+
+  set currentDirectoryURL(NSURL? value) {
+    _lib._objc_msgSend_888(
+        _id, _lib._sel_setCurrentDirectoryURL_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSObject get standardInput {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_standardInput1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  set standardInput(NSObject value) {
+    _lib._objc_msgSend_368(_id, _lib._sel_setStandardInput_1, value._id);
+  }
+
+  NSObject get standardOutput {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_standardOutput1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  set standardOutput(NSObject value) {
+    _lib._objc_msgSend_368(_id, _lib._sel_setStandardOutput_1, value._id);
+  }
+
+  NSObject get standardError {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_standardError1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  set standardError(NSObject value) {
+    _lib._objc_msgSend_368(_id, _lib._sel_setStandardError_1, value._id);
+  }
+
+  bool launchAndReturnError_(ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_219(_id, _lib._sel_launchAndReturnError_1, error);
+  }
+
+  void interrupt() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_interrupt1);
+  }
+
+  void terminate() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_terminate1);
+  }
+
+  bool suspend() {
+    return _lib._objc_msgSend_12(_id, _lib._sel_suspend1);
+  }
+
+  bool resume() {
+    return _lib._objc_msgSend_12(_id, _lib._sel_resume1);
+  }
+
+  int get processIdentifier {
+    return _lib._objc_msgSend_213(_id, _lib._sel_processIdentifier1);
+  }
+
+  bool get running {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isRunning1);
+  }
+
+  int get terminationStatus {
+    return _lib._objc_msgSend_213(_id, _lib._sel_terminationStatus1);
+  }
+
+  int get terminationReason {
+    return _lib._objc_msgSend_961(_id, _lib._sel_terminationReason1);
+  }
+
+  ObjCBlock43 get terminationHandler {
+    final _ret = _lib._objc_msgSend_962(_id, _lib._sel_terminationHandler1);
+    return ObjCBlock43._(_ret, _lib);
+  }
+
+  set terminationHandler(ObjCBlock43 value) {
+    _lib._objc_msgSend_963(_id, _lib._sel_setTerminationHandler_1, value._id);
+  }
+
+  int get qualityOfService {
+    return _lib._objc_msgSend_475(_id, _lib._sel_qualityOfService1);
+  }
+
+  set qualityOfService(int value) {
+    _lib._objc_msgSend_476(_id, _lib._sel_setQualityOfService_1, value);
+  }
+
+  static NSTask
+      launchedTaskWithExecutableURL_arguments_error_terminationHandler_(
+          SwiftLibrary _lib,
+          NSURL? url,
+          NSArray? arguments,
+          ffi.Pointer<ffi.Pointer<ObjCObject>> error,
+          ObjCBlock43 terminationHandler) {
+    final _ret = _lib._objc_msgSend_964(
+        _lib._class_NSTask1,
+        _lib._sel_launchedTaskWithExecutableURL_arguments_error_terminationHandler_1,
+        url?._id ?? ffi.nullptr,
+        arguments?._id ?? ffi.nullptr,
+        error,
+        terminationHandler._id);
+    return NSTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  void waitUntilExit() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_waitUntilExit1);
+  }
+
+  NSString? get launchPath {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_launchPath1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set launchPath(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setLaunchPath_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get currentDirectoryPath {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_currentDirectoryPath1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set currentDirectoryPath(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setCurrentDirectoryPath_1, value?._id ?? ffi.nullptr);
+  }
+
+  void launch() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_launch1);
+  }
+
+  static NSTask launchedTaskWithLaunchPath_arguments_(
+      SwiftLibrary _lib, NSString? path, NSArray? arguments) {
+    final _ret = _lib._objc_msgSend_965(
+        _lib._class_NSTask1,
+        _lib._sel_launchedTaskWithLaunchPath_arguments_1,
+        path?._id ?? ffi.nullptr,
+        arguments?._id ?? ffi.nullptr);
+    return NSTask._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSTask new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSTask1, _lib._sel_new1);
+    return NSTask._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSTask alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSTask1, _lib._sel_alloc1);
+    return NSTask._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSTask1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSTask1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSTask1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSTask1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSTask1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSTask1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSTask1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSTask1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSTask1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSTaskTerminationReason {
+  static const int NSTaskTerminationReasonExit = 1;
+  static const int NSTaskTerminationReasonUncaughtSignal = 2;
+}
+
+void _ObjCBlock43_fnPtrTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ObjCObject> arg0) {
+  return block.ref.target
+      .cast<
+          ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ObjCObject> arg0)>>()
+      .asFunction<void Function(ffi.Pointer<ObjCObject> arg0)>()(arg0);
+}
+
+final _ObjCBlock43_closureRegistry = <int, Function>{};
+int _ObjCBlock43_closureRegistryIndex = 0;
+ffi.Pointer<ffi.Void> _ObjCBlock43_registerClosure(Function fn) {
+  final id = ++_ObjCBlock43_closureRegistryIndex;
+  _ObjCBlock43_closureRegistry[id] = fn;
+  return ffi.Pointer<ffi.Void>.fromAddress(id);
+}
+
+void _ObjCBlock43_closureTrampoline(
+    ffi.Pointer<_ObjCBlock> block, ffi.Pointer<ObjCObject> arg0) {
+  return _ObjCBlock43_closureRegistry[block.ref.target.address]!(arg0);
+}
+
+class ObjCBlock43 extends _ObjCBlockBase {
+  ObjCBlock43._(ffi.Pointer<_ObjCBlock> id, SwiftLibrary lib)
+      : super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  ObjCBlock43.fromFunctionPointer(
+      SwiftLibrary lib,
+      ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ObjCObject> arg0)>>
+          ptr)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0)>(
+                        _ObjCBlock43_fnPtrTrampoline)
+                    .cast(),
+                ptr.cast()),
+            lib);
+
+  /// Creates a block from a Dart function.
+  ObjCBlock43.fromFunction(
+      SwiftLibrary lib, void Function(ffi.Pointer<ObjCObject> arg0) fn)
+      : this._(
+            lib._newBlock1(
+                ffi.Pointer.fromFunction<
+                            ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                                ffi.Pointer<ObjCObject> arg0)>(
+                        _ObjCBlock43_closureTrampoline)
+                    .cast(),
+                _ObjCBlock43_registerClosure(fn)),
+            lib);
+  void call(ffi.Pointer<ObjCObject> arg0) {
+    return _id.ref.invoke
+        .cast<
+            ffi.NativeFunction<
+                ffi.Void Function(ffi.Pointer<_ObjCBlock> block,
+                    ffi.Pointer<ObjCObject> arg0)>>()
+        .asFunction<
+            void Function(ffi.Pointer<_ObjCBlock> block,
+                ffi.Pointer<ObjCObject> arg0)>()(_id, arg0);
+  }
+
+  ffi.Pointer<_ObjCBlock> get pointer => _id;
+}
+
+class NSXMLElement extends NSXMLNode {
+  NSXMLElement._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSXMLElement] that points to the same underlying object as [other].
+  static NSXMLElement castFrom<T extends _ObjCWrapper>(T other) {
+    return NSXMLElement._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSXMLElement] that wraps the given raw object pointer.
+  static NSXMLElement castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSXMLElement._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSXMLElement].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSXMLElement1);
+  }
+
+  NSXMLElement initWithName_(NSString? name) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initWithName_1, name?._id ?? ffi.nullptr);
+    return NSXMLElement._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLElement initWithName_URI_(NSString? name, NSString? URI) {
+    final _ret = _lib._objc_msgSend_159(_id, _lib._sel_initWithName_URI_1,
+        name?._id ?? ffi.nullptr, URI?._id ?? ffi.nullptr);
+    return NSXMLElement._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLElement initWithName_stringValue_(NSString? name, NSString? string) {
+    final _ret = _lib._objc_msgSend_159(
+        _id,
+        _lib._sel_initWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        string?._id ?? ffi.nullptr);
+    return NSXMLElement._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLElement initWithXMLString_error_(
+      NSString? string, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_264(_id,
+        _lib._sel_initWithXMLString_error_1, string?._id ?? ffi.nullptr, error);
+    return NSXMLElement._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSXMLElement initWithKind_options_(int kind, int options) {
+    final _ret = _lib._objc_msgSend_967(
+        _id, _lib._sel_initWithKind_options_1, kind, options);
+    return NSXMLElement._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray elementsForName_(NSString? name) {
+    final _ret = _lib._objc_msgSend_119(
+        _id, _lib._sel_elementsForName_1, name?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray elementsForLocalName_URI_(NSString? localName, NSString? URI) {
+    final _ret = _lib._objc_msgSend_617(
+        _id,
+        _lib._sel_elementsForLocalName_URI_1,
+        localName?._id ?? ffi.nullptr,
+        URI?._id ?? ffi.nullptr);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  void addAttribute_(NSXMLNode? attribute) {
+    return _lib._objc_msgSend_979(
+        _id, _lib._sel_addAttribute_1, attribute?._id ?? ffi.nullptr);
+  }
+
+  void removeAttributeForName_(NSString? name) {
+    return _lib._objc_msgSend_186(
+        _id, _lib._sel_removeAttributeForName_1, name?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get attributes {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_attributes1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set attributes(NSArray? value) {
+    _lib._objc_msgSend_696(
+        _id, _lib._sel_setAttributes_1, value?._id ?? ffi.nullptr);
+  }
+
+  void setAttributesWithDictionary_(NSDictionary? attributes) {
+    return _lib._objc_msgSend_444(_id, _lib._sel_setAttributesWithDictionary_1,
+        attributes?._id ?? ffi.nullptr);
+  }
+
+  NSXMLNode attributeForName_(NSString? name) {
+    final _ret = _lib._objc_msgSend_983(
+        _id, _lib._sel_attributeForName_1, name?._id ?? ffi.nullptr);
+    return NSXMLNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLNode attributeForLocalName_URI_(NSString? localName, NSString? URI) {
+    final _ret = _lib._objc_msgSend_1000(
+        _id,
+        _lib._sel_attributeForLocalName_URI_1,
+        localName?._id ?? ffi.nullptr,
+        URI?._id ?? ffi.nullptr);
+    return NSXMLNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  void addNamespace_(NSXMLNode? aNamespace) {
+    return _lib._objc_msgSend_979(
+        _id, _lib._sel_addNamespace_1, aNamespace?._id ?? ffi.nullptr);
+  }
+
+  void removeNamespaceForPrefix_(NSString? name) {
+    return _lib._objc_msgSend_186(
+        _id, _lib._sel_removeNamespaceForPrefix_1, name?._id ?? ffi.nullptr);
+  }
+
+  NSArray? get namespaces {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_namespaces1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  set namespaces(NSArray? value) {
+    _lib._objc_msgSend_696(
+        _id, _lib._sel_setNamespaces_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSXMLNode namespaceForPrefix_(NSString? name) {
+    final _ret = _lib._objc_msgSend_983(
+        _id, _lib._sel_namespaceForPrefix_1, name?._id ?? ffi.nullptr);
+    return NSXMLNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLNode resolveNamespaceForName_(NSString? name) {
+    final _ret = _lib._objc_msgSend_983(
+        _id, _lib._sel_resolveNamespaceForName_1, name?._id ?? ffi.nullptr);
+    return NSXMLNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString resolvePrefixForNamespaceURI_(NSString? namespaceURI) {
+    final _ret = _lib._objc_msgSend_64(
+        _id,
+        _lib._sel_resolvePrefixForNamespaceURI_1,
+        namespaceURI?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  void insertChild_atIndex_(NSXMLNode? child, int index) {
+    return _lib._objc_msgSend_977(
+        _id, _lib._sel_insertChild_atIndex_1, child?._id ?? ffi.nullptr, index);
+  }
+
+  void insertChildren_atIndex_(NSArray? children, int index) {
+    return _lib._objc_msgSend_978(_id, _lib._sel_insertChildren_atIndex_1,
+        children?._id ?? ffi.nullptr, index);
+  }
+
+  void removeChildAtIndex_(int index) {
+    return _lib._objc_msgSend_410(_id, _lib._sel_removeChildAtIndex_1, index);
+  }
+
+  void setChildren_(NSArray? children) {
+    return _lib._objc_msgSend_412(
+        _id, _lib._sel_setChildren_1, children?._id ?? ffi.nullptr);
+  }
+
+  void addChild_(NSXMLNode? child) {
+    return _lib._objc_msgSend_979(
+        _id, _lib._sel_addChild_1, child?._id ?? ffi.nullptr);
+  }
+
+  void replaceChildAtIndex_withNode_(int index, NSXMLNode? node) {
+    return _lib._objc_msgSend_980(_id, _lib._sel_replaceChildAtIndex_withNode_1,
+        index, node?._id ?? ffi.nullptr);
+  }
+
+  void normalizeAdjacentTextNodesPreservingCDATA_(bool preserve) {
+    return _lib._objc_msgSend_756(
+        _id, _lib._sel_normalizeAdjacentTextNodesPreservingCDATA_1, preserve);
+  }
+
+  void setAttributesAsDictionary_(NSDictionary? attributes) {
+    return _lib._objc_msgSend_444(_id, _lib._sel_setAttributesAsDictionary_1,
+        attributes?._id ?? ffi.nullptr);
+  }
+
+  static NSObject document(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSXMLElement1, _lib._sel_document1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject documentWithRootElement_(
+      SwiftLibrary _lib, NSXMLElement? element) {
+    final _ret = _lib._objc_msgSend_968(_lib._class_NSXMLElement1,
+        _lib._sel_documentWithRootElement_1, element?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_(SwiftLibrary _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLElement1,
+        _lib._sel_elementWithName_1, name?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_URI_(
+      SwiftLibrary _lib, NSString? name, NSString? URI) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLElement1,
+        _lib._sel_elementWithName_URI_1,
+        name?._id ?? ffi.nullptr,
+        URI?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_stringValue_(
+      SwiftLibrary _lib, NSString? name, NSString? string) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLElement1,
+        _lib._sel_elementWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        string?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_children_attributes_(SwiftLibrary _lib,
+      NSString? name, NSArray? children, NSArray? attributes) {
+    final _ret = _lib._objc_msgSend_969(
+        _lib._class_NSXMLElement1,
+        _lib._sel_elementWithName_children_attributes_1,
+        name?._id ?? ffi.nullptr,
+        children?._id ?? ffi.nullptr,
+        attributes?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject attributeWithName_stringValue_(
+      SwiftLibrary _lib, NSString? name, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLElement1,
+        _lib._sel_attributeWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject attributeWithName_URI_stringValue_(
+      SwiftLibrary _lib, NSString? name, NSString? URI, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_26(
+        _lib._class_NSXMLElement1,
+        _lib._sel_attributeWithName_URI_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        URI?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject namespaceWithName_stringValue_(
+      SwiftLibrary _lib, NSString? name, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLElement1,
+        _lib._sel_namespaceWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject processingInstructionWithName_stringValue_(
+      SwiftLibrary _lib, NSString? name, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLElement1,
+        _lib._sel_processingInstructionWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject commentWithStringValue_(
+      SwiftLibrary _lib, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLElement1,
+        _lib._sel_commentWithStringValue_1, stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject textWithStringValue_(
+      SwiftLibrary _lib, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLElement1,
+        _lib._sel_textWithStringValue_1, stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject DTDNodeWithXMLString_(SwiftLibrary _lib, NSString? string) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLElement1,
+        _lib._sel_DTDNodeWithXMLString_1, string?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString localNameForName_(SwiftLibrary _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_64(_lib._class_NSXMLElement1,
+        _lib._sel_localNameForName_1, name?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString prefixForName_(SwiftLibrary _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_64(_lib._class_NSXMLElement1,
+        _lib._sel_prefixForName_1, name?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSXMLNode predefinedNamespaceForPrefix_(
+      SwiftLibrary _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_983(_lib._class_NSXMLElement1,
+        _lib._sel_predefinedNamespaceForPrefix_1, name?._id ?? ffi.nullptr);
+    return NSXMLNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSXMLElement new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSXMLElement1, _lib._sel_new1);
+    return NSXMLElement._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSXMLElement alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSXMLElement1, _lib._sel_alloc1);
+    return NSXMLElement._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSXMLElement1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSXMLElement1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSXMLElement1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSXMLElement1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSXMLElement1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSXMLElement1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSXMLElement1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSXMLElement1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSXMLElement1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSXMLNode extends NSObject {
+  NSXMLNode._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSXMLNode] that points to the same underlying object as [other].
+  static NSXMLNode castFrom<T extends _ObjCWrapper>(T other) {
+    return NSXMLNode._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSXMLNode] that wraps the given raw object pointer.
+  static NSXMLNode castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSXMLNode._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSXMLNode].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSXMLNode1);
+  }
+
+  @override
+  NSXMLNode init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSXMLNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLNode initWithKind_(int kind) {
+    final _ret = _lib._objc_msgSend_966(_id, _lib._sel_initWithKind_1, kind);
+    return NSXMLNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLNode initWithKind_options_(int kind, int options) {
+    final _ret = _lib._objc_msgSend_967(
+        _id, _lib._sel_initWithKind_options_1, kind, options);
+    return NSXMLNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject document(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSXMLNode1, _lib._sel_document1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject documentWithRootElement_(
+      SwiftLibrary _lib, NSXMLElement? element) {
+    final _ret = _lib._objc_msgSend_968(_lib._class_NSXMLNode1,
+        _lib._sel_documentWithRootElement_1, element?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_(SwiftLibrary _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLNode1,
+        _lib._sel_elementWithName_1, name?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_URI_(
+      SwiftLibrary _lib, NSString? name, NSString? URI) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLNode1,
+        _lib._sel_elementWithName_URI_1,
+        name?._id ?? ffi.nullptr,
+        URI?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_stringValue_(
+      SwiftLibrary _lib, NSString? name, NSString? string) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLNode1,
+        _lib._sel_elementWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        string?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_children_attributes_(SwiftLibrary _lib,
+      NSString? name, NSArray? children, NSArray? attributes) {
+    final _ret = _lib._objc_msgSend_969(
+        _lib._class_NSXMLNode1,
+        _lib._sel_elementWithName_children_attributes_1,
+        name?._id ?? ffi.nullptr,
+        children?._id ?? ffi.nullptr,
+        attributes?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject attributeWithName_stringValue_(
+      SwiftLibrary _lib, NSString? name, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLNode1,
+        _lib._sel_attributeWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject attributeWithName_URI_stringValue_(
+      SwiftLibrary _lib, NSString? name, NSString? URI, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_26(
+        _lib._class_NSXMLNode1,
+        _lib._sel_attributeWithName_URI_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        URI?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject namespaceWithName_stringValue_(
+      SwiftLibrary _lib, NSString? name, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLNode1,
+        _lib._sel_namespaceWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject processingInstructionWithName_stringValue_(
+      SwiftLibrary _lib, NSString? name, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLNode1,
+        _lib._sel_processingInstructionWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject commentWithStringValue_(
+      SwiftLibrary _lib, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLNode1,
+        _lib._sel_commentWithStringValue_1, stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject textWithStringValue_(
+      SwiftLibrary _lib, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLNode1,
+        _lib._sel_textWithStringValue_1, stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject DTDNodeWithXMLString_(SwiftLibrary _lib, NSString? string) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLNode1,
+        _lib._sel_DTDNodeWithXMLString_1, string?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get kind {
+    return _lib._objc_msgSend_970(_id, _lib._sel_kind1);
+  }
+
+  NSString? get name {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_name1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set name(NSString? value) {
+    _lib._objc_msgSend_477(_id, _lib._sel_setName_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSObject get objectValue {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_objectValue1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  set objectValue(NSObject value) {
+    _lib._objc_msgSend_368(_id, _lib._sel_setObjectValue_1, value._id);
+  }
+
+  NSString? get stringValue {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_stringValue1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set stringValue(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setStringValue_1, value?._id ?? ffi.nullptr);
+  }
+
+  void setStringValue_resolvingEntities_(NSString? string, bool resolve) {
+    return _lib._objc_msgSend_971(
+        _id,
+        _lib._sel_setStringValue_resolvingEntities_1,
+        string?._id ?? ffi.nullptr,
+        resolve);
+  }
+
+  int get index {
+    return _lib._objc_msgSend_10(_id, _lib._sel_index1);
+  }
+
+  int get level {
+    return _lib._objc_msgSend_10(_id, _lib._sel_level1);
+  }
+
+  NSXMLDocument? get rootDocument {
+    final _ret = _lib._objc_msgSend_994(_id, _lib._sel_rootDocument1);
+    return _ret.address == 0
+        ? null
+        : NSXMLDocument._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLNode? get parent {
+    final _ret = _lib._objc_msgSend_995(_id, _lib._sel_parent1);
+    return _ret.address == 0
+        ? null
+        : NSXMLNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get childCount {
+    return _lib._objc_msgSend_10(_id, _lib._sel_childCount1);
+  }
+
+  NSArray? get children {
+    final _ret = _lib._objc_msgSend_80(_id, _lib._sel_children1);
+    return _ret.address == 0
+        ? null
+        : NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLNode childAtIndex_(int index) {
+    final _ret = _lib._objc_msgSend_996(_id, _lib._sel_childAtIndex_1, index);
+    return NSXMLNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLNode? get previousSibling {
+    final _ret = _lib._objc_msgSend_995(_id, _lib._sel_previousSibling1);
+    return _ret.address == 0
+        ? null
+        : NSXMLNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLNode? get nextSibling {
+    final _ret = _lib._objc_msgSend_995(_id, _lib._sel_nextSibling1);
+    return _ret.address == 0
+        ? null
+        : NSXMLNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLNode? get previousNode {
+    final _ret = _lib._objc_msgSend_995(_id, _lib._sel_previousNode1);
+    return _ret.address == 0
+        ? null
+        : NSXMLNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLNode? get nextNode {
+    final _ret = _lib._objc_msgSend_995(_id, _lib._sel_nextNode1);
+    return _ret.address == 0
+        ? null
+        : NSXMLNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  void detach() {
+    return _lib._objc_msgSend_1(_id, _lib._sel_detach1);
+  }
+
+  NSString? get XPath {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_XPath1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get localName {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_localName1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get prefix {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_prefix1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get URI {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_URI1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set URI(NSString? value) {
+    _lib._objc_msgSend_477(_id, _lib._sel_setURI_1, value?._id ?? ffi.nullptr);
+  }
+
+  static NSString localNameForName_(SwiftLibrary _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_64(_lib._class_NSXMLNode1,
+        _lib._sel_localNameForName_1, name?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString prefixForName_(SwiftLibrary _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_64(_lib._class_NSXMLNode1,
+        _lib._sel_prefixForName_1, name?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSXMLNode predefinedNamespaceForPrefix_(
+      SwiftLibrary _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_983(_lib._class_NSXMLNode1,
+        _lib._sel_predefinedNamespaceForPrefix_1, name?._id ?? ffi.nullptr);
+    return NSXMLNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get description {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_description1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get XMLString {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_XMLString1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString XMLStringWithOptions_(int options) {
+    final _ret =
+        _lib._objc_msgSend_997(_id, _lib._sel_XMLStringWithOptions_1, options);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString canonicalXMLStringPreservingComments_(bool comments) {
+    final _ret = _lib._objc_msgSend_998(
+        _id, _lib._sel_canonicalXMLStringPreservingComments_1, comments);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray nodesForXPath_error_(
+      NSString? xpath, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_394(
+        _id, _lib._sel_nodesForXPath_error_1, xpath?._id ?? ffi.nullptr, error);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray objectsForXQuery_constants_error_(NSString? xquery,
+      NSDictionary? constants, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_999(
+        _id,
+        _lib._sel_objectsForXQuery_constants_error_1,
+        xquery?._id ?? ffi.nullptr,
+        constants?._id ?? ffi.nullptr,
+        error);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSArray objectsForXQuery_error_(
+      NSString? xquery, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_394(_id, _lib._sel_objectsForXQuery_error_1,
+        xquery?._id ?? ffi.nullptr, error);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSXMLNode new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSXMLNode1, _lib._sel_new1);
+    return NSXMLNode._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSXMLNode alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSXMLNode1, _lib._sel_alloc1);
+    return NSXMLNode._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSXMLNode1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSXMLNode1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSXMLNode1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSXMLNode1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSXMLNode1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSXMLNode1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSXMLNode1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSXMLNode1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSXMLNode1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSXMLNodeKind {
+  static const int NSXMLInvalidKind = 0;
+  static const int NSXMLDocumentKind = 1;
+  static const int NSXMLElementKind = 2;
+  static const int NSXMLAttributeKind = 3;
+  static const int NSXMLNamespaceKind = 4;
+  static const int NSXMLProcessingInstructionKind = 5;
+  static const int NSXMLCommentKind = 6;
+  static const int NSXMLTextKind = 7;
+  static const int NSXMLDTDKind = 8;
+  static const int NSXMLEntityDeclarationKind = 9;
+  static const int NSXMLAttributeDeclarationKind = 10;
+  static const int NSXMLElementDeclarationKind = 11;
+  static const int NSXMLNotationDeclarationKind = 12;
+}
+
+abstract class NSXMLNodeOptions {
+  static const int NSXMLNodeOptionsNone = 0;
+  static const int NSXMLNodeIsCDATA = 1;
+  static const int NSXMLNodeExpandEmptyElement = 2;
+  static const int NSXMLNodeCompactEmptyElement = 4;
+  static const int NSXMLNodeUseSingleQuotes = 8;
+  static const int NSXMLNodeUseDoubleQuotes = 16;
+  static const int NSXMLNodeNeverEscapeContents = 32;
+  static const int NSXMLDocumentTidyHTML = 512;
+  static const int NSXMLDocumentTidyXML = 1024;
+  static const int NSXMLDocumentValidate = 8192;
+  static const int NSXMLNodeLoadExternalEntitiesAlways = 16384;
+  static const int NSXMLNodeLoadExternalEntitiesSameOriginOnly = 32768;
+  static const int NSXMLNodeLoadExternalEntitiesNever = 524288;
+  static const int NSXMLDocumentXInclude = 65536;
+  static const int NSXMLNodePrettyPrint = 131072;
+  static const int NSXMLDocumentIncludeContentTypeDeclaration = 262144;
+  static const int NSXMLNodePreserveNamespaceOrder = 1048576;
+  static const int NSXMLNodePreserveAttributeOrder = 2097152;
+  static const int NSXMLNodePreserveEntities = 4194304;
+  static const int NSXMLNodePreservePrefixes = 8388608;
+  static const int NSXMLNodePreserveCDATA = 16777216;
+  static const int NSXMLNodePreserveWhitespace = 33554432;
+  static const int NSXMLNodePreserveDTD = 67108864;
+  static const int NSXMLNodePreserveCharacterReferences = 134217728;
+  static const int NSXMLNodePromoteSignificantWhitespace = 268435456;
+  static const int NSXMLNodePreserveEmptyElements = 6;
+  static const int NSXMLNodePreserveQuotes = 24;
+  static const int NSXMLNodePreserveAll = 4293918750;
+}
+
+class NSXMLDocument extends NSXMLNode {
+  NSXMLDocument._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSXMLDocument] that points to the same underlying object as [other].
+  static NSXMLDocument castFrom<T extends _ObjCWrapper>(T other) {
+    return NSXMLDocument._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSXMLDocument] that wraps the given raw object pointer.
+  static NSXMLDocument castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSXMLDocument._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSXMLDocument].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSXMLDocument1);
+  }
+
+  @override
+  NSXMLDocument init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSXMLDocument._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLDocument initWithXMLString_options_error_(
+      NSString? string, int mask, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_972(
+        _id,
+        _lib._sel_initWithXMLString_options_error_1,
+        string?._id ?? ffi.nullptr,
+        mask,
+        error);
+    return NSXMLDocument._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLDocument initWithContentsOfURL_options_error_(
+      NSURL? url, int mask, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_973(
+        _id,
+        _lib._sel_initWithContentsOfURL_options_error_1,
+        url?._id ?? ffi.nullptr,
+        mask,
+        error);
+    return NSXMLDocument._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLDocument initWithData_options_error_(
+      NSData? data, int mask, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_974(
+        _id,
+        _lib._sel_initWithData_options_error_1,
+        data?._id ?? ffi.nullptr,
+        mask,
+        error);
+    return NSXMLDocument._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLDocument initWithRootElement_(NSXMLElement? element) {
+    final _ret = _lib._objc_msgSend_968(
+        _id, _lib._sel_initWithRootElement_1, element?._id ?? ffi.nullptr);
+    return NSXMLDocument._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject replacementClassForClass_(SwiftLibrary _lib, NSObject cls) {
+    final _ret = _lib._objc_msgSend_16(_lib._class_NSXMLDocument1,
+        _lib._sel_replacementClassForClass_1, cls._id);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get characterEncoding {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_characterEncoding1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set characterEncoding(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setCharacterEncoding_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get version {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_version1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set version(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setVersion_1, value?._id ?? ffi.nullptr);
+  }
+
+  bool get standalone {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isStandalone1);
+  }
+
+  set standalone(bool value) {
+    _lib._objc_msgSend_460(_id, _lib._sel_setStandalone_1, value);
+  }
+
+  int get documentContentKind {
+    return _lib._objc_msgSend_975(_id, _lib._sel_documentContentKind1);
+  }
+
+  set documentContentKind(int value) {
+    _lib._objc_msgSend_976(_id, _lib._sel_setDocumentContentKind_1, value);
+  }
+
+  NSString? get MIMEType {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_MIMEType1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set MIMEType(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setMIMEType_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSXMLDTD? get DTD {
+    final _ret = _lib._objc_msgSend_986(_id, _lib._sel_DTD1);
+    return _ret.address == 0
+        ? null
+        : NSXMLDTD._(_ret, _lib, retain: true, release: true);
+  }
+
+  set DTD(NSXMLDTD? value) {
+    _lib._objc_msgSend_987(_id, _lib._sel_setDTD_1, value?._id ?? ffi.nullptr);
+  }
+
+  void setRootElement_(NSXMLElement? root) {
+    return _lib._objc_msgSend_988(
+        _id, _lib._sel_setRootElement_1, root?._id ?? ffi.nullptr);
+  }
+
+  NSXMLElement rootElement() {
+    final _ret = _lib._objc_msgSend_989(_id, _lib._sel_rootElement1);
+    return NSXMLElement._(_ret, _lib, retain: true, release: true);
+  }
+
+  void insertChild_atIndex_(NSXMLNode? child, int index) {
+    return _lib._objc_msgSend_977(
+        _id, _lib._sel_insertChild_atIndex_1, child?._id ?? ffi.nullptr, index);
+  }
+
+  void insertChildren_atIndex_(NSArray? children, int index) {
+    return _lib._objc_msgSend_978(_id, _lib._sel_insertChildren_atIndex_1,
+        children?._id ?? ffi.nullptr, index);
+  }
+
+  void removeChildAtIndex_(int index) {
+    return _lib._objc_msgSend_410(_id, _lib._sel_removeChildAtIndex_1, index);
+  }
+
+  void setChildren_(NSArray? children) {
+    return _lib._objc_msgSend_412(
+        _id, _lib._sel_setChildren_1, children?._id ?? ffi.nullptr);
+  }
+
+  void addChild_(NSXMLNode? child) {
+    return _lib._objc_msgSend_979(
+        _id, _lib._sel_addChild_1, child?._id ?? ffi.nullptr);
+  }
+
+  void replaceChildAtIndex_withNode_(int index, NSXMLNode? node) {
+    return _lib._objc_msgSend_980(_id, _lib._sel_replaceChildAtIndex_withNode_1,
+        index, node?._id ?? ffi.nullptr);
+  }
+
+  NSData? get XMLData {
+    final _ret = _lib._objc_msgSend_39(_id, _lib._sel_XMLData1);
+    return _ret.address == 0
+        ? null
+        : NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSData XMLDataWithOptions_(int options) {
+    final _ret =
+        _lib._objc_msgSend_990(_id, _lib._sel_XMLDataWithOptions_1, options);
+    return NSData._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject objectByApplyingXSLT_arguments_error_(NSData? xslt,
+      NSDictionary? arguments, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_991(
+        _id,
+        _lib._sel_objectByApplyingXSLT_arguments_error_1,
+        xslt?._id ?? ffi.nullptr,
+        arguments?._id ?? ffi.nullptr,
+        error);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject objectByApplyingXSLTString_arguments_error_(NSString? xslt,
+      NSDictionary? arguments, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_992(
+        _id,
+        _lib._sel_objectByApplyingXSLTString_arguments_error_1,
+        xslt?._id ?? ffi.nullptr,
+        arguments?._id ?? ffi.nullptr,
+        error);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSObject objectByApplyingXSLTAtURL_arguments_error_(NSURL? xsltURL,
+      NSDictionary? argument, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_993(
+        _id,
+        _lib._sel_objectByApplyingXSLTAtURL_arguments_error_1,
+        xsltURL?._id ?? ffi.nullptr,
+        argument?._id ?? ffi.nullptr,
+        error);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  bool validateAndReturnError_(ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    return _lib._objc_msgSend_219(
+        _id, _lib._sel_validateAndReturnError_1, error);
+  }
+
+  static NSObject document(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSXMLDocument1, _lib._sel_document1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject documentWithRootElement_(
+      SwiftLibrary _lib, NSXMLElement? element) {
+    final _ret = _lib._objc_msgSend_968(_lib._class_NSXMLDocument1,
+        _lib._sel_documentWithRootElement_1, element?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_(SwiftLibrary _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLDocument1,
+        _lib._sel_elementWithName_1, name?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_URI_(
+      SwiftLibrary _lib, NSString? name, NSString? URI) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLDocument1,
+        _lib._sel_elementWithName_URI_1,
+        name?._id ?? ffi.nullptr,
+        URI?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_stringValue_(
+      SwiftLibrary _lib, NSString? name, NSString? string) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLDocument1,
+        _lib._sel_elementWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        string?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_children_attributes_(SwiftLibrary _lib,
+      NSString? name, NSArray? children, NSArray? attributes) {
+    final _ret = _lib._objc_msgSend_969(
+        _lib._class_NSXMLDocument1,
+        _lib._sel_elementWithName_children_attributes_1,
+        name?._id ?? ffi.nullptr,
+        children?._id ?? ffi.nullptr,
+        attributes?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject attributeWithName_stringValue_(
+      SwiftLibrary _lib, NSString? name, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLDocument1,
+        _lib._sel_attributeWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject attributeWithName_URI_stringValue_(
+      SwiftLibrary _lib, NSString? name, NSString? URI, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_26(
+        _lib._class_NSXMLDocument1,
+        _lib._sel_attributeWithName_URI_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        URI?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject namespaceWithName_stringValue_(
+      SwiftLibrary _lib, NSString? name, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLDocument1,
+        _lib._sel_namespaceWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject processingInstructionWithName_stringValue_(
+      SwiftLibrary _lib, NSString? name, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLDocument1,
+        _lib._sel_processingInstructionWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject commentWithStringValue_(
+      SwiftLibrary _lib, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLDocument1,
+        _lib._sel_commentWithStringValue_1, stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject textWithStringValue_(
+      SwiftLibrary _lib, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLDocument1,
+        _lib._sel_textWithStringValue_1, stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject DTDNodeWithXMLString_(SwiftLibrary _lib, NSString? string) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLDocument1,
+        _lib._sel_DTDNodeWithXMLString_1, string?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString localNameForName_(SwiftLibrary _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_64(_lib._class_NSXMLDocument1,
+        _lib._sel_localNameForName_1, name?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString prefixForName_(SwiftLibrary _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_64(_lib._class_NSXMLDocument1,
+        _lib._sel_prefixForName_1, name?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSXMLNode predefinedNamespaceForPrefix_(
+      SwiftLibrary _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_983(_lib._class_NSXMLDocument1,
+        _lib._sel_predefinedNamespaceForPrefix_1, name?._id ?? ffi.nullptr);
+    return NSXMLNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSXMLDocument new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSXMLDocument1, _lib._sel_new1);
+    return NSXMLDocument._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSXMLDocument alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSXMLDocument1, _lib._sel_alloc1);
+    return NSXMLDocument._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSXMLDocument1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSXMLDocument1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSXMLDocument1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSXMLDocument1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSXMLDocument1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSXMLDocument1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSXMLDocument1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSXMLDocument1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSXMLDocument1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSXMLDocumentContentKind {
+  static const int NSXMLDocumentXMLKind = 0;
+  static const int NSXMLDocumentXHTMLKind = 1;
+  static const int NSXMLDocumentHTMLKind = 2;
+  static const int NSXMLDocumentTextKind = 3;
+}
+
+class NSXMLDTD extends NSXMLNode {
+  NSXMLDTD._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSXMLDTD] that points to the same underlying object as [other].
+  static NSXMLDTD castFrom<T extends _ObjCWrapper>(T other) {
+    return NSXMLDTD._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSXMLDTD] that wraps the given raw object pointer.
+  static NSXMLDTD castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSXMLDTD._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSXMLDTD].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSXMLDTD1);
+  }
+
+  @override
+  NSXMLDTD init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSXMLDTD._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSXMLDTD initWithKind_options_(int kind, int options) {
+    final _ret = _lib._objc_msgSend_967(
+        _id, _lib._sel_initWithKind_options_1, kind, options);
+    return NSXMLDTD._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLDTD initWithContentsOfURL_options_error_(
+      NSURL? url, int mask, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_973(
+        _id,
+        _lib._sel_initWithContentsOfURL_options_error_1,
+        url?._id ?? ffi.nullptr,
+        mask,
+        error);
+    return NSXMLDTD._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLDTD initWithData_options_error_(
+      NSData? data, int mask, ffi.Pointer<ffi.Pointer<ObjCObject>> error) {
+    final _ret = _lib._objc_msgSend_974(
+        _id,
+        _lib._sel_initWithData_options_error_1,
+        data?._id ?? ffi.nullptr,
+        mask,
+        error);
+    return NSXMLDTD._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSString? get publicID {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_publicID1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set publicID(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setPublicID_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get systemID {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_systemID1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set systemID(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setSystemID_1, value?._id ?? ffi.nullptr);
+  }
+
+  void insertChild_atIndex_(NSXMLNode? child, int index) {
+    return _lib._objc_msgSend_977(
+        _id, _lib._sel_insertChild_atIndex_1, child?._id ?? ffi.nullptr, index);
+  }
+
+  void insertChildren_atIndex_(NSArray? children, int index) {
+    return _lib._objc_msgSend_978(_id, _lib._sel_insertChildren_atIndex_1,
+        children?._id ?? ffi.nullptr, index);
+  }
+
+  void removeChildAtIndex_(int index) {
+    return _lib._objc_msgSend_410(_id, _lib._sel_removeChildAtIndex_1, index);
+  }
+
+  void setChildren_(NSArray? children) {
+    return _lib._objc_msgSend_412(
+        _id, _lib._sel_setChildren_1, children?._id ?? ffi.nullptr);
+  }
+
+  void addChild_(NSXMLNode? child) {
+    return _lib._objc_msgSend_979(
+        _id, _lib._sel_addChild_1, child?._id ?? ffi.nullptr);
+  }
+
+  void replaceChildAtIndex_withNode_(int index, NSXMLNode? node) {
+    return _lib._objc_msgSend_980(_id, _lib._sel_replaceChildAtIndex_withNode_1,
+        index, node?._id ?? ffi.nullptr);
+  }
+
+  NSXMLDTDNode entityDeclarationForName_(NSString? name) {
+    final _ret = _lib._objc_msgSend_984(
+        _id, _lib._sel_entityDeclarationForName_1, name?._id ?? ffi.nullptr);
+    return NSXMLDTDNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLDTDNode notationDeclarationForName_(NSString? name) {
+    final _ret = _lib._objc_msgSend_984(
+        _id, _lib._sel_notationDeclarationForName_1, name?._id ?? ffi.nullptr);
+    return NSXMLDTDNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLDTDNode elementDeclarationForName_(NSString? name) {
+    final _ret = _lib._objc_msgSend_984(
+        _id, _lib._sel_elementDeclarationForName_1, name?._id ?? ffi.nullptr);
+    return NSXMLDTDNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  NSXMLDTDNode attributeDeclarationForName_elementName_(
+      NSString? name, NSString? elementName) {
+    final _ret = _lib._objc_msgSend_985(
+        _id,
+        _lib._sel_attributeDeclarationForName_elementName_1,
+        name?._id ?? ffi.nullptr,
+        elementName?._id ?? ffi.nullptr);
+    return NSXMLDTDNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSXMLDTDNode predefinedEntityDeclarationForName_(
+      SwiftLibrary _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_984(
+        _lib._class_NSXMLDTD1,
+        _lib._sel_predefinedEntityDeclarationForName_1,
+        name?._id ?? ffi.nullptr);
+    return NSXMLDTDNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject document(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSXMLDTD1, _lib._sel_document1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject documentWithRootElement_(
+      SwiftLibrary _lib, NSXMLElement? element) {
+    final _ret = _lib._objc_msgSend_968(_lib._class_NSXMLDTD1,
+        _lib._sel_documentWithRootElement_1, element?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_(SwiftLibrary _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLDTD1,
+        _lib._sel_elementWithName_1, name?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_URI_(
+      SwiftLibrary _lib, NSString? name, NSString? URI) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLDTD1,
+        _lib._sel_elementWithName_URI_1,
+        name?._id ?? ffi.nullptr,
+        URI?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_stringValue_(
+      SwiftLibrary _lib, NSString? name, NSString? string) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLDTD1,
+        _lib._sel_elementWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        string?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_children_attributes_(SwiftLibrary _lib,
+      NSString? name, NSArray? children, NSArray? attributes) {
+    final _ret = _lib._objc_msgSend_969(
+        _lib._class_NSXMLDTD1,
+        _lib._sel_elementWithName_children_attributes_1,
+        name?._id ?? ffi.nullptr,
+        children?._id ?? ffi.nullptr,
+        attributes?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject attributeWithName_stringValue_(
+      SwiftLibrary _lib, NSString? name, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLDTD1,
+        _lib._sel_attributeWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject attributeWithName_URI_stringValue_(
+      SwiftLibrary _lib, NSString? name, NSString? URI, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_26(
+        _lib._class_NSXMLDTD1,
+        _lib._sel_attributeWithName_URI_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        URI?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject namespaceWithName_stringValue_(
+      SwiftLibrary _lib, NSString? name, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLDTD1,
+        _lib._sel_namespaceWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject processingInstructionWithName_stringValue_(
+      SwiftLibrary _lib, NSString? name, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLDTD1,
+        _lib._sel_processingInstructionWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject commentWithStringValue_(
+      SwiftLibrary _lib, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLDTD1,
+        _lib._sel_commentWithStringValue_1, stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject textWithStringValue_(
+      SwiftLibrary _lib, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLDTD1,
+        _lib._sel_textWithStringValue_1, stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject DTDNodeWithXMLString_(SwiftLibrary _lib, NSString? string) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLDTD1,
+        _lib._sel_DTDNodeWithXMLString_1, string?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString localNameForName_(SwiftLibrary _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_64(_lib._class_NSXMLDTD1,
+        _lib._sel_localNameForName_1, name?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString prefixForName_(SwiftLibrary _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_64(_lib._class_NSXMLDTD1,
+        _lib._sel_prefixForName_1, name?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSXMLNode predefinedNamespaceForPrefix_(
+      SwiftLibrary _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_983(_lib._class_NSXMLDTD1,
+        _lib._sel_predefinedNamespaceForPrefix_1, name?._id ?? ffi.nullptr);
+    return NSXMLNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSXMLDTD new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSXMLDTD1, _lib._sel_new1);
+    return NSXMLDTD._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSXMLDTD alloc(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_NSXMLDTD1, _lib._sel_alloc1);
+    return NSXMLDTD._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSXMLDTD1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSXMLDTD1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSXMLDTD1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSXMLDTD1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSXMLDTD1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSXMLDTD1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSXMLDTD1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSXMLDTD1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSXMLDTD1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+class NSXMLDTDNode extends NSXMLNode {
+  NSXMLDTDNode._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [NSXMLDTDNode] that points to the same underlying object as [other].
+  static NSXMLDTDNode castFrom<T extends _ObjCWrapper>(T other) {
+    return NSXMLDTDNode._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [NSXMLDTDNode] that wraps the given raw object pointer.
+  static NSXMLDTDNode castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return NSXMLDTDNode._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [NSXMLDTDNode].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSXMLDTDNode1);
+  }
+
+  NSXMLDTDNode initWithXMLString_(NSString? string) {
+    final _ret = _lib._objc_msgSend_30(
+        _id, _lib._sel_initWithXMLString_1, string?._id ?? ffi.nullptr);
+    return NSXMLDTDNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSXMLDTDNode initWithKind_options_(int kind, int options) {
+    final _ret = _lib._objc_msgSend_967(
+        _id, _lib._sel_initWithKind_options_1, kind, options);
+    return NSXMLDTDNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  @override
+  NSXMLDTDNode init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return NSXMLDTDNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get DTDKind {
+    return _lib._objc_msgSend_981(_id, _lib._sel_DTDKind1);
+  }
+
+  set DTDKind(int value) {
+    _lib._objc_msgSend_982(_id, _lib._sel_setDTDKind_1, value);
+  }
+
+  bool get external1 {
+    return _lib._objc_msgSend_12(_id, _lib._sel_isExternal1);
+  }
+
+  NSString? get publicID {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_publicID1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set publicID(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setPublicID_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get systemID {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_systemID1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set systemID(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setSystemID_1, value?._id ?? ffi.nullptr);
+  }
+
+  NSString? get notationName {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_notationName1);
+    return _ret.address == 0
+        ? null
+        : NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  set notationName(NSString? value) {
+    _lib._objc_msgSend_477(
+        _id, _lib._sel_setNotationName_1, value?._id ?? ffi.nullptr);
+  }
+
+  static NSObject document(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSXMLDTDNode1, _lib._sel_document1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject documentWithRootElement_(
+      SwiftLibrary _lib, NSXMLElement? element) {
+    final _ret = _lib._objc_msgSend_968(_lib._class_NSXMLDTDNode1,
+        _lib._sel_documentWithRootElement_1, element?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_(SwiftLibrary _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLDTDNode1,
+        _lib._sel_elementWithName_1, name?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_URI_(
+      SwiftLibrary _lib, NSString? name, NSString? URI) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLDTDNode1,
+        _lib._sel_elementWithName_URI_1,
+        name?._id ?? ffi.nullptr,
+        URI?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_stringValue_(
+      SwiftLibrary _lib, NSString? name, NSString? string) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLDTDNode1,
+        _lib._sel_elementWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        string?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject elementWithName_children_attributes_(SwiftLibrary _lib,
+      NSString? name, NSArray? children, NSArray? attributes) {
+    final _ret = _lib._objc_msgSend_969(
+        _lib._class_NSXMLDTDNode1,
+        _lib._sel_elementWithName_children_attributes_1,
+        name?._id ?? ffi.nullptr,
+        children?._id ?? ffi.nullptr,
+        attributes?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject attributeWithName_stringValue_(
+      SwiftLibrary _lib, NSString? name, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLDTDNode1,
+        _lib._sel_attributeWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject attributeWithName_URI_stringValue_(
+      SwiftLibrary _lib, NSString? name, NSString? URI, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_26(
+        _lib._class_NSXMLDTDNode1,
+        _lib._sel_attributeWithName_URI_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        URI?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject namespaceWithName_stringValue_(
+      SwiftLibrary _lib, NSString? name, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLDTDNode1,
+        _lib._sel_namespaceWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject processingInstructionWithName_stringValue_(
+      SwiftLibrary _lib, NSString? name, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_159(
+        _lib._class_NSXMLDTDNode1,
+        _lib._sel_processingInstructionWithName_stringValue_1,
+        name?._id ?? ffi.nullptr,
+        stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject commentWithStringValue_(
+      SwiftLibrary _lib, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLDTDNode1,
+        _lib._sel_commentWithStringValue_1, stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject textWithStringValue_(
+      SwiftLibrary _lib, NSString? stringValue) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLDTDNode1,
+        _lib._sel_textWithStringValue_1, stringValue?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject DTDNodeWithXMLString_(SwiftLibrary _lib, NSString? string) {
+    final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLDTDNode1,
+        _lib._sel_DTDNodeWithXMLString_1, string?._id ?? ffi.nullptr);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString localNameForName_(SwiftLibrary _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_64(_lib._class_NSXMLDTDNode1,
+        _lib._sel_localNameForName_1, name?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSString prefixForName_(SwiftLibrary _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_64(_lib._class_NSXMLDTDNode1,
+        _lib._sel_prefixForName_1, name?._id ?? ffi.nullptr);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSXMLNode predefinedNamespaceForPrefix_(
+      SwiftLibrary _lib, NSString? name) {
+    final _ret = _lib._objc_msgSend_983(_lib._class_NSXMLDTDNode1,
+        _lib._sel_predefinedNamespaceForPrefix_1, name?._id ?? ffi.nullptr);
+    return NSXMLNode._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSXMLDTDNode new1(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSXMLDTDNode1, _lib._sel_new1);
+    return NSXMLDTDNode._(_ret, _lib, retain: false, release: true);
+  }
+
+  static NSXMLDTDNode alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_NSXMLDTDNode1, _lib._sel_alloc1);
+    return NSXMLDTDNode._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_NSXMLDTDNode1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_NSXMLDTDNode1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSXMLDTDNode1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_NSXMLDTDNode1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_NSXMLDTDNode1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_NSXMLDTDNode1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_NSXMLDTDNode1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_NSXMLDTDNode1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_NSXMLDTDNode1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
+
+abstract class NSXMLDTDNodeKind {
+  static const int NSXMLEntityGeneralKind = 1;
+  static const int NSXMLEntityParsedKind = 2;
+  static const int NSXMLEntityUnparsedKind = 3;
+  static const int NSXMLEntityParameterKind = 4;
+  static const int NSXMLEntityPredefined = 5;
+  static const int NSXMLAttributeCDATAKind = 6;
+  static const int NSXMLAttributeIDKind = 7;
+  static const int NSXMLAttributeIDRefKind = 8;
+  static const int NSXMLAttributeIDRefsKind = 9;
+  static const int NSXMLAttributeEntityKind = 10;
+  static const int NSXMLAttributeEntitiesKind = 11;
+  static const int NSXMLAttributeNMTokenKind = 12;
+  static const int NSXMLAttributeNMTokensKind = 13;
+  static const int NSXMLAttributeEnumerationKind = 14;
+  static const int NSXMLAttributeNotationKind = 15;
+  static const int NSXMLElementDeclarationUndefinedKind = 16;
+  static const int NSXMLElementDeclarationEmptyKind = 17;
+  static const int NSXMLElementDeclarationAnyKind = 18;
+  static const int NSXMLElementDeclarationMixedKind = 19;
+  static const int NSXMLElementDeclarationElementKind = 20;
+}
+
+class SwiftClass extends NSObject {
+  SwiftClass._(ffi.Pointer<ObjCObject> id, SwiftLibrary lib,
+      {bool retain = false, bool release = false})
+      : super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [SwiftClass] that points to the same underlying object as [other].
+  static SwiftClass castFrom<T extends _ObjCWrapper>(T other) {
+    return SwiftClass._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [SwiftClass] that wraps the given raw object pointer.
+  static SwiftClass castFromPointer(
+      SwiftLibrary lib, ffi.Pointer<ObjCObject> other,
+      {bool retain = false, bool release = false}) {
+    return SwiftClass._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [SwiftClass].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib._objc_msgSend_0(
+        obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_SwiftClass1);
+  }
+
+  NSString sayHello() {
+    final _ret = _lib._objc_msgSend_20(_id, _lib._sel_sayHello1);
+    return NSString._(_ret, _lib, retain: true, release: true);
+  }
+
+  int get someField {
+    return _lib._objc_msgSend_78(_id, _lib._sel_someField1);
+  }
+
+  set someField(int value) {
+    _lib._objc_msgSend_558(_id, _lib._sel_setSomeField_1, value);
+  }
+
+  @override
+  SwiftClass init() {
+    final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1);
+    return SwiftClass._(_ret, _lib, retain: true, release: true);
+  }
+
+  static SwiftClass new1(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(_lib._class_SwiftClass1, _lib._sel_new1);
+    return SwiftClass._(_ret, _lib, retain: false, release: true);
+  }
+
+  static SwiftClass alloc(SwiftLibrary _lib) {
+    final _ret =
+        _lib._objc_msgSend_2(_lib._class_SwiftClass1, _lib._sel_alloc1);
+    return SwiftClass._(_ret, _lib, retain: false, release: true);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_selector_object_(
+      SwiftLibrary _lib,
+      NSObject aTarget,
+      ffi.Pointer<ObjCSel> aSelector,
+      NSObject anArgument) {
+    return _lib._objc_msgSend_14(
+        _lib._class_SwiftClass1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1,
+        aTarget._id,
+        aSelector,
+        anArgument._id);
+  }
+
+  static void cancelPreviousPerformRequestsWithTarget_(
+      SwiftLibrary _lib, NSObject aTarget) {
+    return _lib._objc_msgSend_15(_lib._class_SwiftClass1,
+        _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id);
+  }
+
+  static bool getAccessInstanceVariablesDirectly(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_SwiftClass1, _lib._sel_accessInstanceVariablesDirectly1);
+  }
+
+  static bool useStoredAccessor(SwiftLibrary _lib) {
+    return _lib._objc_msgSend_12(
+        _lib._class_SwiftClass1, _lib._sel_useStoredAccessor1);
+  }
+
+  static NSSet keyPathsForValuesAffectingValueForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    final _ret = _lib._objc_msgSend_58(
+        _lib._class_SwiftClass1,
+        _lib._sel_keyPathsForValuesAffectingValueForKey_1,
+        key?._id ?? ffi.nullptr);
+    return NSSet._(_ret, _lib, retain: true, release: true);
+  }
+
+  static bool automaticallyNotifiesObserversForKey_(
+      SwiftLibrary _lib, NSString? key) {
+    return _lib._objc_msgSend_59(
+        _lib._class_SwiftClass1,
+        _lib._sel_automaticallyNotifiesObserversForKey_1,
+        key?._id ?? ffi.nullptr);
+  }
+
+  static void setKeys_triggerChangeNotificationsForDependentKey_(
+      SwiftLibrary _lib, NSArray? keys, NSString? dependentKey) {
+    return _lib._objc_msgSend_79(
+        _lib._class_SwiftClass1,
+        _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1,
+        keys?._id ?? ffi.nullptr,
+        dependentKey?._id ?? ffi.nullptr);
+  }
+
+  static NSArray classFallbacksForKeyedArchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_80(
+        _lib._class_SwiftClass1, _lib._sel_classFallbacksForKeyedArchiver1);
+    return NSArray._(_ret, _lib, retain: true, release: true);
+  }
+
+  static NSObject classForKeyedUnarchiver(SwiftLibrary _lib) {
+    final _ret = _lib._objc_msgSend_2(
+        _lib._class_SwiftClass1, _lib._sel_classForKeyedUnarchiver1);
+    return NSObject._(_ret, _lib, retain: true, release: true);
+  }
+}
diff --git a/pkgs/ffigen/lib/src/code_generator.dart b/pkgs/ffigen/lib/src/code_generator.dart
index 710b32f..82b2ed6 100644
--- a/pkgs/ffigen/lib/src/code_generator.dart
+++ b/pkgs/ffigen/lib/src/code_generator.dart
@@ -10,9 +10,17 @@
 export 'code_generator/constant.dart';
 export 'code_generator/enum_class.dart';
 export 'code_generator/func.dart';
+export 'code_generator/func_type.dart';
 export 'code_generator/global.dart';
+export 'code_generator/handle.dart';
+export 'code_generator/imports.dart';
 export 'code_generator/library.dart';
-export 'code_generator/struc.dart';
+export 'code_generator/native_type.dart';
+export 'code_generator/objc_block.dart';
+export 'code_generator/objc_built_in_functions.dart';
+export 'code_generator/objc_interface.dart';
+export 'code_generator/pointer.dart';
+export 'code_generator/struct.dart';
 export 'code_generator/type.dart';
 export 'code_generator/typealias.dart';
 export 'code_generator/union.dart';
diff --git a/pkgs/ffigen/lib/src/code_generator/binding.dart b/pkgs/ffigen/lib/src/code_generator/binding.dart
index 105d6f0..2e2f189 100644
--- a/pkgs/ffigen/lib/src/code_generator/binding.dart
+++ b/pkgs/ffigen/lib/src/code_generator/binding.dart
@@ -19,12 +19,14 @@
   String name;
 
   final String? dartDoc;
+  final bool isInternal;
 
   Binding({
     required this.usr,
     required this.originalName,
     required this.name,
     this.dartDoc,
+    this.isInternal = false,
   });
 
   /// Get all dependencies, including itself and save them in [dependencies].
@@ -44,11 +46,13 @@
     String? originalName,
     required String name,
     String? dartDoc,
+    bool isInternal = false,
   }) : super(
           usr: usr ?? name,
           originalName: originalName ?? name,
           name: name,
           dartDoc: dartDoc,
+          isInternal: isInternal,
         );
 }
 
@@ -59,10 +63,12 @@
     String? originalName,
     required String name,
     String? dartDoc,
+    bool isInternal = false,
   }) : super(
           usr: usr ?? name,
           originalName: originalName ?? name,
           name: name,
           dartDoc: dartDoc,
+          isInternal: isInternal,
         );
 }
diff --git a/pkgs/ffigen/lib/src/code_generator/binding_string.dart b/pkgs/ffigen/lib/src/code_generator/binding_string.dart
index 2929ee8..decfd6f 100644
--- a/pkgs/ffigen/lib/src/code_generator/binding_string.dart
+++ b/pkgs/ffigen/lib/src/code_generator/binding_string.dart
@@ -17,10 +17,12 @@
 /// A [BindingString]'s type.
 enum BindingStringType {
   func,
-  struc,
+  struct,
   union,
   constant,
   global,
   enumClass,
   typeDef,
+  objcInterface,
+  objcBlock,
 }
diff --git a/pkgs/ffigen/lib/src/code_generator/compound.dart b/pkgs/ffigen/lib/src/code_generator/compound.dart
index 067e64f..2c915a2 100644
--- a/pkgs/ffigen/lib/src/code_generator/compound.dart
+++ b/pkgs/ffigen/lib/src/code_generator/compound.dart
@@ -11,17 +11,18 @@
 enum CompoundType { struct, union }
 
 /// A binding for Compound type - Struct/Union.
-abstract class Compound extends NoLookUpBinding {
+abstract class Compound extends BindingType {
   /// Marker for if a struct definition is complete.
   ///
   /// A function can be safely pass this struct by value if it's complete.
-  bool isInComplete;
+  bool isIncomplete;
 
   List<Member> members;
 
   bool get isOpaque => members.isEmpty;
 
-  /// Value for `@Packed(X)` annotation. Can be null(no packing), 1, 2, 4, 8, 16.
+  /// Value for `@Packed(X)` annotation. Can be null (no packing), 1, 2, 4, 8,
+  /// or 16.
   ///
   /// Only supported for [CompoundType.struct].
   int? pack;
@@ -38,16 +39,18 @@
     String? originalName,
     required String name,
     required this.compoundType,
-    this.isInComplete = false,
+    this.isIncomplete = false,
     this.pack,
     String? dartDoc,
     List<Member>? members,
+    bool isInternal = false,
   })  : members = members ?? [],
         super(
           usr: usr,
           originalName: originalName,
           name: name,
           dartDoc: dartDoc,
+          isInternal: isInternal,
         );
 
   factory Compound.fromType({
@@ -55,18 +58,18 @@
     String? usr,
     String? originalName,
     required String name,
-    bool isInComplete = false,
+    bool isIncomplete = false,
     int? pack,
     String? dartDoc,
     List<Member>? members,
   }) {
     switch (type) {
       case CompoundType.struct:
-        return Struc(
+        return Struct(
           usr: usr,
           originalName: originalName,
           name: name,
-          isInComplete: isInComplete,
+          isIncomplete: isIncomplete,
           pack: pack,
           dartDoc: dartDoc,
           members: members,
@@ -76,7 +79,7 @@
           usr: usr,
           originalName: originalName,
           name: name,
-          isInComplete: isInComplete,
+          isIncomplete: isIncomplete,
           pack: pack,
           dartDoc: dartDoc,
           members: members,
@@ -87,16 +90,17 @@
   List<int> _getArrayDimensionLengths(Type type) {
     final array = <int>[];
     var startType = type;
-    while (startType.broadType == BroadType.ConstantArray) {
-      array.add(startType.length!);
-      startType = startType.child!;
+    while (startType is ConstantArray) {
+      array.add(startType.length);
+      startType = startType.child;
     }
     return array;
   }
 
   String _getInlineArrayTypeString(Type type, Writer w) {
-    if (type.broadType == BroadType.ConstantArray) {
-      return '${w.ffiLibraryPrefix}.Array<${_getInlineArrayTypeString(type.child!, w)}>';
+    if (type is ConstantArray) {
+      return '${w.ffiLibraryPrefix}.Array<'
+          '${_getInlineArrayTypeString(type.child, w)}>';
     }
     return type.getCType(w);
   }
@@ -125,32 +129,32 @@
     }
     final dartClassName = isStruct ? 'Struct' : 'Union';
     // Write class declaration.
-    s.write(
-        'class $enclosingClassName extends ${w.ffiLibraryPrefix}.${isOpaque ? 'Opaque' : dartClassName}{\n');
+    s.write('class $enclosingClassName extends ');
+    s.write('${w.ffiLibraryPrefix}.${isOpaque ? 'Opaque' : dartClassName}{\n');
     const depth = '  ';
     for (final m in members) {
-      final memberName = localUniqueNamer.makeUnique(m.name);
-      if (m.type.broadType == BroadType.ConstantArray) {
-        s.write(
-            '$depth@${w.ffiLibraryPrefix}.Array.multi(${_getArrayDimensionLengths(m.type)})\n');
-        s.write(
-            '${depth}external ${_getInlineArrayTypeString(m.type, w)} $memberName;\n\n');
+      m.name = localUniqueNamer.makeUnique(m.name);
+      if (m.type is ConstantArray) {
+        s.write('$depth@${w.ffiLibraryPrefix}.Array.multi(');
+        s.write('${_getArrayDimensionLengths(m.type)})\n');
+        s.write('${depth}external ${_getInlineArrayTypeString(m.type, w)} ');
+        s.write('${m.name};\n\n');
       } else {
         if (m.dartDoc != null) {
-          s.write(depth + '/// ');
-          s.writeAll(m.dartDoc!.split('\n'), '\n' + depth + '/// ');
+          s.write('$depth/// ');
+          s.writeAll(m.dartDoc!.split('\n'), '\n$depth/// ');
           s.write('\n');
         }
-        if (!m.type.sameDartAndCType(w)) {
+        if (!sameDartAndCType(m.type, w)) {
           s.write('$depth@${m.type.getCType(w)}()\n');
         }
-        s.write('${depth}external ${m.type.getDartType(w)} $memberName;\n\n');
+        s.write('${depth}external ${m.type.getDartType(w)} ${m.name};\n\n');
       }
     }
     s.write('}\n\n');
 
     return BindingString(
-        type: isStruct ? BindingStringType.struc : BindingStringType.union,
+        type: isStruct ? BindingStringType.struct : BindingStringType.union,
         string: s.toString());
   }
 
@@ -163,15 +167,21 @@
       m.type.addDependencies(dependencies);
     }
   }
+
+  @override
+  bool get isIncompleteCompound => isIncomplete;
+
+  @override
+  String getCType(Writer w) => name;
 }
 
 class Member {
   final String? dartDoc;
   final String originalName;
-  final String name;
+  String name;
   final Type type;
 
-  const Member({
+  Member({
     String? originalName,
     required this.name,
     required this.type,
diff --git a/pkgs/ffigen/lib/src/code_generator/dart_keywords.dart b/pkgs/ffigen/lib/src/code_generator/dart_keywords.dart
index 8e0de3c..93d5877 100644
--- a/pkgs/ffigen/lib/src/code_generator/dart_keywords.dart
+++ b/pkgs/ffigen/lib/src/code_generator/dart_keywords.dart
@@ -7,65 +7,66 @@
 /// Source: https://dart.dev/guides/language/language-tour#keywords.
 const keywords = {
   'abstract',
-  'else',
-  'import',
-  'super',
   'as',
-  'enum',
-  'in',
-  'switch',
   'assert',
-  'export',
-  'interface',
-  'sync',
   'async',
-  'extends',
-  'is',
-  'this',
   'await',
-  'extension',
-  'library',
-  'throw',
   'break',
-  'external',
-  'mixin',
-  'true',
   'case',
-  'factory',
-  'new',
-  'try',
   'catch',
-  'false',
-  'null',
-  'typedef',
   'class',
-  'final',
-  'on',
-  'var',
   'const',
-  'finally',
-  'operator',
-  'void',
   'continue',
-  'for',
-  'part',
-  'while',
   'covariant',
-  'Function',
-  'rethrow',
-  'with',
   'default',
-  'get',
-  'return',
-  'yield',
   'deferred',
-  'hide',
-  'set',
   'do',
-  'if',
-  'show',
   'dynamic',
+  'else',
+  'enum',
+  'export',
+  'extends',
+  'extension',
+  'external',
+  'factory',
+  'false',
+  'final',
+  'finally',
+  'for',
+  'Function',
+  'get',
+  'hide',
+  'if',
   'implements',
-  'static',
+  'import',
+  'in',
+  'interface',
+  'is',
   'late',
+  'library',
+  'mixin',
+  'new',
+  'null',
+  'on',
+  'operator',
+  'part',
+  'required',
+  'rethrow',
+  'return',
+  'set',
+  'show',
+  'static',
+  'super',
+  'switch',
+  'sync',
+  'this',
+  'throw',
+  'true',
+  'try',
+  'typedef',
+  'var',
+  'void',
+  'while',
+  'with',
+  'yield',
 };
diff --git a/pkgs/ffigen/lib/src/code_generator/enum_class.dart b/pkgs/ffigen/lib/src/code_generator/enum_class.dart
index 2765aef..081c864 100644
--- a/pkgs/ffigen/lib/src/code_generator/enum_class.dart
+++ b/pkgs/ffigen/lib/src/code_generator/enum_class.dart
@@ -4,6 +4,8 @@
 
 import 'binding.dart';
 import 'binding_string.dart';
+import 'native_type.dart';
+import 'type.dart';
 import 'utils.dart';
 import 'writer.dart';
 
@@ -21,7 +23,9 @@
 ///   static const banana = 10;
 /// }
 /// ```
-class EnumClass extends NoLookUpBinding {
+class EnumClass extends BindingType {
+  static final nativeType = NativeType(SupportedNativeType.Int32);
+
   final List<EnumConstant> enumConstants;
 
   EnumClass({
@@ -57,11 +61,11 @@
     for (final ec in enumConstants) {
       final enumValueName = localUniqueNamer.makeUnique(ec.name);
       if (ec.dartDoc != null) {
-        s.write(depth + '/// ');
-        s.writeAll(ec.dartDoc!.split('\n'), '\n' + depth + '/// ');
+        s.write('$depth/// ');
+        s.writeAll(ec.dartDoc!.split('\n'), '\n$depth/// ');
         s.write('\n');
       }
-      s.write(depth + 'static const int $enumValueName = ${ec.value};\n');
+      s.write('${depth}static const int $enumValueName = ${ec.value};\n');
     }
     s.write('}\n\n');
 
@@ -75,6 +79,15 @@
 
     dependencies.add(this);
   }
+
+  @override
+  String getCType(Writer w) => nativeType.getCType(w);
+
+  @override
+  String getDartType(Writer w) => nativeType.getDartType(w);
+
+  @override
+  String? getDefaultValue(Writer w, String nativeLib) => '0';
 }
 
 /// Represents a single value in an enum.
diff --git a/pkgs/ffigen/lib/src/code_generator/func.dart b/pkgs/ffigen/lib/src/code_generator/func.dart
index d33f135..590f63c 100644
--- a/pkgs/ffigen/lib/src/code_generator/func.dart
+++ b/pkgs/ffigen/lib/src/code_generator/func.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:ffigen/src/code_generator.dart';
+import 'package:ffigen/src/config_provider/config_types.dart';
 
 import 'binding_string.dart';
 import 'utils.dart';
@@ -10,11 +11,14 @@
 
 /// A binding for C function.
 ///
-/// For a C function -
+/// For example, take the following C function.
+///
 /// ```c
 /// int sum(int a, int b);
 /// ```
-/// The Generated dart code is -
+///
+/// The generated Dart code for this function (without `FfiNative`) is as follows.
+///
 /// ```dart
 /// int sum(int a, int b) {
 ///   return _sum(a, b);
@@ -26,14 +30,24 @@
 ///
 /// typedef _dart_sum = int Function(int a, int b);
 /// ```
+///
+/// When using `FfiNative`, the code is as follows.
+///
+/// ```dart
+/// @ffi.FfiNative<ffi.Int32 Function(ffi.Int32 a, ffi.Int32 b)>('sum')
+/// external int sum(int a, int b);
+/// ```
 class Func extends LookUpBinding {
   final FunctionType functionType;
   final bool exposeSymbolAddress;
   final bool exposeFunctionTypedefs;
   final bool isLeaf;
+  final FfiNativeConfig ffiNativeConfig;
+  late final String funcPointerName;
 
   /// Contains typealias for function type if [exposeFunctionTypedefs] is true.
-  Typealias? _exposedCFunctionTypealias, _exposedDartFunctionTypealias;
+  Typealias? _exposedCFunctionTypealias;
+  Typealias? _exposedDartFunctionTypealias;
 
   /// [originalName] is looked up in dynamic library, if not
   /// provided, takes the value of [name].
@@ -47,6 +61,8 @@
     this.exposeSymbolAddress = false,
     this.exposeFunctionTypedefs = false,
     this.isLeaf = false,
+    bool isInternal = false,
+    this.ffiNativeConfig = const FfiNativeConfig(enabled: false),
   })  : functionType = FunctionType(
           returnType: returnType,
           parameters: parameters ?? const [],
@@ -56,6 +72,7 @@
           originalName: originalName,
           name: name,
           dartDoc: dartDoc,
+          isInternal: isInternal,
         ) {
     for (var i = 0; i < functionType.parameters.length; i++) {
       if (functionType.parameters[i].name.trim() == '') {
@@ -68,12 +85,14 @@
     if (exposeFunctionTypedefs) {
       _exposedCFunctionTypealias = Typealias(
         name: 'Native$upperCaseName',
-        type: Type.functionType(functionType),
+        type: functionType,
+        isInternal: true,
       );
       _exposedDartFunctionTypealias = Typealias(
         name: 'Dart$upperCaseName',
-        type: Type.functionType(functionType),
+        type: functionType,
         useDartType: true,
+        isInternal: true,
       );
     }
   }
@@ -83,7 +102,7 @@
     final s = StringBuffer();
     final enclosingFuncName = name;
     final funcVarName = w.wrapperLevelUniqueNamer.makeUnique('_$name');
-    final funcPointerName = w.wrapperLevelUniqueNamer.makeUnique('_${name}Ptr');
+    funcPointerName = w.wrapperLevelUniqueNamer.makeUnique('_${name}Ptr');
 
     if (dartDoc != null) {
       s.write(makeDartDoc(dartDoc!));
@@ -93,45 +112,6 @@
     for (final p in functionType.parameters) {
       p.name = paramNamer.makeUnique(p.name);
     }
-    // Write enclosing function.
-    if (w.dartBool &&
-        functionType.returnType.getBaseTypealiasType().broadType ==
-            BroadType.Boolean) {
-      // Use bool return type in enclosing function.
-      s.write('bool $enclosingFuncName(\n');
-    } else {
-      s.write(
-          '${functionType.returnType.getDartType(w)} $enclosingFuncName(\n');
-    }
-    for (final p in functionType.parameters) {
-      if (w.dartBool &&
-          p.type.getBaseTypealiasType().broadType == BroadType.Boolean) {
-        // Use bool parameter type in enclosing function.
-        s.write('  bool ${p.name},\n');
-      } else {
-        s.write('  ${p.type.getDartType(w)} ${p.name},\n');
-      }
-    }
-    s.write(') {\n');
-    s.write('return $funcVarName');
-
-    s.write('(\n');
-    for (final p in functionType.parameters) {
-      if (w.dartBool &&
-          p.type.getBaseTypealiasType().broadType == BroadType.Boolean) {
-        // Convert bool parameter to int before calling.
-        s.write('    ${p.name}?1:0,\n');
-      } else {
-        s.write('    ${p.name},\n');
-      }
-    }
-    if (w.dartBool && functionType.returnType.broadType == BroadType.Boolean) {
-      // Convert int return type to bool.
-      s.write('  )!=0;\n');
-    } else {
-      s.write('  );\n');
-    }
-    s.write('}\n');
 
     final cType = exposeFunctionTypedefs
         ? _exposedCFunctionTypealias!.name
@@ -140,21 +120,53 @@
         ? _exposedDartFunctionTypealias!.name
         : functionType.getDartType(w, writeArgumentNames: false);
 
-    if (exposeSymbolAddress) {
-      // Add to SymbolAddress in writer.
-      w.symbolAddressWriter.addSymbol(
-        type:
-            '${w.ffiLibraryPrefix}.Pointer<${w.ffiLibraryPrefix}.NativeFunction<$cType>>',
-        name: name,
-        ptrName: funcPointerName,
-      );
+    if (ffiNativeConfig.enabled) {
+      final assetString = ffiNativeConfig.asset != null
+          ? ", asset: '${ffiNativeConfig.asset}'"
+          : '';
+      final isLeafString = isLeaf ? ', isLeaf: true' : '';
+      s.write(
+          "@${w.ffiLibraryPrefix}.FfiNative<$cType>('$originalName'$assetString$isLeafString)\n");
+
+      s.write(
+          'external ${functionType.returnType.getDartType(w)} $enclosingFuncName(\n');
+      for (final p in functionType.parameters) {
+        s.write('  ${p.type.getDartType(w)} ${p.name},\n');
+      }
+      s.write(');\n\n');
+    } else {
+      // Write enclosing function.
+      s.write(
+          '${functionType.returnType.getDartType(w)} $enclosingFuncName(\n');
+      for (final p in functionType.parameters) {
+        s.write('  ${p.type.getDartType(w)} ${p.name},\n');
+      }
+      s.write(') {\n');
+      s.write('return $funcVarName');
+
+      s.write('(\n');
+      for (final p in functionType.parameters) {
+        s.write('    ${p.name},\n');
+      }
+      s.write('  );\n');
+      s.write('}\n');
+
+      if (exposeSymbolAddress) {
+        // Add to SymbolAddress in writer.
+        w.symbolAddressWriter.addSymbol(
+          type:
+              '${w.ffiLibraryPrefix}.Pointer<${w.ffiLibraryPrefix}.NativeFunction<$cType>>',
+          name: name,
+          ptrName: funcPointerName,
+        );
+      }
+      // Write function pointer.
+      s.write(
+          "late final $funcPointerName = ${w.lookupFuncIdentifier}<${w.ffiLibraryPrefix}.NativeFunction<$cType>>('$originalName');\n");
+      final isLeafString = isLeaf ? 'isLeaf:true' : '';
+      s.write(
+          'late final $funcVarName = $funcPointerName.asFunction<$dartType>($isLeafString);\n\n');
     }
-    // Write function pointer.
-    s.write(
-        "late final $funcPointerName = ${w.lookupFuncIdentifier}<${w.ffiLibraryPrefix}.NativeFunction<$cType>>('$originalName');\n");
-    final isLeafString = isLeaf ? 'isLeaf:true' : '';
-    s.write(
-        'late final $funcVarName = $funcPointerName.asFunction<$dartType>($isLeafString);\n\n');
 
     return BindingString(type: BindingStringType.func, string: s.toString());
   }
@@ -180,9 +192,7 @@
 
   Parameter({String? originalName, this.name = '', required Type type})
       : originalName = originalName ?? name,
-        // A type with broadtype [BroadType.NativeFunction] is wrapped with a
-        // pointer because this is a shorthand used in C for Pointer to function.
-        type = type.getBaseTypealiasType().broadType == BroadType.NativeFunction
-            ? Type.pointer(type)
-            : type;
+        // A [NativeFunc] is wrapped with a pointer because this is a shorthand
+        // used in C for Pointer to function.
+        type = type.typealiasType is NativeFunc ? PointerType(type) : type;
 }
diff --git a/pkgs/ffigen/lib/src/code_generator/func_type.dart b/pkgs/ffigen/lib/src/code_generator/func_type.dart
new file mode 100644
index 0000000..5402028
--- /dev/null
+++ b/pkgs/ffigen/lib/src/code_generator/func_type.dart
@@ -0,0 +1,99 @@
+// Copyright (c) 2022, 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 'package:ffigen/src/code_generator.dart';
+import 'package:ffigen/src/code_generator/utils.dart';
+
+import 'writer.dart';
+
+/// Represents a function type.
+class FunctionType extends Type {
+  final Type returnType;
+  final List<Parameter> parameters;
+
+  FunctionType({
+    required this.returnType,
+    required this.parameters,
+  });
+
+  String _getTypeString(
+      bool writeArgumentNames, String Function(Type) typeToString) {
+    final sb = StringBuffer();
+
+    // Write return Type.
+    sb.write(typeToString(returnType));
+
+    // Write Function.
+    sb.write(' Function(');
+    sb.write(parameters.map<String>((p) {
+      return '${typeToString(p.type)} ${writeArgumentNames ? p.name : ""}';
+    }).join(', '));
+    sb.write(')');
+
+    return sb.toString();
+  }
+
+  @override
+  String getCType(Writer w, {bool writeArgumentNames = true}) =>
+      _getTypeString(writeArgumentNames, (Type t) => t.getCType(w));
+
+  @override
+  String getDartType(Writer w, {bool writeArgumentNames = true}) =>
+      _getTypeString(writeArgumentNames, (Type t) => t.getDartType(w));
+
+  @override
+  String toString() => _getTypeString(false, (Type t) => t.toString());
+
+  @override
+  String cacheKey() => _getTypeString(false, (Type t) => t.cacheKey());
+
+  @override
+  void addDependencies(Set<Binding> dependencies) {
+    returnType.addDependencies(dependencies);
+    for (final p in parameters) {
+      p.type.addDependencies(dependencies);
+    }
+  }
+
+  void addParameterNames(List<String> names) {
+    if (names.length != parameters.length) {
+      return;
+    }
+    final paramNamer = UniqueNamer({});
+    for (int i = 0; i < parameters.length; i++) {
+      final finalName = paramNamer.makeUnique(names[i]);
+      parameters[i] = Parameter(
+        type: parameters[i].type,
+        originalName: names[i],
+        name: finalName,
+      );
+    }
+  }
+}
+
+/// Represents a NativeFunction<Function>.
+class NativeFunc extends Type {
+  final FunctionType type;
+
+  NativeFunc(this.type);
+
+  @override
+  void addDependencies(Set<Binding> dependencies) {
+    type.addDependencies(dependencies);
+  }
+
+  @override
+  String getCType(Writer w) =>
+      '${w.ffiLibraryPrefix}.NativeFunction<${type.getCType(w)}>';
+
+  @override
+  String getDartType(Writer w) =>
+      '${w.ffiLibraryPrefix}.NativeFunction<${type.getCType(w)}>';
+
+  @override
+  String toString() => 'NativeFunction<${type.toString()}>';
+
+  @override
+  String cacheKey() => 'NatFn(${type.cacheKey()})';
+}
diff --git a/pkgs/ffigen/lib/src/code_generator/global.dart b/pkgs/ffigen/lib/src/code_generator/global.dart
index df4c7f0..579d8dd 100644
--- a/pkgs/ffigen/lib/src/code_generator/global.dart
+++ b/pkgs/ffigen/lib/src/code_generator/global.dart
@@ -4,6 +4,7 @@
 
 import 'binding.dart';
 import 'binding_string.dart';
+import 'compound.dart';
 import 'type.dart';
 import 'utils.dart';
 import 'writer.dart';
@@ -49,9 +50,9 @@
 
     s.write(
         "late final ${w.ffiLibraryPrefix}.Pointer<$cType> $pointerName = ${w.lookupFuncIdentifier}<$cType>('$originalName');\n\n");
-    final baseTypealiasType = type.getBaseTypealiasType();
-    if (baseTypealiasType.broadType == BroadType.Compound) {
-      if (baseTypealiasType.compound!.isOpaque) {
+    final baseTypealiasType = type.typealiasType;
+    if (baseTypealiasType is Compound) {
+      if (baseTypealiasType.isOpaque) {
         s.write(
             '${w.ffiLibraryPrefix}.Pointer<$cType> get $globalVarName => $pointerName;\n\n');
       } else {
diff --git a/pkgs/ffigen/lib/src/code_generator/handle.dart b/pkgs/ffigen/lib/src/code_generator/handle.dart
new file mode 100644
index 0000000..a1b2d47
--- /dev/null
+++ b/pkgs/ffigen/lib/src/code_generator/handle.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2022, 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 'package:ffigen/src/code_generator.dart';
+
+import 'writer.dart';
+
+/// Represents a Dart_Handle.
+class HandleType extends Type {
+  const HandleType._();
+  static const _handle = HandleType._();
+  factory HandleType() => _handle;
+
+  @override
+  String getCType(Writer w) => '${w.ffiLibraryPrefix}.Handle';
+
+  @override
+  String getDartType(Writer w) => 'Object';
+
+  @override
+  String toString() => 'Handle';
+}
diff --git a/pkgs/ffigen/lib/src/code_generator/imports.dart b/pkgs/ffigen/lib/src/code_generator/imports.dart
new file mode 100644
index 0000000..41f7161
--- /dev/null
+++ b/pkgs/ffigen/lib/src/code_generator/imports.dart
@@ -0,0 +1,77 @@
+// Copyright (c) 2022, 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 'struct.dart';
+import 'type.dart';
+import 'writer.dart';
+
+/// A library import which will be written as an import in the generated file.
+class LibraryImport {
+  final String name;
+  final String importPath;
+  String prefix;
+
+  LibraryImport(this.name, this.importPath) : prefix = name;
+
+  @override
+  bool operator ==(other) {
+    return other is LibraryImport && name == other.name;
+  }
+
+  @override
+  int get hashCode => name.hashCode;
+}
+
+/// An imported type which will be used in the generated code.
+class ImportedType extends Type {
+  final LibraryImport libraryImport;
+  final String cType;
+  final String dartType;
+  final String? defaultValue;
+
+  ImportedType(this.libraryImport, this.cType, this.dartType,
+      [this.defaultValue]);
+
+  @override
+  String getCType(Writer w) {
+    w.markImportUsed(libraryImport);
+    return '${libraryImport.prefix}.$cType';
+  }
+
+  @override
+  String getDartType(Writer w) => cType == dartType ? getCType(w) : dartType;
+
+  @override
+  String toString() => '${libraryImport.name}.$cType';
+
+  @override
+  String? getDefaultValue(Writer w, String nativeLib) => defaultValue;
+}
+
+final ffiImport = LibraryImport('ffi', 'dart:ffi');
+final ffiPkgImport = LibraryImport('pkg_ffi', 'package:ffi/ffi.dart');
+
+final voidType = ImportedType(ffiImport, 'Void', 'void');
+
+final unsignedCharType = ImportedType(ffiImport, 'UnsignedChar', 'int', '0');
+final signedCharType = ImportedType(ffiImport, 'SignedChar', 'int', '0');
+final charType = ImportedType(ffiImport, 'Char', 'int', '0');
+final unsignedShortType = ImportedType(ffiImport, 'UnsignedShort', 'int', '0');
+final shortType = ImportedType(ffiImport, 'Short', 'int', '0');
+final unsignedIntType = ImportedType(ffiImport, 'UnsignedInt', 'int', '0');
+final intType = ImportedType(ffiImport, 'Int', 'int', '0');
+final unsignedLongType = ImportedType(ffiImport, 'UnsignedLong', 'int', '0');
+final longType = ImportedType(ffiImport, 'Long', 'int', '0');
+final unsignedLongLongType =
+    ImportedType(ffiImport, 'UnsignedLongLong', 'int', '0');
+final longLongType = ImportedType(ffiImport, 'LongLong', 'int', '0');
+
+final floatType = ImportedType(ffiImport, 'Float', 'double', '0');
+final doubleType = ImportedType(ffiImport, 'Double', 'double', '0');
+
+final sizeType = ImportedType(ffiImport, 'Size', 'int', '0');
+final wCharType = ImportedType(ffiImport, 'WChar', 'int', '0');
+
+final objCObjectType = Struct(name: 'ObjCObject');
+final objCSelType = Struct(name: 'ObjCSel');
diff --git a/pkgs/ffigen/lib/src/code_generator/library.dart b/pkgs/ffigen/lib/src/code_generator/library.dart
index 080f099..befdfce 100644
--- a/pkgs/ffigen/lib/src/code_generator/library.dart
+++ b/pkgs/ffigen/lib/src/code_generator/library.dart
@@ -5,11 +5,13 @@
 import 'dart:io';
 
 import 'package:cli_util/cli_util.dart';
+import 'package:ffigen/src/code_generator.dart';
 import 'package:ffigen/src/config_provider/config_types.dart';
 import 'package:logging/logging.dart';
 import 'package:path/path.dart' as p;
-import 'binding.dart';
-import 'struc.dart';
+import 'package:yaml_edit/yaml_edit.dart';
+
+import '../strings.dart' as strings;
 import 'utils.dart';
 import 'writer.dart';
 
@@ -28,9 +30,9 @@
     String? description,
     required List<Binding> bindings,
     String? header,
-    bool dartBool = true,
     bool sort = false,
     StructPackingOverride? packingOverride,
+    Set<LibraryImport>? libraryImports,
   }) {
     /// Get all dependencies (includes itself).
     final dependencies = <Binding>{};
@@ -45,41 +47,53 @@
       _sort();
     }
 
-    /// Handle any declaration-declaration name conflicts.
+    /// Handle any declaration-declaration name conflicts and emit warnings.
     final declConflictHandler = UniqueNamer({});
     for (final b in this.bindings) {
       _warnIfPrivateDeclaration(b);
       _resolveIfNameConflicts(declConflictHandler, b);
+      _warnIfExposeSymbolAddressAndFfiNative(b);
     }
 
     // Override pack values according to config. We do this after declaration
     // conflicts have been handled so that users can target the generated names.
     if (packingOverride != null) {
       for (final b in this.bindings) {
-        if (b is Struc && packingOverride.isOverriden(b.name)) {
+        if (b is Struct && packingOverride.isOverriden(b.name)) {
           b.pack = packingOverride.getOverridenPackValue(b.name);
         }
       }
     }
 
     // Seperate bindings which require lookup.
-    final lookUpBindings = this.bindings.whereType<LookUpBinding>().toList();
+    final lookUpBindings = this.bindings.whereType<LookUpBinding>().where((e) {
+      if (e is Func) {
+        return !e.ffiNativeConfig.enabled;
+      }
+      return true;
+    }).toList();
+    final ffiNativeBindings = this
+        .bindings
+        .whereType<Func>()
+        .where((e) => e.ffiNativeConfig.enabled)
+        .toList();
     final noLookUpBindings =
         this.bindings.whereType<NoLookUpBinding>().toList();
 
     _writer = Writer(
       lookUpBindings: lookUpBindings,
+      ffiNativeBindings: ffiNativeBindings,
       noLookUpBindings: noLookUpBindings,
       className: name,
       classDocComment: description,
       header: header,
-      dartBool: dartBool,
+      additionalImports: libraryImports,
     );
   }
 
   /// Logs a warning if generated declaration will be private.
   void _warnIfPrivateDeclaration(Binding b) {
-    if (b.name.startsWith('_')) {
+    if (b.name.startsWith('_') && !b.isInternal) {
       _logger.warning(
           "Generated declaration '${b.name}' start's with '_' and therefore will be private.");
     }
@@ -99,6 +113,16 @@
     }
   }
 
+  /// Logs a warning if generated declaration will be private.
+  void _warnIfExposeSymbolAddressAndFfiNative(Binding b) {
+    if (b is Func) {
+      if (b.exposeSymbolAddress && b.ffiNativeConfig.enabled) {
+        _logger.warning(
+            "Ignoring ${strings.symbolAddress} for '${b.name}' because it is generated as FfiNative.");
+      }
+    }
+  }
+
   /// Sort all bindings in alphabetical order.
   void _sort() {
     bindings.sort((b1, b2) => b1.name.compareTo(b2.name));
@@ -115,6 +139,19 @@
     }
   }
 
+  /// Generates [file] with symbol output yaml.
+  void generateSymbolOutputFile(File file, String importPath) {
+    if (!file.existsSync()) file.createSync(recursive: true);
+    final symbolFileYamlMap = writer.generateSymbolOutputYamlMap(importPath);
+    final yamlEditor = YamlEditor("");
+    yamlEditor.update([], wrapAsYamlNode(symbolFileYamlMap));
+    var yamlString = yamlEditor.toString();
+    if (!yamlString.endsWith('\n')) {
+      yamlString += "\n";
+    }
+    file.writeAsStringSync(yamlString);
+  }
+
   /// Formats a file using the Dart formatter.
   void _dartFormat(String path) {
     final sdkPath = getSdkPath();
diff --git a/pkgs/ffigen/lib/src/code_generator/native_type.dart b/pkgs/ffigen/lib/src/code_generator/native_type.dart
new file mode 100644
index 0000000..d76e7e7
--- /dev/null
+++ b/pkgs/ffigen/lib/src/code_generator/native_type.dart
@@ -0,0 +1,80 @@
+// Copyright (c) 2022, 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 'package:ffigen/src/code_generator.dart';
+
+import 'writer.dart';
+
+enum SupportedNativeType {
+  Void,
+  Char,
+  Int8,
+  Int16,
+  Int32,
+  Int64,
+  Uint8,
+  Uint16,
+  Uint32,
+  Uint64,
+  Float,
+  Double,
+  IntPtr,
+  UintPtr,
+}
+
+/// Represents a primitive native type, such as float.
+class NativeType extends Type {
+  static const _primitives = <SupportedNativeType, NativeType>{
+    SupportedNativeType.Void: NativeType._('Void', 'void', null),
+    SupportedNativeType.Char: NativeType._('Uint8', 'int', '0'),
+    SupportedNativeType.Int8: NativeType._('Int8', 'int', '0'),
+    SupportedNativeType.Int16: NativeType._('Int16', 'int', '0'),
+    SupportedNativeType.Int32: NativeType._('Int32', 'int', '0'),
+    SupportedNativeType.Int64: NativeType._('Int64', 'int', '0'),
+    SupportedNativeType.Uint8: NativeType._('Uint8', 'int', '0'),
+    SupportedNativeType.Uint16: NativeType._('Uint16', 'int', '0'),
+    SupportedNativeType.Uint32: NativeType._('Uint32', 'int', '0'),
+    SupportedNativeType.Uint64: NativeType._('Uint64', 'int', '0'),
+    SupportedNativeType.Float: NativeType._('Float', 'double', '0'),
+    SupportedNativeType.Double: NativeType._('Double', 'double', '0'),
+    SupportedNativeType.IntPtr: NativeType._('IntPtr', 'int', '0'),
+    SupportedNativeType.UintPtr: NativeType._('UintPtr', 'int', '0'),
+  };
+
+  final String _cType;
+  final String _dartType;
+  final String? _defaultValue;
+
+  const NativeType._(this._cType, this._dartType, this._defaultValue);
+
+  factory NativeType(SupportedNativeType type) => _primitives[type]!;
+
+  @override
+  String getCType(Writer w) => '${w.ffiLibraryPrefix}.$_cType';
+
+  @override
+  String getDartType(Writer w) => _dartType;
+
+  @override
+  String toString() => _cType;
+
+  @override
+  String cacheKey() => _cType;
+
+  @override
+  String? getDefaultValue(Writer w, String nativeLib) => _defaultValue;
+}
+
+class BooleanType extends NativeType {
+  // Booleans are treated as uint8.
+  const BooleanType._() : super._('Bool', 'bool', 'false');
+  static const _boolean = BooleanType._();
+  factory BooleanType() => _boolean;
+
+  @override
+  String toString() => 'bool';
+
+  @override
+  String cacheKey() => 'bool';
+}
diff --git a/pkgs/ffigen/lib/src/code_generator/objc_block.dart b/pkgs/ffigen/lib/src/code_generator/objc_block.dart
new file mode 100644
index 0000000..310fef1
--- /dev/null
+++ b/pkgs/ffigen/lib/src/code_generator/objc_block.dart
@@ -0,0 +1,168 @@
+// Copyright (c) 2022, 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 'package:ffigen/src/code_generator.dart';
+
+import 'binding_string.dart';
+import 'writer.dart';
+
+class ObjCBlock extends BindingType {
+  final Type returnType;
+  final List<Type> argTypes;
+  final ObjCBuiltInFunctions builtInFunctions;
+
+  ObjCBlock({
+    required String usr,
+    required String name,
+    required this.returnType,
+    required this.argTypes,
+    required this.builtInFunctions,
+  }) : super(
+          usr: usr,
+          originalName: name,
+          name: name,
+        );
+
+  @override
+  BindingString toBindingString(Writer w) {
+    final s = StringBuffer();
+
+    builtInFunctions.ensureBlockUtilsExist(w, s);
+
+    final params = <Parameter>[];
+    for (int i = 0; i < argTypes.length; ++i) {
+      params.add(Parameter(name: 'arg$i', type: argTypes[i]));
+    }
+
+    final isVoid = returnType == NativeType(SupportedNativeType.Void);
+    final voidPtr = PointerType(voidType).getCType(w);
+    final blockPtr = PointerType(builtInFunctions.blockStruct);
+    final funcType = FunctionType(returnType: returnType, parameters: params);
+    final natFnType = NativeFunc(funcType);
+    final natFnPtr = PointerType(natFnType).getCType(w);
+    final funcPtrTrampoline =
+        w.topLevelUniqueNamer.makeUnique('_${name}_fnPtrTrampoline');
+    final closureTrampoline =
+        w.topLevelUniqueNamer.makeUnique('_${name}_closureTrampoline');
+    final registerClosure =
+        w.topLevelUniqueNamer.makeUnique('_${name}_registerClosure');
+    final closureRegistry =
+        w.topLevelUniqueNamer.makeUnique('_${name}_closureRegistry');
+    final closureRegistryIndex =
+        w.topLevelUniqueNamer.makeUnique('_${name}_closureRegistryIndex');
+    final trampFuncType = FunctionType(
+        returnType: returnType,
+        parameters: [Parameter(type: blockPtr, name: 'block'), ...params]);
+    final natTrampFnType = NativeFunc(trampFuncType);
+
+    // Write the function pointer based trampoline function.
+    s.write(returnType.getDartType(w));
+    s.write(' $funcPtrTrampoline(${blockPtr.getCType(w)} block');
+    for (int i = 0; i < params.length; ++i) {
+      s.write(', ${params[i].type.getDartType(w)} ${params[i].name}');
+    }
+    s.write(') {\n');
+    s.write('  ${isVoid ? '' : 'return '}block.ref.target.cast<'
+        '${natFnType.getDartType(w)}>().asFunction<'
+        '${funcType.getDartType(w)}>()(');
+    for (int i = 0; i < params.length; ++i) {
+      s.write('${i == 0 ? '' : ', '}${params[i].name}');
+    }
+    s.write(');\n');
+    s.write('}\n');
+
+    // Write the closure registry function.
+    s.write('''
+final $closureRegistry = <int, Function>{};
+int $closureRegistryIndex = 0;
+$voidPtr $registerClosure(Function fn) {
+  final id = ++$closureRegistryIndex;
+  $closureRegistry[id] = fn;
+  return $voidPtr.fromAddress(id);
+}
+''');
+
+    // Write the closure based trampoline function.
+    s.write(returnType.getDartType(w));
+    s.write(' $closureTrampoline(${blockPtr.getCType(w)} block');
+    for (int i = 0; i < params.length; ++i) {
+      s.write(', ${params[i].type.getDartType(w)} ${params[i].name}');
+    }
+    s.write(') {\n');
+    s.write('  ${isVoid ? '' : 'return '}$closureRegistry['
+        'block.ref.target.address]!(');
+    for (int i = 0; i < params.length; ++i) {
+      s.write('${i == 0 ? '' : ', '}${params[i].name}');
+    }
+    s.write(');\n');
+    s.write('}\n');
+
+    // Write the wrapper class.
+    final defaultValue = returnType.getDefaultValue(w, '_lib');
+    final exceptionalReturn = defaultValue == null ? '' : ', $defaultValue';
+    s.write('''
+class $name extends _ObjCBlockBase {
+  $name._(${blockPtr.getCType(w)} id, ${w.className} lib) :
+      super._(id, lib, retain: false, release: true);
+
+  /// Creates a block from a C function pointer.
+  $name.fromFunctionPointer(${w.className} lib, $natFnPtr ptr) :
+      this._(lib.${builtInFunctions.newBlock.name}(
+          _cFuncTrampoline ??= ${w.ffiLibraryPrefix}.Pointer.fromFunction<
+              ${trampFuncType.getCType(w)}>($funcPtrTrampoline
+                  $exceptionalReturn).cast(), ptr.cast()), lib);
+  static $voidPtr? _cFuncTrampoline;
+
+  /// Creates a block from a Dart function.
+  $name.fromFunction(${w.className} lib, ${funcType.getDartType(w)} fn) :
+      this._(lib.${builtInFunctions.newBlock.name}(
+          _dartFuncTrampoline ??= ${w.ffiLibraryPrefix}.Pointer.fromFunction<
+              ${trampFuncType.getCType(w)}>($closureTrampoline
+                  $exceptionalReturn).cast(), $registerClosure(fn)), lib);
+  static $voidPtr? _dartFuncTrampoline;
+''');
+
+    // Call method.
+    s.write('  ${returnType.getDartType(w)} call(');
+    for (int i = 0; i < params.length; ++i) {
+      s.write('${i == 0 ? '' : ', '}${params[i].type.getDartType(w)}');
+      s.write(' ${params[i].name}');
+    }
+    s.write(''') {
+    ${isVoid ? '' : 'return '}_id.ref.invoke.cast<
+        ${natTrampFnType.getCType(w)}>().asFunction<
+            ${trampFuncType.getDartType(w)}>()(_id''');
+    for (int i = 0; i < params.length; ++i) {
+      s.write(', ${params[i].name}');
+    }
+    s.write(''');
+  }''');
+
+    // Get the pointer to the underlying block.
+    s.write('  ${blockPtr.getCType(w)} get pointer => _id;\n');
+
+    s.write('}\n');
+    return BindingString(
+        type: BindingStringType.objcBlock, string: s.toString());
+  }
+
+  @override
+  void addDependencies(Set<Binding> dependencies) {
+    if (dependencies.contains(this)) return;
+    dependencies.add(this);
+
+    returnType.addDependencies(dependencies);
+    for (final t in argTypes) {
+      t.addDependencies(dependencies);
+    }
+    builtInFunctions.addBlockDependencies(dependencies);
+  }
+
+  @override
+  String getCType(Writer w) =>
+      PointerType(builtInFunctions.blockStruct).getCType(w);
+
+  @override
+  String toString() => '($returnType (^)(${argTypes.join(', ')}))';
+}
diff --git a/pkgs/ffigen/lib/src/code_generator/objc_built_in_functions.dart b/pkgs/ffigen/lib/src/code_generator/objc_built_in_functions.dart
new file mode 100644
index 0000000..ebb4b20
--- /dev/null
+++ b/pkgs/ffigen/lib/src/code_generator/objc_built_in_functions.dart
@@ -0,0 +1,395 @@
+// Copyright (c) 2022, 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 'package:ffigen/src/code_generator.dart';
+
+import 'binding_string.dart';
+import 'writer.dart';
+
+/// Built in functions used by the Objective C bindings.
+class ObjCBuiltInFunctions {
+  late final _registerNameFunc = Func(
+    name: '_sel_registerName',
+    originalName: 'sel_registerName',
+    returnType: PointerType(objCSelType),
+    parameters: [Parameter(name: 'str', type: PointerType(charType))],
+    isInternal: true,
+  );
+  late final registerName = ObjCInternalFunction(
+      '_registerName', _registerNameFunc, (Writer w, String name) {
+    final selType = _registerNameFunc.functionType.returnType.getCType(w);
+    return '''
+$selType $name(String name) {
+  final cstr = name.toNativeUtf8();
+  final sel = ${_registerNameFunc.name}(cstr.cast());
+  ${w.ffiPkgLibraryPrefix}.calloc.free(cstr);
+  return sel;
+}
+''';
+  });
+
+  late final _getClassFunc = Func(
+    name: '_objc_getClass',
+    originalName: 'objc_getClass',
+    returnType: PointerType(objCObjectType),
+    parameters: [Parameter(name: 'str', type: PointerType(charType))],
+    isInternal: true,
+  );
+  late final getClass =
+      ObjCInternalFunction('_getClass', _getClassFunc, (Writer w, String name) {
+    final objType = _getClassFunc.functionType.returnType.getCType(w);
+    return '''
+$objType $name(String name) {
+  final cstr = name.toNativeUtf8();
+  final clazz = ${_getClassFunc.name}(cstr.cast());
+  ${w.ffiPkgLibraryPrefix}.calloc.free(cstr);
+  if (clazz == ${w.ffiLibraryPrefix}.nullptr) {
+    throw Exception('Failed to load Objective-C class: \$name');
+  }
+  return clazz;
+}
+''';
+  });
+
+  late final _retainFunc = Func(
+    name: '_objc_retain',
+    originalName: 'objc_retain',
+    returnType: PointerType(objCObjectType),
+    parameters: [Parameter(name: 'value', type: PointerType(objCObjectType))],
+    isInternal: true,
+  );
+  late final _releaseFunc = Func(
+    name: '_objc_release',
+    originalName: 'objc_release',
+    returnType: voidType,
+    parameters: [Parameter(name: 'value', type: PointerType(objCObjectType))],
+    isInternal: true,
+  );
+  late final _releaseFinalizer = ObjCInternalGlobal(
+    '_objc_releaseFinalizer',
+    (Writer w) => '${w.ffiLibraryPrefix}.NativeFinalizer('
+        '${_releaseFunc.funcPointerName}.cast())',
+    _releaseFunc,
+  );
+
+  late final _blockCopyFunc = Func(
+    name: '_Block_copy',
+    originalName: '_Block_copy',
+    returnType: PointerType(voidType),
+    parameters: [Parameter(name: 'value', type: PointerType(voidType))],
+    isInternal: true,
+  );
+  late final _blockReleaseFunc = Func(
+    name: '_Block_release',
+    originalName: '_Block_release',
+    returnType: voidType,
+    parameters: [Parameter(name: 'value', type: PointerType(voidType))],
+    isInternal: true,
+  );
+  late final _blockReleaseFinalizer = ObjCInternalGlobal(
+    '_objc_releaseFinalizer',
+    (Writer w) => '${w.ffiLibraryPrefix}.NativeFinalizer('
+        '${_blockReleaseFunc.funcPointerName}.cast())',
+    _blockReleaseFunc,
+  );
+
+  // We need to load a separate instance of objc_msgSend for each signature.
+  final _msgSendFuncs = <String, Func>{};
+  Func getMsgSendFunc(Type returnType, List<ObjCMethodParam> params) {
+    var key = returnType.cacheKey();
+    for (final p in params) {
+      key += ' ${p.type.cacheKey()}';
+    }
+    return _msgSendFuncs[key] ??= Func(
+      name: '_objc_msgSend_${_msgSendFuncs.length}',
+      originalName: 'objc_msgSend',
+      returnType: returnType,
+      parameters: [
+        Parameter(name: 'obj', type: PointerType(objCObjectType)),
+        Parameter(name: 'sel', type: PointerType(objCSelType)),
+        for (final p in params) Parameter(name: p.name, type: p.type),
+      ],
+      isInternal: true,
+    );
+  }
+
+  final _selObjects = <String, ObjCInternalGlobal>{};
+  ObjCInternalGlobal getSelObject(String methodName) {
+    return _selObjects[methodName] ??= ObjCInternalGlobal(
+      '_sel_${methodName.replaceAll(":", "_")}',
+      (Writer w) => '${registerName.name}("$methodName")',
+      registerName,
+    );
+  }
+
+  // See https://clang.llvm.org/docs/Block-ABI-Apple.html
+  late final blockStruct = Struct(
+    name: '_ObjCBlock',
+    isInternal: true,
+    members: [
+      Member(name: 'isa', type: PointerType(voidType)),
+      Member(name: 'flags', type: intType),
+      Member(name: 'reserved', type: intType),
+      Member(name: 'invoke', type: PointerType(voidType)),
+      Member(name: 'descriptor', type: PointerType(blockDescStruct)),
+      Member(name: 'target', type: PointerType(voidType)),
+    ],
+  );
+  late final blockDescStruct = Struct(
+    name: '_ObjCBlockDesc',
+    isInternal: true,
+    members: [
+      Member(name: 'reserved', type: unsignedLongType),
+      Member(name: 'size', type: unsignedLongType),
+      Member(name: 'copy_helper', type: PointerType(voidType)),
+      Member(name: 'dispose_helper', type: PointerType(voidType)),
+      Member(name: 'signature', type: PointerType(charType)),
+    ],
+  );
+  late final newBlockDesc =
+      ObjCInternalFunction('_newBlockDesc', null, (Writer w, String name) {
+    final blockType = blockStruct.getCType(w);
+    final descType = blockDescStruct.getCType(w);
+    final descPtr = PointerType(blockDescStruct).getCType(w);
+    return '''
+$descPtr $name() {
+  final d = ${w.ffiPkgLibraryPrefix}.calloc.allocate<$descType>(
+      ${w.ffiLibraryPrefix}.sizeOf<$descType>());
+  d.ref.reserved = 0;
+  d.ref.size = ${w.ffiLibraryPrefix}.sizeOf<$blockType>();
+  d.ref.copy_helper = ${w.ffiLibraryPrefix}.nullptr;
+  d.ref.dispose_helper = ${w.ffiLibraryPrefix}.nullptr;
+  d.ref.signature = ${w.ffiLibraryPrefix}.nullptr;
+  return d;
+}
+''';
+  });
+  late final blockDescSingleton = ObjCInternalGlobal(
+    '_objc_block_desc',
+    (Writer w) => '${newBlockDesc.name}()',
+    blockDescStruct,
+  );
+  late final concreteGlobalBlock = ObjCInternalGlobal(
+    '_objc_concrete_global_block',
+    (Writer w) => '${w.lookupFuncIdentifier}<${voidType.getCType(w)}>('
+        "'_NSConcreteGlobalBlock')",
+  );
+  late final newBlock = ObjCInternalFunction('_newBlock', _blockCopyFunc,
+      (Writer w, String name) {
+    final blockType = blockStruct.getCType(w);
+    final blockPtr = PointerType(blockStruct).getCType(w);
+    final voidPtr = PointerType(voidType).getCType(w);
+    return '''
+$blockPtr $name($voidPtr invoke, $voidPtr target) {
+  final b = ${w.ffiPkgLibraryPrefix}.calloc.allocate<$blockType>(
+      ${w.ffiLibraryPrefix}.sizeOf<$blockType>());
+  b.ref.isa = ${concreteGlobalBlock.name};
+  b.ref.flags = 0;
+  b.ref.reserved = 0;
+  b.ref.invoke = invoke;
+  b.ref.target = target;
+  b.ref.descriptor = ${blockDescSingleton.name};
+  final copy = ${_blockCopyFunc.name}(b.cast()).cast<$blockType>();
+  ${w.ffiPkgLibraryPrefix}.calloc.free(b);
+  return copy;
+}
+''';
+  });
+
+  void _writeFinalizableClass(
+      Writer w,
+      StringBuffer s,
+      String name,
+      String kind,
+      String idType,
+      String retain,
+      String release,
+      String finalizer) {
+    s.write('''
+class $name implements ${w.ffiLibraryPrefix}.Finalizable {
+  final $idType _id;
+  final ${w.className} _lib;
+  bool _pendingRelease;
+
+  $name._(this._id, this._lib,
+      {bool retain = false, bool release = false}) : _pendingRelease = release {
+    if (retain) {
+      _lib.$retain(_id.cast());
+    }
+    if (release) {
+      _lib.$finalizer.attach(this, _id.cast(), detach: this);
+    }
+  }
+
+  /// Releases the reference to the underlying ObjC $kind held by this wrapper.
+  /// Throws a StateError if this wrapper doesn't currently hold a reference.
+  void release() {
+    if (_pendingRelease) {
+      _pendingRelease = false;
+      _lib.$release(_id.cast());
+      _lib.$finalizer.detach(this);
+    } else {
+      throw StateError(
+          'Released an ObjC $kind that was unowned or already released.');
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    return other is $name && _id == other._id;
+  }
+
+  @override
+  int get hashCode => _id.hashCode;
+}
+''');
+  }
+
+  bool utilsExist = false;
+  void ensureUtilsExist(Writer w, StringBuffer s) {
+    if (utilsExist) return;
+    utilsExist = true;
+    _writeFinalizableClass(
+        w,
+        s,
+        '_ObjCWrapper',
+        'object',
+        PointerType(objCObjectType).getCType(w),
+        _retainFunc.name,
+        _releaseFunc.name,
+        _releaseFinalizer.name);
+  }
+
+  bool blockUtilsExist = false;
+  void ensureBlockUtilsExist(Writer w, StringBuffer s) {
+    if (blockUtilsExist) return;
+    blockUtilsExist = true;
+    _writeFinalizableClass(
+        w,
+        s,
+        '_ObjCBlockBase',
+        'block',
+        PointerType(blockStruct).getCType(w),
+        _blockCopyFunc.name,
+        _blockReleaseFunc.name,
+        _blockReleaseFinalizer.name);
+  }
+
+  void addDependencies(Set<Binding> dependencies) {
+    registerName.addDependencies(dependencies);
+    getClass.addDependencies(dependencies);
+    _retainFunc.addDependencies(dependencies);
+    _releaseFunc.addDependencies(dependencies);
+    _releaseFinalizer.addDependencies(dependencies);
+    for (final func in _msgSendFuncs.values) {
+      func.addDependencies(dependencies);
+    }
+    for (final sel in _selObjects.values) {
+      sel.addDependencies(dependencies);
+    }
+  }
+
+  void addBlockDependencies(Set<Binding> dependencies) {
+    newBlockDesc.addDependencies(dependencies);
+    blockDescSingleton.addDependencies(dependencies);
+    blockStruct.addDependencies(dependencies);
+    concreteGlobalBlock.addDependencies(dependencies);
+    newBlock.addDependencies(dependencies);
+    _blockCopyFunc.addDependencies(dependencies);
+    _blockReleaseFunc.addDependencies(dependencies);
+    _blockReleaseFinalizer.addDependencies(dependencies);
+  }
+
+  final _interfaceRegistry = <String, ObjCInterface>{};
+  void registerInterface(ObjCInterface interface) {
+    _interfaceRegistry[interface.originalName] = interface;
+  }
+
+  ObjCInterface get nsData {
+    return _interfaceRegistry["NSData"] ??
+        (ObjCInterface(
+          originalName: "NSData",
+          builtInFunctions: this,
+        ));
+  }
+
+  void generateNSStringUtils(Writer w, StringBuffer s) {
+    // Generate a constructor that wraps stringWithCharacters, and a toString
+    // method that wraps dataUsingEncoding.
+    s.write('''
+  factory NSString(${w.className} _lib, String str) {
+    final cstr = str.toNativeUtf16();
+    final nsstr = stringWithCharacters_length_(_lib, cstr.cast(), str.length);
+    ${w.ffiPkgLibraryPrefix}.calloc.free(cstr);
+    return nsstr;
+  }
+
+  @override
+  String toString() {
+    final data = dataUsingEncoding_(
+        0x94000100 /* NSUTF16LittleEndianStringEncoding */);
+    return data.bytes.cast<${w.ffiPkgLibraryPrefix}.Utf16>().toDartString(
+        length: length);
+  }
+''');
+  }
+
+  void generateStringUtils(Writer w, StringBuffer s) {
+    // Generate an extension on String to convert to NSString
+    s.write('''
+extension StringToNSString on String {
+  NSString toNSString(${w.className} lib) => NSString(lib, this);
+}
+''');
+  }
+}
+
+/// Functions only used internally by ObjC bindings, which may or may not wrap a
+/// native function, such as getClass.
+class ObjCInternalFunction extends LookUpBinding {
+  final Func? _wrappedFunction;
+  final String Function(Writer, String) _toBindingString;
+
+  ObjCInternalFunction(
+      String name, this._wrappedFunction, this._toBindingString)
+      : super(originalName: name, name: name, isInternal: true);
+
+  @override
+  BindingString toBindingString(Writer w) {
+    name = w.wrapperLevelUniqueNamer.makeUnique(name);
+    return BindingString(
+        type: BindingStringType.func, string: _toBindingString(w, name));
+  }
+
+  @override
+  void addDependencies(Set<Binding> dependencies) {
+    if (dependencies.contains(this)) return;
+    dependencies.add(this);
+    _wrappedFunction?.addDependencies(dependencies);
+  }
+}
+
+/// Globals only used internally by ObjC bindings, such as classes and SELs.
+class ObjCInternalGlobal extends LookUpBinding {
+  final String Function(Writer) makeValue;
+  Binding? binding;
+
+  ObjCInternalGlobal(String name, this.makeValue, [this.binding])
+      : super(originalName: name, name: name, isInternal: true);
+
+  @override
+  BindingString toBindingString(Writer w) {
+    final s = StringBuffer();
+    name = w.wrapperLevelUniqueNamer.makeUnique(name);
+    s.write('late final $name = ${makeValue(w)};');
+    return BindingString(type: BindingStringType.global, string: s.toString());
+  }
+
+  @override
+  void addDependencies(Set<Binding> dependencies) {
+    if (dependencies.contains(this)) return;
+    dependencies.add(this);
+    binding?.addDependencies(dependencies);
+  }
+}
diff --git a/pkgs/ffigen/lib/src/code_generator/objc_interface.dart b/pkgs/ffigen/lib/src/code_generator/objc_interface.dart
new file mode 100644
index 0000000..2cf44af
--- /dev/null
+++ b/pkgs/ffigen/lib/src/code_generator/objc_interface.dart
@@ -0,0 +1,499 @@
+// Copyright (c) 2022, 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 'package:ffigen/src/code_generator.dart';
+import 'package:logging/logging.dart';
+
+import '../strings.dart' as strings;
+import 'binding_string.dart';
+import 'utils.dart';
+import 'writer.dart';
+
+// Class methods defined on NSObject that we don't want to copy to child objects
+// by default.
+const _excludedNSObjectClassMethods = {
+  'allocWithZone:',
+  'class',
+  'conformsToProtocol:',
+  'copyWithZone:',
+  'debugDescription',
+  'description',
+  'hash',
+  'initialize',
+  'instanceMethodForSelector:',
+  'instanceMethodSignatureForSelector:',
+  'instancesRespondToSelector:',
+  'isSubclassOfClass:',
+  'load',
+  'mutableCopyWithZone:',
+  'poseAsClass:',
+  'resolveClassMethod:',
+  'resolveInstanceMethod:',
+  'setVersion:',
+  'superclass',
+  'version',
+};
+
+final _logger = Logger('ffigen.code_generator.objc_interface');
+
+class ObjCInterface extends BindingType {
+  ObjCInterface? superType;
+  final methods = <String, ObjCMethod>{};
+  bool filled = false;
+
+  final String lookupName;
+  final ObjCBuiltInFunctions builtInFunctions;
+  late final ObjCInternalGlobal _classObject;
+  late final ObjCInternalGlobal _isKindOfClass;
+  late final Func _isKindOfClassMsgSend;
+
+  ObjCInterface({
+    String? usr,
+    required String originalName,
+    String? name,
+    String? lookupName,
+    String? dartDoc,
+    required this.builtInFunctions,
+  })  : lookupName = lookupName ?? originalName,
+        super(
+          usr: usr,
+          originalName: originalName,
+          name: name ?? originalName,
+          dartDoc: dartDoc,
+        ) {
+    builtInFunctions.registerInterface(this);
+  }
+
+  bool get isNSString => originalName == "NSString";
+  bool get isNSData => originalName == "NSData";
+
+  @override
+  BindingString toBindingString(Writer w) {
+    String paramsToString(List<ObjCMethodParam> params,
+        {required bool isStatic}) {
+      final List<String> stringParams = [];
+
+      if (isStatic) {
+        stringParams.add('${w.className} _lib');
+      }
+      stringParams.addAll(params.map((p) =>
+          (_getConvertedType(p.type, w, name) +
+              (p.isNullable ? "? " : " ") +
+              p.name)));
+      return '(${stringParams.join(", ")})';
+    }
+
+    final s = StringBuffer();
+    if (dartDoc != null) {
+      s.write(makeDartDoc(dartDoc!));
+    }
+
+    final uniqueNamer = UniqueNamer({name, '_id', '_lib'});
+    final natLib = w.className;
+
+    builtInFunctions.ensureUtilsExist(w, s);
+    final objType = PointerType(objCObjectType).getCType(w);
+
+    // Class declaration.
+    s.write('''
+class $name extends ${superType?.name ?? '_ObjCWrapper'} {
+  $name._($objType id, $natLib lib,
+      {bool retain = false, bool release = false}) :
+          super._(id, lib, retain: retain, release: release);
+
+  /// Returns a [$name] that points to the same underlying object as [other].
+  static $name castFrom<T extends _ObjCWrapper>(T other) {
+    return $name._(other._id, other._lib, retain: true, release: true);
+  }
+
+  /// Returns a [$name] that wraps the given raw object pointer.
+  static $name castFromPointer($natLib lib, $objType other,
+      {bool retain = false, bool release = false}) {
+    return $name._(other, lib, retain: retain, release: release);
+  }
+
+  /// Returns whether [obj] is an instance of [$name].
+  static bool isInstance(_ObjCWrapper obj) {
+    return obj._lib.${_isKindOfClassMsgSend.name}(
+        obj._id, obj._lib.${_isKindOfClass.name},
+        obj._lib.${_classObject.name});
+  }
+
+''');
+
+    if (isNSString) {
+      builtInFunctions.generateNSStringUtils(w, s);
+    }
+
+    // Methods.
+    for (final m in methods.values) {
+      final methodName = m._getDartMethodName(uniqueNamer);
+      final isStatic = m.isClass;
+      final returnType = m.returnType;
+
+      // The method declaration.
+      if (m.dartDoc != null) {
+        s.write(makeDartDoc(m.dartDoc!));
+      }
+
+      s.write('  ');
+      if (isStatic) {
+        s.write('static ');
+        s.write(
+            _getConvertedReturnType(returnType, w, name, m.isNullableReturn));
+
+        switch (m.kind) {
+          case ObjCMethodKind.method:
+            // static returnType methodName(NativeLibrary _lib, ...)
+            s.write(' $methodName');
+            break;
+          case ObjCMethodKind.propertyGetter:
+            // static returnType getMethodName(NativeLibrary _lib)
+            s.write(' get');
+            s.write(methodName[0].toUpperCase() + methodName.substring(1));
+            break;
+          case ObjCMethodKind.propertySetter:
+            // static void setMethodName(NativeLibrary _lib, ...)
+            s.write(' set');
+            s.write(methodName[0].toUpperCase() + methodName.substring(1));
+            break;
+        }
+        s.write(paramsToString(m.params, isStatic: true));
+      } else {
+        if (superType?.methods[m.originalName]?.sameAs(m) ?? false) {
+          s.write('@override\n  ');
+        }
+        switch (m.kind) {
+          case ObjCMethodKind.method:
+            // returnType methodName(...)
+            s.write(_getConvertedReturnType(
+                returnType, w, name, m.isNullableReturn));
+            s.write(' $methodName');
+            s.write(paramsToString(m.params, isStatic: false));
+            break;
+          case ObjCMethodKind.propertyGetter:
+            // returnType get methodName
+            s.write(_getConvertedReturnType(
+                returnType, w, name, m.isNullableReturn));
+            s.write(' get $methodName');
+            break;
+          case ObjCMethodKind.propertySetter:
+            // set methodName(...)
+            s.write(' set $methodName');
+            s.write(paramsToString(m.params, isStatic: false));
+            break;
+        }
+      }
+
+      s.write(' {\n');
+
+      // Implementation.
+      final convertReturn = m.kind != ObjCMethodKind.propertySetter &&
+          _needsConverting(returnType);
+
+      if (returnType != NativeType(SupportedNativeType.Void)) {
+        s.write('    ${convertReturn ? 'final _ret = ' : 'return '}');
+      }
+      s.write('_lib.${m.msgSend!.name}(');
+      s.write(isStatic ? '_lib.${_classObject.name}' : '_id');
+      s.write(', _lib.${m.selObject!.name}');
+      for (final p in m.params) {
+        s.write(', ${_doArgConversion(p)}');
+      }
+      s.write(');\n');
+      if (convertReturn) {
+        final result = _doReturnConversion(returnType, '_ret', name, '_lib',
+            m.isNullableReturn, m.isOwnedReturn);
+        s.write('    return $result;');
+      }
+
+      s.write('  }\n\n');
+    }
+
+    s.write('}\n\n');
+
+    if (isNSString) {
+      builtInFunctions.generateStringUtils(w, s);
+    }
+
+    return BindingString(
+        type: BindingStringType.objcInterface, string: s.toString());
+  }
+
+  @override
+  void addDependencies(Set<Binding> dependencies) {
+    if (dependencies.contains(this)) return;
+    dependencies.add(this);
+    builtInFunctions.addDependencies(dependencies);
+
+    _classObject = ObjCInternalGlobal(
+        '_class_$originalName',
+        (Writer w) => '${builtInFunctions.getClass.name}("$lookupName")',
+        builtInFunctions.getClass)
+      ..addDependencies(dependencies);
+    _isKindOfClass = builtInFunctions.getSelObject('isKindOfClass:');
+    _isKindOfClassMsgSend = builtInFunctions.getMsgSendFunc(
+        BooleanType(), [ObjCMethodParam(PointerType(objCObjectType), 'clazz')]);
+
+    if (isNSString) {
+      _addNSStringMethods();
+    }
+
+    if (isNSData) {
+      _addNSDataMethods();
+    }
+
+    if (superType != null) {
+      superType!.addDependencies(dependencies);
+      _copyClassMethodsFromSuperType();
+    }
+
+    for (final m in methods.values) {
+      m.addDependencies(dependencies, builtInFunctions);
+    }
+  }
+
+  void _copyClassMethodsFromSuperType() {
+    // Copy class methods from the super type, because Dart classes don't
+    // inherit static methods.
+    for (final m in superType!.methods.values) {
+      if (m.isClass &&
+          !_excludedNSObjectClassMethods.contains(m.originalName)) {
+        addMethod(m);
+      }
+    }
+  }
+
+  void addMethod(ObjCMethod method) {
+    final oldMethod = methods[method.originalName];
+    if (oldMethod != null) {
+      // Typically we ignore duplicate methods. However, property setters and
+      // getters are duplicated in the AST. One copy is marked with
+      // ObjCMethodKind.propertyGetter/Setter. The other copy is missing
+      // important information, and is a plain old instanceMethod. So if the
+      // existing method is an instanceMethod, and the new one is a property,
+      // override it.
+      if (method.isProperty && !oldMethod.isProperty) {
+        // Fallthrough.
+      } else if (!method.isProperty && oldMethod.isProperty) {
+        // Don't override, but also skip the same method check below.
+        return;
+      } else {
+        // Check duplicate is the same method.
+        if (!method.sameAs(oldMethod)) {
+          _logger.severe('Duplicate methods with different signatures: '
+              '$originalName.${method.originalName}');
+        }
+        return;
+      }
+    }
+    methods[method.originalName] = method;
+  }
+
+  void _addNSStringMethods() {
+    addMethod(ObjCMethod(
+      originalName: 'stringWithCharacters:length:',
+      kind: ObjCMethodKind.method,
+      isClass: true,
+      returnType: this,
+      params_: [
+        ObjCMethodParam(PointerType(wCharType), 'characters'),
+        ObjCMethodParam(unsignedIntType, 'length'),
+      ],
+    ));
+    addMethod(ObjCMethod(
+      originalName: 'dataUsingEncoding:',
+      kind: ObjCMethodKind.method,
+      isClass: false,
+      returnType: builtInFunctions.nsData,
+      params_: [
+        ObjCMethodParam(unsignedIntType, 'encoding'),
+      ],
+    ));
+    addMethod(ObjCMethod(
+      originalName: 'length',
+      kind: ObjCMethodKind.propertyGetter,
+      isClass: false,
+      returnType: unsignedIntType,
+      params_: [],
+    ));
+  }
+
+  void _addNSDataMethods() {
+    addMethod(ObjCMethod(
+      originalName: 'bytes',
+      kind: ObjCMethodKind.propertyGetter,
+      isClass: false,
+      returnType: PointerType(voidType),
+      params_: [],
+    ));
+  }
+
+  @override
+  String getCType(Writer w) => PointerType(objCObjectType).getCType(w);
+
+  bool _isObject(Type type) =>
+      type is PointerType && type.child == objCObjectType;
+
+  bool _isInstanceType(Type type) =>
+      type is Typealias &&
+      type.originalName == strings.objcInstanceType &&
+      _isObject(type.type);
+
+  // Utils for converting between the internal types passed to native code, and
+  // the external types visible to the user. For example, ObjCInterfaces are
+  // passed to native as Pointer<ObjCObject>, but the user sees the Dart wrapper
+  // class. These methods need to be kept in sync.
+  bool _needsConverting(Type type) =>
+      type is ObjCInterface ||
+      type is ObjCBlock ||
+      _isObject(type) ||
+      _isInstanceType(type);
+
+  String _getConvertedType(Type type, Writer w, String enclosingClass) {
+    if (type is BooleanType) return 'bool';
+    if (type is ObjCInterface) return type.name;
+    if (type is ObjCBlock) return type.name;
+    if (_isObject(type)) return 'NSObject';
+    if (_isInstanceType(type)) return enclosingClass;
+    return type.getDartType(w);
+  }
+
+  String _getConvertedReturnType(
+      Type type, Writer w, String enclosingClass, bool isNullableReturn) {
+    final result = _getConvertedType(type, w, enclosingClass);
+    if (isNullableReturn) {
+      return "$result?";
+    }
+    return result;
+  }
+
+  String _doArgConversion(ObjCMethodParam arg) {
+    if (arg.type is ObjCInterface ||
+        _isObject(arg.type) ||
+        _isInstanceType(arg.type) ||
+        arg.type is ObjCBlock) {
+      if (arg.isNullable) {
+        return '${arg.name}?._id ?? ffi.nullptr';
+      } else {
+        return '${arg.name}._id';
+      }
+    }
+    return arg.name;
+  }
+
+  String _doReturnConversion(Type type, String value, String enclosingClass,
+      String library, bool isNullable, bool isOwnedReturn) {
+    final prefix = isNullable ? '$value.address == 0 ? null : ' : '';
+    final ownerFlags = 'retain: ${!isOwnedReturn}, release: true';
+    if (type is ObjCInterface) {
+      return '$prefix${type.name}._($value, $library, $ownerFlags)';
+    }
+    if (type is ObjCBlock) {
+      return '$prefix${type.name}._($value, $library)';
+    }
+    if (_isObject(type)) {
+      return '${prefix}NSObject._($value, $library, $ownerFlags)';
+    }
+    if (_isInstanceType(type)) {
+      return '$prefix$enclosingClass._($value, $library, $ownerFlags)';
+    }
+    return prefix + value;
+  }
+}
+
+enum ObjCMethodKind {
+  method,
+  propertyGetter,
+  propertySetter,
+}
+
+class ObjCProperty {
+  final String originalName;
+  String? dartName;
+
+  ObjCProperty(this.originalName);
+}
+
+class ObjCMethod {
+  final String? dartDoc;
+  final String originalName;
+  final ObjCProperty? property;
+  final Type returnType;
+  final bool isNullableReturn;
+  final List<ObjCMethodParam> params;
+  final ObjCMethodKind kind;
+  final bool isClass;
+  bool returnsRetained = false;
+  ObjCInternalGlobal? selObject;
+  Func? msgSend;
+
+  ObjCMethod({
+    required this.originalName,
+    this.property,
+    this.dartDoc,
+    required this.kind,
+    required this.isClass,
+    required this.returnType,
+    this.isNullableReturn = false,
+    List<ObjCMethodParam>? params_,
+  }) : params = params_ ?? [];
+
+  bool get isProperty =>
+      kind == ObjCMethodKind.propertyGetter ||
+      kind == ObjCMethodKind.propertySetter;
+
+  void addDependencies(
+      Set<Binding> dependencies, ObjCBuiltInFunctions builtInFunctions) {
+    returnType.addDependencies(dependencies);
+    for (final p in params) {
+      p.type.addDependencies(dependencies);
+    }
+    selObject ??= builtInFunctions.getSelObject(originalName)
+      ..addDependencies(dependencies);
+    msgSend ??= builtInFunctions.getMsgSendFunc(returnType, params)
+      ..addDependencies(dependencies);
+  }
+
+  String _getDartMethodName(UniqueNamer uniqueNamer) {
+    if (property != null) {
+      // A getter and a setter are allowed to have the same name, so we can't
+      // just run the name through uniqueNamer. Instead they need to share
+      // the dartName, which is run through uniqueNamer.
+      if (property!.dartName == null) {
+        property!.dartName = uniqueNamer.makeUnique(property!.originalName);
+      }
+      return property!.dartName!;
+    }
+    // Objective C methods can look like:
+    // foo
+    // foo:
+    // foo:someArgName:
+    // So replace all ':' with '_'.
+    return uniqueNamer.makeUnique(originalName.replaceAll(":", "_"));
+  }
+
+  bool sameAs(ObjCMethod other) {
+    if (originalName != other.originalName) return false;
+    if (isNullableReturn != other.isNullableReturn) return false;
+    if (kind != other.kind) return false;
+    if (isClass != other.isClass) return false;
+    // msgSend is deduped by signature, so this check covers the signature.
+    return msgSend == other.msgSend;
+  }
+
+  static final _copyRegExp = RegExp('[cC]opy');
+  bool get isOwnedReturn =>
+      returnsRetained ||
+      originalName.startsWith('new') ||
+      originalName.startsWith('alloc') ||
+      originalName.contains(_copyRegExp);
+}
+
+class ObjCMethodParam {
+  final Type type;
+  final String name;
+  final bool isNullable;
+  ObjCMethodParam(this.type, this.name, {this.isNullable = false});
+}
diff --git a/pkgs/ffigen/lib/src/code_generator/pointer.dart b/pkgs/ffigen/lib/src/code_generator/pointer.dart
new file mode 100644
index 0000000..cacb5b2
--- /dev/null
+++ b/pkgs/ffigen/lib/src/code_generator/pointer.dart
@@ -0,0 +1,63 @@
+// Copyright (c) 2022, 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 'package:ffigen/src/code_generator.dart';
+
+import 'writer.dart';
+
+/// Represents a pointer.
+class PointerType extends Type {
+  final Type child;
+  PointerType(this.child);
+
+  @override
+  void addDependencies(Set<Binding> dependencies) {
+    child.addDependencies(dependencies);
+  }
+
+  @override
+  Type get baseType => child.baseType;
+
+  @override
+  String getCType(Writer w) =>
+      '${w.ffiLibraryPrefix}.Pointer<${child.getCType(w)}>';
+
+  @override
+  String toString() => '$child*';
+
+  @override
+  String cacheKey() => '${child.cacheKey()}*';
+}
+
+/// Represents a constant array, which has a fixed size.
+class ConstantArray extends PointerType {
+  final int length;
+  ConstantArray(this.length, Type child) : super(child);
+
+  @override
+  Type get baseArrayType => child.baseArrayType;
+
+  @override
+  bool get isIncompleteCompound => baseArrayType.isIncompleteCompound;
+
+  @override
+  String toString() => '$child[$length]';
+
+  @override
+  String cacheKey() => '${child.cacheKey()}[$length]';
+}
+
+/// Represents an incomplete array, which has an unknown size.
+class IncompleteArray extends PointerType {
+  IncompleteArray(Type child) : super(child);
+
+  @override
+  Type get baseArrayType => child.baseArrayType;
+
+  @override
+  String toString() => '$child[]';
+
+  @override
+  String cacheKey() => '${child.cacheKey()}[]';
+}
diff --git a/pkgs/ffigen/lib/src/code_generator/struc.dart b/pkgs/ffigen/lib/src/code_generator/struct.dart
similarity index 84%
rename from pkgs/ffigen/lib/src/code_generator/struc.dart
rename to pkgs/ffigen/lib/src/code_generator/struct.dart
index 4f06369..c65e04b 100644
--- a/pkgs/ffigen/lib/src/code_generator/struc.dart
+++ b/pkgs/ffigen/lib/src/code_generator/struct.dart
@@ -28,23 +28,25 @@
 ///
 /// }
 /// ```
-class Struc extends Compound {
-  Struc({
+class Struct extends Compound {
+  Struct({
     String? usr,
     String? originalName,
     required String name,
-    bool isInComplete = false,
+    bool isIncomplete = false,
     int? pack,
     String? dartDoc,
     List<Member>? members,
+    bool isInternal = false,
   }) : super(
           usr: usr,
           originalName: originalName,
           name: name,
           dartDoc: dartDoc,
-          isInComplete: isInComplete,
+          isIncomplete: isIncomplete,
           members: members,
           pack: pack,
           compoundType: CompoundType.struct,
+          isInternal: isInternal,
         );
 }
diff --git a/pkgs/ffigen/lib/src/code_generator/type.dart b/pkgs/ffigen/lib/src/code_generator/type.dart
index ba16841..8468eca 100644
--- a/pkgs/ffigen/lib/src/code_generator/type.dart
+++ b/pkgs/ffigen/lib/src/code_generator/type.dart
@@ -6,382 +6,115 @@
 
 import 'writer.dart';
 
-class _SubType {
-  final String c;
-  final String dart;
-
-  const _SubType({required this.c, required this.dart});
-}
-
-enum SupportedNativeType {
-  Void,
-  Char,
-  Int8,
-  Int16,
-  Int32,
-  Int64,
-  Uint8,
-  Uint16,
-  Uint32,
-  Uint64,
-  Float,
-  Double,
-  IntPtr,
-}
-
-/// The basic types in which all types can be broadly classified into.
-enum BroadType {
-  Boolean,
-  NativeType,
-  Pointer,
-  Compound,
-  NativeFunction,
-
-  /// Represents a function type.
-  FunctionType,
-
-  /// Represents a typealias.
-  Typealias,
-
-  /// Represents a Dart_Handle.
-  Handle,
-
-  Enum,
-
-  /// Represents an Array type.
-  ConstantArray,
-  IncompleteArray,
-
-  /// Used as a marker, so that declarations having these can exclude them.
-  Unimplemented,
-}
-
 /// Type class for return types, variable types, etc.
-class Type {
-  static const _primitives = <SupportedNativeType, _SubType>{
-    SupportedNativeType.Void: _SubType(c: 'Void', dart: 'void'),
-    SupportedNativeType.Char: _SubType(c: 'Uint8', dart: 'int'),
-    SupportedNativeType.Int8: _SubType(c: 'Int8', dart: 'int'),
-    SupportedNativeType.Int16: _SubType(c: 'Int16', dart: 'int'),
-    SupportedNativeType.Int32: _SubType(c: 'Int32', dart: 'int'),
-    SupportedNativeType.Int64: _SubType(c: 'Int64', dart: 'int'),
-    SupportedNativeType.Uint8: _SubType(c: 'Uint8', dart: 'int'),
-    SupportedNativeType.Uint16: _SubType(c: 'Uint16', dart: 'int'),
-    SupportedNativeType.Uint32: _SubType(c: 'Uint32', dart: 'int'),
-    SupportedNativeType.Uint64: _SubType(c: 'Uint64', dart: 'int'),
-    SupportedNativeType.Float: _SubType(c: 'Float', dart: 'double'),
-    SupportedNativeType.Double: _SubType(c: 'Double', dart: 'double'),
-    SupportedNativeType.IntPtr: _SubType(c: 'IntPtr', dart: 'int'),
-  };
-
-  /// Enum type is mapped to [SupportedNativeType.Int32].
-  static const enumNativeType = SupportedNativeType.Int32;
-
-  /// Reference to the [Compound] binding this type refers to.
-  Compound? compound;
-
-  /// Reference to the [NativeFunc] this type refers to.
-  NativeFunc? nativeFunc;
-
-  /// Reference to the [Typealias] this type refers to.
-  Typealias? typealias;
-
-  /// Reference to the [FunctionType] this type refers to.
-  FunctionType? functionType;
-
-  /// Reference to the [EnumClass] this type refers to.
-  EnumClass? enumClass;
-
-  /// For providing [SupportedNativeType] only.
-  final SupportedNativeType? nativeType;
-
-  /// The BroadType of this Type.
-  final BroadType broadType;
-
-  /// Child Type, e.g Pointer(Parent) to Int(Child), or Child Type of an Array.
-  final Type? child;
-
-  /// For ConstantArray and IncompleteArray type.
-  final int? length;
-
-  /// For storing cursor type info for an unimplemented type.
-  String? unimplementedReason;
-
-  Type._({
-    required this.broadType,
-    this.child,
-    this.compound,
-    this.enumClass,
-    this.nativeType,
-    this.nativeFunc,
-    this.typealias,
-    this.functionType,
-    this.length,
-    this.unimplementedReason,
-  });
-
-  factory Type.pointer(Type child) {
-    return Type._(broadType: BroadType.Pointer, child: child);
-  }
-  factory Type.compound(Compound compound) {
-    return Type._(broadType: BroadType.Compound, compound: compound);
-  }
-  factory Type.struct(Struc struc) {
-    return Type._(broadType: BroadType.Compound, compound: struc);
-  }
-  factory Type.union(Union union) {
-    return Type._(broadType: BroadType.Compound, compound: union);
-  }
-  factory Type.enumClass(EnumClass enumClass) {
-    return Type._(broadType: BroadType.Enum, enumClass: enumClass);
-  }
-  factory Type.functionType(FunctionType functionType) {
-    return Type._(
-        broadType: BroadType.FunctionType, functionType: functionType);
-  }
-  factory Type.nativeFunc(NativeFunc nativeFunc) {
-    return Type._(broadType: BroadType.NativeFunction, nativeFunc: nativeFunc);
-  }
-  factory Type.typealias(Typealias typealias) {
-    return Type._(broadType: BroadType.Typealias, typealias: typealias);
-  }
-  factory Type.nativeType(SupportedNativeType nativeType) {
-    return Type._(broadType: BroadType.NativeType, nativeType: nativeType);
-  }
-  factory Type.constantArray(int length, Type elementType) {
-    return Type._(
-      broadType: BroadType.ConstantArray,
-      child: elementType,
-      length: length,
-    );
-  }
-  factory Type.incompleteArray(Type elementType) {
-    return Type._(
-      broadType: BroadType.IncompleteArray,
-      child: elementType,
-    );
-  }
-  factory Type.boolean() {
-    return Type._(
-      broadType: BroadType.Boolean,
-    );
-  }
-  factory Type.unimplemented(String reason) {
-    return Type._(
-        broadType: BroadType.Unimplemented, unimplementedReason: reason);
-  }
-  factory Type.handle() {
-    return Type._(broadType: BroadType.Handle);
-  }
+///
+/// Implementers should extend either Type, or BindingType if the type is also a
+/// binding, and override at least getCType and toString.
+abstract class Type {
+  const Type();
 
   /// Get all dependencies of this type and save them in [dependencies].
-  void addDependencies(Set<Binding> dependencies) {
-    switch (broadType) {
-      case BroadType.Compound:
-        return compound!.addDependencies(dependencies);
-      case BroadType.NativeFunction:
-        return nativeFunc!.addDependencies(dependencies);
-      case BroadType.FunctionType:
-        return functionType!.addDependencies(dependencies);
-      case BroadType.Typealias:
-        return typealias!.addDependencies(dependencies);
-      case BroadType.Enum:
-        return enumClass!.addDependencies(dependencies);
-      default:
-        if (child != null) {
-          return child!.addDependencies(dependencies);
-        }
-    }
-  }
+  void addDependencies(Set<Binding> dependencies) {}
 
   /// Get base type for any type.
   ///
   /// E.g int** has base [Type] of int.
   /// double[2][3] has base [Type] of double.
-  Type getBaseType() {
-    if (child != null) {
-      return child!.getBaseType();
-    } else {
-      return this;
-    }
-  }
+  Type get baseType => this;
 
   /// Get base Array type.
   ///
   /// Returns itself if it's not an Array Type.
-  Type getBaseArrayType() {
-    if (broadType == BroadType.ConstantArray ||
-        broadType == BroadType.IncompleteArray) {
-      return child!.getBaseArrayType();
-    } else {
-      return this;
-    }
-  }
+  Type get baseArrayType => this;
 
   /// Get base typealias type.
   ///
   /// Returns itself if it's not a Typealias.
-  Type getBaseTypealiasType() {
-    if (broadType == BroadType.Typealias) {
-      return typealias!.type.getBaseTypealiasType();
-    } else {
-      return this;
-    }
-  }
-
-  /// Function to check if the dart and C type string are same.
-  bool sameDartAndCType(Writer w) => getCType(w) == getDartType(w);
+  Type get typealiasType => this;
 
   /// Returns true if the type is a [Compound] and is incomplete.
-  bool get isIncompleteCompound {
-    final baseTypealiasType = getBaseTypealiasType();
-    if (baseTypealiasType == this) {
-      return (broadType == BroadType.Compound &&
-              compound != null &&
-              compound!.isInComplete) ||
-          (broadType == BroadType.ConstantArray &&
-              getBaseArrayType().isIncompleteCompound);
-    } else {
-      return baseTypealiasType.isIncompleteCompound;
-    }
-  }
+  bool get isIncompleteCompound => false;
 
-  String getCType(Writer w) {
-    switch (broadType) {
-      case BroadType.NativeType:
-        return '${w.ffiLibraryPrefix}.${_primitives[nativeType!]!.c}';
-      case BroadType.Pointer:
-        return '${w.ffiLibraryPrefix}.Pointer<${child!.getCType(w)}>';
-      case BroadType.Compound:
-        return compound!.name;
-      case BroadType.Enum:
-        return '${w.ffiLibraryPrefix}.${_primitives[enumNativeType]!.c}';
-      case BroadType.NativeFunction:
-        return '${w.ffiLibraryPrefix}.NativeFunction<${nativeFunc!.type.getCType(w)}>';
-      case BroadType
-          .IncompleteArray: // Array parameters are treated as Pointers in C.
-        return '${w.ffiLibraryPrefix}.Pointer<${child!.getCType(w)}>';
-      case BroadType
-          .ConstantArray: // Array parameters are treated as Pointers in C.
-        return '${w.ffiLibraryPrefix}.Pointer<${child!.getCType(w)}>';
-      case BroadType.Boolean: // Booleans are treated as uint8.
-        return '${w.ffiLibraryPrefix}.${_primitives[SupportedNativeType.Uint8]!.c}';
-      case BroadType.Handle:
-        return '${w.ffiLibraryPrefix}.Handle';
-      case BroadType.FunctionType:
-        return functionType!.getCType(w);
-      case BroadType.Typealias:
-        return typealias!.name;
-      case BroadType.Unimplemented:
-        throw UnimplementedError('C type unknown for ${broadType.toString()}');
-    }
-  }
+  /// Returns the C type of the Type. This is the FFI compatible type that is
+  /// passed to native code.
+  String getCType(Writer w) => throw 'No mapping for type: $this';
 
-  String getDartType(Writer w) {
-    switch (broadType) {
-      case BroadType.NativeType:
-        return _primitives[nativeType!]!.dart;
-      case BroadType.Pointer:
-        return '${w.ffiLibraryPrefix}.Pointer<${child!.getCType(w)}>';
-      case BroadType.Compound:
-        return compound!.name;
-      case BroadType.Enum:
-        return _primitives[enumNativeType]!.dart;
-      case BroadType.NativeFunction:
-        return '${w.ffiLibraryPrefix}.NativeFunction<${nativeFunc!.type.getDartType(w)}>';
-      case BroadType
-          .IncompleteArray: // Array parameters are treated as Pointers in C.
-        return '${w.ffiLibraryPrefix}.Pointer<${child!.getCType(w)}>';
-      case BroadType
-          .ConstantArray: // Array parameters are treated as Pointers in C.
-        return '${w.ffiLibraryPrefix}.Pointer<${child!.getCType(w)}>';
-      case BroadType.Boolean: // Booleans are treated as uint8.
-        return _primitives[SupportedNativeType.Uint8]!.dart;
-      case BroadType.Handle:
-        return 'Object';
-      case BroadType.FunctionType:
-        return functionType!.getDartType(w);
-      case BroadType.Typealias:
-        // Typealias cannot be used by name in Dart types unless both the C and
-        // Dart type of the underlying types are same.
-        if (typealias!.type.sameDartAndCType(w)) {
-          return typealias!.name;
-        } else {
-          return typealias!.type.getDartType(w);
-        }
-      case BroadType.Unimplemented:
-        throw UnimplementedError(
-            'dart type unknown for ${broadType.toString()}');
-    }
-  }
+  /// Returns the Dart type of the Type. This is the user visible type that is
+  /// passed to Dart code.
+  String getDartType(Writer w) => getCType(w);
+
+  /// Returns the string representation of the Type, for debugging purposes
+  /// only. This string should not be printed as generated code.
+  @override
+  String toString();
+
+  /// Cache key used in various places to dedupe Types. By default this is just
+  /// the hash of the Type, but in many cases this does not dedupe sufficiently.
+  /// So Types that may be duplicated should override this to return a more
+  /// specific key. Types that are already deduped don't need to override this.
+  /// toString() is not a valid cache key as there may be name collisions.
+  String cacheKey() => hashCode.toRadixString(36);
+
+  /// Returns a string of code that creates a default value for this type. For
+  /// example, for int types this returns the string '0'. A null return means
+  /// that default values aren't supported for this type, eg void.
+  String? getDefaultValue(Writer w, String nativeLib) => null;
+}
+
+/// Function to check if the dart and C type string are same.
+bool sameDartAndCType(Type t, Writer w) => t.getCType(w) == t.getDartType(w);
+
+/// Base class for all Type bindings.
+///
+/// Since Dart doesn't have multiple inheritance, this type exists so that we
+/// don't have to reimplement the default methods in all the classes that want
+/// to extend both NoLookUpBinding and Type.
+abstract class BindingType extends NoLookUpBinding implements Type {
+  BindingType({
+    String? usr,
+    String? originalName,
+    required String name,
+    String? dartDoc,
+    bool isInternal = false,
+  }) : super(
+          usr: usr,
+          originalName: originalName,
+          name: name,
+          dartDoc: dartDoc,
+          isInternal: isInternal,
+        );
 
   @override
-  String toString() {
-    return 'Type: $broadType';
-  }
+  Type get baseType => this;
+
+  @override
+  Type get baseArrayType => this;
+
+  @override
+  Type get typealiasType => this;
+
+  @override
+  bool get isIncompleteCompound => false;
+
+  @override
+  String getDartType(Writer w) => getCType(w);
+
+  @override
+  String toString() => originalName;
+
+  @override
+  String cacheKey() => hashCode.toRadixString(36);
+
+  @override
+  String? getDefaultValue(Writer w, String nativeLib) => null;
 }
 
-/// Represents a function type.
-class FunctionType {
-  final Type returnType;
-  final List<Parameter> parameters;
+/// Represents an unimplemented type. Used as a marker, so that declarations
+/// having these can exclude them.
+class UnimplementedType extends Type {
+  String reason;
+  UnimplementedType(this.reason);
 
-  FunctionType({
-    required this.returnType,
-    required this.parameters,
-  });
-
-  String getCType(Writer w, {bool writeArgumentNames = true}) {
-    final sb = StringBuffer();
-
-    // Write return Type.
-    sb.write(returnType.getCType(w));
-
-    // Write Function.
-    sb.write(' Function(');
-    sb.write(parameters.map<String>((p) {
-      return '${p.type.getCType(w)} ${writeArgumentNames ? p.name : ""}';
-    }).join(', '));
-    sb.write(')');
-
-    return sb.toString();
-  }
-
-  String getDartType(Writer w, {bool writeArgumentNames = true}) {
-    final sb = StringBuffer();
-
-    // Write return Type.
-    sb.write(returnType.getDartType(w));
-
-    // Write Function.
-    sb.write(' Function(');
-    sb.write(parameters.map<String>((p) {
-      return '${p.type.getDartType(w)} ${writeArgumentNames ? p.name : ""}';
-    }).join(', '));
-    sb.write(')');
-
-    return sb.toString();
-  }
-
-  void addDependencies(Set<Binding> dependencies) {
-    returnType.addDependencies(dependencies);
-    for (final p in parameters) {
-      p.type.addDependencies(dependencies);
-    }
-  }
-}
-
-/// Represents a NativeFunction<Function>.
-class NativeFunc {
-  final Type type;
-
-  NativeFunc.fromFunctionType(FunctionType functionType)
-      : type = Type.functionType(functionType);
-
-  NativeFunc.fromFunctionTypealias(Typealias typealias)
-      : type = Type.typealias(typealias);
-
-  void addDependencies(Set<Binding> dependencies) {
-    type.addDependencies(dependencies);
-  }
+  @override
+  String toString() => '(Unimplemented: $reason)';
 }
diff --git a/pkgs/ffigen/lib/src/code_generator/typealias.dart b/pkgs/ffigen/lib/src/code_generator/typealias.dart
index ea8ef95..6a47f61 100644
--- a/pkgs/ffigen/lib/src/code_generator/typealias.dart
+++ b/pkgs/ffigen/lib/src/code_generator/typealias.dart
@@ -14,7 +14,7 @@
 /// typedef $name = $type;
 /// );
 /// ```
-class Typealias extends NoLookUpBinding {
+class Typealias extends BindingType {
   final Type type;
   final bool _useDartType;
 
@@ -29,12 +29,14 @@
     ///
     /// E.g if C type is ffi.Void func(ffi.Int32), Dart type is void func(int).
     bool useDartType = false,
+    bool isInternal = false,
   })  : _useDartType = useDartType,
         super(
           usr: usr,
           name: name,
           dartDoc: dartDoc,
           originalName: originalName,
+          isInternal: isInternal,
         );
 
   @override
@@ -51,9 +53,36 @@
     if (dartDoc != null) {
       sb.write(makeDartDoc(dartDoc!));
     }
-    sb.write(
-        'typedef $name = ${_useDartType ? type.getDartType(w) : type.getCType(w)};\n');
+    sb.write('typedef $name = ');
+    sb.write('${_useDartType ? type.getDartType(w) : type.getCType(w)};\n');
     return BindingString(
         type: BindingStringType.typeDef, string: sb.toString());
   }
+
+  @override
+  Type get typealiasType => type.typealiasType;
+
+  @override
+  bool get isIncompleteCompound => type.isIncompleteCompound;
+
+  @override
+  String getCType(Writer w) => name;
+
+  @override
+  String getDartType(Writer w) {
+    // Typealias cannot be used by name in Dart types unless both the C and Dart
+    // type of the underlying types are same.
+    if (sameDartAndCType(type, w)) {
+      return name;
+    } else {
+      return type.getDartType(w);
+    }
+  }
+
+  @override
+  String cacheKey() => type.cacheKey();
+
+  @override
+  String? getDefaultValue(Writer w, String nativeLib) =>
+      type.getDefaultValue(w, nativeLib);
 }
diff --git a/pkgs/ffigen/lib/src/code_generator/union.dart b/pkgs/ffigen/lib/src/code_generator/union.dart
index a8a0861..fc7be96 100644
--- a/pkgs/ffigen/lib/src/code_generator/union.dart
+++ b/pkgs/ffigen/lib/src/code_generator/union.dart
@@ -32,7 +32,7 @@
     String? usr,
     String? originalName,
     required String name,
-    bool isInComplete = false,
+    bool isIncomplete = false,
     int? pack,
     String? dartDoc,
     List<Member>? members,
@@ -41,7 +41,7 @@
           originalName: originalName,
           name: name,
           dartDoc: dartDoc,
-          isInComplete: isInComplete,
+          isIncomplete: isIncomplete,
           members: members,
           pack: pack,
           compoundType: CompoundType.union,
diff --git a/pkgs/ffigen/lib/src/code_generator/utils.dart b/pkgs/ffigen/lib/src/code_generator/utils.dart
index c000bdf..5c18c7f 100644
--- a/pkgs/ffigen/lib/src/code_generator/utils.dart
+++ b/pkgs/ffigen/lib/src/code_generator/utils.dart
@@ -15,6 +15,11 @@
   ///
   /// Adds the resulting name to the used names by default.
   String makeUnique(String name, [bool addToUsedUpNames = true]) {
+    // For example, nested structures/unions may not have a name
+    if (name.isEmpty) {
+      name = 'unnamed';
+    }
+
     var crName = name;
     var i = 1;
     while (_usedUpNames.contains(crName)) {
diff --git a/pkgs/ffigen/lib/src/code_generator/writer.dart b/pkgs/ffigen/lib/src/code_generator/writer.dart
index 2b9a0c9..d20db66 100644
--- a/pkgs/ffigen/lib/src/code_generator/writer.dart
+++ b/pkgs/ffigen/lib/src/code_generator/writer.dart
@@ -2,9 +2,13 @@
 // 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 'package:ffigen/src/code_generator.dart';
 import 'package:ffigen/src/code_generator/utils.dart';
+import 'package:logging/logging.dart';
 
-import 'binding.dart';
+import '../strings.dart' as strings;
+
+final _logger = Logger('ffigen.code_generator.writer');
 
 /// To store generated String bindings.
 class Writer {
@@ -13,6 +17,9 @@
   /// Holds bindings, which lookup symbols.
   final List<Binding> lookUpBindings;
 
+  /// Holds bindings, which lookup symbols through `FfiNative`.
+  final List<Binding> ffiNativeBindings;
+
   /// Holds bindings which don't lookup symbols.
   final List<Binding> noLookUpBindings;
 
@@ -20,10 +27,37 @@
   final symbolAddressWriter = SymbolAddressWriter();
 
   late String _className;
+  String get className => _className;
+
   final String? classDocComment;
 
-  late String _ffiLibraryPrefix;
-  String get ffiLibraryPrefix => _ffiLibraryPrefix;
+  String? _ffiLibraryPrefix;
+  String get ffiLibraryPrefix {
+    if (_ffiLibraryPrefix != null) {
+      return _ffiLibraryPrefix!;
+    }
+
+    final import = _usedImports.firstWhere(
+        (element) => element.name == ffiImport.name,
+        orElse: () => ffiImport);
+    _usedImports.add(import);
+    return _ffiLibraryPrefix = import.prefix;
+  }
+
+  String? _ffiPkgLibraryPrefix;
+  String get ffiPkgLibraryPrefix {
+    if (_ffiPkgLibraryPrefix != null) {
+      return _ffiPkgLibraryPrefix!;
+    }
+
+    final import = _usedImports.firstWhere(
+        (element) => element.name == ffiPkgImport.name,
+        orElse: () => ffiPkgImport);
+    _usedImports.add(import);
+    return _ffiPkgLibraryPrefix = import.prefix;
+  }
+
+  final Set<LibraryImport> _usedImports = {};
 
   late String _lookupFuncIdentifier;
   String get lookupFuncIdentifier => _lookupFuncIdentifier;
@@ -32,8 +66,6 @@
   late String _symbolAddressVariableName;
   late String _symbolAddressLibraryVarName;
 
-  final bool dartBool;
-
   /// Initial namers set after running constructor. Namers are reset to this
   /// initial state everytime [generate] is called.
   late UniqueNamer _initialTopLevelUniqueNamer, _initialWrapperLevelUniqueNamer;
@@ -48,13 +80,19 @@
   /// Guaranteed to be a unique prefix.
   String get arrayHelperClassPrefix => _arrayHelperClassPrefix;
 
+  /// Set true after calling [generate]. Indicates if
+  /// [generateSymbolOutputYamlMap] can be called.
+  bool get canGenerateSymbolOutput => _canGenerateSymbolOutput;
+  bool _canGenerateSymbolOutput = false;
+
   /// [_usedUpNames] should contain names of all the declarations which are
   /// already used. This is used to avoid name collisions.
   Writer({
     required this.lookUpBindings,
+    required this.ffiNativeBindings,
     required this.noLookUpBindings,
     required String className,
-    required this.dartBool,
+    Set<LibraryImport>? additionalImports,
     this.classDocComment,
     this.header,
   }) {
@@ -75,12 +113,19 @@
       markUsed: [_initialWrapperLevelUniqueNamer, _initialTopLevelUniqueNamer],
     );
 
-    /// [_ffiLibraryPrefix] should be unique unique among all names.
-    _ffiLibraryPrefix = _resolveNameConflict(
-      name: 'ffi',
-      makeUnique: allLevelsUniqueNamer,
-      markUsed: [_initialWrapperLevelUniqueNamer, _initialTopLevelUniqueNamer],
-    );
+    /// Library imports prefix should be unique unique among all names.
+    if (additionalImports != null) {
+      for (final lib in additionalImports) {
+        lib.prefix = _resolveNameConflict(
+          name: lib.prefix,
+          makeUnique: allLevelsUniqueNamer,
+          markUsed: [
+            _initialWrapperLevelUniqueNamer,
+            _initialTopLevelUniqueNamer
+          ],
+        );
+      }
+    }
 
     /// [_lookupFuncIdentifier] should be unique in top level.
     _lookupFuncIdentifier = _resolveNameConflict(
@@ -143,26 +188,34 @@
     _wrapperLevelUniqueNamer = _initialWrapperLevelUniqueNamer.clone();
   }
 
+  void markImportUsed(LibraryImport import) {
+    _usedImports.add(import);
+  }
+
   /// Writes all bindings to a String.
   String generate() {
     final s = StringBuffer();
 
+    // We write the source first to determine which imports are actually
+    // referenced. Headers and [s] are then combined into the final result.
+    final result = StringBuffer();
+
     // Reset unique namers to initial state.
     _resetUniqueNamersNamers();
 
     // Write file header (if any).
     if (header != null) {
-      s.write(header);
-      s.write('\n');
+      result.writeln(header);
     }
 
     // Write auto generated declaration.
-    s.write(makeDoc(
+    result.write(makeDoc(
         'AUTO GENERATED FILE, DO NOT EDIT.\n\nGenerated by `package:ffigen`.'));
 
-    // Write neccesary imports.
-    s.write("import 'dart:ffi' as $ffiLibraryPrefix;\n");
-    s.write('\n');
+    // Write lint ignore if not specified by user already.
+    if (!RegExp(r'ignore_for_file:\s*type\s*=\s*lint').hasMatch(header ?? '')) {
+      result.write(makeDoc('ignore_for_file: type=lint'));
+    }
 
     /// Write [lookUpBindings].
     if (lookUpBindings.isNotEmpty) {
@@ -197,6 +250,10 @@
       s.write('}\n\n');
     }
 
+    for (final b in ffiNativeBindings) {
+      s.write(b.toBindingString(this).string);
+    }
+
     if (symbolAddressWriter.shouldGenerate) {
       s.write(symbolAddressWriter.writeClass(this));
     }
@@ -206,7 +263,62 @@
       s.write(b.toBindingString(this).string);
     }
 
-    return s.toString();
+    // Write neccesary imports.
+    for (final lib in _usedImports) {
+      result
+        ..write("import '${lib.importPath}' as ${lib.prefix};")
+        ..write('\n');
+    }
+    result.write(s);
+
+    _canGenerateSymbolOutput = true;
+    return result.toString();
+  }
+
+  Map<String, dynamic> generateSymbolOutputYamlMap(String importFilePath) {
+    final bindings = <Binding>[
+      ...noLookUpBindings,
+      ...ffiNativeBindings,
+      ...lookUpBindings
+    ];
+    if (!canGenerateSymbolOutput) {
+      throw Exception(
+          "Invalid state: generateSymbolOutputYamlMap() called before generate()");
+    }
+    final result = <String, dynamic>{};
+
+    result[strings.formatVersion] = strings.symbolFileFormatVersion;
+    result[strings.files] = <String, dynamic>{};
+    result[strings.files][importFilePath] = <String, dynamic>{};
+
+    final fileConfig = result[strings.files][importFilePath];
+    fileConfig[strings.usedConfig] = <String, dynamic>{};
+
+    // Warn for macros.
+    final hasMacroBindings = bindings.any(
+        (element) => element is Constant && element.usr.contains('@macro@'));
+    if (hasMacroBindings) {
+      _logger.info(
+          'Removing all Macros from symbol file since they cannot be cross referenced reliably.');
+    }
+    // Remove internal bindings and macros.
+    bindings.removeWhere((element) {
+      return element.isInternal ||
+          (element is Constant && element.usr.contains('@macro@'));
+    });
+    // Sort bindings alphabetically by USR.
+    bindings.sort((a, b) => a.usr.compareTo(b.usr));
+    fileConfig[strings.usedConfig][strings.ffiNative] = bindings
+        .whereType<Func>()
+        .any((element) => element.ffiNativeConfig.enabled);
+    fileConfig[strings.symbols] = <String, dynamic>{};
+    final symbolConfig = fileConfig[strings.symbols];
+    for (final binding in bindings) {
+      symbolConfig[binding.usr] = {
+        strings.name: binding.name,
+      };
+    }
+    return result;
   }
 }
 
diff --git a/pkgs/ffigen/lib/src/config_provider/config.dart b/pkgs/ffigen/lib/src/config_provider/config.dart
index 88d5d8d..e012e56 100644
--- a/pkgs/ffigen/lib/src/config_provider/config.dart
+++ b/pkgs/ffigen/lib/src/config_provider/config.dart
@@ -4,10 +4,11 @@
 
 /// Validates the yaml input by the user, prints useful info for the user
 
-import 'package:ffigen/src/code_generator.dart';
-import 'package:ffigen/src/header_parser/type_extractor/cxtypekindmap.dart';
+import 'dart:io';
 
+import 'package:ffigen/src/code_generator.dart';
 import 'package:logging/logging.dart';
+import 'package:package_config/package_config_types.dart';
 import 'package:yaml/yaml.dart';
 
 import '../strings.dart' as strings;
@@ -18,15 +19,32 @@
 
 /// Provides configurations to other modules.
 ///
-/// Handles validation, extraction of confiurations from yaml file.
+/// Handles validation, extraction of configurations from a yaml file.
 class Config {
+  /// Input filename.
+  String? get filename => _filename;
+  String? _filename;
+
+  /// Package config.
+  PackageConfig? get packageConfig => _packageConfig;
+  PackageConfig? _packageConfig;
+
   /// Location for llvm/lib folder.
   String get libclangDylib => _libclangDylib;
   late String _libclangDylib;
 
-  /// output file name.
+  /// Output file name.
   String get output => _output;
   late String _output;
+
+  /// Symbol file config.
+  SymbolFile? get symbolFile => _symbolFile;
+  late SymbolFile? _symbolFile;
+
+  /// Language that ffigen is consuming.
+  Language get language => _language;
+  late Language _language;
+
   // Holds headers and filters for header.
   Headers get headers => _headers;
   late Headers _headers;
@@ -67,6 +85,15 @@
   Declaration get typedefs => _typedefs;
   late Declaration _typedefs;
 
+  /// Declaration config for Objective C interfaces.
+  Declaration get objcInterfaces => _objcInterfaces;
+  late Declaration _objcInterfaces;
+
+  /// If enabled, the default behavior of all declaration filters is to exclude
+  /// everything, rather than include everything.
+  bool get excludeAllByDefault => _excludeAllByDefault;
+  late bool _excludeAllByDefault;
+
   /// If generated bindings should be sorted alphabetically.
   bool get sort => _sort;
   late bool _sort;
@@ -75,10 +102,30 @@
   bool get useSupportedTypedefs => _useSupportedTypedefs;
   late bool _useSupportedTypedefs;
 
-  /// Stores typedef name to NativeType mappings specified by user.
-  Map<String, SupportedNativeType> get typedefNativeTypeMappings =>
-      _typedefNativeTypeMappings;
-  late Map<String, SupportedNativeType> _typedefNativeTypeMappings;
+  /// Stores all the library imports specified by user including those for ffi
+  /// and pkg_ffi.
+  Map<String, LibraryImport> get libraryImports => _libraryImports;
+  late Map<String, LibraryImport> _libraryImports;
+
+  /// Stores all the symbol file maps name to ImportedType mappings specified by user.
+  Map<String, ImportedType> get usrTypeMappings => _usrTypeMappings;
+  late Map<String, ImportedType> _usrTypeMappings;
+
+  /// Stores typedef name to ImportedType mappings specified by user.
+  Map<String, ImportedType> get typedefTypeMappings => _typedefTypeMappings;
+  late Map<String, ImportedType> _typedefTypeMappings;
+
+  /// Stores struct name to ImportedType mappings specified by user.
+  Map<String, ImportedType> get structTypeMappings => _structTypeMappings;
+  late Map<String, ImportedType> _structTypeMappings;
+
+  /// Stores union name to ImportedType mappings specified by user.
+  Map<String, ImportedType> get unionTypeMappings => _unionTypeMappings;
+  late Map<String, ImportedType> _unionTypeMappings;
+
+  /// Stores native int name to ImportedType mappings specified by user.
+  Map<String, ImportedType> get nativeTypeMappings => _nativeTypeMappings;
+  late Map<String, ImportedType> _nativeTypeMappings;
 
   /// Extracted Doc comment type.
   CommentType get commentType => _commentType;
@@ -96,9 +143,9 @@
   StructPackingOverride get structPackingOverride => _structPackingOverride;
   late StructPackingOverride _structPackingOverride;
 
-  /// If dart bool should be generated for C booleans.
-  bool get dartBool => _dartBool;
-  late bool _dartBool;
+  /// Module prefixes for ObjC interfaces.
+  ObjCModulePrefixer get objcModulePrefixer => _objcModulePrefixer;
+  late ObjCModulePrefixer _objcModulePrefixer;
 
   /// Name of the wrapper class.
   String get wrapperName => _wrapperName;
@@ -122,12 +169,16 @@
   Includer get leafFunctions => _leafFunctions;
   late Includer _leafFunctions;
 
-  Config._();
+  FfiNativeConfig get ffiNativeConfig => _ffiNativeConfig;
+  late FfiNativeConfig _ffiNativeConfig;
+
+  Config._(this._filename, this._packageConfig);
 
   /// Create config from Yaml map.
-  factory Config.fromYaml(YamlMap map) {
-    final configspecs = Config._();
-    _logger.finest('Config Map: ' + map.toString());
+  factory Config.fromYaml(YamlMap map,
+      {String? filename, PackageConfig? packageConfig}) {
+    final configspecs = Config._(filename, packageConfig);
+    _logger.finest('Config Map: $map');
 
     final specs = configspecs._getSpecs();
 
@@ -140,6 +191,15 @@
     return configspecs;
   }
 
+  /// Create config from a file.
+  factory Config.fromFile(File file, {PackageConfig? packageConfig}) {
+    // Throws a [YamlException] if it's unable to parse the Yaml.
+    final configYaml = loadYaml(file.readAsStringSync()) as YamlMap;
+
+    return Config.fromYaml(configYaml,
+        filename: file.path, packageConfig: packageConfig);
+  }
+
   /// Add compiler options for clang. If [highPriority] is true these are added
   /// to the front of the list.
   void addCompilerOpts(String compilerOpts, {bool highPriority = false}) {
@@ -153,28 +213,22 @@
 
   /// Validates Yaml according to given specs.
   bool _checkConfigs(YamlMap map, Map<List<String>, Specification> specs) {
-    var _result = true;
+    var result = true;
     for (final key in specs.keys) {
       final spec = specs[key];
       if (checkKeyInYaml(key, map)) {
-        _result =
-            _result && spec!.validator(key, getKeyValueFromYaml(key, map));
+        result = result && spec!.validator(key, getKeyValueFromYaml(key, map));
       } else if (spec!.requirement == Requirement.yes) {
         _logger.severe("Key '$key' is required.");
-        _result = false;
+        result = false;
       } else if (spec.requirement == Requirement.prefer) {
         _logger.warning("Prefer adding Key '$key' to your config.");
       }
     }
     // Warn about unknown keys.
-    for (final key in map.keys) {
-      final specString = specs.keys.map((e) => e.join(':')).toSet();
-      if (!specString.contains(key)) {
-        _logger.warning("Unknown key '$key' found.");
-      }
-    }
+    warnUnknownKeys(specs.keys.toList(), map);
 
-    return _result;
+    return result;
   }
 
   /// Extracts variables from Yaml according to given specs.
@@ -205,16 +259,27 @@
           _libclangDylib = result as String;
         },
       ),
-      [strings.output]: Specification<String>(
+      [strings.output]: Specification<OutputConfig>(
         requirement: Requirement.yes,
         validator: outputValidator,
-        extractor: outputExtractor,
-        extractedResult: (dynamic result) => _output = result as String,
+        extractor: (dynamic value) =>
+            outputExtractor(value, filename, packageConfig),
+        extractedResult: (dynamic result) {
+          _output = (result as OutputConfig).output;
+          _symbolFile = result.symbolFile;
+        },
+      ),
+      [strings.language]: Specification<Language>(
+        requirement: Requirement.no,
+        validator: languageValidator,
+        extractor: languageExtractor,
+        defaultValue: () => Language.c,
+        extractedResult: (dynamic result) => _language = result as Language,
       ),
       [strings.headers]: Specification<Headers>(
         requirement: Requirement.yes,
         validator: headersValidator,
-        extractor: headersExtractor,
+        extractor: (dynamic value) => headersExtractor(value, filename),
         extractedResult: (dynamic result) => _headers = result as Headers,
       ),
       [strings.compilerOpts]: Specification<List<String>>(
@@ -305,25 +370,89 @@
           _typedefs = result as Declaration;
         },
       ),
-      [strings.sizemap]: Specification<Map<int, SupportedNativeType>>(
-        validator: sizemapValidator,
-        extractor: sizemapExtractor,
-        defaultValue: () => <int, SupportedNativeType>{},
+      [strings.objcInterfaces]: Specification<Declaration>(
+        requirement: Requirement.no,
+        validator: declarationConfigValidator,
+        extractor: declarationConfigExtractor,
+        defaultValue: () => Declaration(),
         extractedResult: (dynamic result) {
-          final map = result as Map<int, SupportedNativeType>;
-          for (final key in map.keys) {
-            if (cxTypeKindToSupportedNativeTypes.containsKey(key)) {
-              cxTypeKindToSupportedNativeTypes[key] = map[key]!;
-            }
-          }
+          _objcInterfaces = result as Declaration;
         },
       ),
-      [strings.typedefmap]: Specification<Map<String, SupportedNativeType>>(
-        validator: typedefmapValidator,
-        extractor: typedefmapExtractor,
-        defaultValue: () => <String, SupportedNativeType>{},
-        extractedResult: (dynamic result) => _typedefNativeTypeMappings =
-            result as Map<String, SupportedNativeType>,
+      [strings.objcInterfaces, strings.objcModule]:
+          Specification<Map<String, String>>(
+        requirement: Requirement.no,
+        validator: stringStringMapValidator,
+        extractor: stringStringMapExtractor,
+        defaultValue: () => <String, String>{},
+        extractedResult: (dynamic result) => _objcModulePrefixer =
+            ObjCModulePrefixer(result as Map<String, String>),
+      ),
+      [strings.libraryImports]: Specification<Map<String, LibraryImport>>(
+        validator: libraryImportsValidator,
+        extractor: libraryImportsExtractor,
+        defaultValue: () => <String, LibraryImport>{},
+        extractedResult: (dynamic result) {
+          _libraryImports = result as Map<String, LibraryImport>;
+        },
+      ),
+      [strings.import, strings.symbolFilesImport]:
+          Specification<Map<String, ImportedType>>(
+        validator: symbolFileImportValidator,
+        extractor: (value) => symbolFileImportExtractor(
+            value, _libraryImports, filename, packageConfig),
+        defaultValue: () => <String, ImportedType>{},
+        extractedResult: (dynamic result) {
+          _usrTypeMappings = result as Map<String, ImportedType>;
+        },
+      ),
+      [strings.typeMap, strings.typeMapTypedefs]:
+          Specification<Map<String, List<String>>>(
+        validator: typeMapValidator,
+        extractor: typeMapExtractor,
+        defaultValue: () => <String, List<String>>{},
+        extractedResult: (dynamic result) {
+          _typedefTypeMappings = makeImportTypeMapping(
+              result as Map<String, List<String>>, _libraryImports);
+        },
+      ),
+      [strings.typeMap, strings.typeMapStructs]:
+          Specification<Map<String, List<String>>>(
+        validator: typeMapValidator,
+        extractor: typeMapExtractor,
+        defaultValue: () => <String, List<String>>{},
+        extractedResult: (dynamic result) {
+          _structTypeMappings = makeImportTypeMapping(
+              result as Map<String, List<String>>, _libraryImports);
+        },
+      ),
+      [strings.typeMap, strings.typeMapUnions]:
+          Specification<Map<String, List<String>>>(
+        validator: typeMapValidator,
+        extractor: typeMapExtractor,
+        defaultValue: () => <String, List<String>>{},
+        extractedResult: (dynamic result) {
+          _unionTypeMappings = makeImportTypeMapping(
+              result as Map<String, List<String>>, _libraryImports);
+        },
+      ),
+      [strings.typeMap, strings.typeMapNativeTypes]:
+          Specification<Map<String, List<String>>>(
+        validator: typeMapValidator,
+        extractor: typeMapExtractor,
+        defaultValue: () => <String, List<String>>{},
+        extractedResult: (dynamic result) {
+          _nativeTypeMappings = makeImportTypeMapping(
+              result as Map<String, List<String>>, _libraryImports);
+        },
+      ),
+      [strings.excludeAllByDefault]: Specification<bool>(
+        requirement: Requirement.no,
+        validator: booleanValidator,
+        extractor: booleanExtractor,
+        defaultValue: () => false,
+        extractedResult: (dynamic result) =>
+            _excludeAllByDefault = result as bool,
       ),
       [strings.sort]: Specification<bool>(
         requirement: Requirement.no,
@@ -375,13 +504,6 @@
         extractedResult: (dynamic result) =>
             _structPackingOverride = result as StructPackingOverride,
       ),
-      [strings.dartBool]: Specification<bool>(
-        requirement: Requirement.no,
-        validator: booleanValidator,
-        extractor: booleanExtractor,
-        defaultValue: () => true,
-        extractedResult: (dynamic result) => _dartBool = result as bool,
-      ),
       [strings.name]: Specification<String>(
         requirement: Requirement.prefer,
         validator: dartClassNameValidator,
@@ -427,6 +549,14 @@
         extractedResult: (dynamic result) =>
             _leafFunctions = result as Includer,
       ),
+      [strings.ffiNative]: Specification<FfiNativeConfig>(
+        requirement: Requirement.no,
+        validator: ffiNativeValidator,
+        extractor: ffiNativeExtractor,
+        defaultValue: () => FfiNativeConfig(enabled: false),
+        extractedResult: (dynamic result) =>
+            _ffiNativeConfig = result as FfiNativeConfig,
+      )
     };
   }
 }
diff --git a/pkgs/ffigen/lib/src/config_provider/config_types.dart b/pkgs/ffigen/lib/src/config_provider/config_types.dart
index d973013..8521bdb 100644
--- a/pkgs/ffigen/lib/src/config_provider/config_types.dart
+++ b/pkgs/ffigen/lib/src/config_provider/config_types.dart
@@ -9,6 +9,8 @@
 
 import 'path_finder.dart';
 
+enum Language { c, objc }
+
 class CommentType {
   CommentStyle style;
   CommentLength length;
@@ -27,6 +29,7 @@
 }
 
 enum CommentStyle { doxygen, any }
+
 enum CommentLength { none, brief, full }
 
 enum CompoundDependencies { full, opaque }
@@ -153,7 +156,8 @@
       _memberRenamer.rename(declaration, member);
 
   /// Checks if a name is allowed by a filter.
-  bool shouldInclude(String name) => _includer.shouldInclude(name);
+  bool shouldInclude(String name, bool excludeAllByDefault) =>
+      _includer.shouldInclude(name, excludeAllByDefault);
 
   /// Checks if the symbol address should be included for this name.
   bool shouldIncludeSymbolAddress(String name) =>
@@ -232,7 +236,7 @@
   /// Returns true if [name] is allowed.
   ///
   /// Exclude overrides include.
-  bool shouldInclude(String name) {
+  bool shouldInclude(String name, [bool excludeAllByDefault = false]) {
     if (_excludeFull.contains(name)) {
       return false;
     }
@@ -258,7 +262,8 @@
     if (_includeMatchers.isNotEmpty || _includeFull.isNotEmpty) {
       return false;
     } else {
-      return true;
+      // Otherwise, fall back to the default behavior for empty filters.
+      return !excludeAllByDefault;
     }
   }
 }
@@ -368,3 +373,53 @@
     return [];
   }
 }
+
+class _ObjCModulePrefixerEntry {
+  final RegExp pattern;
+  final String moduleName;
+
+  _ObjCModulePrefixerEntry(this.pattern, this.moduleName);
+}
+
+/// Handles applying module prefixes to ObjC classes.
+class ObjCModulePrefixer {
+  final _prefixes = <_ObjCModulePrefixerEntry>[];
+
+  ObjCModulePrefixer(Map<String, String> prefixes) {
+    for (final entry in prefixes.entries) {
+      _prefixes.add(_ObjCModulePrefixerEntry(RegExp(entry.key), entry.value));
+    }
+  }
+
+  /// If any of the prefixing patterns match, applies that module prefix.
+  /// Otherwise returns the class name unmodified.
+  String applyPrefix(String className) {
+    for (final entry in _prefixes) {
+      if (quiver.matchesFull(entry.pattern, className)) {
+        return '${entry.moduleName}.$className';
+      }
+    }
+    return className;
+  }
+}
+
+class FfiNativeConfig {
+  final bool enabled;
+  final String? asset;
+
+  const FfiNativeConfig({required this.enabled, this.asset});
+}
+
+class SymbolFile {
+  final String importPath;
+  final String output;
+
+  SymbolFile(this.importPath, this.output);
+}
+
+class OutputConfig {
+  final String output;
+  final SymbolFile? symbolFile;
+
+  OutputConfig(this.output, this.symbolFile);
+}
diff --git a/pkgs/ffigen/lib/src/config_provider/path_finder.dart b/pkgs/ffigen/lib/src/config_provider/path_finder.dart
index 3f6a597..715e1ac 100644
--- a/pkgs/ffigen/lib/src/config_provider/path_finder.dart
+++ b/pkgs/ffigen/lib/src/config_provider/path_finder.dart
@@ -20,7 +20,7 @@
       '/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include';
   if (Directory(systemHeaders).existsSync()) {
     _logger.fine('Added $systemHeaders to compiler-opts.');
-    includePaths.add('-I' + systemHeaders);
+    includePaths.add('-I$systemHeaders');
   }
 
   /// Find headers from XCode or LLVM installed via brew.
@@ -39,7 +39,7 @@
         final path = p.join(searchPath, version, 'include');
         if (Directory(path).existsSync()) {
           _logger.fine('Added stdlib path: $path to compiler-opts.');
-          includePaths.add('-I' + path);
+          includePaths.add('-I$path');
           return includePaths;
         }
       }
@@ -51,7 +51,7 @@
       '/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Kernel.framework/Headers/';
   if (Directory(cmdLineToolHeaders).existsSync()) {
     _logger.fine('Added stdlib path: $cmdLineToolHeaders to compiler-opts.');
-    includePaths.add('-I' + cmdLineToolHeaders);
+    includePaths.add('-I$cmdLineToolHeaders');
     return includePaths;
   }
 
diff --git a/pkgs/ffigen/lib/src/config_provider/spec_utils.dart b/pkgs/ffigen/lib/src/config_provider/spec_utils.dart
index 22a6e1a..dfe6bbf 100644
--- a/pkgs/ffigen/lib/src/config_provider/spec_utils.dart
+++ b/pkgs/ffigen/lib/src/config_provider/spec_utils.dart
@@ -5,9 +5,11 @@
 import 'dart:io';
 
 import 'package:ffigen/src/code_generator.dart';
+import 'package:ffigen/src/code_generator/utils.dart';
 import 'package:file/local.dart';
 import 'package:glob/glob.dart';
 import 'package:logging/logging.dart';
+import 'package:package_config/package_config.dart';
 import 'package:path/path.dart' as p;
 import 'package:quiver/pattern.dart' as quiver;
 import 'package:yaml/yaml.dart';
@@ -26,6 +28,16 @@
   }
 }
 
+/// Replaces the path separators according to current platform. If a relative
+/// path is passed in, it is resolved relative to the config path, and the
+/// absolute path is returned.
+String _normalizePath(String path, String? configFilename) {
+  final skipNormalization =
+      (configFilename == null) || p.isAbsolute(path) || path.startsWith("**");
+  return _replaceSeparators(
+      skipNormalization ? path : p.join(p.dirname(configFilename), path));
+}
+
 /// Checks if type of value is [T], logs an error if it's not.
 ///
 /// [key] is printed as `'item1 -> item2 => item3'` in log message.
@@ -49,7 +61,8 @@
       return false;
     }
   }
-  return last != null;
+  // The entry for the last key may be null.
+  return true;
 }
 
 /// Extracts value of nested [key] from [map].
@@ -65,71 +78,257 @@
   return null;
 }
 
+/// Recursively checks the keys in [configKeyMap] from [allowedKeyList].
+void warnUnknownKeys(List<List<String>> allowedKeyList, YamlMap configKeyMap) {
+  final allowedKeyMap = <String, dynamic>{};
+  for (final specKeys in allowedKeyList) {
+    var item = allowedKeyMap;
+    for (final specSubKey in specKeys) {
+      item.putIfAbsent(specSubKey, () => <String, dynamic>{});
+      item = item[specSubKey] as Map<String, dynamic>;
+    }
+    // Add empty key to mark that any sub-keys of this key are allowed.
+    item[''] = <String, dynamic>{};
+  }
+  _warnUnknownKeysInMap(allowedKeyMap, configKeyMap, <dynamic>[]);
+}
+
+/// Recursive function to check a key set in a configKeyMap.
+void _warnUnknownKeysInMap(Map<String, dynamic> allowedKeyMap,
+    dynamic configKeyMap, List<dynamic> prev) {
+  if (allowedKeyMap.containsKey('') || configKeyMap is! YamlMap) {
+    return;
+  }
+  for (final key in configKeyMap.keys) {
+    if (allowedKeyMap.containsKey(key)) {
+      prev.add(key);
+      _warnUnknownKeysInMap(
+          allowedKeyMap[key] as Map<String, dynamic>, configKeyMap[key], prev);
+      prev.removeLast();
+    } else {
+      prev.add(key);
+      _logger.warning('Unknown key - ${prev.join(' -> ')}.');
+      prev.removeLast();
+    }
+  }
+}
+
 bool booleanExtractor(dynamic value) => value as bool;
 
 bool booleanValidator(List<String> name, dynamic value) =>
     checkType<bool>(name, value);
 
-Map<int, SupportedNativeType> sizemapExtractor(dynamic yamlConfig) {
-  final resultMap = <int, SupportedNativeType>{};
-  final sizemap = yamlConfig as YamlMap?;
-  if (sizemap != null) {
-    for (final typeName in strings.sizemap_native_mapping.keys) {
-      if (sizemap.containsKey(typeName)) {
-        final cxTypeInt = strings.sizemap_native_mapping[typeName] as int;
-        final byteSize = sizemap[typeName] as int;
-        resultMap[cxTypeInt] = nativeSupportedType(byteSize,
-            signed: typeName.contains('unsigned') ? false : true);
-      }
+Map<String, LibraryImport> libraryImportsExtractor(dynamic yamlConfig) {
+  final resultMap = <String, LibraryImport>{};
+  final typeMap = yamlConfig as YamlMap?;
+  if (typeMap != null) {
+    for (final typeName in typeMap.keys) {
+      resultMap[typeName as String] =
+          LibraryImport(typeName, typeMap[typeName] as String);
     }
   }
   return resultMap;
 }
 
-bool sizemapValidator(List<String> name, dynamic yamlConfig) {
+bool libraryImportsValidator(List<String> name, dynamic yamlConfig) {
   if (!checkType<YamlMap>(name, yamlConfig)) {
     return false;
   }
   for (final key in (yamlConfig as YamlMap).keys) {
-    if (!strings.sizemap_native_mapping.containsKey(key)) {
-      _logger.warning("Unknown subkey '$key' in '$name'.");
+    if (!checkType<String>([...name, key as String], yamlConfig[key])) {
+      return false;
+    }
+    if (strings.predefinedLibraryImports.containsKey(key)) {
+      _logger.severe(
+          'library-import -> $key should not collide with any predefined imports - ${strings.predefinedLibraryImports.keys}.');
+      return false;
     }
   }
-
   return true;
 }
 
-Map<String, SupportedNativeType> typedefmapExtractor(dynamic yamlConfig) {
-  final resultMap = <String, SupportedNativeType>{};
-  final typedefmap = yamlConfig as YamlMap?;
-  if (typedefmap != null) {
-    for (final typeName in typedefmap.keys) {
-      if (typedefmap[typeName] is String &&
-          strings.supportedNativeType_mappings
-              .containsKey(typedefmap[typeName])) {
-        // Map this typename to specified supportedNativeType.
-        resultMap[typeName as String] =
-            strings.supportedNativeType_mappings[typedefmap[typeName]]!;
+void loadImportedTypes(YamlMap fileConfig,
+    Map<String, ImportedType> usrTypeMappings, LibraryImport libraryImport) {
+  final symbols = fileConfig['symbols'] as YamlMap;
+  for (final key in symbols.keys) {
+    final usr = key as String;
+    final value = symbols[usr]! as YamlMap;
+    usrTypeMappings[usr] = ImportedType(
+        libraryImport, value['name'] as String, value['name'] as String);
+  }
+}
+
+YamlMap loadSymbolFile(String symbolFilePath, String? configFileName,
+    PackageConfig? packageConfig) {
+  final path = symbolFilePath.startsWith('package:')
+      ? packageConfig!.resolve(Uri.parse(symbolFilePath))!.toFilePath()
+      : _normalizePath(symbolFilePath, configFileName);
+
+  return loadYaml(File(path).readAsStringSync()) as YamlMap;
+}
+
+Map<String, ImportedType> symbolFileImportExtractor(
+    dynamic yamlConfig,
+    Map<String, LibraryImport> libraryImports,
+    String? configFileName,
+    PackageConfig? packageConfig) {
+  final resultMap = <String, ImportedType>{};
+  for (final item in (yamlConfig as YamlList)) {
+    String symbolFilePath;
+    if (item is String) {
+      symbolFilePath = item;
+    } else {
+      symbolFilePath = item[strings.symbolFile] as String;
+    }
+    final symbolFile =
+        loadSymbolFile(symbolFilePath, configFileName, packageConfig);
+    final formatVersion = symbolFile[strings.formatVersion] as String;
+    if (formatVersion.split('.')[0] !=
+        strings.symbolFileFormatVersion.split('.')[0]) {
+      _logger.severe(
+          'Incompatible format versions for file $symbolFilePath: ${strings.symbolFileFormatVersion}(ours), $formatVersion(theirs).');
+      exit(1);
+    }
+    final uniqueNamer = UniqueNamer(libraryImports.keys
+        .followedBy([strings.defaultSymbolFileImportPrefix]).toSet());
+    for (final file in (symbolFile[strings.files] as YamlMap).keys) {
+      final existingImports =
+          libraryImports.values.where((element) => element.importPath == file);
+      if (existingImports.isEmpty) {
+        final name =
+            uniqueNamer.makeUnique(strings.defaultSymbolFileImportPrefix);
+        libraryImports[name] = LibraryImport(name, file as String);
       }
+      final libraryImport = libraryImports.values.firstWhere(
+        (element) => element.importPath == file,
+      );
+      loadImportedTypes(
+          symbolFile[strings.files][file] as YamlMap, resultMap, libraryImport);
     }
   }
   return resultMap;
 }
 
-bool typedefmapValidator(List<String> name, dynamic yamlConfig) {
+bool symbolFileImportValidator(List<String> name, dynamic yamlConfig) {
+  if (!checkType<YamlList>(name, yamlConfig)) {
+    return false;
+  }
+  var result = true;
+  (yamlConfig as YamlList).asMap().forEach((idx, value) {
+    if (value is YamlMap) {
+      if (!value.keys.contains(strings.symbolFile)) {
+        result = false;
+        _logger
+            .severe('Key $name -> $idx -> ${strings.symbolFile} is required.');
+      }
+      for (final key in value.keys) {
+        if (key == strings.symbolFile) {
+          if (!checkType<String>(
+              [...name, idx.toString(), key as String], value[key])) {
+            result = false;
+          }
+        } else {
+          result = false;
+          _logger.severe('Unknown key : $name -> $idx -> $key.');
+        }
+      }
+    } else if (value is! String) {
+      result = false;
+      _logger.severe('Expected $name -> $idx should be a String or Map.');
+    }
+  });
+  return result;
+}
+
+Map<String, List<String>> typeMapExtractor(dynamic yamlConfig) {
+  // Key - type_name, Value - [lib, cType, dartType].
+  final resultMap = <String, List<String>>{};
+  final typeMap = yamlConfig as YamlMap?;
+  if (typeMap != null) {
+    for (final typeName in typeMap.keys) {
+      final typeConfigItem = typeMap[typeName] as YamlMap;
+      resultMap[typeName as String] = [
+        typeConfigItem[strings.lib] as String,
+        typeConfigItem[strings.cType] as String,
+        typeConfigItem[strings.dartType] as String,
+      ];
+    }
+  }
+  return resultMap;
+}
+
+bool typeMapValidator(List<String> name, dynamic yamlConfig) {
   if (!checkType<YamlMap>(name, yamlConfig)) {
     return false;
   }
-  for (final value in (yamlConfig as YamlMap).values) {
-    if (value is! String ||
-        !strings.supportedNativeType_mappings.containsKey(value)) {
-      _logger.severe("Unknown value of subkey '$value' in '$name'.");
+  var result = true;
+  for (final key in (yamlConfig as YamlMap).keys) {
+    if (!checkType<YamlMap>([...name, key as String], yamlConfig[key])) {
+      return false;
+    }
+    final lib = (yamlConfig[key] as YamlMap).containsKey(strings.lib);
+    if (!lib) {
+      _logger.severe("Key '${strings.lib}' in $name -> $key is required.");
+      result = false;
+    }
+    final cType = (yamlConfig[key] as YamlMap).containsKey(strings.cType);
+    if (!cType) {
+      _logger.severe("Key '${strings.cType}' in $name -> $key is required.");
+      result = false;
+    }
+    final dartType = (yamlConfig[key] as YamlMap).containsKey(strings.dartType);
+    if (!dartType) {
+      _logger.severe("Key '${strings.dartType}' in $name -> $key is required.");
+      result = false;
     }
   }
+  return result;
+}
 
+Map<String, String> stringStringMapExtractor(dynamic yamlConfig) {
+  final resultMap = <String, String>{};
+  final inputMap = yamlConfig as YamlMap?;
+  if (inputMap != null) {
+    for (final key in inputMap.keys) {
+      resultMap[key as String] = inputMap[key] as String;
+    }
+  }
+  return resultMap;
+}
+
+bool stringStringMapValidator(List<String> name, dynamic yamlConfig) {
+  if (!checkType<YamlMap>(name, yamlConfig)) {
+    return false;
+  }
+  for (final key in (yamlConfig as YamlMap).keys) {
+    if (!checkType<String>([...name, key as String], yamlConfig[key])) {
+      return false;
+    }
+  }
   return true;
 }
 
+Map<String, ImportedType> makeImportTypeMapping(
+    Map<String, List<String>> rawTypeMappings,
+    Map<String, LibraryImport> libraryImportsMap) {
+  final typeMappings = <String, ImportedType>{};
+  for (final key in rawTypeMappings.keys) {
+    final lib = rawTypeMappings[key]![0];
+    final cType = rawTypeMappings[key]![1];
+    final dartType = rawTypeMappings[key]![2];
+    if (strings.predefinedLibraryImports.containsKey(lib)) {
+      typeMappings[key] =
+          ImportedType(strings.predefinedLibraryImports[lib]!, cType, dartType);
+    } else if (libraryImportsMap.containsKey(lib)) {
+      typeMappings[key] =
+          ImportedType(libraryImportsMap[lib]!, cType, dartType);
+    } else {
+      throw Exception("Please declare $lib under library-imports.");
+    }
+  }
+  return typeMappings;
+}
+
 final _quoteMatcher = RegExp(r'''^["'](.*)["']$''', dotAll: true);
 final _cmdlineArgMatcher = RegExp(r'''['"](\\"|[^"])*?['"]|[^ ]+''');
 List<String> compilerOptsToList(String compilerOpts) {
@@ -180,7 +379,7 @@
 }
 
 bool compilerOptsAutoValidator(List<String> name, dynamic value) {
-  var _result = true;
+  var result = true;
 
   if (!checkType<YamlMap>(name, value)) {
     return false;
@@ -196,38 +395,38 @@
         if (inckey == strings.includeCStdLib) {
           if (!checkType<bool>(
               [...name, oskey, inckey as String], value[oskey][inckey])) {
-            _result = false;
+            result = false;
           }
         } else {
           _logger.severe("Unknown key '$inckey' in '$name -> $oskey.");
-          _result = false;
+          result = false;
         }
       }
     } else {
       _logger.severe("Unknown key '$oskey' in '$name'.");
-      _result = false;
+      result = false;
     }
   }
-  return _result;
+  return result;
 }
 
-Headers headersExtractor(dynamic yamlConfig) {
+Headers headersExtractor(dynamic yamlConfig, String? configFilename) {
   final entryPoints = <String>[];
   final includeGlobs = <quiver.Glob>[];
   for (final key in (yamlConfig as YamlMap).keys) {
     if (key == strings.entryPoints) {
       for (final h in (yamlConfig[key] as YamlList)) {
-        final headerGlob = h as String;
+        final headerGlob = _normalizePath(h as String, configFilename);
         // Add file directly to header if it's not a Glob but a File.
         if (File(headerGlob).existsSync()) {
-          final osSpecificPath = _replaceSeparators(headerGlob);
+          final osSpecificPath = headerGlob;
           entryPoints.add(osSpecificPath);
           _logger.fine('Adding header/file: $headerGlob');
         } else {
           final glob = Glob(headerGlob);
           for (final file in glob.listFileSystemSync(const LocalFileSystem(),
               followLinks: true)) {
-            final fixedPath = _replaceSeparators(file.path);
+            final fixedPath = file.path;
             entryPoints.add(fixedPath);
             _logger.fine('Adding header/file: $fixedPath');
           }
@@ -237,7 +436,8 @@
     if (key == strings.includeDirectives) {
       for (final h in (yamlConfig[key] as YamlList)) {
         final headerGlob = h as String;
-        includeGlobs.add(quiver.Glob(headerGlob));
+        final fixedGlob = _normalizePath(headerGlob, configFilename);
+        includeGlobs.add(quiver.Glob(fixedGlob));
       }
     }
   }
@@ -271,36 +471,6 @@
   }
 }
 
-String libclangDylibExtractor(dynamic value) => getDylibPath(value as String);
-
-bool libclangDylibValidator(List<String> name, dynamic value) {
-  if (!checkType<String>(name, value)) {
-    return false;
-  } else {
-    final dylibPath = getDylibPath(value as String);
-    if (!File(dylibPath).existsSync()) {
-      _logger.severe(
-          'Dynamic library: $dylibPath does not exist or is corrupt, input folder: $value.');
-      return false;
-    } else {
-      return true;
-    }
-  }
-}
-
-String getDylibPath(String dylibParentFoler) {
-  dylibParentFoler = _replaceSeparators(dylibParentFoler);
-  String dylibPath;
-  if (Platform.isMacOS) {
-    dylibPath = p.join(dylibParentFoler, strings.libclang_dylib_macos);
-  } else if (Platform.isWindows) {
-    dylibPath = p.join(dylibParentFoler, strings.libclang_dylib_windows);
-  } else {
-    dylibPath = p.join(dylibParentFoler, strings.libclang_dylib_linux);
-  }
-  return dylibPath;
-}
-
 /// Returns location of dynamic library by searching default locations. Logs
 /// error and throws an Exception if not found.
 String findDylibAtDefaultLocations() {
@@ -310,8 +480,28 @@
       k = findLibclangDylib(l);
       if (k != null) return k;
     }
+    Process.runSync('ldconfig', ['-p']);
+    final ldConfigResult = Process.runSync('ldconfig', ['-p']);
+    if (ldConfigResult.exitCode == 0) {
+      final lines = (ldConfigResult.stdout as String).split('\n');
+      final paths = [
+        for (final line in lines)
+          if (line.contains('libclang')) line.split(' => ')[1],
+      ];
+      for (final location in paths) {
+        if (File(location).existsSync()) {
+          return location;
+        }
+      }
+    }
   } else if (Platform.isWindows) {
-    for (final l in strings.windowsDylibLocations) {
+    final dylibLocations = strings.windowsDylibLocations.toList();
+    final userHome = Platform.environment['USERPROFILE'];
+    if (userHome != null) {
+      dylibLocations
+          .add(p.join(userHome, 'scoop', 'apps', 'llvm', 'current', 'bin'));
+    }
+    for (final l in dylibLocations) {
       k = findLibclangDylib(l);
       if (k != null) return k;
     }
@@ -320,6 +510,23 @@
       k = findLibclangDylib(l);
       if (k != null) return k;
     }
+    final findLibraryResult =
+        Process.runSync('xcodebuild', ['-find-library', 'libclang.dylib']);
+    if (findLibraryResult.exitCode == 0) {
+      final location = (findLibraryResult.stdout as String).split('\n').first;
+      if (File(location).existsSync()) {
+        return location;
+      }
+    }
+    final xcodePathResult = Process.runSync('xcode-select', ['-print-path']);
+    if (xcodePathResult.exitCode == 0) {
+      final xcodePath = (xcodePathResult.stdout as String).split('\n').first;
+      final location =
+          p.join(xcodePath, strings.xcodeDylibLocation, strings.dylibFileName);
+      if (File(location).existsSync()) {
+        return location;
+      }
+    }
   } else {
     throw Exception('Unsupported Platform.');
   }
@@ -378,10 +585,118 @@
   return true;
 }
 
-String outputExtractor(dynamic value) => _replaceSeparators(value as String);
+OutputConfig outputExtractor(
+    dynamic value, String? configFilename, PackageConfig? packageConfig) {
+  if (value is String) {
+    return OutputConfig(_normalizePath(value, configFilename), null);
+  }
+  value = value as YamlMap;
+  return OutputConfig(
+    _normalizePath((value)[strings.bindings] as String, configFilename),
+    value.containsKey(strings.symbolFile)
+        ? symbolFileOutputExtractor(
+            value[strings.symbolFile], configFilename, packageConfig)
+        : null,
+  );
+}
 
-bool outputValidator(List<String> name, dynamic value) =>
-    checkType<String>(name, value);
+bool outputValidator(List<String> name, dynamic value) {
+  if (value is String) {
+    return true;
+  } else if (value is YamlMap) {
+    final keys = value.keys;
+    var result = true;
+    for (final key in keys) {
+      if (key == strings.bindings) {
+        if (!checkType<String>([...name, key as String], value[key])) {
+          result = false;
+        }
+      } else if (key == strings.symbolFile) {
+        result = symbolFileOutputValidator(
+            [...name, strings.symbolFile], value[key]);
+      } else {
+        result = false;
+        _logger.severe("Unknown key '$key' in '$name'.");
+      }
+    }
+    return result;
+  } else {
+    _logger.severe(
+        "Expected value of key '${name.join(' -> ')}' to be a String or Map.");
+    return false;
+  }
+}
+
+SymbolFile symbolFileOutputExtractor(
+    dynamic value, String? configFilename, PackageConfig? packageConfig) {
+  value = value as YamlMap;
+  var output = value[strings.output] as String;
+  if (Uri.parse(output).scheme != "package") {
+    _logger.warning(
+        'Consider using a Package Uri for ${strings.symbolFile} -> ${strings.output}: $output so that external packages can use it.');
+    output = _normalizePath(output, configFilename);
+  } else {
+    output = packageConfig!.resolve(Uri.parse(output))!.toFilePath();
+  }
+  final importPath = value[strings.importPath] as String;
+  if (Uri.parse(importPath).scheme != "package") {
+    _logger.warning(
+        'Consider using a Package Uri for ${strings.symbolFile} -> ${strings.importPath}: $importPath so that external packages can use it.');
+  }
+  return SymbolFile(importPath, output);
+}
+
+bool symbolFileOutputValidator(List<String> name, dynamic value) {
+  if (!checkType<YamlMap>(name, value)) {
+    return false;
+  }
+  if (!(value as YamlMap).containsKey(strings.output)) {
+    _logger.severe("Required '$name -> ${strings.output}'.");
+    return false;
+  }
+  if (!(value).containsKey(strings.importPath)) {
+    _logger.severe("Required '$name -> ${strings.importPath}'.");
+    return false;
+  }
+  for (final key in value.keys) {
+    if (key == strings.output || key == strings.importPath) {
+      if (!checkType<String>([...name, key as String], value[key])) {
+        return false;
+      }
+    } else {
+      _logger.severe("Unknown key '$key' in '$name'.");
+      return false;
+    }
+  }
+  return true;
+}
+
+Language languageExtractor(dynamic value) {
+  if (value == strings.langC) {
+    return Language.c;
+  } else if (value == strings.langObjC) {
+    return Language.objc;
+  }
+  return Language.c;
+}
+
+bool languageValidator(List<String> name, dynamic value) {
+  if (value is String) {
+    if (value == strings.langC) {
+      return true;
+    }
+    if (value == strings.langObjC) {
+      _logger.severe('Objective C support is EXPERIMENTAL. The API may change '
+          'in a breaking way without notice.');
+      return true;
+    }
+    _logger.severe("'$name' must be one of the following - "
+        "{${strings.langC}, ${strings.langObjC}}");
+    return false;
+  }
+  _logger.severe("Expected value of key '$name' to be a String.");
+  return false;
+}
 
 /// Returns true if [str] is not a full name.
 ///
@@ -505,41 +820,42 @@
 }
 
 bool declarationConfigValidator(List<String> name, dynamic value) {
-  var _result = true;
+  var result = true;
   if (value is YamlMap) {
     for (final key in value.keys) {
       if (key == strings.include || key == strings.exclude) {
         if (!checkType<YamlList>([...name, key as String], value[key])) {
-          _result = false;
+          result = false;
         }
       } else if (key == strings.rename) {
         if (!checkType<YamlMap>([...name, key as String], value[key])) {
-          _result = false;
+          result = false;
         } else {
-          for (final subkey in value[key].keys) {
+          for (final subkey in (value[key] as YamlMap).keys) {
             if (!checkType<String>(
                 [...name, key, subkey as String], value[key][subkey])) {
-              _result = false;
+              result = false;
             }
           }
         }
       } else if (key == strings.memberRename) {
         if (!checkType<YamlMap>([...name, key as String], value[key])) {
-          _result = false;
+          result = false;
         } else {
-          for (final declNameKey in value[key].keys) {
+          for (final declNameKey in (value[key] as YamlMap).keys) {
             if (!checkType<YamlMap>([...name, key, declNameKey as String],
                 value[key][declNameKey])) {
-              _result = false;
+              result = false;
             } else {
-              for (final memberNameKey in value[key][declNameKey].keys) {
+              for (final memberNameKey
+                  in ((value[key] as YamlMap)[declNameKey] as YamlMap).keys) {
                 if (!checkType<String>([
                   ...name,
                   key,
                   declNameKey,
                   memberNameKey as String,
                 ], value[key][declNameKey][memberNameKey])) {
-                  _result = false;
+                  result = false;
                 }
               }
             }
@@ -547,17 +863,17 @@
         }
       } else if (key == strings.symbolAddress) {
         if (!checkType<YamlMap>([...name, key as String], value[key])) {
-          _result = false;
+          result = false;
         } else {
-          for (final subkey in value[key].keys) {
+          for (final subkey in (value[key] as YamlMap).keys) {
             if (subkey == strings.include || subkey == strings.exclude) {
               if (!checkType<YamlList>(
                   [...name, key, subkey as String], value[key][subkey])) {
-                _result = false;
+                result = false;
               }
             } else {
               _logger.severe("Unknown key '$subkey' in '$name -> $key'.");
-              _result = false;
+              result = false;
             }
           }
         }
@@ -565,59 +881,59 @@
     }
   } else {
     _logger.severe("Expected value '$name' to be a Map.");
-    _result = false;
+    result = false;
   }
-  return _result;
+  return result;
 }
 
 Includer exposeFunctionTypeExtractor(dynamic value) =>
     _extractIncluderFromYaml(value);
 
 bool exposeFunctionTypeValidator(List<String> name, dynamic value) {
-  var _result = true;
+  var result = true;
 
   if (!checkType<YamlMap>(name, value)) {
-    _result = false;
+    result = false;
   } else {
     final mp = value as YamlMap;
     for (final key in mp.keys) {
       if (key == strings.include || key == strings.exclude) {
         if (!checkType<YamlList>([...name, key as String], value[key])) {
-          _result = false;
+          result = false;
         }
       } else {
         _logger.severe("Unknown subkey '$key' in '$name'.");
-        _result = false;
+        result = false;
       }
     }
   }
 
-  return _result;
+  return result;
 }
 
 Includer leafFunctionExtractor(dynamic value) =>
     _extractIncluderFromYaml(value);
 
 bool leafFunctionValidator(List<String> name, dynamic value) {
-  var _result = true;
+  var result = true;
 
   if (!checkType<YamlMap>(name, value)) {
-    _result = false;
+    result = false;
   } else {
     final mp = value as YamlMap;
     for (final key in mp.keys) {
       if (key == strings.include || key == strings.exclude) {
         if (!checkType<YamlList>([...name, key as String], value[key])) {
-          _result = false;
+          result = false;
         }
       } else {
         _logger.severe("Unknown subkey '$key' in '$name'.");
-        _result = false;
+        result = false;
       }
     }
   }
 
-  return _result;
+  return result;
 }
 
 SupportedNativeType nativeSupportedType(int value, {bool signed = true}) {
@@ -741,7 +1057,7 @@
 
 StructPackingOverride structPackingOverrideExtractor(dynamic value) {
   final matcherMap = <RegExp, int?>{};
-  for (final key in value.keys) {
+  for (final key in (value as YamlMap).keys) {
     matcherMap[RegExp(key as String, dotAll: true)] =
         strings.packingValuesMap[value[key]];
   }
@@ -749,19 +1065,48 @@
 }
 
 bool structPackingOverrideValidator(List<String> name, dynamic value) {
-  var _result = true;
+  var result = true;
 
   if (!checkType<YamlMap>([...name], value)) {
-    _result = false;
+    result = false;
   } else {
-    for (final key in value.keys) {
+    for (final key in (value as YamlMap).keys) {
       if (!(strings.packingValuesMap.keys.contains(value[key]))) {
         _logger.severe(
             "'$name -> $key' must be one of the following - ${strings.packingValuesMap.keys.toList()}");
-        _result = false;
+        result = false;
       }
     }
   }
 
-  return _result;
+  return result;
+}
+
+FfiNativeConfig ffiNativeExtractor(dynamic yamlConfig) {
+  final yamlMap = yamlConfig as YamlMap?;
+  return FfiNativeConfig(
+    enabled: true,
+    asset: yamlMap?[strings.ffiNativeAsset] as String?,
+  );
+}
+
+bool ffiNativeValidator(List<String> name, dynamic yamlConfig) {
+  if (!checkType<YamlMap?>(name, yamlConfig)) {
+    return false;
+  }
+  if (yamlConfig == null) {
+    // Empty means no asset name.
+    return true;
+  }
+  for (final key in (yamlConfig as YamlMap).keys) {
+    if (!checkType<String>([...name, key as String], yamlConfig[key])) {
+      return false;
+    }
+    if (key != strings.ffiNativeAsset) {
+      _logger.severe("'$name -> $key' must be one of the following - ${[
+        strings.ffiNativeAsset
+      ]}");
+    }
+  }
+  return true;
 }
diff --git a/pkgs/ffigen/lib/src/executables/ffigen.dart b/pkgs/ffigen/lib/src/executables/ffigen.dart
index 12dd868..c37cb4f 100644
--- a/pkgs/ffigen/lib/src/executables/ffigen.dart
+++ b/pkgs/ffigen/lib/src/executables/ffigen.dart
@@ -9,6 +9,7 @@
 import 'package:cli_util/cli_logging.dart' show Ansi;
 import 'package:ffigen/ffigen.dart';
 import 'package:logging/logging.dart';
+import 'package:package_config/package_config.dart';
 import 'package:yaml/yaml.dart' as yaml;
 
 final _logger = Logger('ffigen.ffigen');
@@ -34,7 +35,7 @@
   return '${_ansi.red}$str${_ansi.none}';
 }
 
-void main(List<String> args) {
+void main(List<String> args) async {
   // Parses the cmd args. This will print usage and exit if --help was passed.
   final argResult = getArgResults(args);
 
@@ -44,7 +45,7 @@
   // Create a config object.
   Config config;
   try {
-    config = getConfig(argResult);
+    config = getConfig(argResult, await findPackageConfig(Directory.current));
   } on FormatException {
     _logger.severe('Please fix configuration errors and re-run the tool.');
     exit(1);
@@ -58,17 +59,25 @@
   library.generateFile(gen);
   _logger
       .info(successPen('Finished, Bindings generated in ${gen.absolute.path}'));
+
+  if (config.symbolFile != null) {
+    final symbolFileGen = File(config.symbolFile!.output);
+    library.generateSymbolOutputFile(
+        symbolFileGen, config.symbolFile!.importPath);
+    _logger.info(successPen(
+        'Finished, Symbol Output generated in ${symbolFileGen.absolute.path}'));
+  }
 }
 
-Config getConfig(ArgResults result) {
+Config getConfig(ArgResults result, PackageConfig? packageConfig) {
   _logger.info('Running in ${Directory.current}');
   Config config;
 
   // Parse config from yaml.
   if (result.wasParsed(conf)) {
-    config = getConfigFromCustomYaml(result[conf] as String);
+    config = getConfigFromCustomYaml(result[conf] as String, packageConfig);
   } else {
-    config = getConfigFromPubspec();
+    config = getConfigFromPubspec(packageConfig);
   }
 
   // Add compiler options from command line.
@@ -82,7 +91,7 @@
 }
 
 /// Extracts configuration from pubspec file.
-Config getConfigFromPubspec() {
+Config getConfigFromPubspec(PackageConfig? packageConfig) {
   final pubspecFile = File(pubspecName);
 
   if (!pubspecFile.existsSync()) {
@@ -101,11 +110,12 @@
     _logger.severe("Couldn't find an entry for '$configKey' in $pubspecName.");
     exit(1);
   }
-  return Config.fromYaml(bindingsConfigMap);
+  return Config.fromYaml(bindingsConfigMap,
+      filename: pubspecFile.path, packageConfig: packageConfig);
 }
 
 /// Extracts configuration from a custom yaml file.
-Config getConfigFromCustomYaml(String yamlPath) {
+Config getConfigFromCustomYaml(String yamlPath, PackageConfig? packageConfig) {
   final yamlFile = File(yamlPath);
 
   if (!yamlFile.existsSync()) {
@@ -113,11 +123,7 @@
     exit(1);
   }
 
-  // Throws a [YamlException] if it's unable to parse the Yaml.
-  final bindingsConfigMap =
-      yaml.loadYaml(yamlFile.readAsStringSync()) as yaml.YamlMap;
-
-  return Config.fromYaml(bindingsConfigMap);
+  return Config.fromFile(yamlFile, packageConfig: packageConfig);
 }
 
 /// Parses the cmd line arguments.
diff --git a/pkgs/ffigen/lib/src/header_parser/clang_bindings/clang_bindings.dart b/pkgs/ffigen/lib/src/header_parser/clang_bindings/clang_bindings.dart
index abfad7f..6b77794 100644
--- a/pkgs/ffigen/lib/src/header_parser/clang_bindings/clang_bindings.dart
+++ b/pkgs/ffigen/lib/src/header_parser/clang_bindings/clang_bindings.dart
@@ -8,6 +8,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 //
 // Generated by `package:ffigen`.
+// ignore_for_file: type=lint
 import 'dart:ffi' as ffi;
 
 /// Holds bindings to LibClang.
@@ -26,7 +27,7 @@
       : _lookup = lookup;
 
   /// Retrieve the character data associated with the given string.
-  ffi.Pointer<ffi.Int8> clang_getCString(
+  ffi.Pointer<ffi.Char> clang_getCString(
     CXString string,
   ) {
     return _clang_getCString(
@@ -35,10 +36,10 @@
   }
 
   late final _clang_getCStringPtr =
-      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Int8> Function(CXString)>>(
+      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Char> Function(CXString)>>(
           'clang_getCString');
   late final _clang_getCString = _clang_getCStringPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(CXString)>();
+      .asFunction<ffi.Pointer<ffi.Char> Function(CXString)>();
 
   /// Free the given string.
   void clang_disposeString(
@@ -104,7 +105,7 @@
   }
 
   late final _clang_createIndexPtr =
-      _lookup<ffi.NativeFunction<CXIndex Function(ffi.Int32, ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<CXIndex Function(ffi.Int, ffi.Int)>>(
           'clang_createIndex');
   late final _clang_createIndex =
       _clang_createIndexPtr.asFunction<CXIndex Function(int, int)>();
@@ -142,6 +143,22 @@
   late final _clang_getFileName =
       _clang_getFileNamePtr.asFunction<CXString Function(CXFile)>();
 
+  /// Returns non-zero if the given source location is in a system header.
+  int clang_Location_isInSystemHeader(
+    CXSourceLocation location,
+  ) {
+    return _clang_Location_isInSystemHeader(
+      location,
+    );
+  }
+
+  late final _clang_Location_isInSystemHeaderPtr =
+      _lookup<ffi.NativeFunction<ffi.Int Function(CXSourceLocation)>>(
+          'clang_Location_isInSystemHeader');
+  late final _clang_Location_isInSystemHeader =
+      _clang_Location_isInSystemHeaderPtr
+          .asFunction<int Function(CXSourceLocation)>();
+
   /// Determine whether two ranges are equivalent.
   ///
   /// \returns non-zero if the ranges are the same, zero if they differ.
@@ -157,7 +174,7 @@
 
   late final _clang_equalRangesPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Uint32 Function(
+          ffi.UnsignedInt Function(
               CXSourceRange, CXSourceRange)>>('clang_equalRanges');
   late final _clang_equalRanges = _clang_equalRangesPtr
       .asFunction<int Function(CXSourceRange, CXSourceRange)>();
@@ -186,9 +203,9 @@
   void clang_getFileLocation(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset,
+    ffi.Pointer<ffi.UnsignedInt> line,
+    ffi.Pointer<ffi.UnsignedInt> column,
+    ffi.Pointer<ffi.UnsignedInt> offset,
   ) {
     return _clang_getFileLocation(
       location,
@@ -204,16 +221,16 @@
           ffi.Void Function(
               CXSourceLocation,
               ffi.Pointer<CXFile>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>)>>('clang_getFileLocation');
+              ffi.Pointer<ffi.UnsignedInt>,
+              ffi.Pointer<ffi.UnsignedInt>,
+              ffi.Pointer<ffi.UnsignedInt>)>>('clang_getFileLocation');
   late final _clang_getFileLocation = _clang_getFileLocationPtr.asFunction<
       void Function(
           CXSourceLocation,
           ffi.Pointer<CXFile>,
-          ffi.Pointer<ffi.Uint32>,
-          ffi.Pointer<ffi.Uint32>,
-          ffi.Pointer<ffi.Uint32>)>();
+          ffi.Pointer<ffi.UnsignedInt>,
+          ffi.Pointer<ffi.UnsignedInt>,
+          ffi.Pointer<ffi.UnsignedInt>)>();
 
   /// Determine the number of diagnostics produced for the given
   /// translation unit.
@@ -226,7 +243,7 @@
   }
 
   late final _clang_getNumDiagnosticsPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXTranslationUnit)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXTranslationUnit)>>(
           'clang_getNumDiagnostics');
   late final _clang_getNumDiagnostics =
       _clang_getNumDiagnosticsPtr.asFunction<int Function(CXTranslationUnit)>();
@@ -251,7 +268,7 @@
   late final _clang_getDiagnosticPtr = _lookup<
       ffi.NativeFunction<
           CXDiagnostic Function(
-              CXTranslationUnit, ffi.Uint32)>>('clang_getDiagnostic');
+              CXTranslationUnit, ffi.UnsignedInt)>>('clang_getDiagnostic');
   late final _clang_getDiagnostic = _clang_getDiagnosticPtr
       .asFunction<CXDiagnostic Function(CXTranslationUnit, int)>();
 
@@ -293,9 +310,9 @@
     );
   }
 
-  late final _clang_formatDiagnosticPtr =
-      _lookup<ffi.NativeFunction<CXString Function(CXDiagnostic, ffi.Uint32)>>(
-          'clang_formatDiagnostic');
+  late final _clang_formatDiagnosticPtr = _lookup<
+          ffi.NativeFunction<CXString Function(CXDiagnostic, ffi.UnsignedInt)>>(
+      'clang_formatDiagnostic');
   late final _clang_formatDiagnostic = _clang_formatDiagnosticPtr
       .asFunction<CXString Function(CXDiagnostic, int)>();
 
@@ -305,8 +322,8 @@
   /// error codes.
   CXTranslationUnit clang_parseTranslationUnit(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    ffi.Pointer<ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> command_line_args,
     int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     int num_unsaved_files,
@@ -327,18 +344,18 @@
       ffi.NativeFunction<
           CXTranslationUnit Function(
               CXIndex,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              ffi.Int32,
+              ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Pointer<ffi.Char>>,
+              ffi.Int,
               ffi.Pointer<CXUnsavedFile>,
-              ffi.Uint32,
-              ffi.Uint32)>>('clang_parseTranslationUnit');
+              ffi.UnsignedInt,
+              ffi.UnsignedInt)>>('clang_parseTranslationUnit');
   late final _clang_parseTranslationUnit =
       _clang_parseTranslationUnitPtr.asFunction<
           CXTranslationUnit Function(
               CXIndex,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
+              ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Pointer<ffi.Char>>,
               int,
               ffi.Pointer<CXUnsavedFile>,
               int,
@@ -388,7 +405,7 @@
   }
 
   late final _clang_Cursor_isNullPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(CXCursor)>>(
           'clang_Cursor_isNull');
   late final _clang_Cursor_isNull =
       _clang_Cursor_isNullPtr.asFunction<int Function(CXCursor)>();
@@ -418,7 +435,7 @@
   }
 
   late final _clang_Cursor_hasAttrsPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCursor)>>(
           'clang_Cursor_hasAttrs');
   late final _clang_Cursor_hasAttrs =
       _clang_Cursor_hasAttrsPtr.asFunction<int Function(CXCursor)>();
@@ -512,7 +529,7 @@
   }
 
   late final _clang_getEnumConstantDeclValuePtr =
-      _lookup<ffi.NativeFunction<ffi.Int64 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.LongLong Function(CXCursor)>>(
           'clang_getEnumConstantDeclValue');
   late final _clang_getEnumConstantDeclValue =
       _clang_getEnumConstantDeclValuePtr.asFunction<int Function(CXCursor)>();
@@ -529,7 +546,7 @@
   }
 
   late final _clang_getFieldDeclBitWidthPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(CXCursor)>>(
           'clang_getFieldDeclBitWidth');
   late final _clang_getFieldDeclBitWidth =
       _clang_getFieldDeclBitWidthPtr.asFunction<int Function(CXCursor)>();
@@ -548,7 +565,7 @@
   }
 
   late final _clang_Cursor_getNumArgumentsPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(CXCursor)>>(
           'clang_Cursor_getNumArguments');
   late final _clang_Cursor_getNumArguments =
       _clang_Cursor_getNumArgumentsPtr.asFunction<int Function(CXCursor)>();
@@ -569,7 +586,7 @@
   }
 
   late final _clang_Cursor_getArgumentPtr =
-      _lookup<ffi.NativeFunction<CXCursor Function(CXCursor, ffi.Uint32)>>(
+      _lookup<ffi.NativeFunction<CXCursor Function(CXCursor, ffi.UnsignedInt)>>(
           'clang_Cursor_getArgument');
   late final _clang_Cursor_getArgument = _clang_Cursor_getArgumentPtr
       .asFunction<CXCursor Function(CXCursor, int)>();
@@ -605,7 +622,7 @@
   }
 
   late final _clang_Cursor_isMacroFunctionLikePtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCursor)>>(
           'clang_Cursor_isMacroFunctionLike');
   late final _clang_Cursor_isMacroFunctionLike =
       _clang_Cursor_isMacroFunctionLikePtr.asFunction<int Function(CXCursor)>();
@@ -621,7 +638,7 @@
   }
 
   late final _clang_Cursor_isMacroBuiltinPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCursor)>>(
           'clang_Cursor_isMacroBuiltin');
   late final _clang_Cursor_isMacroBuiltin =
       _clang_Cursor_isMacroBuiltinPtr.asFunction<int Function(CXCursor)>();
@@ -637,7 +654,7 @@
   }
 
   late final _clang_Cursor_isFunctionInlinedPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCursor)>>(
           'clang_Cursor_isFunctionInlined');
   late final _clang_Cursor_isFunctionInlined =
       _clang_Cursor_isFunctionInlinedPtr.asFunction<int Function(CXCursor)>();
@@ -732,7 +749,7 @@
   }
 
   late final _clang_getNumArgTypesPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(CXType)>>(
           'clang_getNumArgTypes');
   late final _clang_getNumArgTypes =
       _clang_getNumArgTypesPtr.asFunction<int Function(CXType)>();
@@ -752,11 +769,46 @@
   }
 
   late final _clang_getArgTypePtr =
-      _lookup<ffi.NativeFunction<CXType Function(CXType, ffi.Uint32)>>(
+      _lookup<ffi.NativeFunction<CXType Function(CXType, ffi.UnsignedInt)>>(
           'clang_getArgType');
   late final _clang_getArgType =
       _clang_getArgTypePtr.asFunction<CXType Function(CXType, int)>();
 
+  /// Retrieves the base type of the ObjCObjectType.
+  ///
+  /// If the type is not an ObjC object, an invalid type is returned.
+  CXType clang_Type_getObjCObjectBaseType(
+    CXType T,
+  ) {
+    return _clang_Type_getObjCObjectBaseType(
+      T,
+    );
+  }
+
+  late final _clang_Type_getObjCObjectBaseTypePtr =
+      _lookup<ffi.NativeFunction<CXType Function(CXType)>>(
+          'clang_Type_getObjCObjectBaseType');
+  late final _clang_Type_getObjCObjectBaseType =
+      _clang_Type_getObjCObjectBaseTypePtr
+          .asFunction<CXType Function(CXType)>();
+
+  /// Retrieve the return type associated with a given cursor.
+  ///
+  /// This only returns a valid type if the cursor refers to a function or method.
+  CXType clang_getCursorResultType(
+    CXCursor C,
+  ) {
+    return _clang_getCursorResultType(
+      C,
+    );
+  }
+
+  late final _clang_getCursorResultTypePtr =
+      _lookup<ffi.NativeFunction<CXType Function(CXCursor)>>(
+          'clang_getCursorResultType');
+  late final _clang_getCursorResultType =
+      _clang_getCursorResultTypePtr.asFunction<CXType Function(CXCursor)>();
+
   /// Return the number of elements of an array or vector type.
   ///
   /// If a type is passed in that is not an array or vector type,
@@ -770,7 +822,7 @@
   }
 
   late final _clang_getNumElementsPtr =
-      _lookup<ffi.NativeFunction<ffi.Int64 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<ffi.LongLong Function(CXType)>>(
           'clang_getNumElements');
   late final _clang_getNumElements =
       _clang_getNumElementsPtr.asFunction<int Function(CXType)>();
@@ -809,6 +861,21 @@
   late final _clang_Type_getNamedType =
       _clang_Type_getNamedTypePtr.asFunction<CXType Function(CXType)>();
 
+  /// Retrieve the nullability kind of a pointer type.
+  int clang_Type_getNullability(
+    CXType T,
+  ) {
+    return _clang_Type_getNullability(
+      T,
+    );
+  }
+
+  late final _clang_Type_getNullabilityPtr =
+      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXType)>>(
+          'clang_Type_getNullability');
+  late final _clang_Type_getNullability =
+      _clang_Type_getNullabilityPtr.asFunction<int Function(CXType)>();
+
   /// Return the alignment of a type in bytes as per C++[expr.alignof]
   /// standard.
   ///
@@ -828,7 +895,7 @@
   }
 
   late final _clang_Type_getAlignOfPtr =
-      _lookup<ffi.NativeFunction<ffi.Int64 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<ffi.LongLong Function(CXType)>>(
           'clang_Type_getAlignOf');
   late final _clang_Type_getAlignOf =
       _clang_Type_getAlignOfPtr.asFunction<int Function(CXType)>();
@@ -844,7 +911,7 @@
   }
 
   late final _clang_Cursor_isAnonymousPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCursor)>>(
           'clang_Cursor_isAnonymous');
   late final _clang_Cursor_isAnonymous =
       _clang_Cursor_isAnonymousPtr.asFunction<int Function(CXCursor)>();
@@ -860,7 +927,7 @@
   }
 
   late final _clang_Cursor_isAnonymousRecordDeclPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCursor)>>(
           'clang_Cursor_isAnonymousRecordDecl');
   late final _clang_Cursor_isAnonymousRecordDecl =
       _clang_Cursor_isAnonymousRecordDeclPtr
@@ -900,7 +967,7 @@
 
   late final _clang_visitChildrenPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Uint32 Function(
+          ffi.UnsignedInt Function(
               CXCursor, CXCursorVisitor, CXClientData)>>('clang_visitChildren');
   late final _clang_visitChildren = _clang_visitChildrenPtr
       .asFunction<int Function(CXCursor, CXCursorVisitor, CXClientData)>();
@@ -981,6 +1048,63 @@
   late final _clang_getCursorDefinition =
       _clang_getCursorDefinitionPtr.asFunction<CXCursor Function(CXCursor)>();
 
+  /// Given a cursor that represents a property declaration, return the
+  /// associated property attributes. The bits are formed from
+  /// \c CXObjCPropertyAttrKind.
+  ///
+  /// \param reserved Reserved for future use, pass 0.
+  int clang_Cursor_getObjCPropertyAttributes(
+    CXCursor C,
+    int reserved,
+  ) {
+    return _clang_Cursor_getObjCPropertyAttributes(
+      C,
+      reserved,
+    );
+  }
+
+  late final _clang_Cursor_getObjCPropertyAttributesPtr = _lookup<
+      ffi.NativeFunction<
+          ffi.UnsignedInt Function(CXCursor,
+              ffi.UnsignedInt)>>('clang_Cursor_getObjCPropertyAttributes');
+  late final _clang_Cursor_getObjCPropertyAttributes =
+      _clang_Cursor_getObjCPropertyAttributesPtr
+          .asFunction<int Function(CXCursor, int)>();
+
+  /// Given a cursor that represents a property declaration, return the
+  /// name of the method that implements the getter.
+  CXString clang_Cursor_getObjCPropertyGetterName(
+    CXCursor C,
+  ) {
+    return _clang_Cursor_getObjCPropertyGetterName(
+      C,
+    );
+  }
+
+  late final _clang_Cursor_getObjCPropertyGetterNamePtr =
+      _lookup<ffi.NativeFunction<CXString Function(CXCursor)>>(
+          'clang_Cursor_getObjCPropertyGetterName');
+  late final _clang_Cursor_getObjCPropertyGetterName =
+      _clang_Cursor_getObjCPropertyGetterNamePtr
+          .asFunction<CXString Function(CXCursor)>();
+
+  /// Given a cursor that represents a property declaration, return the
+  /// name of the method that implements the setter, if any.
+  CXString clang_Cursor_getObjCPropertySetterName(
+    CXCursor C,
+  ) {
+    return _clang_Cursor_getObjCPropertySetterName(
+      C,
+    );
+  }
+
+  late final _clang_Cursor_getObjCPropertySetterNamePtr =
+      _lookup<ffi.NativeFunction<CXString Function(CXCursor)>>(
+          'clang_Cursor_getObjCPropertySetterName');
+  late final _clang_Cursor_getObjCPropertySetterName =
+      _clang_Cursor_getObjCPropertySetterNamePtr
+          .asFunction<CXString Function(CXCursor)>();
+
   /// Given a cursor that represents a declaration, return the associated
   /// comment's source range.  The range may include multiple consecutive comments
   /// with whitespace in between.
@@ -1053,6 +1177,17 @@
   late final _clang_getCursorKindSpelling =
       _clang_getCursorKindSpellingPtr.asFunction<CXString Function(int)>();
 
+  /// Return a version string, suitable for showing to a user, but not
+  /// intended to be parsed (the format is not guaranteed to be stable).
+  CXString clang_getClangVersion() {
+    return _clang_getClangVersion();
+  }
+
+  late final _clang_getClangVersionPtr =
+      _lookup<ffi.NativeFunction<CXString Function()>>('clang_getClangVersion');
+  late final _clang_getClangVersion =
+      _clang_getClangVersionPtr.asFunction<CXString Function()>();
+
   /// If cursor is a statement declaration tries to evaluate the
   /// statement and if its variable, tries to evaluate its initializer,
   /// into its corresponding type.
@@ -1096,7 +1231,7 @@
   }
 
   late final _clang_EvalResult_getAsIntPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXEvalResult)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(CXEvalResult)>>(
           'clang_EvalResult_getAsInt');
   late final _clang_EvalResult_getAsInt =
       _clang_EvalResult_getAsIntPtr.asFunction<int Function(CXEvalResult)>();
@@ -1113,7 +1248,7 @@
   }
 
   late final _clang_EvalResult_getAsLongLongPtr =
-      _lookup<ffi.NativeFunction<ffi.Int64 Function(CXEvalResult)>>(
+      _lookup<ffi.NativeFunction<ffi.LongLong Function(CXEvalResult)>>(
           'clang_EvalResult_getAsLongLong');
   late final _clang_EvalResult_getAsLongLong =
       _clang_EvalResult_getAsLongLongPtr
@@ -1139,7 +1274,7 @@
   /// kind is other than Int or float. User must not free this pointer,
   /// instead call clang_EvalResult_dispose on the CXEvalResult returned
   /// by clang_Cursor_Evaluate.
-  ffi.Pointer<ffi.Int8> clang_EvalResult_getAsStr(
+  ffi.Pointer<ffi.Char> clang_EvalResult_getAsStr(
     CXEvalResult E,
   ) {
     return _clang_EvalResult_getAsStr(
@@ -1148,10 +1283,10 @@
   }
 
   late final _clang_EvalResult_getAsStrPtr =
-      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Int8> Function(CXEvalResult)>>(
+      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Char> Function(CXEvalResult)>>(
           'clang_EvalResult_getAsStr');
   late final _clang_EvalResult_getAsStr = _clang_EvalResult_getAsStrPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(CXEvalResult)>();
+      .asFunction<ffi.Pointer<ffi.Char> Function(CXEvalResult)>();
 
   /// Disposes the created Eval memory.
   void clang_EvalResult_dispose(
@@ -1178,7 +1313,7 @@
 class CXString extends ffi.Struct {
   external ffi.Pointer<ffi.Void> data;
 
-  @ffi.Uint32()
+  @ffi.UnsignedInt()
   external int private_flags;
 }
 
@@ -1193,13 +1328,13 @@
   /// The file whose contents have not yet been saved.
   ///
   /// This file must already exist in the file system.
-  external ffi.Pointer<ffi.Int8> Filename;
+  external ffi.Pointer<ffi.Char> Filename;
 
   /// A buffer containing the unsaved contents of this file.
-  external ffi.Pointer<ffi.Int8> Contents;
+  external ffi.Pointer<ffi.Char> Contents;
 
   /// The length of the unsaved contents of this buffer.
-  @ffi.Uint64()
+  @ffi.UnsignedLong()
   external int Length;
 }
 
@@ -1219,7 +1354,7 @@
   @ffi.Array.multi([2])
   external ffi.Array<ffi.Pointer<ffi.Void>> ptr_data;
 
-  @ffi.Uint32()
+  @ffi.UnsignedInt()
   external int int_data;
 }
 
@@ -1231,10 +1366,10 @@
   @ffi.Array.multi([2])
   external ffi.Array<ffi.Pointer<ffi.Void>> ptr_data;
 
-  @ffi.Uint32()
+  @ffi.UnsignedInt()
   external int begin_int_data;
 
-  @ffi.Uint32()
+  @ffi.UnsignedInt()
   external int end_int_data;
 }
 
@@ -2225,7 +2360,7 @@
   @ffi.Int32()
   external int kind;
 
-  @ffi.Int32()
+  @ffi.Int()
   external int xdata;
 
   @ffi.Array.multi([3])
@@ -2371,6 +2506,49 @@
   external ffi.Array<ffi.Pointer<ffi.Void>> data;
 }
 
+abstract class CXTypeNullabilityKind {
+  /// Values of this type can never be null.
+  static const int CXTypeNullability_NonNull = 0;
+
+  /// Values of this type can be null.
+  static const int CXTypeNullability_Nullable = 1;
+
+  /// Whether values of this type can be null is (explicitly)
+  /// unspecified. This captures a (fairly rare) case where we
+  /// can't conclude anything about the nullability of the type even
+  /// though it has been considered.
+  static const int CXTypeNullability_Unspecified = 2;
+
+  /// Nullability is not applicable to this type.
+  static const int CXTypeNullability_Invalid = 3;
+}
+
+/// List the possible error codes for \c clang_Type_getSizeOf,
+/// \c clang_Type_getAlignOf, \c clang_Type_getOffsetOf and
+/// \c clang_Cursor_getOffsetOf.
+///
+/// A value of this enumeration type can be returned if the target type is not
+/// a valid argument to sizeof, alignof or offsetof.
+abstract class CXTypeLayoutError {
+  /// Type is of kind CXType_Invalid.
+  static const int CXTypeLayoutError_Invalid = -1;
+
+  /// The type is an incomplete Type.
+  static const int CXTypeLayoutError_Incomplete = -2;
+
+  /// The type is a dependent Type.
+  static const int CXTypeLayoutError_Dependent = -3;
+
+  /// The type is not a constant size type.
+  static const int CXTypeLayoutError_NotConstantSize = -4;
+
+  /// The Field name is not valid for this record.
+  static const int CXTypeLayoutError_InvalidFieldName = -5;
+
+  /// The type is undeduced.
+  static const int CXTypeLayoutError_Undeduced = -6;
+}
+
 /// Describes how the traversal of the children of a particular
 /// cursor should proceed after visiting a particular child cursor.
 ///
@@ -2406,6 +2584,24 @@
 /// to various callbacks and visitors.
 typedef CXClientData = ffi.Pointer<ffi.Void>;
 
+/// Property attributes for a \c CXCursor_ObjCPropertyDecl.
+abstract class CXObjCPropertyAttrKind {
+  static const int CXObjCPropertyAttr_noattr = 0;
+  static const int CXObjCPropertyAttr_readonly = 1;
+  static const int CXObjCPropertyAttr_getter = 2;
+  static const int CXObjCPropertyAttr_assign = 4;
+  static const int CXObjCPropertyAttr_readwrite = 8;
+  static const int CXObjCPropertyAttr_retain = 16;
+  static const int CXObjCPropertyAttr_copy = 32;
+  static const int CXObjCPropertyAttr_nonatomic = 64;
+  static const int CXObjCPropertyAttr_setter = 128;
+  static const int CXObjCPropertyAttr_atomic = 256;
+  static const int CXObjCPropertyAttr_weak = 512;
+  static const int CXObjCPropertyAttr_strong = 1024;
+  static const int CXObjCPropertyAttr_unsafe_unretained = 2048;
+  static const int CXObjCPropertyAttr_class = 4096;
+}
+
 abstract class CXEvalResultKind {
   static const int CXEval_Int = 1;
   static const int CXEval_Float = 2;
diff --git a/pkgs/ffigen/lib/src/header_parser/data.dart b/pkgs/ffigen/lib/src/header_parser/data.dart
index ac16572..5bd4e90 100644
--- a/pkgs/ffigen/lib/src/header_parser/data.dart
+++ b/pkgs/ffigen/lib/src/header_parser/data.dart
@@ -4,7 +4,8 @@
 
 import 'dart:ffi';
 
-import 'package:ffigen/src/code_generator.dart' show Constant;
+import 'package:ffigen/src/code_generator.dart'
+    show Constant, ObjCBuiltInFunctions;
 import 'package:ffigen/src/config_provider.dart' show Config;
 import 'clang_bindings/clang_bindings.dart' show Clang;
 
@@ -20,6 +21,10 @@
 Clang get clang => _clang;
 late Clang _clang;
 
+// Cursor index.
+CursorIndex get cursorIndex => _cursorIndex;
+CursorIndex _cursorIndex = CursorIndex();
+
 // Tracks seen status for bindings
 BindingsIndex get bindingsIndex => _bindingsIndex;
 BindingsIndex _bindingsIndex = BindingsIndex();
@@ -36,11 +41,17 @@
 List<Constant> get unnamedEnumConstants => _unnamedEnumConstants;
 List<Constant> _unnamedEnumConstants = [];
 
+/// Built in functions used by the Objective C bindings.
+ObjCBuiltInFunctions get objCBuiltInFunctions => _objCBuiltInFunctions;
+late ObjCBuiltInFunctions _objCBuiltInFunctions;
+
 void initializeGlobals({required Config config}) {
   _config = config;
   _clang = Clang(DynamicLibrary.open(config.libclangDylib));
   _incrementalNamer = IncrementalNamer();
   _savedMacros = {};
   _unnamedEnumConstants = [];
+  _cursorIndex = CursorIndex();
   _bindingsIndex = BindingsIndex();
+  _objCBuiltInFunctions = ObjCBuiltInFunctions();
 }
diff --git a/pkgs/ffigen/lib/src/header_parser/includer.dart b/pkgs/ffigen/lib/src/header_parser/includer.dart
index 9211d5f..5e55aa2 100644
--- a/pkgs/ffigen/lib/src/header_parser/includer.dart
+++ b/pkgs/ffigen/lib/src/header_parser/includer.dart
@@ -5,13 +5,20 @@
 /// Utility functions to check whether a binding should be parsed or not
 /// based on filters.
 
+import '../config_provider/config_types.dart';
+import '../strings.dart' as strings;
 import 'data.dart';
 
-bool _shouldIncludeDecl(String usr, String name,
-    bool Function(String) isSeenDecl, bool Function(String) configIncludes) {
+bool _shouldIncludeDecl(
+    String usr,
+    String name,
+    bool Function(String) isSeenDecl,
+    bool Function(String, bool) configIncludes) {
   if (isSeenDecl(usr) || name == '') {
     return false;
-  } else if (configIncludes(name)) {
+  } else if (config.usrTypeMappings.containsKey(usr)) {
+    return false;
+  } else if (configIncludes(name, config.excludeAllByDefault)) {
     return true;
   } else {
     return false;
@@ -20,12 +27,12 @@
 
 bool shouldIncludeStruct(String usr, String name) {
   return _shouldIncludeDecl(
-      usr, name, bindingsIndex.isSeenStruct, config.structDecl.shouldInclude);
+      usr, name, bindingsIndex.isSeenType, config.structDecl.shouldInclude);
 }
 
 bool shouldIncludeUnion(String usr, String name) {
   return _shouldIncludeDecl(
-      usr, name, bindingsIndex.isSeenUnion, config.unionDecl.shouldInclude);
+      usr, name, bindingsIndex.isSeenType, config.unionDecl.shouldInclude);
 }
 
 bool shouldIncludeFunc(String usr, String name) {
@@ -34,8 +41,8 @@
 }
 
 bool shouldIncludeEnumClass(String usr, String name) {
-  return _shouldIncludeDecl(usr, name, bindingsIndex.isSeenEnumClass,
-      config.enumClassDecl.shouldInclude);
+  return _shouldIncludeDecl(
+      usr, name, bindingsIndex.isSeenType, config.enumClassDecl.shouldInclude);
 }
 
 bool shouldIncludeUnnamedEnumConstant(String usr, String name) {
@@ -54,8 +61,17 @@
 }
 
 bool shouldIncludeTypealias(String usr, String name) {
+  // Objective C has some core typedefs that are important to keep.
+  if (config.language == Language.objc && name == strings.objcInstanceType) {
+    return true;
+  }
   return _shouldIncludeDecl(
-      usr, name, bindingsIndex.isSeenTypealias, config.typedefs.shouldInclude);
+      usr, name, bindingsIndex.isSeenType, config.typedefs.shouldInclude);
+}
+
+bool shouldIncludeObjCInterface(String usr, String name) {
+  return _shouldIncludeDecl(
+      usr, name, bindingsIndex.isSeenType, config.objcInterfaces.shouldInclude);
 }
 
 /// True if a cursor should be included based on headers config, used on root
diff --git a/pkgs/ffigen/lib/src/header_parser/parser.dart b/pkgs/ffigen/lib/src/header_parser/parser.dart
index 93dfaa1..871da44 100644
--- a/pkgs/ffigen/lib/src/header_parser/parser.dart
+++ b/pkgs/ffigen/lib/src/header_parser/parser.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:ffi';
+import 'dart:io';
 
 import 'package:ffi/ffi.dart';
 import 'package:ffigen/src/code_generator.dart';
@@ -28,9 +29,9 @@
     name: config.wrapperName,
     description: config.wrapperDocComment,
     header: config.preamble,
-    dartBool: config.dartBool,
     sort: config.sort,
     packingOverride: config.structPackingOverride,
+    libraryImports: c.libraryImports.values.toSet(),
   );
 
   return library;
@@ -55,17 +56,25 @@
   final index = clang.clang_createIndex(0, 0);
 
   Pointer<Pointer<Utf8>> clangCmdArgs = nullptr;
-  var cmdLen = 0;
+  final compilerOpts = <String>[
+    // Add compiler opt for comment parsing for clang based on config.
+    if (config.commentType.length != CommentLength.none &&
+        config.commentType.style == CommentStyle.any)
+      strings.fparseAllComments,
 
-  /// Add compiler opt for comment parsing for clang based on config.
-  if (config.commentType.length != CommentLength.none &&
-      config.commentType.style == CommentStyle.any) {
-    config.compilerOpts.add(strings.fparseAllComments);
-  }
+    // If the config targets Objective C, add a compiler opt for it.
+    if (config.language == Language.objc) ...[
+      ...strings.clangLangObjC,
+      ..._findObjectiveCSysroot(),
+    ],
 
-  _logger.fine('CompilerOpts used: ${config.compilerOpts}');
-  clangCmdArgs = createDynamicStringArray(config.compilerOpts);
-  cmdLen = config.compilerOpts.length;
+    // Add the user options last so they can override any other options.
+    ...config.compilerOpts
+  ];
+
+  _logger.fine('CompilerOpts used: $compilerOpts');
+  clangCmdArgs = createDynamicStringArray(compilerOpts);
+  final cmdLen = compilerOpts.length;
 
   // Contains all bindings. A set ensures we never have duplicates.
   final bindings = <Binding>{};
@@ -73,6 +82,9 @@
   // Log all headers for user.
   _logger.info('Input Headers: ${config.headers.entryPoints}');
 
+  final tuList = <Pointer<clang_types.CXTranslationUnitImpl>>[];
+
+  // Parse all translation units from entry points.
   for (final headerLocation in config.headers.entryPoints) {
     _logger.fine('Creating TranslationUnit for header: $headerLocation');
 
@@ -96,11 +108,24 @@
     }
 
     logTuDiagnostics(tu, _logger, headerLocation);
-    final rootCursor = clang.clang_getTranslationUnitCursor(tu);
+    tuList.add(tu);
+  }
 
+  final tuCursors =
+      tuList.map((tu) => clang.clang_getTranslationUnitCursor(tu));
+
+  // Build usr to CXCusror map from translation units.
+  for (final rootCursor in tuCursors) {
+    buildUsrCursorDefinitionMap(rootCursor);
+  }
+
+  // Parse definitions from translation units.
+  for (final rootCursor in tuCursors) {
     bindings.addAll(parseTranslationUnit(rootCursor));
+  }
 
-    // Cleanup.
+  // Dispose translation units.
+  for (final tu in tuList) {
     clang.clang_disposeTranslationUnit(tu);
   }
 
@@ -110,7 +135,19 @@
   // Parse all saved macros.
   bindings.addAll(parseSavedMacros()!);
 
-  clangCmdArgs.dispose(config.compilerOpts.length);
+  clangCmdArgs.dispose(cmdLen);
   clang.clang_disposeIndex(index);
   return bindings.toList();
 }
+
+List<String> _findObjectiveCSysroot() {
+  final result = Process.runSync('xcrun', ['--show-sdk-path']);
+  if (result.exitCode == 0) {
+    for (final line in (result.stdout as String).split('\n')) {
+      if (line.isNotEmpty) {
+        return ['-isysroot', line];
+      }
+    }
+  }
+  return [];
+}
diff --git a/pkgs/ffigen/lib/src/header_parser/sub_parsers/compounddecl_parser.dart b/pkgs/ffigen/lib/src/header_parser/sub_parsers/compounddecl_parser.dart
index 431334a..93d662d 100644
--- a/pkgs/ffigen/lib/src/header_parser/sub_parsers/compounddecl_parser.dart
+++ b/pkgs/ffigen/lib/src/header_parser/sub_parsers/compounddecl_parser.dart
@@ -16,56 +16,66 @@
 
 final _logger = Logger('ffigen.header_parser.compounddecl_parser');
 
+Pointer<
+        NativeFunction<
+            Int32 Function(
+                clang_types.CXCursor, clang_types.CXCursor, Pointer<Void>)>>?
+    _compoundMembersVisitorPtr;
+
 /// Holds temporary information regarding [compound] while parsing.
 class _ParsedCompound {
-  Compound? compound;
+  Compound compound;
   bool unimplementedMemberType = false;
   bool flexibleArrayMember = false;
   bool bitFieldMember = false;
   bool dartHandleMember = false;
   bool incompleteCompoundMember = false;
 
-  bool get isInComplete =>
+  _ParsedCompound(this.compound);
+
+  bool get isIncomplete =>
       unimplementedMemberType ||
       flexibleArrayMember ||
       bitFieldMember ||
       (dartHandleMember && config.useDartHandle) ||
-      incompleteCompoundMember;
+      incompleteCompoundMember ||
+      alignment == clang_types.CXTypeLayoutError.CXTypeLayoutError_Incomplete;
 
   // A struct without any attribute is definitely not packed. #pragma pack(...)
   // also adds an attribute, but it's unexposed and cannot be travesed.
   bool hasAttr = false;
+
   // A struct which as a __packed__ attribute is definitely packed.
   bool hasPackedAttr = false;
+
   // Stores the maximum alignment from all the children.
   int maxChildAlignment = 0;
+
   // Alignment of this struct.
-  int allignment = 0;
+  int alignment = 0;
 
   bool get _isPacked {
-    if (!hasAttr || isInComplete) return false;
+    if (!hasAttr || isIncomplete) return false;
     if (hasPackedAttr) return true;
 
-    return maxChildAlignment > allignment;
+    return maxChildAlignment > alignment;
   }
 
   /// Returns pack value of a struct depending on config, returns null for no
   /// packing.
   int? get packValue {
-    if (compound!.isStruct && _isPacked) {
-      if (strings.packingValuesMap.containsKey(allignment)) {
-        return allignment;
+    if (compound.isStruct && _isPacked && !isIncomplete) {
+      if (strings.packingValuesMap.containsKey(alignment)) {
+        return alignment;
       } else {
         _logger.warning(
-            'Unsupported pack value "$allignment" for Struct "${compound!.name}".');
+            'Unsupported pack value "$alignment" for Struct "${compound.name}".');
         return null;
       }
     } else {
       return null;
     }
   }
-
-  _ParsedCompound();
 }
 
 final _stack = Stack<_ParsedCompound>();
@@ -74,7 +84,6 @@
 Compound? parseCompoundDeclaration(
   clang_types.CXCursor cursor,
   CompoundType compoundType, {
-
   /// Option to ignore declaration filter (Useful in case of extracting
   /// declarations when they are passed/returned by an included function.)
   bool ignoreFilter = false,
@@ -83,38 +92,23 @@
   /// generate these as opaque if `dependency-only` was set to opaque).
   bool pointerReference = false,
 }) {
-  _stack.push(_ParsedCompound());
-
   // Set includer functions according to compoundType.
   final bool Function(String, String) shouldIncludeDecl;
-  final bool Function(String) isSeenDecl;
-  final Compound? Function(String) getSeenDecl;
-  final void Function(String, Compound) addDeclToSeen;
   final Declaration configDecl;
-  final String className;
+  final String className = _compoundTypeDebugName(compoundType);
   switch (compoundType) {
     case CompoundType.struct:
       shouldIncludeDecl = shouldIncludeStruct;
-      isSeenDecl = bindingsIndex.isSeenStruct;
-      getSeenDecl = bindingsIndex.getSeenStruct;
-      addDeclToSeen = bindingsIndex.addStructToSeen;
       configDecl = config.structDecl;
-      className = 'Struct';
       break;
     case CompoundType.union:
       shouldIncludeDecl = shouldIncludeUnion;
-      isSeenDecl = bindingsIndex.isSeenUnion;
-      getSeenDecl = bindingsIndex.getSeenUnion;
-      addDeclToSeen = bindingsIndex.addUnionToSeen;
       configDecl = config.unionDecl;
-      className = 'Union';
       break;
   }
 
   // Parse the cursor definition instead, if this is a forward declaration.
-  if (isForwardDeclaration(cursor)) {
-    cursor = clang.clang_getCursorDefinition(cursor);
-  }
+  cursor = cursorIndex.getDefinition(cursor);
   final declUsr = cursor.usr();
   final String declName;
 
@@ -134,110 +128,111 @@
     if (ignoreFilter) {
       // This declaration is defined inside some other declaration and hence
       // must be generated.
-      _stack.top.compound = Compound.fromType(
+      return Compound.fromType(
         type: compoundType,
         name: incrementalNamer.name('Unnamed$className'),
         usr: declUsr,
         dartDoc: getCursorDocComment(cursor),
       );
-      _setMembers(cursor, className);
     } else {
       _logger.finest('unnamed $className declaration');
     }
-  } else if ((ignoreFilter || shouldIncludeDecl(declUsr, declName)) &&
-      (!isSeenDecl(declUsr))) {
+  } else if (ignoreFilter || shouldIncludeDecl(declUsr, declName)) {
     _logger.fine(
         '++++ Adding $className: Name: $declName, ${cursor.completeStringRepr()}');
-    _stack.top.compound = Compound.fromType(
+    return Compound.fromType(
       type: compoundType,
       usr: declUsr,
       originalName: declName,
       name: configDecl.renameUsingConfig(declName),
       dartDoc: getCursorDocComment(cursor),
     );
-    // Adding to seen here to stop recursion if a declaration has itself as a
-    // member, members are updated later.
-    addDeclToSeen(declUsr, _stack.top.compound!);
   }
-
-  if (isSeenDecl(declUsr)) {
-    _stack.top.compound = getSeenDecl(declUsr);
-
-    // Skip dependencies if already seen OR user has specified `dependency-only`
-    // as opaque AND this is a pointer reference AND the declaration was not
-    // included according to config (ignoreFilter).
-    final skipDependencies = _stack.top.compound!.parsedDependencies ||
-        (pointerReference &&
-            ignoreFilter &&
-            ((compoundType == CompoundType.struct &&
-                    config.structDependencies == CompoundDependencies.opaque) ||
-                (compoundType == CompoundType.union &&
-                    config.unionDependencies == CompoundDependencies.opaque)));
-
-    if (!skipDependencies) {
-      // Prevents infinite recursion if struct has a pointer to itself.
-      _stack.top.compound!.parsedDependencies = true;
-      _setMembers(cursor, className);
-    } else if (!_stack.top.compound!.parsedDependencies) {
-      _logger.fine('Skipped dependencies.');
-    }
-  }
-
-  return _stack.pop().compound;
+  return null;
 }
 
-void _setMembers(clang_types.CXCursor cursor, String className) {
-  _stack.top.hasAttr = clang.clang_Cursor_hasAttrs(cursor) != 0;
-  _stack.top.allignment = cursor.type().alignment();
+void fillCompoundMembersIfNeeded(
+  Compound compound,
+  clang_types.CXCursor cursor, {
+  /// Option to ignore declaration filter (Useful in case of extracting
+  /// declarations when they are passed/returned by an included function.)
+  bool ignoreFilter = false,
 
+  /// To track if the declaration was used by reference(i.e T*). (Used to only
+  /// generate these as opaque if `dependency-only` was set to opaque).
+  bool pointerReference = false,
+}) {
+  cursor = cursorIndex.getDefinition(cursor);
+  final compoundType = compound.compoundType;
+
+  // Skip dependencies if already seen OR user has specified `dependency-only`
+  // as opaque AND this is a pointer reference AND the declaration was not
+  // included according to config (ignoreFilter).
+  final skipDependencies = compound.parsedDependencies ||
+      (pointerReference &&
+          ignoreFilter &&
+          ((compoundType == CompoundType.struct &&
+                  config.structDependencies == CompoundDependencies.opaque) ||
+              (compoundType == CompoundType.union &&
+                  config.unionDependencies == CompoundDependencies.opaque)));
+  if (skipDependencies) return;
+
+  final parsed = _ParsedCompound(compound);
+  final String className = _compoundTypeDebugName(compoundType);
+  parsed.hasAttr = clang.clang_Cursor_hasAttrs(cursor) != 0;
+  parsed.alignment = cursor.type().alignment();
+  compound.parsedDependencies = true; // Break cycles.
+
+  _stack.push(parsed);
   final resultCode = clang.clang_visitChildren(
     cursor,
-    Pointer.fromFunction(_compoundMembersVisitor, exceptional_visitor_return),
+    _compoundMembersVisitorPtr ??= Pointer.fromFunction(
+        _compoundMembersVisitor, exceptional_visitor_return),
     nullptr,
   );
+  _stack.pop();
 
   _logger.finest(
-      'Opaque: ${_stack.top.isInComplete}, HasAttr: ${_stack.top.hasAttr}, AlignValue: ${_stack.top.allignment}, MaxChildAlignValue: ${_stack.top.maxChildAlignment}, PackValue: ${_stack.top.packValue}.');
-  _stack.top.compound!.pack = _stack.top.packValue;
+      'Opaque: ${parsed.isIncomplete}, HasAttr: ${parsed.hasAttr}, AlignValue: ${parsed.alignment}, MaxChildAlignValue: ${parsed.maxChildAlignment}, PackValue: ${parsed.packValue}.');
+  compound.pack = parsed.packValue;
 
   visitChildrenResultChecker(resultCode);
 
-  if (_stack.top.unimplementedMemberType) {
+  if (parsed.unimplementedMemberType) {
     _logger.fine(
         '---- Removed $className members, reason: member with unimplementedtype ${cursor.completeStringRepr()}');
     _logger.warning(
-        'Removed All $className Members from ${_stack.top.compound!.name}(${_stack.top.compound!.originalName}), struct member has an unsupported type.');
-  } else if (_stack.top.flexibleArrayMember) {
+        'Removed All $className Members from ${compound.name}(${compound.originalName}), struct member has an unsupported type.');
+  } else if (parsed.flexibleArrayMember) {
     _logger.fine(
         '---- Removed $className members, reason: incomplete array member ${cursor.completeStringRepr()}');
     _logger.warning(
-        'Removed All $className Members from ${_stack.top.compound!.name}(${_stack.top.compound!.originalName}), Flexible array members not supported.');
-  } else if (_stack.top.bitFieldMember) {
+        'Removed All $className Members from ${compound.name}(${compound.originalName}), Flexible array members not supported.');
+  } else if (parsed.bitFieldMember) {
     _logger.fine(
         '---- Removed $className members, reason: bitfield members ${cursor.completeStringRepr()}');
     _logger.warning(
-        'Removed All $className Members from ${_stack.top.compound!.name}(${_stack.top.compound!.originalName}), Bit Field members not supported.');
-  } else if (_stack.top.dartHandleMember && config.useDartHandle) {
+        'Removed All $className Members from ${compound.name}(${compound.originalName}), Bit Field members not supported.');
+  } else if (parsed.dartHandleMember && config.useDartHandle) {
     _logger.fine(
         '---- Removed $className members, reason: Dart_Handle member. ${cursor.completeStringRepr()}');
     _logger.warning(
-        'Removed All $className Members from ${_stack.top.compound!.name}(${_stack.top.compound!.originalName}), Dart_Handle member not supported.');
-  } else if (_stack.top.incompleteCompoundMember) {
+        'Removed All $className Members from ${compound.name}(${compound.originalName}), Dart_Handle member not supported.');
+  } else if (parsed.incompleteCompoundMember) {
     _logger.fine(
         '---- Removed $className members, reason: Incomplete Nested Struct member. ${cursor.completeStringRepr()}');
     _logger.warning(
-        'Removed All $className Members from ${_stack.top.compound!.name}(${_stack.top.compound!.originalName}), Incomplete Nested Struct member not supported.');
+        'Removed All $className Members from ${compound.name}(${compound.originalName}), Incomplete Nested Struct member not supported.');
   }
 
   // Clear all members if declaration is incomplete.
-  if (_stack.top.isInComplete) {
-    _stack.top.compound!.members.clear();
+  if (parsed.isIncomplete) {
+    compound.members.clear();
   }
 
   // C allows empty structs/union, but it's undefined behaviour at runtine.
   // So we need to mark a declaration incomplete if it has no members.
-  _stack.top.compound!.isInComplete =
-      _stack.top.isInComplete || _stack.top.compound!.members.isEmpty;
+  compound.isIncomplete = parsed.isIncomplete || compound.members.isEmpty;
 }
 
 /// Visitor for the struct/union cursor [CXCursorKind.CXCursor_StructDecl]/
@@ -246,51 +241,86 @@
 /// Child visitor invoked on struct/union cursor.
 int _compoundMembersVisitor(clang_types.CXCursor cursor,
     clang_types.CXCursor parent, Pointer<Void> clientData) {
+  final parsed = _stack.top;
   try {
-    if (cursor.kind == clang_types.CXCursorKind.CXCursor_FieldDecl) {
-      _logger.finer('===== member: ${cursor.completeStringRepr()}');
+    switch (cursor.kind) {
+      case clang_types.CXCursorKind.CXCursor_FieldDecl:
+        _logger.finer('===== member: ${cursor.completeStringRepr()}');
 
-      // Set maxChildAlignValue.
-      final align = cursor.type().alignment();
-      if (align > _stack.top.maxChildAlignment) {
-        _stack.top.maxChildAlignment = align;
-      }
+        // Set maxChildAlignValue.
+        final align = cursor.type().alignment();
+        if (align > parsed.maxChildAlignment) {
+          parsed.maxChildAlignment = align;
+        }
 
-      final mt = cursor.type().toCodeGenType();
-      if (mt.broadType == BroadType.IncompleteArray) {
-        // TODO(68): Structs with flexible Array Members are not supported.
-        _stack.top.flexibleArrayMember = true;
-      }
-      if (clang.clang_getFieldDeclBitWidth(cursor) != -1) {
-        // TODO(84): Struct with bitfields are not suppoorted.
-        _stack.top.bitFieldMember = true;
-      }
-      if (mt.broadType == BroadType.Handle) {
-        _stack.top.dartHandleMember = true;
-      }
-      if (mt.isIncompleteCompound) {
-        _stack.top.incompleteCompoundMember = true;
-      }
-      if (mt.getBaseType().broadType == BroadType.Unimplemented) {
-        _stack.top.unimplementedMemberType = true;
-      }
-
-      _stack.top.compound!.members.add(
-        Member(
-          dartDoc: getCursorDocComment(
-            cursor,
-            nesting.length + commentPrefix.length,
+        final mt = cursor.toCodeGenType();
+        if (mt is IncompleteArray) {
+          // TODO(68): Structs with flexible Array Members are not supported.
+          parsed.flexibleArrayMember = true;
+        }
+        if (clang.clang_getFieldDeclBitWidth(cursor) != -1) {
+          // TODO(84): Struct with bitfields are not suppoorted.
+          parsed.bitFieldMember = true;
+        }
+        if (mt is HandleType) {
+          parsed.dartHandleMember = true;
+        }
+        if (mt.isIncompleteCompound) {
+          parsed.incompleteCompoundMember = true;
+        }
+        if (mt.baseType is UnimplementedType) {
+          parsed.unimplementedMemberType = true;
+        }
+        parsed.compound.members.add(
+          Member(
+            dartDoc: getCursorDocComment(
+              cursor,
+              nesting.length + commentPrefix.length,
+            ),
+            originalName: cursor.spelling(),
+            name: config.structDecl.renameMemberUsingConfig(
+              parsed.compound.originalName,
+              cursor.spelling(),
+            ),
+            type: mt,
           ),
-          originalName: cursor.spelling(),
-          name: config.structDecl.renameMemberUsingConfig(
-            _stack.top.compound!.originalName,
-            cursor.spelling(),
+        );
+
+        break;
+
+      case clang_types.CXCursorKind.CXCursor_PackedAttr:
+        parsed.hasPackedAttr = true;
+
+        break;
+      case clang_types.CXCursorKind.CXCursor_UnionDecl:
+      case clang_types.CXCursorKind.CXCursor_StructDecl:
+        final mt = cursor.toCodeGenType();
+
+        // If the union/struct are anonymous, then we need to add them now,
+        // otherwise they will be added in the next iteration.
+        if (!cursor.isAnonymousRecordDecl()) break;
+
+        // Anonymous members are always unnamed. To avoid environment-
+        // dependent naming issues with the generated code, we explicitly
+        // use the empty string as spelling.
+        final spelling = '';
+
+        parsed.compound.members.add(
+          Member(
+            dartDoc: getCursorDocComment(
+              cursor,
+              nesting.length + commentPrefix.length,
+            ),
+            originalName: spelling,
+            name: config.structDecl.renameMemberUsingConfig(
+              parsed.compound.originalName,
+              spelling,
+            ),
+            type: mt,
           ),
-          type: mt,
-        ),
-      );
-    } else if (cursor.kind == clang_types.CXCursorKind.CXCursor_PackedAttr) {
-      _stack.top.hasPackedAttr = true;
+        );
+
+        break;
     }
   } catch (e, s) {
     _logger.severe(e);
@@ -299,3 +329,7 @@
   }
   return clang_types.CXChildVisitResult.CXChildVisit_Continue;
 }
+
+String _compoundTypeDebugName(CompoundType compoundType) {
+  return compoundType == CompoundType.struct ? "Struct" : "Union";
+}
diff --git a/pkgs/ffigen/lib/src/header_parser/sub_parsers/enumdecl_parser.dart b/pkgs/ffigen/lib/src/header_parser/sub_parsers/enumdecl_parser.dart
index c4b2ab8..e66781c 100644
--- a/pkgs/ffigen/lib/src/header_parser/sub_parsers/enumdecl_parser.dart
+++ b/pkgs/ffigen/lib/src/header_parser/sub_parsers/enumdecl_parser.dart
@@ -10,12 +10,17 @@
 import 'package:logging/logging.dart';
 
 import '../clang_bindings/clang_bindings.dart' as clang_types;
-import '../data.dart';
 import '../includer.dart';
 import '../utils.dart';
 
 final _logger = Logger('ffigen.header_parser.enumdecl_parser');
 
+Pointer<
+        NativeFunction<
+            Int32 Function(
+                clang_types.CXCursor, clang_types.CXCursor, Pointer<Void>)>>?
+    _enumCursorVisitorPtr;
+
 /// Holds temporary information regarding [EnumClass] while parsing.
 class _ParsedEnum {
   EnumClass? enumClass;
@@ -27,7 +32,6 @@
 /// Parses an enum declaration.
 EnumClass? parseEnumDeclaration(
   clang_types.CXCursor cursor, {
-
   /// Option to ignore declaration filter (Useful in case of extracting
   /// declarations when they are passed/returned by an included function.)
   bool ignoreFilter = false,
@@ -35,9 +39,7 @@
   _stack.push(_ParsedEnum());
 
   // Parse the cursor definition instead, if this is a forward declaration.
-  if (isForwardDeclaration(cursor)) {
-    cursor = clang.clang_getCursorDefinition(cursor);
-  }
+  cursor = cursorIndex.getDefinition(cursor);
 
   final enumUsr = cursor.usr();
   final String enumName;
@@ -54,8 +56,7 @@
   if (enumName.isEmpty) {
     _logger.fine('Saving anonymous enum.');
     saveUnNamedEnum(cursor);
-  } else if ((ignoreFilter || shouldIncludeEnumClass(enumUsr, enumName)) &&
-      (!bindingsIndex.isSeenEnumClass(enumUsr))) {
+  } else if (ignoreFilter || shouldIncludeEnumClass(enumUsr, enumName)) {
     _logger.fine('++++ Adding Enum: ${cursor.completeStringRepr()}');
     _stack.top.enumClass = EnumClass(
       usr: enumUsr,
@@ -63,12 +64,8 @@
       originalName: enumName,
       name: config.enumClassDecl.renameUsingConfig(enumName),
     );
-    bindingsIndex.addEnumClassToSeen(enumUsr, _stack.top.enumClass!);
     _addEnumConstant(cursor);
   }
-  if (bindingsIndex.isSeenEnumClass(enumUsr)) {
-    _stack.top.enumClass = bindingsIndex.getSeenEnumClass(enumUsr);
-  }
 
   return _stack.pop().enumClass;
 }
@@ -76,7 +73,8 @@
 void _addEnumConstant(clang_types.CXCursor cursor) {
   final resultCode = clang.clang_visitChildren(
     cursor,
-    Pointer.fromFunction(_enumCursorVisitor, exceptional_visitor_return),
+    _enumCursorVisitorPtr ??=
+        Pointer.fromFunction(_enumCursorVisitor, exceptional_visitor_return),
     nullptr,
   );
 
@@ -95,6 +93,9 @@
       case clang_types.CXCursorKind.CXCursor_EnumConstantDecl:
         _addEnumConstantToEnumClass(cursor);
         break;
+      case clang_types.CXCursorKind.CXCursor_UnexposedAttr:
+        // Ignore.
+        break;
       default:
         _logger.fine('invalid enum constant');
     }
diff --git a/pkgs/ffigen/lib/src/header_parser/sub_parsers/function_type_param_parser.dart b/pkgs/ffigen/lib/src/header_parser/sub_parsers/function_type_param_parser.dart
new file mode 100644
index 0000000..739b3b1
--- /dev/null
+++ b/pkgs/ffigen/lib/src/header_parser/sub_parsers/function_type_param_parser.dart
@@ -0,0 +1,54 @@
+// Copyright (c) 2021, 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:ffi';
+
+import '../clang_bindings/clang_bindings.dart';
+import '../data.dart';
+import '../utils.dart';
+
+/// This type holds the list of `ParmDecl` nodes of a function type declaration.
+class FunctionTypeParams {
+  final List<String> paramNames;
+  final Map<String, CXCursor> params;
+  FunctionTypeParams()
+      : paramNames = [],
+        params = {};
+}
+
+FunctionTypeParams? _params;
+
+int _functionPointerFieldVisitor(
+    CXCursor cursor, CXCursor parent, Pointer<Void> clientData) {
+  if (cursor.kind == CXCursorKind.CXCursor_ParmDecl) {
+    final spelling = cursor.spelling();
+    if (spelling.isNotEmpty) {
+      _params!.paramNames.add(spelling);
+      _params!.params[spelling] = cursor;
+      return CXChildVisitResult.CXChildVisit_Continue;
+    } else {
+      // A parameter's spelling is empty, do not continue further traversal.
+      _params!.paramNames.clear();
+      _params!.params.clear();
+      return CXChildVisitResult.CXChildVisit_Break;
+    }
+  }
+  // The cursor itself may be a pointer etc..
+  return CXChildVisitResult.CXChildVisit_Recurse;
+}
+
+/// Returns `ParmDecl` nodes of function pointer declaration
+/// directly or indirectly pointed to by [cursor].
+FunctionTypeParams parseFunctionPointerParamNames(CXCursor cursor) {
+  _params = FunctionTypeParams();
+  clang.clang_visitChildren(
+    cursor,
+    Pointer.fromFunction(
+        _functionPointerFieldVisitor, exceptional_visitor_return),
+    nullptr,
+  );
+  final result = _params;
+  _params = null;
+  return result!;
+}
diff --git a/pkgs/ffigen/lib/src/header_parser/sub_parsers/functiondecl_parser.dart b/pkgs/ffigen/lib/src/header_parser/sub_parsers/functiondecl_parser.dart
index 3b8cd63..d2d3412 100644
--- a/pkgs/ffigen/lib/src/header_parser/sub_parsers/functiondecl_parser.dart
+++ b/pkgs/ffigen/lib/src/header_parser/sub_parsers/functiondecl_parser.dart
@@ -35,34 +35,34 @@
     final parameters = _getParameters(cursor, funcName);
 
     if (clang.clang_Cursor_isFunctionInlined(cursor) != 0) {
-      _logger.fine(
-          '---- Removed Function, reason: inline function: ${cursor.completeStringRepr()}');
+      _logger.fine('---- Removed Function, reason: inline function: '
+          '${cursor.completeStringRepr()}');
       _logger.warning(
           "Skipped Function '$funcName', inline functions are not supported.");
-      return _stack
-          .pop()
-          .func; // Returning null so that [addToBindings] function excludes this.
+      // Returning null so that [addToBindings] function excludes this.
+      return _stack.pop().func;
     }
 
     if (rt.isIncompleteCompound || _stack.top.incompleteStructParameter) {
       _logger.fine(
-          '---- Removed Function, reason: Incomplete struct pass/return by value: ${cursor.completeStringRepr()}');
+          '---- Removed Function, reason: Incomplete struct pass/return by '
+          'value: ${cursor.completeStringRepr()}');
       _logger.warning(
-          "Skipped Function '$funcName', Incomplete struct pass/return by value not supported.");
-      return _stack
-          .pop()
-          .func; // Returning null so that [addToBindings] function excludes this.
+          "Skipped Function '$funcName', Incomplete struct pass/return by "
+          'value not supported.');
+      // Returning null so that [addToBindings] function excludes this.
+      return _stack.pop().func;
     }
 
-    if (rt.getBaseType().broadType == BroadType.Unimplemented ||
+    if (rt.baseType is UnimplementedType ||
         _stack.top.unimplementedParameterType) {
-      _logger.fine(
-          '---- Removed Function, reason: unsupported return type or parameter type: ${cursor.completeStringRepr()}');
+      _logger.fine('---- Removed Function, reason: unsupported return type or '
+          'parameter type: ${cursor.completeStringRepr()}');
       _logger.warning(
-          "Skipped Function '$funcName', function has unsupported return type or parameter type.");
-      return _stack
-          .pop()
-          .func; // Returning null so that [addToBindings] function excludes this.
+          "Skipped Function '$funcName', function has unsupported return type "
+          'or parameter type.');
+      // Returning null so that [addToBindings] function excludes this.
+      return _stack.pop().func;
     }
 
     _stack.top.func = Func(
@@ -80,6 +80,7 @@
       exposeFunctionTypedefs:
           config.exposeFunctionTypedefs.shouldInclude(funcName),
       isLeaf: config.leafFunctions.shouldInclude(funcName),
+      ffiNativeConfig: config.ffiNativeConfig,
     );
     bindingsIndex.addFuncToSeen(funcUsr, _stack.top.func!);
   } else if (bindingsIndex.isSeenFunc(funcUsr)) {
@@ -105,9 +106,8 @@
     final pt = _getParameterType(paramCursor);
     if (pt.isIncompleteCompound) {
       _stack.top.incompleteStructParameter = true;
-    } else if (pt.getBaseType().broadType == BroadType.Unimplemented) {
-      _logger
-          .finer('Unimplemented type: ${pt.getBaseType().unimplementedReason}');
+    } else if (pt.baseType is UnimplementedType) {
+      _logger.finer('Unimplemented type: ${pt.baseType}');
       _stack.top.unimplementedParameterType = true;
     }
 
@@ -127,5 +127,5 @@
 }
 
 Type _getParameterType(clang_types.CXCursor cursor) {
-  return cursor.type().toCodeGenType();
+  return cursor.toCodeGenType();
 }
diff --git a/pkgs/ffigen/lib/src/header_parser/sub_parsers/macro_parser.dart b/pkgs/ffigen/lib/src/header_parser/sub_parsers/macro_parser.dart
index 68bc080..535e46d 100644
--- a/pkgs/ffigen/lib/src/header_parser/sub_parsers/macro_parser.dart
+++ b/pkgs/ffigen/lib/src/header_parser/sub_parsers/macro_parser.dart
@@ -15,11 +15,16 @@
 import 'package:path/path.dart' as p;
 
 import '../clang_bindings/clang_bindings.dart' as clang_types;
-import '../data.dart';
 import '../utils.dart';
 
 final _logger = Logger('ffigen.header_parser.macro_parser');
 
+Pointer<
+        NativeFunction<
+            Int32 Function(
+                clang_types.CXCursor, clang_types.CXCursor, Pointer<Void>)>>?
+    _macroVariablevisitorPtr;
+
 /// Adds a macro definition to be parsed later.
 void saveMacroDefinition(clang_types.CXCursor cursor) {
   final macroUsr = cursor.usr();
@@ -61,7 +66,10 @@
   final index = clang.clang_createIndex(0, 0);
   Pointer<Pointer<Utf8>> clangCmdArgs = nullptr;
   var cmdLen = 0;
-  clangCmdArgs = createDynamicStringArray(config.compilerOpts);
+
+  final compilerOpts = config.compilerOpts;
+  clangCmdArgs = createDynamicStringArray(compilerOpts);
+
   cmdLen = config.compilerOpts.length;
   final tu = clang.clang_parseTranslationUnit(
     index,
@@ -76,11 +84,13 @@
   if (tu == nullptr) {
     _logger.severe('Unable to parse Macros.');
   } else {
+    logTuDiagnostics(tu, _logger, file.path, logLevel: Level.FINEST);
     final rootCursor = clang.clang_getTranslationUnitCursor(tu);
 
     final resultCode = clang.clang_visitChildren(
       rootCursor,
-      Pointer.fromFunction(_macroVariablevisitor, exceptional_visitor_return),
+      _macroVariablevisitorPtr ??= Pointer.fromFunction(
+          _macroVariablevisitor, exceptional_visitor_return),
       nullptr,
     );
 
@@ -173,7 +183,7 @@
 
 /// Creates a temporary file for parsing macros in current directory.
 File createFileForMacros() {
-  final fileNameBase = 'temp_for_macros';
+  final fileNameBase = p.join(strings.tmpDir, 'temp_for_macros');
   final fileExt = 'hpp';
 
   // Find a filename which doesn't already exist.
@@ -181,18 +191,20 @@
   var i = 0;
   while (file.existsSync()) {
     i++;
-    file = File('${fileNameBase.split('.')[0]}_$i.$fileExt');
+    file = File('${fileNameBase}_$i.$fileExt');
   }
 
   // Create file.
   file.createSync();
-  // Save generted name.
+
+  // Save generated name.
   _generatedFileBaseName = p.basename(file.path);
 
   // Write file contents.
   final sb = StringBuffer();
   for (final h in config.headers.entryPoints) {
-    sb.writeln('#include "$h"');
+    final fullHeaderPath = File(h).absolute.path;
+    sb.writeln('#include "$fullHeaderPath"');
   }
 
   _macroVarNames = {};
@@ -239,7 +251,7 @@
 /// E.g- For a string "Hello\nWorld", The new line character is converted to \n.
 /// Note: The string is considered to be Utf8, but is treated as Extended ASCII,
 /// if the conversion fails.
-String _getWrittenRepresentation(String macroName, Pointer<Int8> strPtr) {
+String _getWrittenRepresentation(String macroName, Pointer<Char> strPtr) {
   final sb = StringBuffer();
   try {
     // Consider string to be Utf8 encoded by default.
diff --git a/pkgs/ffigen/lib/src/header_parser/sub_parsers/objc_block_parser.dart b/pkgs/ffigen/lib/src/header_parser/sub_parsers/objc_block_parser.dart
new file mode 100644
index 0000000..f7ac662
--- /dev/null
+++ b/pkgs/ffigen/lib/src/header_parser/sub_parsers/objc_block_parser.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2022, 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 'package:ffigen/src/code_generator.dart';
+import 'package:ffigen/src/header_parser/data.dart';
+import 'package:logging/logging.dart';
+
+import '../clang_bindings/clang_bindings.dart' as clang_types;
+import '../utils.dart';
+
+final _logger = Logger('ffigen.header_parser.objc_block_parser');
+
+ObjCBlock parseObjCBlock(clang_types.CXType cxtype) {
+  final blk = clang.clang_getPointeeType(cxtype);
+  final returnType = clang.clang_getResultType(blk).toCodeGenType();
+  final argTypes = <Type>[];
+  final int numArgs = clang.clang_getNumArgTypes(blk);
+  for (int i = 0; i < numArgs; ++i) {
+    argTypes.add(clang.clang_getArgType(blk, i).toCodeGenType());
+  }
+
+  // Create a fake USR code for the block. This code is used to dedupe blocks
+  // with the same signature.
+  var usr = 'objcBlock: ${returnType.cacheKey()}';
+  for (final type in argTypes) {
+    usr += ' ${type.cacheKey()}';
+  }
+
+  _logger.fine('++++ Adding ObjC block: '
+      '${cxtype.completeStringRepr()}, syntheticUsr: $usr');
+
+  return ObjCBlock(
+    usr: usr.toString(),
+    name: 'ObjCBlock',
+    returnType: returnType,
+    argTypes: argTypes,
+    builtInFunctions: objCBuiltInFunctions,
+  );
+}
diff --git a/pkgs/ffigen/lib/src/header_parser/sub_parsers/objcinterfacedecl_parser.dart b/pkgs/ffigen/lib/src/header_parser/sub_parsers/objcinterfacedecl_parser.dart
new file mode 100644
index 0000000..5721905
--- /dev/null
+++ b/pkgs/ffigen/lib/src/header_parser/sub_parsers/objcinterfacedecl_parser.dart
@@ -0,0 +1,355 @@
+// Copyright (c) 2022, 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:ffi';
+
+import 'package:ffigen/src/code_generator.dart';
+import 'package:ffigen/src/header_parser/data.dart';
+import 'package:logging/logging.dart';
+
+import '../clang_bindings/clang_bindings.dart' as clang_types;
+import '../includer.dart';
+import '../utils.dart';
+
+final _logger = Logger('ffigen.header_parser.objcinterfacedecl_parser');
+
+Pointer<
+        NativeFunction<
+            Int32 Function(
+                clang_types.CXCursor, clang_types.CXCursor, Pointer<Void>)>>?
+    _parseInterfaceVisitorPtr;
+Pointer<
+        NativeFunction<
+            Int32 Function(
+                clang_types.CXCursor, clang_types.CXCursor, Pointer<Void>)>>?
+    _isClassDeclarationVisitorPtr;
+Pointer<
+        NativeFunction<
+            Int32 Function(
+                clang_types.CXCursor, clang_types.CXCursor, Pointer<Void>)>>?
+    _parseMethodVisitorPtr;
+Pointer<
+        NativeFunction<
+            Int32 Function(
+                clang_types.CXCursor, clang_types.CXCursor, Pointer<Void>)>>?
+    _findCategoryInterfaceVisitorPtr;
+
+class _ParsedObjCInterface {
+  ObjCInterface interface;
+  _ParsedObjCInterface(this.interface);
+}
+
+class _ParsedObjCMethod {
+  ObjCMethod method;
+  bool hasError = false;
+  _ParsedObjCMethod(this.method);
+}
+
+final _interfaceStack = Stack<_ParsedObjCInterface>();
+final _methodStack = Stack<_ParsedObjCMethod>();
+
+Type? parseObjCInterfaceDeclaration(
+  clang_types.CXCursor cursor, {
+  /// Option to ignore declaration filter (Useful in case of extracting
+  /// declarations when they are passed/returned by an included function.)
+  bool ignoreFilter = false,
+}) {
+  final itfUsr = cursor.usr();
+  final itfName = cursor.spelling();
+  if (!ignoreFilter && !shouldIncludeObjCInterface(itfUsr, itfName)) {
+    return null;
+  }
+
+  final t = cursor.type();
+  final name = t.spelling();
+
+  _logger.fine('++++ Adding ObjC interface: '
+      'Name: $name, ${cursor.completeStringRepr()}');
+
+  return ObjCInterface(
+    usr: itfUsr,
+    originalName: name,
+    name: config.objcInterfaces.renameUsingConfig(name),
+    lookupName: config.objcModulePrefixer.applyPrefix(name),
+    dartDoc: getCursorDocComment(cursor),
+    builtInFunctions: objCBuiltInFunctions,
+  );
+}
+
+void fillObjCInterfaceMethodsIfNeeded(
+    ObjCInterface itf, clang_types.CXCursor cursor) {
+  if (_isClassDeclaration(cursor)) {
+    // @class declarations are ObjC's way of forward declaring classes. In that
+    // case there's nothing to fill yet.
+    return;
+  }
+
+  if (itf.filled) return;
+  itf.filled = true; // Break cycles.
+
+  _logger.fine('++++ Filling ObjC interface: '
+      'Name: ${itf.originalName}, ${cursor.completeStringRepr()}');
+
+  _interfaceStack.push(_ParsedObjCInterface(itf));
+  clang.clang_visitChildren(
+      cursor,
+      _parseInterfaceVisitorPtr ??= Pointer.fromFunction(
+          _parseInterfaceVisitor, exceptional_visitor_return),
+      nullptr);
+  _interfaceStack.pop();
+
+  _logger.fine('++++ Finished ObjC interface: '
+      'Name: ${itf.originalName}, ${cursor.completeStringRepr()}');
+}
+
+bool _isClassDeclarationResult = false;
+bool _isClassDeclaration(clang_types.CXCursor cursor) {
+  // It's a class declaration if it has no children other than ObjCClassRef.
+  _isClassDeclarationResult = true;
+  clang.clang_visitChildren(
+      cursor,
+      _isClassDeclarationVisitorPtr ??= Pointer.fromFunction(
+          _isClassDeclarationVisitor, exceptional_visitor_return),
+      nullptr);
+  return _isClassDeclarationResult;
+}
+
+int _isClassDeclarationVisitor(clang_types.CXCursor cursor,
+    clang_types.CXCursor parent, Pointer<Void> clientData) {
+  if (cursor.kind == clang_types.CXCursorKind.CXCursor_ObjCClassRef) {
+    return clang_types.CXChildVisitResult.CXChildVisit_Continue;
+  }
+  _isClassDeclarationResult = false;
+  return clang_types.CXChildVisitResult.CXChildVisit_Break;
+}
+
+int _parseInterfaceVisitor(clang_types.CXCursor cursor,
+    clang_types.CXCursor parent, Pointer<Void> clientData) {
+  switch (cursor.kind) {
+    case clang_types.CXCursorKind.CXCursor_ObjCSuperClassRef:
+      _parseSuperType(cursor);
+      break;
+    case clang_types.CXCursorKind.CXCursor_ObjCPropertyDecl:
+      _parseProperty(cursor);
+      break;
+    case clang_types.CXCursorKind.CXCursor_ObjCInstanceMethodDecl:
+    case clang_types.CXCursorKind.CXCursor_ObjCClassMethodDecl:
+      _parseMethod(cursor);
+      break;
+  }
+  return clang_types.CXChildVisitResult.CXChildVisit_Continue;
+}
+
+void _parseSuperType(clang_types.CXCursor cursor) {
+  final superType = cursor.type().toCodeGenType();
+  _logger.fine('       > Super type: '
+      '$superType ${cursor.completeStringRepr()}');
+  final itf = _interfaceStack.top.interface;
+  if (superType is ObjCInterface) {
+    itf.superType = superType;
+  } else {
+    _logger.severe(
+        'Super type of $itf is $superType, which is not a valid interface.');
+  }
+}
+
+void _parseProperty(clang_types.CXCursor cursor) {
+  final itf = _interfaceStack.top.interface;
+  final fieldName = cursor.spelling();
+  final fieldType = cursor.type().toCodeGenType();
+
+  if (fieldType.isIncompleteCompound) {
+    _logger.warning('Property "$fieldName" in instance "${itf.originalName}" '
+        'has incomplete type: $fieldType.');
+    return;
+  }
+
+  final dartDoc = getCursorDocComment(cursor);
+
+  final propertyAttributes =
+      clang.clang_Cursor_getObjCPropertyAttributes(cursor, 0);
+  final isClass = propertyAttributes &
+          clang_types.CXObjCPropertyAttrKind.CXObjCPropertyAttr_class >
+      0;
+  final isReadOnly = propertyAttributes &
+          clang_types.CXObjCPropertyAttrKind.CXObjCPropertyAttr_readonly >
+      0;
+  // TODO(#334): Use the nullable attribute to decide this.
+  final isNullable =
+      cursor.type().kind == clang_types.CXTypeKind.CXType_ObjCObjectPointer;
+
+  final property = ObjCProperty(fieldName);
+
+  _logger.fine('       > Property: '
+      '$fieldType $fieldName ${cursor.completeStringRepr()}');
+
+  final getterName =
+      clang.clang_Cursor_getObjCPropertyGetterName(cursor).toStringAndDispose();
+  final getter = ObjCMethod(
+    originalName: getterName,
+    property: property,
+    dartDoc: dartDoc,
+    kind: ObjCMethodKind.propertyGetter,
+    isClass: isClass,
+    returnType: fieldType,
+    isNullableReturn: isNullable,
+  );
+  itf.addMethod(getter);
+
+  if (!isReadOnly) {
+    final setterName = clang
+        .clang_Cursor_getObjCPropertySetterName(cursor)
+        .toStringAndDispose();
+    final setter = ObjCMethod(
+        originalName: setterName,
+        property: property,
+        dartDoc: dartDoc,
+        kind: ObjCMethodKind.propertySetter,
+        isClass: isClass,
+        returnType: NativeType(SupportedNativeType.Void));
+    setter.params
+        .add(ObjCMethodParam(fieldType, 'value', isNullable: isNullable));
+    itf.addMethod(setter);
+  }
+}
+
+void _parseMethod(clang_types.CXCursor cursor) {
+  final methodName = cursor.spelling();
+  final isClassMethod =
+      cursor.kind == clang_types.CXCursorKind.CXCursor_ObjCClassMethodDecl;
+  final returnType = clang.clang_getCursorResultType(cursor).toCodeGenType();
+  if (returnType.isIncompleteCompound) {
+    _logger.warning('Method "$methodName" in instance '
+        '"${_interfaceStack.top.interface.originalName}" has incomplete '
+        'return type: $returnType.');
+    return;
+  }
+  final method = ObjCMethod(
+    originalName: methodName,
+    dartDoc: getCursorDocComment(cursor),
+    kind: ObjCMethodKind.method,
+    isClass: isClassMethod,
+    returnType: returnType,
+  );
+  final parsed = _ParsedObjCMethod(method);
+  _logger.fine('       > ${isClassMethod ? 'Class' : 'Instance'} method: '
+      '${method.originalName} ${cursor.completeStringRepr()}');
+  _methodStack.push(parsed);
+  clang.clang_visitChildren(
+      cursor,
+      _parseMethodVisitorPtr ??=
+          Pointer.fromFunction(_parseMethodVisitor, exceptional_visitor_return),
+      nullptr);
+  _methodStack.pop();
+  if (parsed.hasError) {
+    // Discard it.
+    return;
+  }
+  _interfaceStack.top.interface.addMethod(method);
+}
+
+int _parseMethodVisitor(clang_types.CXCursor cursor,
+    clang_types.CXCursor parent, Pointer<Void> clientData) {
+  switch (cursor.kind) {
+    case clang_types.CXCursorKind.CXCursor_ParmDecl:
+      _parseMethodParam(cursor);
+      break;
+    case clang_types.CXCursorKind.CXCursor_NSReturnsRetained:
+      _markMethodReturnsRetained(cursor);
+      break;
+    default:
+  }
+  return clang_types.CXChildVisitResult.CXChildVisit_Continue;
+}
+
+void _parseMethodParam(clang_types.CXCursor cursor) {
+  /*
+  TODO(#334): Change this to use:
+  
+  clang.clang_Type_getNullability(cursor.type()) ==
+      clang_types.CXTypeNullabilityKind.CXTypeNullability_Nullable;
+
+  NOTE: This will only work with the
+
+    clang_types
+      .CXTranslationUnit_Flags.CXTranslationUnit_IncludeAttributedTypes
+
+  option set.
+  */
+  final parsed = _methodStack.top;
+  final isNullable =
+      cursor.type().kind == clang_types.CXTypeKind.CXType_ObjCObjectPointer;
+  final name = cursor.spelling();
+  final type = cursor.type().toCodeGenType();
+  if (type.isIncompleteCompound) {
+    parsed.hasError = true;
+    _logger.warning('Method "${parsed.method.originalName}" in instance '
+        '"${_interfaceStack.top.interface.originalName}" has incomplete '
+        'parameter type: $type.');
+    return;
+  }
+  _logger.fine(
+      '           >> Parameter: $type $name ${cursor.completeStringRepr()}');
+  parsed.method.params.add(ObjCMethodParam(type, name, isNullable: isNullable));
+}
+
+void _markMethodReturnsRetained(clang_types.CXCursor cursor) {
+  _methodStack.top.method.returnsRetained = true;
+}
+
+BindingType? parseObjCCategoryDeclaration(clang_types.CXCursor cursor) {
+  // Categories add methods to an existing interface, so first we run a visitor
+  // to find the interface, then we fully parse that interface, then we run the
+  // _parseInterfaceVisitor over the category to add its methods etc. Reusing
+  // the interface visitor relies on the fact that the structure of the category
+  // AST looks exactly the same as the interface AST, and that the category's
+  // interface is a different kind of node to the interface's super type (so is
+  // ignored by _parseInterfaceVisitor).
+  final name = cursor.spelling();
+  _logger.fine('++++ Adding ObjC category: '
+      'Name: $name, ${cursor.completeStringRepr()}');
+
+  _findCategoryInterfaceVisitorResult = null;
+  clang.clang_visitChildren(
+      cursor,
+      _findCategoryInterfaceVisitorPtr ??= Pointer.fromFunction(
+          _findCategoryInterfaceVisitor, exceptional_visitor_return),
+      nullptr);
+  final itfCursor = _findCategoryInterfaceVisitorResult;
+  if (itfCursor == null) {
+    _logger.severe('Category $name has no interface.');
+    return null;
+  }
+
+  // TODO(#347): Currently any interface with a category bypasses the filters.
+  final itf = itfCursor.type().toCodeGenType();
+  if (itf is! ObjCInterface) {
+    _logger.severe(
+        'Interface of category $name is $itf, which is not a valid interface.');
+    return null;
+  }
+
+  _interfaceStack.push(_ParsedObjCInterface(itf));
+  clang.clang_visitChildren(
+      cursor,
+      _parseInterfaceVisitorPtr ??= Pointer.fromFunction(
+          _parseInterfaceVisitor, exceptional_visitor_return),
+      nullptr);
+  _interfaceStack.pop();
+
+  _logger.fine('++++ Finished ObjC category: '
+      'Name: $name, ${cursor.completeStringRepr()}');
+
+  return itf;
+}
+
+clang_types.CXCursor? _findCategoryInterfaceVisitorResult;
+int _findCategoryInterfaceVisitor(clang_types.CXCursor cursor,
+    clang_types.CXCursor parent, Pointer<Void> clientData) {
+  if (cursor.kind == clang_types.CXCursorKind.CXCursor_ObjCClassRef) {
+    _findCategoryInterfaceVisitorResult = cursor;
+    return clang_types.CXChildVisitResult.CXChildVisit_Break;
+  }
+  return clang_types.CXChildVisitResult.CXChildVisit_Continue;
+}
diff --git a/pkgs/ffigen/lib/src/header_parser/sub_parsers/typedefdecl_parser.dart b/pkgs/ffigen/lib/src/header_parser/sub_parsers/typedefdecl_parser.dart
index 90d5664..85df348 100644
--- a/pkgs/ffigen/lib/src/header_parser/sub_parsers/typedefdecl_parser.dart
+++ b/pkgs/ffigen/lib/src/header_parser/sub_parsers/typedefdecl_parser.dart
@@ -13,8 +13,7 @@
 
 final _logger = Logger('ffigen.header_parser.typedefdecl_parser');
 
-/// Holds temporary information regarding a typedef referenced [Binding]
-/// while parsing.
+/// Parses a typedef declaration.
 ///
 /// Notes:
 /// - Pointer to Typedefs structs are skipped if the struct is seen.
@@ -30,16 +29,6 @@
 ///
 /// typedef A D; // Typeref.
 /// ```
-class _ParsedTypealias {
-  Typealias? typealias;
-  String? typedefName;
-  bool typedefToPointer = false;
-  _ParsedTypealias();
-}
-
-final _stack = Stack<_ParsedTypealias>();
-
-/// Parses a typedef declaration.
 ///
 /// Returns `null` if the typedef could not be generated or has been excluded
 /// by the config.
@@ -47,58 +36,50 @@
   clang_types.CXCursor cursor, {
   bool pointerReference = false,
 }) {
-  _stack.push(_ParsedTypealias());
   final typedefName = cursor.spelling();
   final typedefUsr = cursor.usr();
   if (shouldIncludeTypealias(typedefUsr, typedefName)) {
     final ct = clang.clang_getTypedefDeclUnderlyingType(cursor);
-    final s = getCodeGenType(ct, pointerReference: pointerReference);
+    final s = getCodeGenType(ct,
+        pointerReference: pointerReference, originalCursor: cursor);
 
     if (bindingsIndex.isSeenUnsupportedTypealias(typedefUsr)) {
       // Do not process unsupported typealiases again.
-    } else if (s.broadType == BroadType.Unimplemented) {
-      _logger
-          .fine("Skipped Typedef '$typedefName': Unimplemented type referred.");
+    } else if (s is UnimplementedType) {
+      _logger.fine("Skipped Typedef '$typedefName': "
+          'Unimplemented type referred.');
       bindingsIndex.addUnsupportedTypealiasToSeen(typedefUsr);
-    } else if (s.broadType == BroadType.Compound &&
-        s.compound!.originalName == typedefName) {
+    } else if (s is Compound && s.originalName == typedefName) {
       // Ignore typedef if it refers to a compound with the same original name.
       bindingsIndex.addUnsupportedTypealiasToSeen(typedefUsr);
-      _logger.fine(
-          "Skipped Typedef '$typedefName': Name matches with referred struct/union.");
-    } else if (s.broadType == BroadType.Enum) {
+      _logger.fine("Skipped Typedef '$typedefName': "
+          'Name matches with referred struct/union.');
+    } else if (s is EnumClass) {
       // Ignore typedefs to Enum.
       bindingsIndex.addUnsupportedTypealiasToSeen(typedefUsr);
       _logger.fine("Skipped Typedef '$typedefName': typedef to enum.");
-    } else if (s.broadType == BroadType.Handle) {
+    } else if (s is HandleType) {
       // Ignore typedefs to Handle.
       _logger.fine("Skipped Typedef '$typedefName': typedef to Dart Handle.");
       bindingsIndex.addUnsupportedTypealiasToSeen(typedefUsr);
-    } else if (s.broadType == BroadType.ConstantArray ||
-        s.broadType == BroadType.IncompleteArray) {
+    } else if (s is ConstantArray || s is IncompleteArray) {
       // Ignore typedefs to Constant Array.
       _logger.fine("Skipped Typedef '$typedefName': typedef to array.");
       bindingsIndex.addUnsupportedTypealiasToSeen(typedefUsr);
-    } else if (s.broadType == BroadType.Boolean) {
+    } else if (s is BooleanType) {
       // Ignore typedefs to Boolean.
       _logger.fine("Skipped Typedef '$typedefName': typedef to bool.");
       bindingsIndex.addUnsupportedTypealiasToSeen(typedefUsr);
     } else {
       // Create typealias.
-      _stack.top.typealias = Typealias(
+      return Typealias(
         usr: typedefUsr,
         originalName: typedefName,
         name: config.typedefs.renameUsingConfig(typedefName),
         type: s,
         dartDoc: getCursorDocComment(cursor),
       );
-      bindingsIndex.addTypealiasToSeen(typedefUsr, _stack.top.typealias!);
     }
   }
-
-  if (bindingsIndex.isSeenTypealias(typedefUsr)) {
-    _stack.top.typealias = bindingsIndex.getSeenTypealias(typedefUsr);
-  }
-
-  return _stack.pop().typealias;
+  return null;
 }
diff --git a/pkgs/ffigen/lib/src/header_parser/sub_parsers/unnamed_enumdecl_parser.dart b/pkgs/ffigen/lib/src/header_parser/sub_parsers/unnamed_enumdecl_parser.dart
index 940369a..320e084 100644
--- a/pkgs/ffigen/lib/src/header_parser/sub_parsers/unnamed_enumdecl_parser.dart
+++ b/pkgs/ffigen/lib/src/header_parser/sub_parsers/unnamed_enumdecl_parser.dart
@@ -10,16 +10,22 @@
 import 'package:logging/logging.dart';
 
 import '../clang_bindings/clang_bindings.dart' as clang_types;
-import '../data.dart';
 import '../utils.dart';
 
 final _logger = Logger('ffigen.header_parser.unnamed_enumdecl_parser');
 
+Pointer<
+        NativeFunction<
+            Int32 Function(
+                clang_types.CXCursor, clang_types.CXCursor, Pointer<Void>)>>?
+    _unnamedenumCursorVisitorPtr;
+
 /// Saves unnamed enums.
 void saveUnNamedEnum(clang_types.CXCursor cursor) {
   final resultCode = clang.clang_visitChildren(
     cursor,
-    Pointer.fromFunction(_unnamedenumCursorVisitor, exceptional_visitor_return),
+    _unnamedenumCursorVisitorPtr ??= Pointer.fromFunction(
+        _unnamedenumCursorVisitor, exceptional_visitor_return),
     nullptr,
   );
 
@@ -41,6 +47,9 @@
           _addUnNamedEnumConstant(cursor);
         }
         break;
+      case clang_types.CXCursorKind.CXCursor_UnexposedAttr:
+        // Ignore.
+        break;
       default:
         _logger.severe('Invalid enum constant.');
     }
diff --git a/pkgs/ffigen/lib/src/header_parser/sub_parsers/var_parser.dart b/pkgs/ffigen/lib/src/header_parser/sub_parsers/var_parser.dart
index 9114f82..a8d46d3 100644
--- a/pkgs/ffigen/lib/src/header_parser/sub_parsers/var_parser.dart
+++ b/pkgs/ffigen/lib/src/header_parser/sub_parsers/var_parser.dart
@@ -8,7 +8,6 @@
 import 'package:logging/logging.dart';
 
 import '../clang_bindings/clang_bindings.dart' as clang_types;
-import '../data.dart';
 import '../utils.dart';
 
 final _logger = Logger('ffigen.header_parser.var_parser');
@@ -27,13 +26,19 @@
   _logger.fine('++++ Adding Global: ${cursor.completeStringRepr()}');
 
   final type = cursor.type().toCodeGenType();
-  if (type.getBaseType().broadType == BroadType.Unimplemented) {
-    _logger.fine(
-        '---- Removed Global, reason: unsupported type: ${cursor.completeStringRepr()}');
+  if (type.baseType is UnimplementedType) {
+    _logger.fine('---- Removed Global, reason: unsupported type: '
+        '${cursor.completeStringRepr()}');
     _logger.warning("Skipped global variable '$name', type not supported.");
     return null;
   }
 
+  if (config.ffiNativeConfig.enabled) {
+    _logger.warning(
+        "Skipped global variable '$name', not supported in FfiNatives.");
+    return null;
+  }
+
   final global = Global(
     originalName: name,
     name: config.globals.renameUsingConfig(name),
diff --git a/pkgs/ffigen/lib/src/header_parser/translation_unit_parser.dart b/pkgs/ffigen/lib/src/header_parser/translation_unit_parser.dart
index 9a576c0..ea9d594 100644
--- a/pkgs/ffigen/lib/src/header_parser/translation_unit_parser.dart
+++ b/pkgs/ffigen/lib/src/header_parser/translation_unit_parser.dart
@@ -6,27 +6,40 @@
 
 import 'package:ffigen/src/code_generator.dart';
 import 'package:ffigen/src/header_parser/sub_parsers/macro_parser.dart';
+import 'package:ffigen/src/header_parser/sub_parsers/objcinterfacedecl_parser.dart';
 import 'package:ffigen/src/header_parser/sub_parsers/var_parser.dart';
 import 'package:logging/logging.dart';
 
 import 'clang_bindings/clang_bindings.dart' as clang_types;
 import 'data.dart';
 import 'includer.dart';
-import 'sub_parsers/compounddecl_parser.dart';
-import 'sub_parsers/enumdecl_parser.dart';
 import 'sub_parsers/functiondecl_parser.dart';
+import 'type_extractor/extractor.dart';
 import 'utils.dart';
 
 final _logger = Logger('ffigen.header_parser.translation_unit_parser');
 
 late Set<Binding> _bindings;
 
+Pointer<
+        NativeFunction<
+            Int32 Function(
+                clang_types.CXCursor, clang_types.CXCursor, Pointer<Void>)>>?
+    _rootCursorVisitorPtr;
+
+Pointer<
+        NativeFunction<
+            Int32 Function(
+                clang_types.CXCursor, clang_types.CXCursor, Pointer<Void>)>>?
+    _cursorDefinitionVisitorPtr;
+
 /// Parses the translation unit and returns the generated bindings.
 Set<Binding> parseTranslationUnit(clang_types.CXCursor translationUnitCursor) {
   _bindings = {};
   final resultCode = clang.clang_visitChildren(
     translationUnitCursor,
-    Pointer.fromFunction(_rootCursorVisitor, exceptional_visitor_return),
+    _rootCursorVisitorPtr ??=
+        Pointer.fromFunction(_rootCursorVisitor, exceptional_visitor_return),
     nullptr,
   );
 
@@ -46,13 +59,13 @@
           addToBindings(parseFunctionDeclaration(cursor));
           break;
         case clang_types.CXCursorKind.CXCursor_StructDecl:
-          addToBindings(parseCompoundDeclaration(cursor, CompoundType.struct));
-          break;
         case clang_types.CXCursorKind.CXCursor_UnionDecl:
-          addToBindings(parseCompoundDeclaration(cursor, CompoundType.union));
-          break;
         case clang_types.CXCursorKind.CXCursor_EnumDecl:
-          addToBindings(parseEnumDeclaration(cursor));
+        case clang_types.CXCursorKind.CXCursor_ObjCInterfaceDecl:
+          addToBindings(_getCodeGenTypeFromCursor(cursor));
+          break;
+        case clang_types.CXCursorKind.CXCursor_ObjCCategoryDecl:
+          addToBindings(parseObjCCategoryDeclaration(cursor));
           break;
         case clang_types.CXCursorKind.CXCursor_MacroDefinition:
           saveMacroDefinition(cursor);
@@ -82,3 +95,34 @@
     _bindings.add(b);
   }
 }
+
+BindingType? _getCodeGenTypeFromCursor(clang_types.CXCursor cursor) {
+  final t = getCodeGenType(cursor.type(), ignoreFilter: false);
+  return t is BindingType ? t : null;
+}
+
+/// Visits all cursors and builds a map of usr and [CXCursor].
+void buildUsrCursorDefinitionMap(clang_types.CXCursor translationUnitCursor) {
+  _bindings = {};
+  final resultCode = clang.clang_visitChildren(
+    translationUnitCursor,
+    _cursorDefinitionVisitorPtr ??= Pointer.fromFunction(
+        _definitionCursorVisitor, exceptional_visitor_return),
+    nullptr,
+  );
+
+  visitChildrenResultChecker(resultCode);
+}
+
+/// Child visitor invoked on translationUnitCursor [CXCursorKind.CXCursor_TranslationUnit].
+int _definitionCursorVisitor(clang_types.CXCursor cursor,
+    clang_types.CXCursor parent, Pointer<Void> clientData) {
+  try {
+    cursorIndex.saveDefinition(cursor);
+  } catch (e, s) {
+    _logger.severe(e);
+    _logger.severe(s);
+    rethrow;
+  }
+  return clang_types.CXChildVisitResult.CXChildVisit_Continue;
+}
diff --git a/pkgs/ffigen/lib/src/header_parser/type_extractor/cxtypekindmap.dart b/pkgs/ffigen/lib/src/header_parser/type_extractor/cxtypekindmap.dart
index eae99bc..2d25d9f 100644
--- a/pkgs/ffigen/lib/src/header_parser/type_extractor/cxtypekindmap.dart
+++ b/pkgs/ffigen/lib/src/header_parser/type_extractor/cxtypekindmap.dart
@@ -3,28 +3,23 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:ffigen/src/code_generator.dart' show SupportedNativeType;
-import 'package:ffigen/src/header_parser/clang_bindings/clang_bindings.dart'
-    as clang;
+import 'package:ffigen/src/code_generator/imports.dart';
 
-/// Utility to convert CXType to [code_generator.Type].
-///
-/// Key: CXTypekindEnum, Value: TypeString for code_generator
-var cxTypeKindToSupportedNativeTypes = <int, SupportedNativeType>{
-  clang.CXTypeKind.CXType_Void: SupportedNativeType.Void,
-  clang.CXTypeKind.CXType_UChar: SupportedNativeType.Uint8,
-  clang.CXTypeKind.CXType_UShort: SupportedNativeType.Uint16,
-  clang.CXTypeKind.CXType_UInt: SupportedNativeType.Uint32,
-  clang.CXTypeKind.CXType_ULong: SupportedNativeType.Uint64,
-  clang.CXTypeKind.CXType_ULongLong: SupportedNativeType.Uint64,
-  clang.CXTypeKind.CXType_SChar: SupportedNativeType.Int8,
-  clang.CXTypeKind.CXType_Short: SupportedNativeType.Int16,
-  clang.CXTypeKind.CXType_Int: SupportedNativeType.Int32,
-  clang.CXTypeKind.CXType_Long: SupportedNativeType.Int64,
-  clang.CXTypeKind.CXType_LongLong: SupportedNativeType.Int64,
-  clang.CXTypeKind.CXType_Float: SupportedNativeType.Float,
-  clang.CXTypeKind.CXType_Double: SupportedNativeType.Double,
-  clang.CXTypeKind.CXType_Char_S: SupportedNativeType.Int8,
-  clang.CXTypeKind.CXType_Char_U: SupportedNativeType.Uint8,
+var cxTypeKindToImportedTypes = <String, ImportedType>{
+  'void': voidType,
+  'unsigned char': unsignedCharType,
+  'signed char': signedCharType,
+  'char': charType,
+  'unsigned short': unsignedShortType,
+  'short': shortType,
+  'unsigned int': unsignedIntType,
+  'int': intType,
+  'unsigned long': unsignedLongType,
+  'long': longType,
+  'unsigned long long': unsignedLongLongType,
+  'long long': longLongType,
+  'float': floatType,
+  'double': doubleType,
 };
 
 var suportedTypedefToSuportedNativeType = <String, SupportedNativeType>{
@@ -37,4 +32,10 @@
   'int32_t': SupportedNativeType.Int32,
   'int64_t': SupportedNativeType.Int64,
   'intptr_t': SupportedNativeType.IntPtr,
+  'uintptr_t': SupportedNativeType.UintPtr,
+};
+
+var supportedTypedefToImportedType = <String, ImportedType>{
+  'size_t': sizeType,
+  'wchar_t': wCharType,
 };
diff --git a/pkgs/ffigen/lib/src/header_parser/type_extractor/extractor.dart b/pkgs/ffigen/lib/src/header_parser/type_extractor/extractor.dart
index 43d964c..c6a0951 100644
--- a/pkgs/ffigen/lib/src/header_parser/type_extractor/extractor.dart
+++ b/pkgs/ffigen/lib/src/header_parser/type_extractor/extractor.dart
@@ -4,217 +4,365 @@
 
 /// Extracts code_gen Type from type.
 import 'package:ffigen/src/code_generator.dart';
+import 'package:ffigen/src/header_parser/sub_parsers/function_type_param_parser.dart';
 import 'package:ffigen/src/header_parser/sub_parsers/typedefdecl_parser.dart';
 import 'package:ffigen/src/strings.dart' as strings;
 import 'package:logging/logging.dart';
 
+import '../../config_provider/config_types.dart';
 import '../clang_bindings/clang_bindings.dart' as clang_types;
 import '../data.dart';
 import '../sub_parsers/compounddecl_parser.dart';
 import '../sub_parsers/enumdecl_parser.dart';
+import '../sub_parsers/objc_block_parser.dart';
+import '../sub_parsers/objcinterfacedecl_parser.dart';
 import '../type_extractor/cxtypekindmap.dart';
 import '../utils.dart';
 
 final _logger = Logger('ffigen.header_parser.extractor');
 const _padding = '  ';
 
+const maxRecursionDepth = 5;
+
 /// Converts cxtype to a typestring code_generator can accept.
 Type getCodeGenType(
   clang_types.CXType cxtype, {
+  /// Option to ignore declaration filter (Useful in case of extracting
+  /// declarations when they are passed/returned by an included function.)
+  bool ignoreFilter = true,
 
   /// Passed on if a value was marked as a pointer before this one.
   bool pointerReference = false,
+
+  /// Cursor of the declaration, currently this is useful only to extract
+  /// parameter names in function types.
+  clang_types.CXCursor? originalCursor,
 }) {
   _logger.fine('${_padding}getCodeGenType ${cxtype.completeStringRepr()}');
-  final kind = cxtype.kind;
 
-  switch (kind) {
+  // Special case: Elaborated types just refer to another type.
+  if (cxtype.kind == clang_types.CXTypeKind.CXType_Elaborated) {
+    return getCodeGenType(clang.clang_Type_getNamedType(cxtype),
+        ignoreFilter: ignoreFilter, pointerReference: pointerReference);
+  }
+
+  // These basic Objective C types skip the cache, and are conditional on the
+  // language flag.
+  if (config.language == Language.objc) {
+    switch (cxtype.kind) {
+      case clang_types.CXTypeKind.CXType_ObjCObjectPointer:
+        final pt = clang.clang_getPointeeType(cxtype);
+        final s = getCodeGenType(pt,
+            ignoreFilter: ignoreFilter, pointerReference: true);
+        if (s is ObjCInterface) {
+          return s;
+        }
+        return PointerType(objCObjectType);
+      case clang_types.CXTypeKind.CXType_ObjCId:
+      case clang_types.CXTypeKind.CXType_ObjCTypeParam:
+      case clang_types.CXTypeKind.CXType_ObjCClass:
+        return PointerType(objCObjectType);
+      case clang_types.CXTypeKind.CXType_ObjCSel:
+        return PointerType(objCSelType);
+      case clang_types.CXTypeKind.CXType_BlockPointer:
+        return _getOrCreateBlockType(cxtype);
+    }
+  }
+
+  // If the type has a declaration cursor, then use the BindingsIndex to break
+  // any potential cycles, and dedupe the Type.
+  final cursor = clang.clang_getTypeDeclaration(cxtype);
+  if (cursor.kind != clang_types.CXCursorKind.CXCursor_NoDeclFound) {
+    final usr = cursor.usr();
+    var type = bindingsIndex.getSeenType(usr);
+    if (type == null) {
+      final result =
+          _createTypeFromCursor(cxtype, cursor, ignoreFilter, pointerReference);
+      type = result.type;
+      if (type == null) {
+        return UnimplementedType('${cxtype.kindSpelling()} not implemented');
+      }
+      if (result.addToCache) {
+        bindingsIndex.addTypeToSeen(usr, type);
+      }
+    }
+    _fillFromCursorIfNeeded(type, cursor, ignoreFilter, pointerReference);
+    return type;
+  }
+
+  // If the type doesn't have a declaration cursor, then it's a basic type such
+  // as int, or a simple derived type like a pointer, so doesn't need to be
+  // cached.
+  switch (cxtype.kind) {
     case clang_types.CXTypeKind.CXType_Pointer:
       final pt = clang.clang_getPointeeType(cxtype);
-      final s = getCodeGenType(pt, pointerReference: true);
+      final s = getCodeGenType(
+        pt,
+        pointerReference: true,
+        originalCursor: originalCursor,
+      );
 
       // Replace Pointer<_Dart_Handle> with Handle.
       if (config.useDartHandle &&
-          s.broadType == BroadType.Compound &&
-          s.compound!.compoundType == CompoundType.struct &&
-          s.compound!.usr == strings.dartHandleUsr) {
-        return Type.handle();
+          s is Compound &&
+          s.compoundType == CompoundType.struct &&
+          s.usr == strings.dartHandleUsr) {
+        return HandleType();
       }
-      return Type.pointer(s);
-    case clang_types.CXTypeKind.CXType_Typedef:
-      final spelling = clang.clang_getTypedefName(cxtype).toStringAndDispose();
-      if (config.typedefNativeTypeMappings.containsKey(spelling)) {
-        _logger.fine('  Type Mapped from typedef-map');
-        return Type.nativeType(config.typedefNativeTypeMappings[spelling]!);
-      }
-      // Get name from supported typedef name if config allows.
-      if (config.useSupportedTypedefs) {
-        if (suportedTypedefToSuportedNativeType.containsKey(spelling)) {
-          _logger.fine('  Type Mapped from supported typedef');
-          return Type.nativeType(
-              suportedTypedefToSuportedNativeType[spelling]!);
-        }
-      }
-
-      // This is important or we get stuck in infinite recursion.
-      final cursor = clang.clang_getTypeDeclaration(cxtype);
-      final typedefUsr = cursor.usr();
-
-      if (bindingsIndex.isSeenTypealias(typedefUsr)) {
-        return Type.typealias(bindingsIndex.getSeenTypealias(typedefUsr)!);
-      } else {
-        final typealias =
-            parseTypedefDeclaration(cursor, pointerReference: pointerReference);
-
-        if (typealias != null) {
-          return Type.typealias(typealias);
-        } else {
-          // Use underlying type if typealias couldn't be created or if
-          // the user excluded this typedef.
-          final ct = clang.clang_getTypedefDeclUnderlyingType(cursor);
-          return getCodeGenType(ct, pointerReference: pointerReference);
-        }
-      }
-    case clang_types.CXTypeKind.CXType_Elaborated:
-      final et = clang.clang_Type_getNamedType(cxtype);
-      final s = getCodeGenType(et, pointerReference: pointerReference);
-      return s;
-    case clang_types.CXTypeKind.CXType_Record:
-      return _extractfromRecord(cxtype, pointerReference);
-    case clang_types.CXTypeKind.CXType_Enum:
-      final cursor = clang.clang_getTypeDeclaration(cxtype);
-      final usr = cursor.usr();
-
-      if (bindingsIndex.isSeenEnumClass(usr)) {
-        return Type.enumClass(bindingsIndex.getSeenEnumClass(usr)!);
-      } else {
-        final enumClass = parseEnumDeclaration(
-          cursor,
-          ignoreFilter: true,
-        );
-        if (enumClass == null) {
-          // Handle anonymous enum declarations within another declaration.
-          return Type.nativeType(Type.enumNativeType);
-        } else {
-          return Type.enumClass(enumClass);
-        }
-      }
+      return PointerType(s);
     case clang_types.CXTypeKind.CXType_FunctionProto:
       // Primarily used for function pointers.
-      return _extractFromFunctionProto(cxtype);
+      return _extractFromFunctionProto(cxtype, cursor: originalCursor);
     case clang_types.CXTypeKind.CXType_FunctionNoProto:
       // Primarily used for function types with zero arguments.
-      return _extractFromFunctionProto(cxtype);
+      return _extractFromFunctionProto(cxtype, cursor: originalCursor);
     case clang_types.CXTypeKind
         .CXType_ConstantArray: // Primarily used for constant array in struct members.
-      return Type.constantArray(
+      return ConstantArray(
         clang.clang_getNumElements(cxtype),
         clang.clang_getArrayElementType(cxtype).toCodeGenType(),
       );
     case clang_types.CXTypeKind
         .CXType_IncompleteArray: // Primarily used for incomplete array in function parameters.
-      return Type.incompleteArray(
+      return IncompleteArray(
         clang.clang_getArrayElementType(cxtype).toCodeGenType(),
       );
     case clang_types.CXTypeKind.CXType_Bool:
-      return Type.boolean();
+      return BooleanType();
     default:
-      if (cxTypeKindToSupportedNativeTypes.containsKey(kind)) {
-        return Type.nativeType(
-          cxTypeKindToSupportedNativeTypes[kind]!,
-        );
+      var typeSpellKey =
+          clang.clang_getTypeSpelling(cxtype).toStringAndDispose();
+      if (typeSpellKey.startsWith('const ')) {
+        typeSpellKey = typeSpellKey.replaceFirst('const ', '');
+      }
+      if (config.nativeTypeMappings.containsKey(typeSpellKey)) {
+        _logger.fine('  Type $typeSpellKey mapped from type-map.');
+        return config.nativeTypeMappings[typeSpellKey]!;
+      } else if (cxTypeKindToImportedTypes.containsKey(typeSpellKey)) {
+        return cxTypeKindToImportedTypes[typeSpellKey]!;
       } else {
-        _logger.fine(
-            'typedeclarationCursorVisitor: getCodeGenType: Type Not Implemented, ${cxtype.completeStringRepr()}');
-        return Type.unimplemented(
-            'Type: ${cxtype.kindSpelling()} not implemented');
+        _logger.fine('typedeclarationCursorVisitor: getCodeGenType: Type Not '
+            'Implemented, ${cxtype.completeStringRepr()}');
+        return UnimplementedType('${cxtype.kindSpelling()} not implemented');
       }
   }
 }
 
-Type _extractfromRecord(clang_types.CXType cxtype, bool pointerReference) {
-  Type type;
+Type _getOrCreateBlockType(clang_types.CXType cxtype) {
+  final block = parseObjCBlock(cxtype);
+  final key = block.usr;
+  final oldBlock = bindingsIndex.getSeenObjCBlock(key);
+  if (oldBlock != null) {
+    return oldBlock;
+  }
+  bindingsIndex.addObjCBlockToSeen(key, block);
+  return block;
+}
 
-  final cursor = clang.clang_getTypeDeclaration(cxtype);
+class _CreateTypeFromCursorResult {
+  final Type? type;
+
+  // Flag that controls whether the type is added to the cache. It should not
+  // be added to the cache if it's just a fallback implementation, such as the
+  // int that is returned when an enum is excluded by the config. Later we might
+  // need to build the full enum type (eg if it's part of an included struct),
+  // and if we put the fallback int in the cache then the full enum will never
+  // be created.
+  final bool addToCache;
+
+  _CreateTypeFromCursorResult(this.type, {this.addToCache = true});
+}
+
+_CreateTypeFromCursorResult _createTypeFromCursor(clang_types.CXType cxtype,
+    clang_types.CXCursor cursor, bool ignoreFilter, bool pointerReference) {
+  switch (cxtype.kind) {
+    case clang_types.CXTypeKind.CXType_Typedef:
+      final spelling = clang.clang_getTypedefName(cxtype).toStringAndDispose();
+      if (config.language == Language.objc && spelling == strings.objcBOOL) {
+        // Objective C's BOOL type can be either bool or signed char, depending
+        // on the platform. We want to present a consistent API to the user, and
+        // those two types are ABI compatible, so just return bool regardless.
+        return _CreateTypeFromCursorResult(BooleanType());
+      }
+      final usr = cursor.usr();
+      if (config.typedefTypeMappings.containsKey(spelling)) {
+        _logger.fine('  Type $spelling mapped from type-map');
+        return _CreateTypeFromCursorResult(
+            config.typedefTypeMappings[spelling]!);
+      }
+      if (config.usrTypeMappings.containsKey(usr)) {
+        _logger.fine('  Type $spelling mapped from usr');
+        return _CreateTypeFromCursorResult(config.usrTypeMappings[usr]!);
+      }
+      // Get name from supported typedef name if config allows.
+      if (config.useSupportedTypedefs) {
+        if (suportedTypedefToSuportedNativeType.containsKey(spelling)) {
+          _logger.fine('  Type Mapped from supported typedef');
+          return _CreateTypeFromCursorResult(
+              NativeType(suportedTypedefToSuportedNativeType[spelling]!));
+        } else if (supportedTypedefToImportedType.containsKey(spelling)) {
+          _logger.fine('  Type Mapped from supported typedef');
+          return _CreateTypeFromCursorResult(
+              supportedTypedefToImportedType[spelling]!);
+        }
+      }
+
+      final typealias =
+          parseTypedefDeclaration(cursor, pointerReference: pointerReference);
+
+      if (typealias != null) {
+        return _CreateTypeFromCursorResult(typealias);
+      } else {
+        // Use underlying type if typealias couldn't be created or if the user
+        // excluded this typedef.
+        final ct = clang.clang_getTypedefDeclUnderlyingType(cursor);
+        return _CreateTypeFromCursorResult(
+            getCodeGenType(ct, pointerReference: pointerReference),
+            addToCache: false);
+      }
+    case clang_types.CXTypeKind.CXType_Record:
+      return _CreateTypeFromCursorResult(
+          _extractfromRecord(cxtype, cursor, ignoreFilter, pointerReference));
+    case clang_types.CXTypeKind.CXType_Enum:
+      final enumClass = parseEnumDeclaration(
+        cursor,
+        ignoreFilter: ignoreFilter,
+      );
+      if (enumClass == null) {
+        // Handle anonymous enum declarations within another declaration.
+        return _CreateTypeFromCursorResult(EnumClass.nativeType,
+            addToCache: false);
+      } else {
+        return _CreateTypeFromCursorResult(enumClass);
+      }
+    case clang_types.CXTypeKind.CXType_ObjCInterface:
+      return _CreateTypeFromCursorResult(
+          parseObjCInterfaceDeclaration(cursor, ignoreFilter: ignoreFilter));
+    default:
+      return _CreateTypeFromCursorResult(
+          UnimplementedType('Unknown type: ${cxtype.completeStringRepr()}'),
+          addToCache: false);
+  }
+}
+
+void _fillFromCursorIfNeeded(Type? type, clang_types.CXCursor cursor,
+    bool ignoreFilter, bool pointerReference) {
+  if (type == null) return;
+  if (type is Compound) {
+    fillCompoundMembersIfNeeded(type, cursor,
+        ignoreFilter: ignoreFilter, pointerReference: pointerReference);
+  } else if (type is ObjCInterface) {
+    fillObjCInterfaceMethodsIfNeeded(type, cursor);
+  }
+}
+
+Type? _extractfromRecord(clang_types.CXType cxtype, clang_types.CXCursor cursor,
+    bool ignoreFilter, bool pointerReference) {
   _logger.fine('${_padding}_extractfromRecord: ${cursor.completeStringRepr()}');
 
   final cursorKind = clang.clang_getCursorKind(cursor);
   if (cursorKind == clang_types.CXCursorKind.CXCursor_StructDecl ||
       cursorKind == clang_types.CXCursorKind.CXCursor_UnionDecl) {
+    final declSpelling = cursor.spelling();
     final declUsr = cursor.usr();
 
     // Set includer functions according to compoundType.
-    final bool Function(String) isSeenDecl;
-    final Compound? Function(String) getSeenDecl;
     final CompoundType compoundType;
+    final Map<String, ImportedType> compoundTypeMappings;
 
     switch (cursorKind) {
       case clang_types.CXCursorKind.CXCursor_StructDecl:
-        isSeenDecl = bindingsIndex.isSeenStruct;
-        getSeenDecl = bindingsIndex.getSeenStruct;
         compoundType = CompoundType.struct;
+        compoundTypeMappings = config.structTypeMappings;
         break;
       case clang_types.CXCursorKind.CXCursor_UnionDecl:
-        isSeenDecl = bindingsIndex.isSeenUnion;
-        getSeenDecl = bindingsIndex.getSeenUnion;
         compoundType = CompoundType.union;
+        compoundTypeMappings = config.unionTypeMappings;
         break;
       default:
         throw Exception('Unhandled compound type cursorkind.');
     }
 
     // Also add a struct binding, if its unseen.
-    // TODO(23): Check if we should auto add compound declarations.
-    if (isSeenDecl(declUsr)) {
-      type = Type.compound(getSeenDecl(declUsr)!);
-
-      // This will parse the dependencies if needed.
-      parseCompoundDeclaration(
-        cursor,
-        compoundType,
-        ignoreFilter: true,
-        pointerReference: pointerReference,
-      );
+    if (compoundTypeMappings.containsKey(declSpelling)) {
+      _logger.fine('  Type Mapped from type-map');
+      return compoundTypeMappings[declSpelling]!;
+    } else if (config.usrTypeMappings.containsKey(declUsr)) {
+      _logger.fine('  Type Mapped from usr');
+      return config.usrTypeMappings[declUsr]!;
     } else {
-      final struc = parseCompoundDeclaration(
+      final struct = parseCompoundDeclaration(
         cursor,
         compoundType,
-        ignoreFilter: true,
+        ignoreFilter: ignoreFilter,
         pointerReference: pointerReference,
       );
-      type = Type.compound(struc!);
+      return struct;
     }
-  } else {
-    _logger.fine(
-        'typedeclarationCursorVisitor: _extractfromRecord: Not Implemented, ${cursor.completeStringRepr()}');
-    return Type.unimplemented('Type: ${cxtype.kindSpelling()} not implemented');
   }
-
-  return type;
+  _logger.fine('typedeclarationCursorVisitor: _extractfromRecord: '
+      'Not Implemented, ${cursor.completeStringRepr()}');
+  return UnimplementedType('${cxtype.kindSpelling()} not implemented');
 }
 
 // Used for function pointer arguments.
-Type _extractFromFunctionProto(clang_types.CXType cxtype) {
-  final _parameters = <Parameter>[];
+Type _extractFromFunctionProto(clang_types.CXType cxtype,
+    {clang_types.CXCursor? cursor}) {
+  final parameters = <Parameter>[];
   final totalArgs = clang.clang_getNumArgTypes(cxtype);
   for (var i = 0; i < totalArgs; i++) {
     final t = clang.clang_getArgType(cxtype, i);
     final pt = t.toCodeGenType();
 
     if (pt.isIncompleteCompound) {
-      return Type.unimplemented(
+      return UnimplementedType(
           'Incomplete Struct by value in function parameter.');
-    } else if (pt.getBaseType().broadType == BroadType.Unimplemented) {
-      return Type.unimplemented('Function parameter has an unsupported type.');
+    } else if (pt.baseType is UnimplementedType) {
+      return UnimplementedType('Function parameter has an unsupported type.');
     }
 
-    _parameters.add(
+    parameters.add(
       Parameter(name: '', type: pt),
     );
   }
 
-  return Type.nativeFunc(NativeFunc.fromFunctionType(FunctionType(
-    parameters: _parameters,
+  final functionType = FunctionType(
+    parameters: parameters,
     returnType: clang.clang_getResultType(cxtype).toCodeGenType(),
-  )));
+  );
+  _parseAndMergeParamNames(functionType, cursor, maxRecursionDepth);
+  return NativeFunc(functionType);
+}
+
+void _parseAndMergeParamNames(
+  FunctionType functionType,
+  clang_types.CXCursor? cursor,
+  int recursionDepth,
+) {
+  if (cursor == null) {
+    return;
+  }
+  if (recursionDepth == 0) {
+    final cursorRepr = cursor.completeStringRepr();
+    _logger.warning('Recursion depth exceeded when merging function parameters.'
+        ' Last cursor encountered was $cursorRepr');
+    return;
+  }
+
+  final paramsInfo = parseFunctionPointerParamNames(cursor);
+  functionType.addParameterNames(paramsInfo.paramNames);
+
+  for (final param in functionType.parameters) {
+    final paramRealType = param.type.typealiasType;
+    final paramBaseType = paramRealType.baseType.typealiasType;
+    if (paramBaseType is NativeFunc && param.name.isNotEmpty) {
+      final paramFunctionType = paramBaseType.type;
+      final paramCursor = paramsInfo.params[param.name];
+      _parseAndMergeParamNames(
+        paramFunctionType,
+        paramCursor,
+        recursionDepth - 1,
+      );
+    }
+  }
 }
diff --git a/pkgs/ffigen/lib/src/header_parser/utils.dart b/pkgs/ffigen/lib/src/header_parser/utils.dart
index 471cc36..a674618 100644
--- a/pkgs/ffigen/lib/src/header_parser/utils.dart
+++ b/pkgs/ffigen/lib/src/header_parser/utils.dart
@@ -13,12 +13,14 @@
 import 'data.dart';
 import 'type_extractor/extractor.dart';
 
+final _logger = Logger('ffigen.header_parser.utils');
+
 const exceptional_visitor_return =
     clang_types.CXChildVisitResult.CXChildVisit_Break;
 
 /// Check [resultCode] of [clang.clang_visitChildren_wrap].
 ///
-/// Throws exception if resultCode is not 0.
+/// Throws exception if resultCode is not [exceptional_visitor_return].
 void visitChildrenResultChecker(int resultCode) {
   if (resultCode != exceptional_visitor_return) {
     throw Exception(
@@ -28,16 +30,13 @@
 
 /// Logs the warnings/errors returned by clang for a translation unit.
 void logTuDiagnostics(
-  Pointer<clang_types.CXTranslationUnitImpl> tu,
-  Logger logger,
-  String header,
-) {
+    Pointer<clang_types.CXTranslationUnitImpl> tu, Logger logger, String header,
+    {Level logLevel = Level.SEVERE}) {
   final total = clang.clang_getNumDiagnostics(tu);
   if (total == 0) {
     return;
   }
-
-  logger.severe('Header $header: Total errors/warnings: $total.');
+  logger.log(logLevel, 'Header $header: Total errors/warnings: $total.');
   for (var i = 0; i < total; i++) {
     final diag = clang.clang_getDiagnostic(tu, i);
     final cxstring = clang.clang_formatDiagnostic(
@@ -48,7 +47,7 @@
           clang_types
               .CXDiagnosticDisplayOptions.CXDiagnostic_DisplayCategoryName,
     );
-    logger.severe('    ' + cxstring.toStringAndDispose());
+    logger.log(logLevel, '    ${cxstring.toStringAndDispose()}');
     clang.clang_disposeDiagnostic(diag);
   }
 }
@@ -81,6 +80,11 @@
         .toStringAndDispose();
   }
 
+  /// Get code_gen [Type] representation of [clang_types.CXType].
+  Type toCodeGenType() {
+    return getCodeGenType(type(), originalCursor: this);
+  }
+
   /// for debug: returns [spelling] [kind] [kindSpelling] [type] [typeSpelling].
   String completeStringRepr() {
     final cxtype = type();
@@ -89,35 +93,69 @@
     return s;
   }
 
-  /// Dispose type using [type.dispose].
+  /// Type associated with the pointer if any. Type will have kind
+  /// [clang.CXTypeKind.CXType_Invalid] otherwise.
   clang_types.CXType type() {
     return clang.clang_getCursorType(this);
   }
 
-  /// Only valid for [clang.CXCursorKind.CXCursor_FunctionDecl].
-  ///
-  /// Dispose type using [type.dispose].
+  /// Determine whether the given cursor
+  /// represents an anonymous record declaration.
+  bool isAnonymousRecordDecl() {
+    return clang.clang_Cursor_isAnonymousRecordDecl(this) == 1;
+  }
+
+  /// Only valid for [clang.CXCursorKind.CXCursor_FunctionDecl]. Type will have
+  /// kind [clang.CXTypeKind.CXType_Invalid] otherwise.
   clang_types.CXType returnType() {
     return clang.clang_getResultType(type());
   }
 
+  /// Returns the file name of the file that the cursor is inside.
   String sourceFileName() {
     final cxsource = clang.clang_getCursorLocation(this);
     final cxfilePtr = calloc<Pointer<Void>>();
-    final line = calloc<Uint32>();
-    final column = calloc<Uint32>();
-    final offset = calloc<Uint32>();
 
     // Puts the values in these pointers.
-    clang.clang_getFileLocation(cxsource, cxfilePtr, line, column, offset);
+    clang.clang_getFileLocation(cxsource, cxfilePtr, nullptr, nullptr, nullptr);
     final s = clang.clang_getFileName(cxfilePtr.value).toStringAndDispose();
 
     calloc.free(cxfilePtr);
-    calloc.free(line);
-    calloc.free(column);
-    calloc.free(offset);
     return s;
   }
+
+  /// Returns whether the file that the cursor is inside is a system header.
+  bool isInSystemHeader() {
+    final location = clang.clang_getCursorLocation(this);
+    return clang.clang_Location_isInSystemHeader(location) != 0;
+  }
+
+  /// Recursively print the AST, for debugging.
+  void printAst([int maxDepth = 3]) {
+    _printAstVisitorMaxDepth = maxDepth;
+    _printAstVisitor(this, this, Pointer<Void>.fromAddress(0));
+  }
+}
+
+Pointer<
+        NativeFunction<
+            Int32 Function(
+                clang_types.CXCursor, clang_types.CXCursor, Pointer<Void>)>>?
+    _printAstVisitorPtr;
+int _printAstVisitorMaxDepth = 0;
+int _printAstVisitor(clang_types.CXCursor cursor, clang_types.CXCursor parent,
+    Pointer<Void> clientData) {
+  final depth = clientData.address;
+  if (depth > _printAstVisitorMaxDepth) {
+    return clang_types.CXChildVisitResult.CXChildVisit_Break;
+  }
+  print(('  ' * depth) + cursor.completeStringRepr());
+  clang.clang_visitChildren(
+      cursor,
+      _printAstVisitorPtr ??=
+          Pointer.fromFunction(_printAstVisitor, exceptional_visitor_return),
+      Pointer<Void>.fromAddress(depth + 1));
+  return clang_types.CXChildVisitResult.CXChildVisit_Continue;
 }
 
 const commentPrefix = '/// ';
@@ -214,11 +252,6 @@
   return sb.toString().trim();
 }
 
-bool isForwardDeclaration(clang_types.CXCursor cursor) {
-  return clang.clang_Cursor_isNull(clang.clang_getCursorDefinition(cursor)) ==
-      0;
-}
-
 extension CXTypeExt on clang_types.CXType {
   /// Get code_gen [Type] representation of [clang_types.CXType].
   Type toCodeGenType() {
@@ -329,134 +362,85 @@
 /// Tracks if a binding is 'seen' or not.
 class BindingsIndex {
   // Tracks if bindings are already seen, Map key is USR obtained from libclang.
-  final Map<String, Struc> _structs = {};
-  final Map<String, Union> _unions = {};
+  final Map<String, Type> _declaredTypes = {};
   final Map<String, Func> _functions = {};
-  final Map<String, EnumClass> _enumClass = {};
   final Map<String, Constant> _unnamedEnumConstants = {};
   final Map<String, String> _macros = {};
   final Map<String, Global> _globals = {};
+  final Map<String, ObjCBlock> _objcBlocks = {};
 
   /// Contains usr for typedefs which cannot be generated.
   final Set<String> _unsupportedTypealiases = {};
-  final Map<String, Typealias> _typealiases = {};
 
   /// Index for headers.
   final Map<String, bool> _headerCache = {};
 
-  bool isSeenStruct(String usr) {
-    return _structs.containsKey(usr);
+  bool isSeenType(String usr) => _declaredTypes.containsKey(usr);
+  void addTypeToSeen(String usr, Type type) => _declaredTypes[usr] = type;
+  Type? getSeenType(String usr) => _declaredTypes[usr];
+  bool isSeenFunc(String usr) => _functions.containsKey(usr);
+  void addFuncToSeen(String usr, Func func) => _functions[usr] = func;
+  Func? getSeenFunc(String usr) => _functions[usr];
+  bool isSeenUnnamedEnumConstant(String usr) =>
+      _unnamedEnumConstants.containsKey(usr);
+  void addUnnamedEnumConstantToSeen(String usr, Constant enumConstant) =>
+      _unnamedEnumConstants[usr] = enumConstant;
+  Constant? getSeenUnnamedEnumConstant(String usr) =>
+      _unnamedEnumConstants[usr];
+  bool isSeenGlobalVar(String usr) => _globals.containsKey(usr);
+  void addGlobalVarToSeen(String usr, Global global) => _globals[usr] = global;
+  Global? getSeenGlobalVar(String usr) => _globals[usr];
+  bool isSeenMacro(String usr) => _macros.containsKey(usr);
+  void addMacroToSeen(String usr, String macro) => _macros[usr] = macro;
+  String? getSeenMacro(String usr) => _macros[usr];
+  bool isSeenUnsupportedTypealias(String usr) =>
+      _unsupportedTypealiases.contains(usr);
+  void addUnsupportedTypealiasToSeen(String usr) =>
+      _unsupportedTypealiases.add(usr);
+  bool isSeenHeader(String source) => _headerCache.containsKey(source);
+  void addHeaderToSeen(String source, bool includeStatus) =>
+      _headerCache[source] = includeStatus;
+  bool? getSeenHeaderStatus(String source) => _headerCache[source];
+  void addObjCBlockToSeen(String key, ObjCBlock t) => _objcBlocks[key] = t;
+  ObjCBlock? getSeenObjCBlock(String key) => _objcBlocks[key];
+}
+
+class CursorIndex {
+  final _usrCursorDefinition = <String, clang_types.CXCursor>{};
+
+  /// Returns the Cursor definition (if found) or itself.
+  clang_types.CXCursor getDefinition(clang_types.CXCursor cursor) {
+    final cursorDefinition = clang.clang_getCursorDefinition(cursor);
+    if (clang.clang_Cursor_isNull(cursorDefinition) == 0) {
+      return cursorDefinition;
+    } else {
+      final usr = cursor.usr();
+      if (_usrCursorDefinition.containsKey(usr)) {
+        return _usrCursorDefinition[cursor.usr()]!;
+      } else {
+        _logger.warning(
+            "No definition found for declaration - ${cursor.completeStringRepr()}");
+        return cursor;
+      }
+    }
   }
 
-  void addStructToSeen(String usr, Compound struc) {
-    _structs[usr] = struc as Struc;
-  }
-
-  Struc? getSeenStruct(String usr) {
-    return _structs[usr];
-  }
-
-  bool isSeenUnion(String usr) {
-    return _unions.containsKey(usr);
-  }
-
-  void addUnionToSeen(String usr, Compound union) {
-    _unions[usr] = union as Union;
-  }
-
-  Union? getSeenUnion(String usr) {
-    return _unions[usr];
-  }
-
-  bool isSeenFunc(String usr) {
-    return _functions.containsKey(usr);
-  }
-
-  void addFuncToSeen(String usr, Func func) {
-    _functions[usr] = func;
-  }
-
-  Func? getSeenFunc(String usr) {
-    return _functions[usr];
-  }
-
-  bool isSeenEnumClass(String usr) {
-    return _enumClass.containsKey(usr);
-  }
-
-  void addEnumClassToSeen(String usr, EnumClass enumClass) {
-    _enumClass[usr] = enumClass;
-  }
-
-  EnumClass? getSeenEnumClass(String usr) {
-    return _enumClass[usr];
-  }
-
-  bool isSeenUnnamedEnumConstant(String usr) {
-    return _unnamedEnumConstants.containsKey(usr);
-  }
-
-  void addUnnamedEnumConstantToSeen(String usr, Constant enumConstant) {
-    _unnamedEnumConstants[usr] = enumConstant;
-  }
-
-  Constant? getSeenUnnamedEnumConstant(String usr) {
-    return _unnamedEnumConstants[usr];
-  }
-
-  bool isSeenGlobalVar(String usr) {
-    return _globals.containsKey(usr);
-  }
-
-  void addGlobalVarToSeen(String usr, Global global) {
-    _globals[usr] = global;
-  }
-
-  Global? getSeenGlobalVar(String usr) {
-    return _globals[usr];
-  }
-
-  bool isSeenMacro(String usr) {
-    return _macros.containsKey(usr);
-  }
-
-  void addMacroToSeen(String usr, String macro) {
-    _macros[usr] = macro;
-  }
-
-  String? getSeenMacro(String usr) {
-    return _macros[usr];
-  }
-
-  bool isSeenTypealias(String usr) {
-    return _typealiases.containsKey(usr);
-  }
-
-  void addTypealiasToSeen(String usr, Typealias t) {
-    _typealiases[usr] = t;
-  }
-
-  bool isSeenUnsupportedTypealias(String usr) {
-    return _unsupportedTypealiases.contains(usr);
-  }
-
-  void addUnsupportedTypealiasToSeen(String usr) {
-    _unsupportedTypealiases.add(usr);
-  }
-
-  Typealias? getSeenTypealias(String usr) {
-    return _typealiases[usr];
-  }
-
-  bool isSeenHeader(String source) {
-    return _headerCache.containsKey(source);
-  }
-
-  void addHeaderToSeen(String source, bool includeStatus) {
-    _headerCache[source] = includeStatus;
-  }
-
-  bool? getSeenHeaderStatus(String source) {
-    return _headerCache[source];
+  /// Saves cursor definition based on its kind.
+  void saveDefinition(clang_types.CXCursor cursor) {
+    switch (cursor.kind) {
+      case clang_types.CXCursorKind.CXCursor_StructDecl:
+      case clang_types.CXCursorKind.CXCursor_UnionDecl:
+      case clang_types.CXCursorKind.CXCursor_EnumDecl:
+        final usr = cursor.usr();
+        if (!_usrCursorDefinition.containsKey(usr)) {
+          final cursorDefinition = clang.clang_getCursorDefinition(cursor);
+          if (clang.clang_Cursor_isNull(cursorDefinition) == 0) {
+            _usrCursorDefinition[usr] = cursorDefinition;
+          } else {
+            _logger.finest(
+                "Missing cursor definition in current translation unit: ${cursor.completeStringRepr()}");
+          }
+        }
+    }
   }
 }
diff --git a/pkgs/ffigen/lib/src/strings.dart b/pkgs/ffigen/lib/src/strings.dart
index 5ae3e35..e0f2761 100644
--- a/pkgs/ffigen/lib/src/strings.dart
+++ b/pkgs/ffigen/lib/src/strings.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 import 'dart:io';
 
-import 'package:ffigen/src/code_generator/type.dart';
+import 'package:ffigen/src/code_generator.dart';
 import 'package:ffigen/src/header_parser/clang_bindings/clang_bindings.dart'
     as clang;
 
@@ -29,6 +29,25 @@
 
 const output = 'output';
 
+// Sub-keys of output.
+const bindings = "bindings";
+const symbolFile = 'symbol-file';
+
+const language = 'language';
+
+// String mappings for the Language enum.
+const langC = 'c';
+const langObjC = 'objc';
+
+// Clang command line args for Objective C.
+const clangLangObjC = ['-x', 'objective-c'];
+const clangObjCBoolDefine = '__OBJC_BOOL_IS_BOOL';
+const clangInclude = '-include';
+
+// Special objective C types.
+const objcBOOL = 'BOOL';
+const objcInstanceType = 'instancetype';
+
 const headers = 'headers';
 
 // Sub-fields of headers
@@ -52,6 +71,9 @@
 const globals = 'globals';
 const macros = 'macros';
 const typedefs = 'typedefs';
+const objcInterfaces = 'objc-interfaces';
+
+const excludeAllByDefault = 'exclude-all-by-default';
 
 // Sub-fields of Declarations.
 const include = 'include';
@@ -64,6 +86,9 @@
 const exposeFunctionTypedefs = 'expose-typedefs';
 const leafFunctions = 'leaf';
 
+// Sub-fields of ObjC interfaces.
+const objcModule = 'module';
+
 const dependencyOnly = 'dependency-only';
 // Values for `compoundDependencies`.
 const fullCompoundDependencies = 'full';
@@ -79,9 +104,6 @@
   16: 16,
 };
 
-const sizemap = 'size-map';
-const typedefmap = 'typedef-map';
-
 // Sizemap values.
 const SChar = 'char';
 const UChar = 'unsigned char';
@@ -110,6 +132,50 @@
   Enum: clang.CXTypeKind.CXType_Enum
 };
 
+// Library imports.
+const libraryImports = 'library-imports';
+
+// Sub Keys of symbol file.
+const symbols = 'symbols';
+
+// Symbol file yaml.
+const formatVersion = "format_version";
+
+/// Current symbol file format version.
+///
+/// This is generated when generating any symbol file. When importing any other
+/// symbol file, this version is compared according to `semantic` versioning
+/// to determine compatibility.
+const symbolFileFormatVersion = "1.0.0";
+const files = "files";
+const usedConfig = "used-config";
+
+const import = 'import';
+const defaultSymbolFileImportPrefix = 'imp';
+
+// Sub keys of import.
+const symbolFilesImport = 'symbol-files';
+// Sub-Sub keys of symbolFilesImport.
+const importPath = 'import-path';
+
+final predefinedLibraryImports = {
+  ffiImport.name: ffiImport,
+  ffiPkgImport.name: ffiPkgImport
+};
+
+const typeMap = 'type-map';
+
+// Sub-fields for type-map.
+const typeMapTypedefs = 'typedefs';
+const typeMapStructs = 'structs';
+const typeMapUnions = 'unions';
+const typeMapNativeTypes = 'native-types';
+
+// Sub-sub-keys for fields under typeMap.
+const lib = 'lib';
+const cType = 'c-type';
+const dartType = 'dart-type';
+
 const supportedNativeType_mappings = <String, SupportedNativeType>{
   'Void': SupportedNativeType.Void,
   'Uint8': SupportedNativeType.Uint8,
@@ -128,7 +194,6 @@
 // Boolean flags.
 const sort = 'sort';
 const useSupportedTypedefs = 'use-supported-typedefs';
-const dartBool = 'dart-bool';
 const useDartHandle = 'use-dart-handle';
 
 const comments = 'comments';
@@ -156,19 +221,33 @@
 const libclang_dylib_windows = 'libclang.dll';
 
 // Dynamic library default locations.
-const linuxDylibLocations = [
+const linuxDylibLocations = {
   '/usr/lib/llvm-9/lib/',
   '/usr/lib/llvm-10/lib/',
   '/usr/lib/llvm-11/lib/',
+  '/usr/lib/llvm-12/lib/',
+  '/usr/lib/llvm-13/lib/',
+  '/usr/lib/llvm-14/lib/',
+  '/usr/lib/llvm-15/lib/',
   '/usr/lib/',
   '/usr/lib64/',
-];
-const windowsDylibLocations = [
+};
+const windowsDylibLocations = {
   r'C:\Program Files\LLVM\bin\',
-];
-const macOsDylibLocations = [
+};
+const macOsDylibLocations = {
+  // Default Xcode commandline tools installation.
+  '/Library/Developer/CommandLineTools/usr/',
+  // Default path for LLVM installed with apt-get.
   '/usr/local/opt/llvm/lib/',
-];
+  // Default path for LLVM installed with brew.
+  '/opt/homebrew/opt/llvm/lib/',
+  // Default Xcode installation.
+  // Last because it does not include ObjectiveC headers by default.
+  // See https://github.com/dart-lang/ffigen/pull/402#issuecomment-1154348670.
+  '/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/',
+};
+const xcodeDylibLocation = 'Toolchains/XcodeDefault.xctoolchain/usr/lib/';
 
 // Writen doubles.
 const doubleInfinity = 'double.infinity';
@@ -177,3 +256,19 @@
 
 /// USR for struct `_Dart_Handle`.
 const dartHandleUsr = 'c:@S@_Dart_Handle';
+
+const ffiNative = 'ffi-native';
+const ffiNativeAsset = 'asset';
+
+Directory? _tmpDir;
+
+/// A path to a unique temporary directory that should be used for files meant
+/// to be discarded after the current execution is finished.
+String get tmpDir {
+  if (Platform.environment.containsKey('TEST_TMPDIR')) {
+    return Platform.environment['TEST_TMPDIR']!;
+  }
+
+  _tmpDir ??= Directory.systemTemp.createTempSync();
+  return _tmpDir!.path;
+}
diff --git a/pkgs/ffigen/pubspec.yaml b/pkgs/ffigen/pubspec.yaml
index 34b851e..6c2e147 100644
--- a/pkgs/ffigen/pubspec.yaml
+++ b/pkgs/ffigen/pubspec.yaml
@@ -3,24 +3,26 @@
 # BSD-style license that can be found in the LICENSE file.
 
 name: ffigen
-version: 4.1.3
-homepage: https://github.com/dart-lang/ffigen
+version: 7.2.10
 description: Generator for FFI bindings, using LibClang to parse C header files.
+repository: https://github.com/dart-lang/ffigen
 
 environment:
-  sdk: '>=2.14.0 <3.0.0'
+  sdk: '>=2.17.0 <4.0.0'
 
 dependencies:
-  ffi: ^1.0.0
+  ffi: ^2.0.1
   yaml: ^3.0.0
   path: ^1.8.0
   quiver: ^3.0.0
   args: ^2.0.0
   logging: ^1.0.0
-  cli_util: ^0.3.0
+  cli_util: ^0.4.0
   glob: ^2.0.0
   file: ^6.0.0
+  package_config: ^2.1.0
+  yaml_edit: ^2.0.3
 
 dev_dependencies:
-  lints: ^1.0.1
+  lints: ^2.0.1
   test: ^1.16.2
diff --git a/pkgs/ffigen/test/README.md b/pkgs/ffigen/test/README.md
new file mode 100644
index 0000000..1a499a4
--- /dev/null
+++ b/pkgs/ffigen/test/README.md
@@ -0,0 +1,64 @@
+[![Build Status](https://github.com/dart-lang/ffigen/workflows/Dart%20CI/badge.svg)](https://github.com/dart-lang/ffigen/actions?query=workflow%3A"Dart+CI")
+[![Coverage Status](https://coveralls.io/repos/github/dart-lang/ffigen/badge.svg?branch=master)](https://coveralls.io/github/dart-lang/ffigen?branch=master)
+
+# ffigen testing
+
+## Running Tests
+
+1.  Some tests require that dynamic libraries be built before running the tests.
+    You can do so with:
+
+    ```shell
+    dart run test/setup.dart
+    ```
+
+2.  Run the tests with:
+
+    ```shell
+    dart test
+    ```
+
+## Development
+
+Some tests verify that the generated Dart FFI bindings match a golden file.
+
+For example, the test
+[`test/native_test/native_test.dart`](https://github.com/dart-lang/ffigen/blob/master/test/native_test/native_test.dart)
+works by:
+
+1.  Loading the dynamic library for
+    [`test/native_test/native_test.c`](https://github.com/dart-lang/ffigen/blob/master/test/native_test/native_test.c)
+    (which was generated by `dart run test/setup.dart`).
+
+2.  Generating binding files for that dynamic library in the
+    `test/debug_generated` directory.
+
+3.  Comparing the golden file (i.e.
+    [`test/native_test/native_test_bindings.dart`](https://github.com/dart-lang/ffigen/blob/master/test/native_test/native_test_bindings.dart))
+    to the generated file and generating a test failure if they do not match.
+
+4.  Using the *golden* bindings to excercise the dynamic library.
+
+If you modify any source for a dynamic library (e.g. any `.c`, `.h` or `.m`
+files), then you should run:
+
+```shell
+   dart run test/setup.dart  # Rebuild the dynamic libraries.
+   dart run test/regen.dart  # Rebuild the golden FFI bindings.
+```
+
+If you modify any code that changes how FFI bindings are generated, then you
+should run:
+
+  ```shell
+  dart run test/regen.dart  # Rebuild the golden FFI bindings.
+  ```
+
+A conservative way to run tests is with:
+
+  ```shell
+  dart run test/setup.dart && dart run test/regen.dart && dart test
+  ```
+
+> Note: you should verify that the changes to the golden bindings are
+> reasonable with `git diff`.
diff --git a/pkgs/ffigen/test/code_generator_tests/code_generator_test.dart b/pkgs/ffigen/test/code_generator_tests/code_generator_test.dart
index 34905a4..e16d3d9 100644
--- a/pkgs/ffigen/test/code_generator_tests/code_generator_test.dart
+++ b/pkgs/ffigen/test/code_generator_tests/code_generator_test.dart
@@ -15,7 +15,7 @@
           Func(
             name: 'noParam',
             dartDoc: 'Just a test function\nheres another line',
-            returnType: Type.nativeType(
+            returnType: NativeType(
               SupportedNativeType.Int32,
             ),
           ),
@@ -24,18 +24,18 @@
             parameters: [
               Parameter(
                 name: 'a',
-                type: Type.nativeType(
+                type: NativeType(
                   SupportedNativeType.Int32,
                 ),
               ),
               Parameter(
                 name: 'b',
-                type: Type.nativeType(
+                type: NativeType(
                   SupportedNativeType.Uint8,
                 ),
               ),
             ],
-            returnType: Type.nativeType(
+            returnType: NativeType(
               SupportedNativeType.Char,
             ),
           ),
@@ -44,25 +44,25 @@
             parameters: [
               Parameter(
                 name: 'a',
-                type: Type.pointer(
-                  Type.nativeType(
+                type: PointerType(
+                  NativeType(
                     SupportedNativeType.Int32,
                   ),
                 ),
               ),
               Parameter(
                 name: 'b',
-                type: Type.pointer(
-                  Type.pointer(
-                    Type.nativeType(
+                type: PointerType(
+                  PointerType(
+                    NativeType(
                       SupportedNativeType.Uint8,
                     ),
                   ),
                 ),
               ),
             ],
-            returnType: Type.pointer(
-              Type.nativeType(
+            returnType: PointerType(
+              NativeType(
                 SupportedNativeType.Double,
               ),
             ),
@@ -74,12 +74,12 @@
             parameters: [
               Parameter(
                 name: 'a',
-                type: Type.nativeType(
+                type: NativeType(
                   SupportedNativeType.Int32,
                 ),
               ),
             ],
-            returnType: Type.nativeType(
+            returnType: NativeType(
               SupportedNativeType.Int32,
             ),
           ),
@@ -93,49 +93,49 @@
       final library = Library(
         name: 'Bindings',
         bindings: [
-          Struc(
+          Struct(
             name: 'NoMember',
             dartDoc: 'Just a test struct\nheres another line',
           ),
-          Struc(
+          Struct(
             name: 'WithPrimitiveMember',
             members: [
               Member(
                 name: 'a',
-                type: Type.nativeType(
+                type: NativeType(
                   SupportedNativeType.Int32,
                 ),
               ),
               Member(
                 name: 'b',
-                type: Type.nativeType(
+                type: NativeType(
                   SupportedNativeType.Double,
                 ),
               ),
               Member(
                 name: 'c',
-                type: Type.nativeType(
+                type: NativeType(
                   SupportedNativeType.Char,
                 ),
               ),
             ],
           ),
-          Struc(
+          Struct(
             name: 'WithPointerMember',
             members: [
               Member(
                 name: 'a',
-                type: Type.pointer(
-                  Type.nativeType(
+                type: PointerType(
+                  NativeType(
                     SupportedNativeType.Int32,
                   ),
                 ),
               ),
               Member(
                 name: 'b',
-                type: Type.pointer(
-                  Type.pointer(
-                    Type.nativeType(
+                type: PointerType(
+                  PointerType(
+                    NativeType(
                       SupportedNativeType.Double,
                     ),
                   ),
@@ -143,12 +143,35 @@
               ),
               Member(
                 name: 'c',
-                type: Type.nativeType(
+                type: NativeType(
                   SupportedNativeType.Char,
                 ),
               ),
             ],
           ),
+          Struct(
+            name: 'WithIntPtrUintPtr',
+            members: [
+              Member(
+                name: 'a',
+                type: PointerType(
+                  NativeType(
+                    SupportedNativeType.UintPtr,
+                  ),
+                ),
+              ),
+              Member(
+                name: 'b',
+                type: PointerType(
+                  PointerType(
+                    NativeType(
+                      SupportedNativeType.IntPtr,
+                    ),
+                  ),
+                ),
+              ),
+            ],
+          ),
         ],
       );
 
@@ -156,24 +179,24 @@
     });
 
     test('Function and Struct Binding (pointer to Struct)', () {
-      final structSome = Struc(
-        name: 'SomeStruc',
+      final structSome = Struct(
+        name: 'SomeStruct',
         members: [
           Member(
             name: 'a',
-            type: Type.nativeType(
+            type: NativeType(
               SupportedNativeType.Int32,
             ),
           ),
           Member(
             name: 'b',
-            type: Type.nativeType(
+            type: NativeType(
               SupportedNativeType.Double,
             ),
           ),
           Member(
             name: 'c',
-            type: Type.nativeType(
+            type: NativeType(
               SupportedNativeType.Char,
             ),
           ),
@@ -188,19 +211,15 @@
             parameters: [
               Parameter(
                 name: 'some',
-                type: Type.pointer(
-                  Type.pointer(
-                    Type.struct(
-                      structSome,
-                    ),
+                type: PointerType(
+                  PointerType(
+                    structSome,
                   ),
                 ),
               ),
             ],
-            returnType: Type.pointer(
-              Type.struct(
-                structSome,
-              ),
+            returnType: PointerType(
+              structSome,
             ),
           ),
         ],
@@ -210,39 +229,37 @@
     });
 
     test('global (primitives, pointers, pointer to struct)', () {
-      final strucSome = Struc(
+      final structSome = Struct(
         name: 'Some',
       );
-      final emptyGlobalStruc = Struc(name: 'EmptyStruct');
+      final emptyGlobalStruct = Struct(name: 'EmptyStruct');
 
       final library = Library(
         name: 'Bindings',
         bindings: [
           Global(
             name: 'test1',
-            type: Type.nativeType(
+            type: NativeType(
               SupportedNativeType.Int32,
             ),
           ),
           Global(
             name: 'test2',
-            type: Type.pointer(
-              Type.nativeType(
+            type: PointerType(
+              NativeType(
                 SupportedNativeType.Float,
               ),
             ),
           ),
-          strucSome,
+          structSome,
           Global(
             name: 'test5',
-            type: Type.pointer(
-              Type.struct(
-                strucSome,
-              ),
+            type: PointerType(
+              structSome,
             ),
           ),
-          emptyGlobalStruc,
-          Global(name: 'globalStruct', type: Type.struct(emptyGlobalStruc)),
+          emptyGlobalStruct,
+          Global(name: 'globalStruct', type: emptyGlobalStruct),
         ],
       );
       _matchLib(library, 'global');
@@ -296,38 +313,38 @@
         bindings: [
           Func(
             name: 'test',
-            returnType: Type.nativeType(SupportedNativeType.Void),
+            returnType: NativeType(SupportedNativeType.Void),
           ),
           Func(
             name: '_test',
-            returnType: Type.nativeType(SupportedNativeType.Void),
+            returnType: NativeType(SupportedNativeType.Void),
           ),
           Func(
             name: '_c_test',
-            returnType: Type.nativeType(SupportedNativeType.Void),
+            returnType: NativeType(SupportedNativeType.Void),
           ),
           Func(
             name: '_dart_test',
-            returnType: Type.nativeType(SupportedNativeType.Void),
+            returnType: NativeType(SupportedNativeType.Void),
           ),
-          Struc(
+          Struct(
             name: '_Test',
             members: [
               Member(
                 name: 'array',
-                type: Type.constantArray(
+                type: ConstantArray(
                   2,
-                  Type.nativeType(
+                  NativeType(
                     SupportedNativeType.Int8,
                   ),
                 ),
               ),
             ],
           ),
-          Struc(name: 'ArrayHelperPrefixCollisionTest'),
+          Struct(name: 'ArrayHelperPrefixCollisionTest'),
           Func(
             name: 'Test',
-            returnType: Type.nativeType(SupportedNativeType.Void),
+            returnType: NativeType(SupportedNativeType.Void),
           ),
           EnumClass(name: '_c_Test'),
           EnumClass(name: 'init_dylib'),
@@ -339,58 +356,34 @@
   test('boolean_dartBool', () {
     final library = Library(
       name: 'Bindings',
-      dartBool: true,
       bindings: [
         Func(
           name: 'test1',
-          returnType: Type.boolean(),
+          returnType: BooleanType(),
           parameters: [
-            Parameter(name: 'a', type: Type.boolean()),
-            Parameter(name: 'b', type: Type.pointer(Type.boolean())),
+            Parameter(name: 'a', type: BooleanType()),
+            Parameter(name: 'b', type: PointerType(BooleanType())),
           ],
         ),
-        Struc(
+        Struct(
           name: 'Test2',
           members: [
-            Member(name: 'a', type: Type.boolean()),
+            Member(name: 'a', type: BooleanType()),
           ],
         ),
       ],
     );
     _matchLib(library, 'boolean_dartbool');
   });
-  test('boolean_no_dartBool', () {
-    final library = Library(
-      name: 'Bindings',
-      dartBool: false,
-      bindings: [
-        Func(
-          name: 'test1',
-          returnType: Type.boolean(),
-          parameters: [
-            Parameter(name: 'a', type: Type.boolean()),
-            Parameter(name: 'b', type: Type.pointer(Type.boolean())),
-          ],
-        ),
-        Struc(
-          name: 'Test2',
-          members: [
-            Member(name: 'a', type: Type.boolean()),
-          ],
-        ),
-      ],
-    );
-    _matchLib(library, 'boolean_no_dartbool');
-  });
   test('sort bindings', () {
     final library = Library(
       name: 'Bindings',
       sort: true,
       bindings: [
-        Func(name: 'b', returnType: Type.nativeType(SupportedNativeType.Void)),
-        Func(name: 'a', returnType: Type.nativeType(SupportedNativeType.Void)),
-        Struc(name: 'D'),
-        Struc(name: 'C'),
+        Func(name: 'b', returnType: NativeType(SupportedNativeType.Void)),
+        Func(name: 'a', returnType: NativeType(SupportedNativeType.Void)),
+        Struct(name: 'D'),
+        Struct(name: 'C'),
       ],
     );
     _matchLib(library, 'sort_bindings');
@@ -399,35 +392,33 @@
     final library = Library(
       name: 'Bindings',
       bindings: [
-        Struc(name: 'NoPacking', pack: null, members: [
-          Member(name: 'a', type: Type.nativeType(SupportedNativeType.Char)),
+        Struct(name: 'NoPacking', pack: null, members: [
+          Member(name: 'a', type: NativeType(SupportedNativeType.Char)),
         ]),
-        Struc(name: 'Pack1', pack: 1, members: [
-          Member(name: 'a', type: Type.nativeType(SupportedNativeType.Char)),
+        Struct(name: 'Pack1', pack: 1, members: [
+          Member(name: 'a', type: NativeType(SupportedNativeType.Char)),
         ]),
-        Struc(name: 'Pack2', pack: 2, members: [
-          Member(name: 'a', type: Type.nativeType(SupportedNativeType.Char)),
+        Struct(name: 'Pack2', pack: 2, members: [
+          Member(name: 'a', type: NativeType(SupportedNativeType.Char)),
         ]),
-        Struc(name: 'Pack2', pack: 4, members: [
-          Member(name: 'a', type: Type.nativeType(SupportedNativeType.Char)),
+        Struct(name: 'Pack2', pack: 4, members: [
+          Member(name: 'a', type: NativeType(SupportedNativeType.Char)),
         ]),
-        Struc(name: 'Pack2', pack: 8, members: [
-          Member(name: 'a', type: Type.nativeType(SupportedNativeType.Char)),
+        Struct(name: 'Pack2', pack: 8, members: [
+          Member(name: 'a', type: NativeType(SupportedNativeType.Char)),
         ]),
-        Struc(name: 'Pack16', pack: 16, members: [
-          Member(name: 'a', type: Type.nativeType(SupportedNativeType.Char)),
+        Struct(name: 'Pack16', pack: 16, members: [
+          Member(name: 'a', type: NativeType(SupportedNativeType.Char)),
         ]),
       ],
     );
     _matchLib(library, 'packed_structs');
   });
   test('Union Bindings', () {
-    final struct1 = Struc(name: 'Struct1', members: [
-      Member(name: 'a', type: Type.nativeType(SupportedNativeType.Int8))
-    ]);
-    final union1 = Union(name: 'Union1', members: [
-      Member(name: 'a', type: Type.nativeType(SupportedNativeType.Int8))
-    ]);
+    final struct1 =
+        Struct(name: 'Struct1', members: [Member(name: 'a', type: charType)]);
+    final union1 =
+        Union(name: 'Union1', members: [Member(name: 'a', type: charType)]);
     final library = Library(
       name: 'Bindings',
       bindings: [
@@ -435,30 +426,23 @@
         union1,
         Union(name: 'EmptyUnion'),
         Union(name: 'Primitives', members: [
-          Member(name: 'a', type: Type.nativeType(SupportedNativeType.Int8)),
-          Member(name: 'b', type: Type.nativeType(SupportedNativeType.Int32)),
-          Member(name: 'c', type: Type.nativeType(SupportedNativeType.Float)),
-          Member(name: 'd', type: Type.nativeType(SupportedNativeType.Double)),
+          Member(name: 'a', type: charType),
+          Member(name: 'b', type: intType),
+          Member(name: 'c', type: floatType),
+          Member(name: 'd', type: doubleType),
         ]),
         Union(name: 'PrimitivesWithPointers', members: [
-          Member(name: 'a', type: Type.nativeType(SupportedNativeType.Int8)),
-          Member(name: 'b', type: Type.nativeType(SupportedNativeType.Float)),
-          Member(
-              name: 'c',
-              type: Type.pointer(Type.nativeType(SupportedNativeType.Double))),
-          Member(name: 'd', type: Type.pointer(Type.union(union1))),
-          Member(name: 'd', type: Type.pointer(Type.struct(struct1))),
+          Member(name: 'a', type: charType),
+          Member(name: 'b', type: floatType),
+          Member(name: 'c', type: PointerType(doubleType)),
+          Member(name: 'd', type: PointerType(union1)),
+          Member(name: 'd', type: PointerType(struct1)),
         ]),
         Union(name: 'WithArray', members: [
-          Member(
-              name: 'a',
-              type: Type.constantArray(
-                  10, Type.nativeType(SupportedNativeType.Int8))),
-          Member(name: 'b', type: Type.constantArray(10, Type.union(union1))),
-          Member(name: 'b', type: Type.constantArray(10, Type.struct(struct1))),
-          Member(
-              name: 'c',
-              type: Type.constantArray(10, Type.pointer(Type.union(union1)))),
+          Member(name: 'a', type: ConstantArray(10, charType)),
+          Member(name: 'b', type: ConstantArray(10, union1)),
+          Member(name: 'b', type: ConstantArray(10, struct1)),
+          Member(name: 'c', type: ConstantArray(10, PointerType(union1))),
         ]),
       ],
     );
@@ -469,31 +453,26 @@
       name: 'Bindings',
       header: '// ignore_for_file: non_constant_identifier_names\n',
       bindings: [
-        Typealias(
-            name: 'RawUnused', type: Type.compound(Struc(name: 'Struct1'))),
-        Struc(name: 'WithTypealiasStruc', members: [
+        Typealias(name: 'RawUnused', type: Struct(name: 'Struct1')),
+        Struct(name: 'WithTypealiasStruct', members: [
           Member(
               name: 't',
-              type: Type.typealias(Typealias(
+              type: Typealias(
                   name: 'Struct2Typealias',
-                  type: Type.struct(Struc(name: 'Struct2', members: [
-                    Member(
-                        name: 'a',
-                        type: Type.nativeType(SupportedNativeType.Double))
-                  ])))))
+                  type: Struct(
+                      name: 'Struct2',
+                      members: [Member(name: 'a', type: doubleType)])))
         ]),
         Func(
-            name: 'WithTypealiasStruc',
-            returnType: Type.pointer(Type.nativeFunc(
-                NativeFunc.fromFunctionType(FunctionType(
-                    returnType: Type.nativeType(SupportedNativeType.Void),
-                    parameters: [])))),
+            name: 'WithTypealiasStruct',
+            returnType: PointerType(NativeFunc(FunctionType(
+                returnType: NativeType(SupportedNativeType.Void),
+                parameters: []))),
             parameters: [
               Parameter(
                   name: 't',
-                  type: Type.typealias(Typealias(
-                      name: 'Struct3Typealias',
-                      type: Type.struct(Struc(name: 'Struct3')))))
+                  type: Typealias(
+                      name: 'Struct3Typealias', type: Struct(name: 'Struct3')))
             ]),
       ],
     );
@@ -503,11 +482,7 @@
 
 /// Utility to match expected bindings to the generated bindings.
 void _matchLib(Library lib, String testName) {
-  matchLibraryWithExpected(lib, [
-    'test',
-    'debug_generated',
-    'code_generator_test_${testName}_output.dart'
-  ], [
+  matchLibraryWithExpected(lib, 'code_generator_test_${testName}_output.dart', [
     'test',
     'code_generator_tests',
     'expected_bindings',
diff --git a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_boolean_dartbool_bindings.dart b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_boolean_dartbool_bindings.dart
index 2e94121..0bc046c 100644
--- a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_boolean_dartbool_bindings.dart
+++ b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_boolean_dartbool_bindings.dart
@@ -1,6 +1,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 //
 // Generated by `package:ffigen`.
+// ignore_for_file: type=lint
 import 'dart:ffi' as ffi;
 
 class Bindings {
@@ -19,23 +20,22 @@
 
   bool test1(
     bool a,
-    ffi.Pointer<ffi.Uint8> b,
+    ffi.Pointer<ffi.Bool> b,
   ) {
     return _test1(
-          a ? 1 : 0,
-          b,
-        ) !=
-        0;
+      a,
+      b,
+    );
   }
 
   late final _test1Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Uint8 Function(ffi.Uint8, ffi.Pointer<ffi.Uint8>)>>('test1');
+          ffi.Bool Function(ffi.Bool, ffi.Pointer<ffi.Bool>)>>('test1');
   late final _test1 =
-      _test1Ptr.asFunction<int Function(int, ffi.Pointer<ffi.Uint8>)>();
+      _test1Ptr.asFunction<bool Function(bool, ffi.Pointer<ffi.Bool>)>();
 }
 
 class Test2 extends ffi.Struct {
-  @ffi.Uint8()
-  external int a;
+  @ffi.Bool()
+  external bool a;
 }
diff --git a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_boolean_no_dartbool_bindings.dart b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_boolean_no_dartbool_bindings.dart
deleted file mode 100644
index c44dddd..0000000
--- a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_boolean_no_dartbool_bindings.dart
+++ /dev/null
@@ -1,40 +0,0 @@
-// AUTO GENERATED FILE, DO NOT EDIT.
-//
-// Generated by `package:ffigen`.
-import 'dart:ffi' as ffi;
-
-class Bindings {
-  /// Holds the symbol lookup function.
-  final ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
-      _lookup;
-
-  /// The symbols are looked up in [dynamicLibrary].
-  Bindings(ffi.DynamicLibrary dynamicLibrary) : _lookup = dynamicLibrary.lookup;
-
-  /// The symbols are looked up with [lookup].
-  Bindings.fromLookup(
-      ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
-          lookup)
-      : _lookup = lookup;
-
-  int test1(
-    int a,
-    ffi.Pointer<ffi.Uint8> b,
-  ) {
-    return _test1(
-      a,
-      b,
-    );
-  }
-
-  late final _test1Ptr = _lookup<
-      ffi.NativeFunction<
-          ffi.Uint8 Function(ffi.Uint8, ffi.Pointer<ffi.Uint8>)>>('test1');
-  late final _test1 =
-      _test1Ptr.asFunction<int Function(int, ffi.Pointer<ffi.Uint8>)>();
-}
-
-class Test2 extends ffi.Struct {
-  @ffi.Uint8()
-  external int a;
-}
diff --git a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_constant_bindings.dart b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_constant_bindings.dart
index d01f2b1..a425c42 100644
--- a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_constant_bindings.dart
+++ b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_constant_bindings.dart
@@ -3,7 +3,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 //
 // Generated by `package:ffigen`.
-import 'dart:ffi' as ffi;
+// ignore_for_file: type=lint
 
 const int test1 = 20;
 
diff --git a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_enumclass_bindings.dart b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_enumclass_bindings.dart
index 0aa2dbb..1f759d5 100644
--- a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_enumclass_bindings.dart
+++ b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_enumclass_bindings.dart
@@ -3,8 +3,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 //
 // Generated by `package:ffigen`.
-import 'dart:ffi' as ffi;
-
+// ignore_for_file: type=lint
 /// test line 1
 /// test line 2
 abstract class Constants {
diff --git a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_function_bindings.dart b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_function_bindings.dart
index ada968c..ae9fc13 100644
--- a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_function_bindings.dart
+++ b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_function_bindings.dart
@@ -1,6 +1,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 //
 // Generated by `package:ffigen`.
+// ignore_for_file: type=lint
 import 'dart:ffi' as ffi;
 
 class Bindings {
diff --git a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_function_n_struct_bindings.dart b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_function_n_struct_bindings.dart
index 6ccce4e..cad1980 100644
--- a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_function_n_struct_bindings.dart
+++ b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_function_n_struct_bindings.dart
@@ -1,6 +1,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 //
 // Generated by `package:ffigen`.
+// ignore_for_file: type=lint
 import 'dart:ffi' as ffi;
 
 class Bindings {
@@ -17,8 +18,8 @@
           lookup)
       : _lookup = lookup;
 
-  ffi.Pointer<SomeStruc> someFunc(
-    ffi.Pointer<ffi.Pointer<SomeStruc>> some,
+  ffi.Pointer<SomeStruct> someFunc(
+    ffi.Pointer<ffi.Pointer<SomeStruct>> some,
   ) {
     return _someFunc(
       some,
@@ -27,13 +28,13 @@
 
   late final _someFuncPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<SomeStruc> Function(
-              ffi.Pointer<ffi.Pointer<SomeStruc>>)>>('someFunc');
+          ffi.Pointer<SomeStruct> Function(
+              ffi.Pointer<ffi.Pointer<SomeStruct>>)>>('someFunc');
   late final _someFunc = _someFuncPtr.asFunction<
-      ffi.Pointer<SomeStruc> Function(ffi.Pointer<ffi.Pointer<SomeStruc>>)>();
+      ffi.Pointer<SomeStruct> Function(ffi.Pointer<ffi.Pointer<SomeStruct>>)>();
 }
 
-class SomeStruc extends ffi.Struct {
+class SomeStruct extends ffi.Struct {
   @ffi.Int32()
   external int a;
 
diff --git a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_global_bindings.dart b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_global_bindings.dart
index 0a531fa..f3f3f12 100644
--- a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_global_bindings.dart
+++ b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_global_bindings.dart
@@ -1,6 +1,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 //
 // Generated by `package:ffigen`.
+// ignore_for_file: type=lint
 import 'dart:ffi' as ffi;
 
 class Bindings {
diff --git a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_internal_conflict_resolution_bindings.dart b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_internal_conflict_resolution_bindings.dart
index b6e1378..edc3935 100644
--- a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_internal_conflict_resolution_bindings.dart
+++ b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_internal_conflict_resolution_bindings.dart
@@ -3,6 +3,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 //
 // Generated by `package:ffigen`.
+// ignore_for_file: type=lint
 import 'dart:ffi' as ffi;
 
 class init_dylib1 {
diff --git a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_packed_structs_bindings.dart b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_packed_structs_bindings.dart
index 4aea89a..e703e28 100644
--- a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_packed_structs_bindings.dart
+++ b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_packed_structs_bindings.dart
@@ -1,6 +1,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 //
 // Generated by `package:ffigen`.
+// ignore_for_file: type=lint
 import 'dart:ffi' as ffi;
 
 class NoPacking extends ffi.Struct {
diff --git a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_sort_bindings_bindings.dart b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_sort_bindings_bindings.dart
index cbae1f8..3a9aa67 100644
--- a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_sort_bindings_bindings.dart
+++ b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_sort_bindings_bindings.dart
@@ -1,6 +1,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 //
 // Generated by `package:ffigen`.
+// ignore_for_file: type=lint
 import 'dart:ffi' as ffi;
 
 class Bindings {
diff --git a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_struct_bindings.dart b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_struct_bindings.dart
index f84642b..f8482e7 100644
--- a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_struct_bindings.dart
+++ b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_struct_bindings.dart
@@ -1,6 +1,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 //
 // Generated by `package:ffigen`.
+// ignore_for_file: type=lint
 import 'dart:ffi' as ffi;
 
 /// Just a test struct
@@ -26,3 +27,9 @@
   @ffi.Uint8()
   external int c;
 }
+
+class WithIntPtrUintPtr extends ffi.Struct {
+  external ffi.Pointer<ffi.UintPtr> a;
+
+  external ffi.Pointer<ffi.Pointer<ffi.IntPtr>> b;
+}
diff --git a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_typealias_bindings.dart b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_typealias_bindings.dart
index e605db2..00306c6 100644
--- a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_typealias_bindings.dart
+++ b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_typealias_bindings.dart
@@ -3,6 +3,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 //
 // Generated by `package:ffigen`.
+// ignore_for_file: type=lint
 import 'dart:ffi' as ffi;
 
 class Bindings {
@@ -19,19 +20,19 @@
           lookup)
       : _lookup = lookup;
 
-  ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>> WithTypealiasStruc1(
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>> WithTypealiasStruct1(
     Struct3Typealias t,
   ) {
-    return _WithTypealiasStruc1(
+    return _WithTypealiasStruct1(
       t,
     );
   }
 
-  late final _WithTypealiasStruc1Ptr = _lookup<
+  late final _WithTypealiasStruct1Ptr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>> Function(
-              Struct3Typealias)>>('WithTypealiasStruc');
-  late final _WithTypealiasStruc1 = _WithTypealiasStruc1Ptr.asFunction<
+              Struct3Typealias)>>('WithTypealiasStruct');
+  late final _WithTypealiasStruct1 = _WithTypealiasStruct1Ptr.asFunction<
       ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>> Function(
           Struct3Typealias)>();
 }
@@ -40,7 +41,7 @@
 
 class Struct1 extends ffi.Opaque {}
 
-class WithTypealiasStruc extends ffi.Struct {
+class WithTypealiasStruct extends ffi.Struct {
   external Struct2Typealias t;
 }
 
diff --git a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_unions_bindings.dart b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_unions_bindings.dart
index c7e7680..1865919 100644
--- a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_unions_bindings.dart
+++ b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_unions_bindings.dart
@@ -1,25 +1,26 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 //
 // Generated by `package:ffigen`.
+// ignore_for_file: type=lint
 import 'dart:ffi' as ffi;
 
 class Struct1 extends ffi.Struct {
-  @ffi.Int8()
+  @ffi.Char()
   external int a;
 }
 
 class Union1 extends ffi.Union {
-  @ffi.Int8()
+  @ffi.Char()
   external int a;
 }
 
 class EmptyUnion extends ffi.Opaque {}
 
 class Primitives extends ffi.Union {
-  @ffi.Int8()
+  @ffi.Char()
   external int a;
 
-  @ffi.Int32()
+  @ffi.Int()
   external int b;
 
   @ffi.Float()
@@ -30,7 +31,7 @@
 }
 
 class PrimitivesWithPointers extends ffi.Union {
-  @ffi.Int8()
+  @ffi.Char()
   external int a;
 
   @ffi.Float()
@@ -45,7 +46,7 @@
 
 class WithArray extends ffi.Union {
   @ffi.Array.multi([10])
-  external ffi.Array<ffi.Int8> a;
+  external ffi.Array<ffi.Char> a;
 
   @ffi.Array.multi([10])
   external ffi.Array<Union1> b;
diff --git a/pkgs/ffigen/test/collision_tests/decl_decl_collision_test.dart b/pkgs/ffigen/test/collision_tests/decl_decl_collision_test.dart
index 914563b..4529f29 100644
--- a/pkgs/ffigen/test/collision_tests/decl_decl_collision_test.dart
+++ b/pkgs/ffigen/test/collision_tests/decl_decl_collision_test.dart
@@ -14,16 +14,14 @@
     });
     test('declaration conflict', () {
       final l1 = Library(name: 'Bindings', bindings: [
-        Struc(name: 'TestStruc'),
-        Struc(name: 'TestStruc'),
+        Struct(name: 'TestStruct'),
+        Struct(name: 'TestStruct'),
         EnumClass(name: 'TestEnum'),
         EnumClass(name: 'TestEnum'),
         Func(
-            name: 'testFunc',
-            returnType: Type.nativeType(SupportedNativeType.Void)),
+            name: 'testFunc', returnType: NativeType(SupportedNativeType.Void)),
         Func(
-            name: 'testFunc',
-            returnType: Type.nativeType(SupportedNativeType.Void)),
+            name: 'testFunc', returnType: NativeType(SupportedNativeType.Void)),
         Constant(
           originalName: 'Test_Macro',
           name: 'Test_Macro',
@@ -37,40 +35,37 @@
           rawValue: '0',
         ),
         Typealias(
-            name: 'testAlias', type: Type.nativeType(SupportedNativeType.Void)),
+            name: 'testAlias', type: NativeType(SupportedNativeType.Void)),
         Typealias(
-            name: 'testAlias', type: Type.nativeType(SupportedNativeType.Void)),
+            name: 'testAlias', type: NativeType(SupportedNativeType.Void)),
 
         /// Conflicts across declarations.
-        Struc(name: 'testCrossDecl'),
+        Struct(name: 'testCrossDecl'),
         Func(
             name: 'testCrossDecl',
-            returnType: Type.nativeType(SupportedNativeType.Void)),
+            returnType: NativeType(SupportedNativeType.Void)),
         Constant(name: 'testCrossDecl', rawValue: '0', rawType: 'int'),
         EnumClass(name: 'testCrossDecl'),
         Typealias(
-            name: 'testCrossDecl',
-            type: Type.nativeType(SupportedNativeType.Void)),
+            name: 'testCrossDecl', type: NativeType(SupportedNativeType.Void)),
 
         /// Conflicts with ffi library prefix, name of prefix is changed.
-        Struc(name: 'ffi'),
-        Func(
-            name: 'ffi1',
-            returnType: Type.nativeType(SupportedNativeType.Void)),
+        Struct(name: 'ffi'),
+        Func(name: 'ffi1', returnType: NativeType(SupportedNativeType.Void)),
       ]);
       final l2 = Library(name: 'Bindings', bindings: [
-        Struc(name: 'TestStruc'),
-        Struc(name: 'TestStruc1'),
+        Struct(name: 'TestStruct'),
+        Struct(name: 'TestStruct1'),
         EnumClass(name: 'TestEnum'),
         EnumClass(name: 'TestEnum1'),
         Func(
             name: 'testFunc',
             originalName: 'testFunc',
-            returnType: Type.nativeType(SupportedNativeType.Void)),
+            returnType: NativeType(SupportedNativeType.Void)),
         Func(
             name: 'testFunc1',
             originalName: 'testFunc',
-            returnType: Type.nativeType(SupportedNativeType.Void)),
+            returnType: NativeType(SupportedNativeType.Void)),
         Constant(
           originalName: 'Test_Macro',
           name: 'Test_Macro',
@@ -84,24 +79,20 @@
           rawValue: '0',
         ),
         Typealias(
-            name: 'testAlias', type: Type.nativeType(SupportedNativeType.Void)),
+            name: 'testAlias', type: NativeType(SupportedNativeType.Void)),
         Typealias(
-            name: 'testAlias1',
-            type: Type.nativeType(SupportedNativeType.Void)),
-        Struc(name: 'testCrossDecl', originalName: 'testCrossDecl'),
+            name: 'testAlias1', type: NativeType(SupportedNativeType.Void)),
+        Struct(name: 'testCrossDecl', originalName: 'testCrossDecl'),
         Func(
             name: 'testCrossDecl1',
             originalName: 'testCrossDecl',
-            returnType: Type.nativeType(SupportedNativeType.Void)),
+            returnType: NativeType(SupportedNativeType.Void)),
         Constant(name: 'testCrossDecl2', rawValue: '0', rawType: 'int'),
         EnumClass(name: 'testCrossDecl3'),
         Typealias(
-            name: 'testCrossDecl4',
-            type: Type.nativeType(SupportedNativeType.Void)),
-        Struc(name: 'ffi'),
-        Func(
-            name: 'ffi1',
-            returnType: Type.nativeType(SupportedNativeType.Void)),
+            name: 'testCrossDecl4', type: NativeType(SupportedNativeType.Void)),
+        Struct(name: 'ffi'),
+        Func(name: 'ffi1', returnType: NativeType(SupportedNativeType.Void)),
       ]);
 
       expect(l1.generate(), l2.generate());
diff --git a/pkgs/ffigen/test/collision_tests/decl_symbol_address_collision_test.dart b/pkgs/ffigen/test/collision_tests/decl_symbol_address_collision_test.dart
index 9520139..0280732 100644
--- a/pkgs/ffigen/test/collision_tests/decl_symbol_address_collision_test.dart
+++ b/pkgs/ffigen/test/collision_tests/decl_symbol_address_collision_test.dart
@@ -17,29 +17,26 @@
         header:
             '// ignore_for_file: unused_element, camel_case_types, non_constant_identifier_names\n',
         bindings: [
-          Struc(name: 'addresses'),
-          Struc(name: '_SymbolAddresses'),
+          Struct(name: 'addresses'),
+          Struct(name: '_SymbolAddresses'),
           EnumClass(name: 'Bindings'),
           Func(
             name: '_library',
-            returnType: Type.nativeType(SupportedNativeType.Void),
+            returnType: NativeType(SupportedNativeType.Void),
             exposeSymbolAddress: true,
             exposeFunctionTypedefs: true,
           ),
           Func(
             name: '_SymbolAddresses_1',
-            returnType: Type.nativeType(SupportedNativeType.Void),
+            returnType: NativeType(SupportedNativeType.Void),
             exposeSymbolAddress: true,
           ),
         ],
       );
     });
     test('declaration and symbol address conflict', () {
-      matchLibraryWithExpected(actual, [
-        'test',
-        'debug_generated',
-        'collision_test_decl_symbol_address_collision_output.dart'
-      ], [
+      matchLibraryWithExpected(
+          actual, 'collision_test_decl_symbol_address_collision_output.dart', [
         'test',
         'collision_tests',
         'expected_bindings',
diff --git a/pkgs/ffigen/test/collision_tests/decl_type_name_collision_test.dart b/pkgs/ffigen/test/collision_tests/decl_type_name_collision_test.dart
index 5bb8f82..19e9497 100644
--- a/pkgs/ffigen/test/collision_tests/decl_type_name_collision_test.dart
+++ b/pkgs/ffigen/test/collision_tests/decl_type_name_collision_test.dart
@@ -3,12 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:ffigen/src/code_generator.dart';
-import 'package:ffigen/src/config_provider.dart';
 import 'package:ffigen/src/header_parser.dart' as parser;
 import 'package:ffigen/src/strings.dart' as strings;
 import 'package:logging/logging.dart';
 import 'package:test/test.dart';
-import 'package:yaml/yaml.dart' as yaml;
 
 import '../test_utils.dart';
 
@@ -18,7 +16,7 @@
     setUpAll(() {
       logWarnings(Level.SEVERE);
       actual = parser.parse(
-        Config.fromYaml(yaml.loadYaml('''
+        testConfig('''
 ${strings.name}: 'NativeLibrary'
 ${strings.description}: 'Decl type name collision test'
 ${strings.output}: 'unused'
@@ -27,16 +25,13 @@
     - 'test/collision_tests/decl_type_name_collision.h'
 ${strings.preamble}: |
     // ignore_for_file: non_constant_identifier_names, 
-        ''') as yaml.YamlMap),
+        '''),
       );
     });
 
     test('Expected bindings', () {
-      matchLibraryWithExpected(actual, [
-        'test',
-        'debug_generated',
-        'decl_type_name_collision_test_output.dart'
-      ], [
+      matchLibraryWithExpected(
+          actual, 'decl_type_name_collision_test_output.dart', [
         'test',
         'collision_tests',
         'expected_bindings',
diff --git a/pkgs/ffigen/test/collision_tests/expected_bindings/_expected_decl_symbol_address_collision_bindings.dart b/pkgs/ffigen/test/collision_tests/expected_bindings/_expected_decl_symbol_address_collision_bindings.dart
index b45cdcd..3b3e791 100644
--- a/pkgs/ffigen/test/collision_tests/expected_bindings/_expected_decl_symbol_address_collision_bindings.dart
+++ b/pkgs/ffigen/test/collision_tests/expected_bindings/_expected_decl_symbol_address_collision_bindings.dart
@@ -3,6 +3,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 //
 // Generated by `package:ffigen`.
+// ignore_for_file: type=lint
 import 'dart:ffi' as ffi;
 
 class Bindings1 {
diff --git a/pkgs/ffigen/test/collision_tests/expected_bindings/_expected_decl_type_name_collision_bindings.dart b/pkgs/ffigen/test/collision_tests/expected_bindings/_expected_decl_type_name_collision_bindings.dart
index 5dab4a2..f7207cf 100644
--- a/pkgs/ffigen/test/collision_tests/expected_bindings/_expected_decl_type_name_collision_bindings.dart
+++ b/pkgs/ffigen/test/collision_tests/expected_bindings/_expected_decl_type_name_collision_bindings.dart
@@ -3,18 +3,19 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 //
 // Generated by `package:ffigen`.
+// ignore_for_file: type=lint
 import 'dart:ffi' as ffi;
 
 class A extends ffi.Struct {
-  @ffi.Int32()
+  @ffi.Int()
   external int a;
 }
 
 class B extends ffi.Struct {
-  @ffi.Int32()
+  @ffi.Int()
   external int B1;
 
-  @ffi.Int32()
+  @ffi.Int()
   external int A;
 }
 
diff --git a/pkgs/ffigen/test/collision_tests/reserved_keyword_collision_test.dart b/pkgs/ffigen/test/collision_tests/reserved_keyword_collision_test.dart
index e38894d..c6873f2 100644
--- a/pkgs/ffigen/test/collision_tests/reserved_keyword_collision_test.dart
+++ b/pkgs/ffigen/test/collision_tests/reserved_keyword_collision_test.dart
@@ -15,73 +15,70 @@
     });
     test('reserved keyword collision', () {
       final l1 = Library(name: 'Bindings', bindings: [
-        Struc(name: 'abstract'),
-        Struc(name: 'abstract'),
-        Struc(name: 'if'),
+        Struct(name: 'abstract'),
+        Struct(name: 'abstract'),
+        Struct(name: 'if'),
         EnumClass(name: 'return'),
         EnumClass(name: 'export'),
-        Func(
-            name: 'show',
-            returnType: Type.nativeType(SupportedNativeType.Void)),
+        Func(name: 'show', returnType: NativeType(SupportedNativeType.Void)),
         Func(
             name: 'implements',
             parameters: [
               Parameter(
-                type: Type.nativeType(SupportedNativeType.Int32),
+                type: intType,
                 name: 'if',
               ),
               Parameter(
-                type: Type.nativeType(SupportedNativeType.Int32),
+                type: intType,
                 name: 'abstract',
               ),
               Parameter(
-                type: Type.nativeType(SupportedNativeType.Int32),
+                type: intType,
                 name: 'in',
               ),
             ],
-            returnType: Type.nativeType(SupportedNativeType.Void)),
+            returnType: NativeType(SupportedNativeType.Void)),
         Constant(
           name: 'else',
           rawType: 'int',
           rawValue: '0',
         ),
-        Typealias(name: 'var', type: Type.nativeType(SupportedNativeType.Void)),
+        Typealias(name: 'var', type: NativeType(SupportedNativeType.Void)),
       ]);
       final l2 = Library(name: 'Bindings', bindings: [
-        Struc(name: 'abstract1'),
-        Struc(name: 'abstract2'),
-        Struc(name: 'if1'),
+        Struct(name: 'abstract1'),
+        Struct(name: 'abstract2'),
+        Struct(name: 'if1'),
         EnumClass(name: 'return1'),
         EnumClass(name: 'export1'),
         Func(
             name: 'show1',
             originalName: 'show',
-            returnType: Type.nativeType(SupportedNativeType.Void)),
+            returnType: NativeType(SupportedNativeType.Void)),
         Func(
             name: 'implements1',
             originalName: 'implements',
             parameters: [
               Parameter(
-                type: Type.nativeType(SupportedNativeType.Int32),
+                type: intType,
                 name: 'if1',
               ),
               Parameter(
-                type: Type.nativeType(SupportedNativeType.Int32),
+                type: intType,
                 name: 'abstract1',
               ),
               Parameter(
-                type: Type.nativeType(SupportedNativeType.Int32),
+                type: intType,
                 name: 'in1',
               ),
             ],
-            returnType: Type.nativeType(SupportedNativeType.Void)),
+            returnType: NativeType(SupportedNativeType.Void)),
         Constant(
           name: 'else1',
           rawType: 'int',
           rawValue: '0',
         ),
-        Typealias(
-            name: 'var1', type: Type.nativeType(SupportedNativeType.Void)),
+        Typealias(name: 'var1', type: NativeType(SupportedNativeType.Void)),
       ]);
       expect(l1.generate(), l2.generate());
     });
diff --git a/pkgs/ffigen/test/config_tests/compiler_opts_test.dart b/pkgs/ffigen/test/config_tests/compiler_opts_test.dart
index 5193d4d..0b711ac 100644
--- a/pkgs/ffigen/test/config_tests/compiler_opts_test.dart
+++ b/pkgs/ffigen/test/config_tests/compiler_opts_test.dart
@@ -6,7 +6,8 @@
 import 'package:ffigen/src/config_provider/spec_utils.dart';
 import 'package:ffigen/src/strings.dart' as strings;
 import 'package:test/test.dart';
-import 'package:yaml/yaml.dart' as yaml;
+
+import '../test_utils.dart';
 
 late Library actual, expected;
 
@@ -28,7 +29,7 @@
       );
     });
     test('Compiler Opts Automatic', () {
-      final config = Config.fromYaml(yaml.loadYaml('''
+      final config = testConfig('''
 ${strings.name}: 'NativeLibrary'
 ${strings.description}: 'Compiler Opts Test'
 ${strings.output}: 'unused'
@@ -38,7 +39,7 @@
 ${strings.compilerOptsAuto}:
   ${strings.macos}:
     ${strings.includeCStdLib}: false
-        ''') as yaml.YamlMap);
+        ''');
       expect(config.compilerOpts.isEmpty, true);
     });
   });
diff --git a/pkgs/ffigen/test/config_tests/exclude_all_by_default.h b/pkgs/ffigen/test/config_tests/exclude_all_by_default.h
new file mode 100644
index 0000000..e45634a
--- /dev/null
+++ b/pkgs/ffigen/test/config_tests/exclude_all_by_default.h
@@ -0,0 +1,25 @@
+// Copyright (c) 2022, 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.
+
+void func();
+
+struct Struct {
+  int a;
+};
+
+union Union {
+  int a;
+};
+
+int global;
+
+#define MACRO 123
+
+enum Enum {
+  zero = 0,
+};
+
+enum {
+  unnamedEnum = 123,
+};
diff --git a/pkgs/ffigen/test/config_tests/exclude_all_by_default_test.dart b/pkgs/ffigen/test/config_tests/exclude_all_by_default_test.dart
new file mode 100644
index 0000000..361e4b2
--- /dev/null
+++ b/pkgs/ffigen/test/config_tests/exclude_all_by_default_test.dart
@@ -0,0 +1,56 @@
+// Copyright (c) 2022, 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 'package:ffigen/ffigen.dart';
+import 'package:ffigen/src/code_generator.dart';
+import 'package:ffigen/src/strings.dart' as strings;
+import 'package:test/test.dart';
+
+import '../test_utils.dart';
+
+void main() {
+  group('exclude_all_by_default', () {
+    test('exclude_all_by_default test flag false', () {
+      final config = testConfig('''
+${strings.name}: 'NativeLibrary'
+${strings.description}: 'exclude_all_by_default test'
+${strings.output}: 'unused'
+${strings.excludeAllByDefault}: false
+${strings.headers}:
+  ${strings.entryPoints}:
+    - 'test/config_tests/exclude_all_by_default.h'
+''');
+
+      final library = parse(config);
+      expect(library.getBinding('func'), isA<Func>());
+      expect(library.getBinding('Struct'), isA<Struct>());
+      expect(library.getBinding('Union'), isA<Union>());
+      expect(library.getBinding('global'), isA<Global>());
+      expect(library.getBinding('MACRO'), isA<Constant>());
+      expect(library.getBinding('Enum'), isA<EnumClass>());
+      expect(library.getBinding('unnamedEnum'), isA<Constant>());
+    });
+
+    test('exclude_all_by_default test flag true', () {
+      final config = testConfig('''
+${strings.name}: 'NativeLibrary'
+${strings.description}: 'exclude_all_by_default test'
+${strings.output}: 'unused'
+${strings.excludeAllByDefault}: true
+${strings.headers}:
+  ${strings.entryPoints}:
+    - 'test/config_tests/exclude_all_by_default.h'
+''');
+
+      final library = parse(config);
+      expect(() => library.getBinding('func'), throwsException);
+      expect(() => library.getBinding('Struct'), throwsException);
+      expect(() => library.getBinding('Union'), throwsException);
+      expect(() => library.getBinding('global'), throwsException);
+      expect(() => library.getBinding('MACRO'), throwsException);
+      expect(() => library.getBinding('Enum'), throwsException);
+      expect(() => library.getBinding('unnamedEnum'), throwsException);
+    });
+  });
+}
diff --git a/pkgs/ffigen/test/config_tests/include_exclude.h b/pkgs/ffigen/test/config_tests/include_exclude.h
new file mode 100644
index 0000000..b62e8f3
--- /dev/null
+++ b/pkgs/ffigen/test/config_tests/include_exclude.h
@@ -0,0 +1,28 @@
+// Copyright (c) 2022, 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.
+
+typedef int Typedef;
+
+void func(Typedef s);
+
+struct Struct {
+  int a;
+};
+
+union Union {
+  int a;
+};
+
+int global;
+
+#define MACRO 123
+
+enum Enum {
+  zero = 0,
+};
+
+enum {
+  unnamedEnum = 123,
+};
+
diff --git a/pkgs/ffigen/test/config_tests/include_exclude_test.dart b/pkgs/ffigen/test/config_tests/include_exclude_test.dart
new file mode 100644
index 0000000..1f27885
--- /dev/null
+++ b/pkgs/ffigen/test/config_tests/include_exclude_test.dart
@@ -0,0 +1,73 @@
+// Copyright (c) 2022, 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 'package:ffigen/ffigen.dart';
+import 'package:ffigen/src/strings.dart' as strings;
+import 'package:test/test.dart';
+
+import '../test_utils.dart';
+
+void main() {
+  group('include_exclude', () {
+    const fieldsAndNameMap = {
+      strings.functions: 'func',
+      strings.structs: 'Struct',
+      strings.unions: 'Union',
+      strings.enums: 'Enum',
+      strings.unnamedEnums: 'unnamedEnum',
+      strings.macros: 'MACRO',
+      strings.globals: 'global',
+      strings.typedefs: 'Typedef',
+    };
+    for (final f in fieldsAndNameMap.keys) {
+      test('include $f', () {
+        final config = _makeFieldIncludeExcludeConfig(
+            field: f, include: fieldsAndNameMap[f]);
+        final library = parse(config);
+        expect(library.getBinding(fieldsAndNameMap[f]!), isNotNull);
+      });
+      test('exclude $f', () {
+        final config = _makeFieldIncludeExcludeConfig(
+            field: f, exclude: fieldsAndNameMap[f]);
+        final library = parse(config);
+        expect(() => library.getBinding(fieldsAndNameMap[f]!), throwsException);
+      });
+    }
+  });
+}
+
+Config _makeFieldIncludeExcludeConfig({
+  required String field,
+  String? include,
+  String? exclude,
+}) {
+  var templateString = '''
+${strings.name}: 'NativeLibrary'
+${strings.description}: 'include_exclude test'
+${strings.output}: 'unused'
+${strings.headers}:
+  ${strings.entryPoints}:
+    - 'test/config_tests/include_exclude.h'
+''';
+  if (include != null || exclude != null) {
+    templateString += '''
+$field:
+''';
+    if (include != null) {
+      templateString += '''
+  ${strings.include}:
+    - $include
+''';
+    }
+    if (exclude != null) {
+      templateString += '''
+  ${strings.exclude}:
+    - $exclude
+''';
+    }
+  }
+
+  final config = testConfig(templateString);
+  return config;
+}
diff --git a/pkgs/ffigen/test/config_tests/packed_struct_override_test.dart b/pkgs/ffigen/test/config_tests/packed_struct_override_test.dart
index ca371d8..68f8954 100644
--- a/pkgs/ffigen/test/config_tests/packed_struct_override_test.dart
+++ b/pkgs/ffigen/test/config_tests/packed_struct_override_test.dart
@@ -6,7 +6,6 @@
 import 'package:ffigen/src/code_generator.dart';
 import 'package:ffigen/src/strings.dart' as strings;
 import 'package:test/test.dart';
-import 'package:yaml/yaml.dart' as yaml;
 
 import '../test_utils.dart';
 
@@ -24,21 +23,15 @@
 ${strings.structs}:
   ${strings.structPack}:
     ''';
-      expect(
-          () => Config.fromYaml(
-              yaml.loadYaml(baseYaml + "'.*': null") as yaml.YamlMap),
+      expect(() => testConfig("$baseYaml'.*': null"),
           throwsA(TypeMatcher<FormatException>()));
-      expect(
-          () => Config.fromYaml(
-              yaml.loadYaml(baseYaml + "'.*': 3") as yaml.YamlMap),
+      expect(() => testConfig("$baseYaml'.*': 3"),
           throwsA(TypeMatcher<FormatException>()));
-      expect(
-          () => Config.fromYaml(
-              yaml.loadYaml(baseYaml + "'.*': 32") as yaml.YamlMap),
+      expect(() => testConfig("$baseYaml'.*': 32"),
           throwsA(TypeMatcher<FormatException>()));
     });
     test('Override values', () {
-      final config = Config.fromYaml(yaml.loadYaml('''
+      final config = testConfig('''
 ${strings.name}: 'NativeLibrary'
 ${strings.description}: 'Packed Struct Override Test'
 ${strings.output}: 'unused'
@@ -50,13 +43,13 @@
     'Normal.*': 1
     'StructWithAttr': 2
     'PackedAttr': none
-        ''') as yaml.YamlMap);
+        ''');
 
       final library = parse(config);
 
-      expect((library.getBinding('NormalStruct1') as Struc).pack, 1);
-      expect((library.getBinding('StructWithAttr') as Struc).pack, 2);
-      expect((library.getBinding('PackedAttr') as Struc).pack, null);
+      expect((library.getBinding('NormalStruct1') as Struct).pack, 1);
+      expect((library.getBinding('StructWithAttr') as Struct).pack, 2);
+      expect((library.getBinding('PackedAttr') as Struct).pack, null);
     });
   });
 }
diff --git a/pkgs/ffigen/test/config_tests/unknown_keys_warn_test.dart b/pkgs/ffigen/test/config_tests/unknown_keys_warn_test.dart
new file mode 100644
index 0000000..3dd0451
--- /dev/null
+++ b/pkgs/ffigen/test/config_tests/unknown_keys_warn_test.dart
@@ -0,0 +1,51 @@
+// Copyright (c) 2021, 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 'package:ffigen/ffigen.dart';
+import 'package:ffigen/src/strings.dart' as strings;
+import 'package:logging/logging.dart';
+import 'package:test/test.dart';
+
+import '../test_utils.dart';
+
+late Library actual, expected;
+
+void main() {
+  var logString = '';
+  group('unknown_keys_warn_test', () {
+    setUpAll(() {
+      final logArr = <String>[];
+      logWarningsToArray(logArr, Level.WARNING);
+      testConfig('''
+${strings.name}: 'NativeLibrary'
+${strings.description}: 'Warn for unknown keys.'
+${strings.output}: 'unused'
+${strings.headers}:
+  ${strings.entryPoints}:
+    - 'test/header_parser_tests/packed_structs.h'
+'warn-1': 'warn'
+${strings.typeMap}:
+  'warn-2': 'warn'
+  'warn-3': 'warn'
+${strings.functions}:
+  'warn-4': 'skip'
+${strings.structs}:
+  'warn-5': 'skip'
+${strings.unions}:
+  'warn-6': 'skip'
+        ''');
+      logString = logArr.join("\n");
+    });
+    test('Warn for unknown keys.', () {
+      expect(logString.contains('warn-1'), true);
+      expect(logString.contains('warn-2'), true);
+      expect(logString.contains('warn-3'), true);
+    });
+    test('Do not warn for unknown keys in declarations.', () {
+      expect(logString.contains('warn-4'), false);
+      expect(logString.contains('warn-5'), false);
+      expect(logString.contains('warn-6'), false);
+    });
+  });
+}
diff --git a/pkgs/ffigen/test/example_tests/cjson_example_test.dart b/pkgs/ffigen/test/example_tests/cjson_example_test.dart
index c95bcf2..714cb70 100644
--- a/pkgs/ffigen/test/example_tests/cjson_example_test.dart
+++ b/pkgs/ffigen/test/example_tests/cjson_example_test.dart
@@ -2,12 +2,10 @@
 // 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 'package:ffigen/src/config_provider/config.dart';
 import 'package:ffigen/src/header_parser.dart';
-import 'package:ffigen/src/strings.dart' as strings;
 import 'package:logging/logging.dart';
+import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
-import 'package:yaml/yaml.dart';
 
 import '../test_utils.dart';
 
@@ -17,47 +15,14 @@
       logWarnings(Level.SEVERE);
     });
     test('c_json', () {
-      final config = Config.fromYaml(loadYaml('''
-${strings.output}: 'cjson_generated_bindings.dart'
-${strings.name}: 'CJson'
-${strings.description}: 'Holds bindings to cJSON.'
-${strings.headers}:
-  ${strings.entryPoints}:
-    - 'third_party/cjson_library/cJSON.h'
-  ${strings.includeDirectives}:
-    - '**cJSON.h'
-${strings.comments}: false
-${strings.typedefmap}:
-  'size_t': 'IntPtr'
-${strings.preamble}: |
-  // Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
-  //
-  // Permission is hereby granted, free of charge, to any person obtaining a copy
-  // of this software and associated documentation files (the "Software"), to deal
-  // in the Software without restriction, including without limitation the rights
-  // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-  // copies of the Software, and to permit persons to whom the Software is
-  // furnished to do so, subject to the following conditions:
-  //
-  // The above copyright notice and this permission notice shall be included in
-  // all copies or substantial portions of the Software.
-  //
-  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-  // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-  // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-  // THE SOFTWARE.
-
-  // ignore_for_file: camel_case_types, non_constant_identifier_names
-''') as YamlMap);
+      final config =
+          testConfigFromPath(path.join('example', 'c_json', 'config.yaml'));
       final library = parse(config);
 
       matchLibraryWithExpected(
         library,
-        ['test', 'debug_generated', 'example_c_json.dart'],
-        ['example', 'c_json', config.output],
+        'example_c_json.dart',
+        [config.output],
       );
     });
   });
diff --git a/pkgs/ffigen/test/example_tests/ffinative_example_test.dart b/pkgs/ffigen/test/example_tests/ffinative_example_test.dart
new file mode 100644
index 0000000..28588b1
--- /dev/null
+++ b/pkgs/ffigen/test/example_tests/ffinative_example_test.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2022, 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 'package:ffigen/src/header_parser.dart';
+import 'package:logging/logging.dart';
+import 'package:path/path.dart' as path;
+import 'package:test/test.dart';
+
+import '../test_utils.dart';
+
+void main() {
+  group('ffinative_example_test', () {
+    setUpAll(() {
+      logWarnings(Level.SEVERE);
+    });
+
+    test('ffinative', () {
+      final config =
+          testConfigFromPath(path.join('example', 'ffinative', 'config.yaml'));
+      final library = parse(config);
+
+      matchLibraryWithExpected(
+        library,
+        'example_ffinative.dart',
+        [config.output],
+      );
+    });
+  });
+}
diff --git a/pkgs/ffigen/test/example_tests/libclang_example_test.dart b/pkgs/ffigen/test/example_tests/libclang_example_test.dart
index 1ca9600..8414e49 100644
--- a/pkgs/ffigen/test/example_tests/libclang_example_test.dart
+++ b/pkgs/ffigen/test/example_tests/libclang_example_test.dart
@@ -2,12 +2,14 @@
 // 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:ffigen/src/code_generator/library.dart';
 import 'package:ffigen/src/config_provider/config.dart';
 import 'package:ffigen/src/header_parser.dart';
-import 'package:ffigen/src/strings.dart' as strings;
 import 'package:logging/logging.dart';
+import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
-import 'package:yaml/yaml.dart';
 
 import '../test_utils.dart';
 
@@ -17,55 +19,20 @@
       logWarnings(Level.SEVERE);
     });
     test('libclang-example', () {
-      final config = Config.fromYaml(loadYaml('''
-${strings.output}: 'generated_bindings.dart'
-${strings.headers}:
-  ${strings.entryPoints}:
-    - third_party/libclang/include/clang-c/Index.h
-  ${strings.includeDirectives}:
-    - '**CXString.h'
-    - '**Index.h'
-
-${strings.compilerOpts}: '-Ithird_party/libclang/include -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/ -Wno-nullability-completeness'
-${strings.functions}:
-  ${strings.include}:
-    - 'clang_.*'
-  ${strings.symbolAddress}:
-      ${strings.include}:
-        - 'clang_.*'
-  ${strings.exposeFunctionTypedefs}:
-      ${strings.include}:
-        - 'clang_.*'
-${strings.structs}:
-  ${strings.include}:
-      - 'CX.*'
-${strings.enums}:
-  ${strings.include}:
-    - 'CXTypeKind'
-    - 'CXGlobalOptFlags'
-${strings.typedefmap}:
-    'size_t': 'IntPtr'
-    'time_t': 'Int64'
-${strings.name}: 'LibClang'
-${strings.description}: 'Holds bindings to LibClang.'
-${strings.comments}:
-  ${strings.style}: ${strings.doxygen}
-  ${strings.length}: ${strings.full}
-
-${strings.preamble}: |
-  // Part of the LLVM Project, under the Apache License v2.0 with LLVM
-  // Exceptions.
-  // See https://llvm.org/LICENSE.txt for license information.
-  // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-
-  // ignore_for_file: camel_case_types, non_constant_identifier_names
-''') as YamlMap);
-      final library = parse(config);
+      final configYaml =
+          File(path.join('example', 'libclang-example', 'config.yaml'))
+              .absolute;
+      late Config config;
+      late Library library;
+      withChDir(configYaml.path, () {
+        config = testConfigFromPath(configYaml.path);
+        library = parse(config);
+      });
 
       matchLibraryWithExpected(
         library,
-        ['test', 'debug_generated', 'example_libclang.dart'],
-        ['example', 'libclang-example', config.output],
+        'example_libclang.dart',
+        [config.output],
       );
     });
   });
diff --git a/pkgs/ffigen/test/example_tests/objective_c_example_test.dart b/pkgs/ffigen/test/example_tests/objective_c_example_test.dart
new file mode 100644
index 0000000..b291edb
--- /dev/null
+++ b/pkgs/ffigen/test/example_tests/objective_c_example_test.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2022, 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.
+
+// Objective C support is only available on mac.
+@TestOn('mac-os')
+
+import 'package:ffigen/src/header_parser.dart';
+import 'package:logging/logging.dart';
+import 'package:path/path.dart' as path;
+import 'package:test/test.dart';
+
+import '../test_utils.dart';
+
+void main() {
+  group('objective_c_example_test', () {
+    setUpAll(() {
+      logWarnings(Level.SEVERE);
+    });
+
+    test('objective_c', () {
+      final config = testConfigFromPath(
+          path.join('example', 'objective_c', 'config.yaml'));
+      final output = parse(config).generate();
+
+      // Verify that the output contains all the methods and classes that the
+      // example app uses.
+      expect(output, contains('class AVFAudio{'));
+      expect(output, contains('class NSString extends NSObject {'));
+      expect(output, contains('class NSURL extends NSObject {'));
+      expect(
+          output,
+          contains(
+              'static NSURL fileURLWithPath_(AVFAudio _lib, NSString? path) {'));
+      expect(output, contains('class AVAudioPlayer extends NSObject {'));
+      expect(
+          output,
+          contains('AVAudioPlayer initWithContentsOfURL_error_('
+              'NSURL? url, ffi.Pointer<ffi.Pointer<ObjCObject>> outError) {'));
+      expect(output, contains('double get duration {'));
+      expect(output, contains('bool play() {'));
+    });
+  });
+}
diff --git a/pkgs/ffigen/test/example_tests/shared_bindings_example_test.dart b/pkgs/ffigen/test/example_tests/shared_bindings_example_test.dart
new file mode 100644
index 0000000..0d4e39b
--- /dev/null
+++ b/pkgs/ffigen/test/example_tests/shared_bindings_example_test.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2022, 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 'package:ffigen/src/header_parser.dart';
+import 'package:logging/logging.dart';
+import 'package:path/path.dart' as path;
+import 'package:test/test.dart';
+
+import '../test_utils.dart';
+
+void main() {
+  group('shared_bindings_example', () {
+    setUpAll(() {
+      logWarnings(Level.SEVERE);
+    });
+
+    test('a_shared_base bindings', () {
+      final config = testConfigFromPath(path.join(
+        'example',
+        'shared_bindings',
+        'ffigen_configs',
+        'a_shared_base.yaml',
+      ));
+      final library = parse(config);
+
+      matchLibraryWithExpected(
+        library,
+        'example_shared_bindings.dart',
+        [config.output],
+      );
+    });
+
+    test('base symbol file output', () {
+      final config = testConfigFromPath(path.join(
+        'example',
+        'shared_bindings',
+        'ffigen_configs',
+        'base.yaml',
+      ));
+      final library = parse(config);
+      matchLibrarySymbolFileWithExpected(
+        library,
+        'example_shared_bindings.yaml',
+        [config.symbolFile!.output],
+        config.symbolFile!.importPath,
+      );
+    });
+  });
+}
diff --git a/pkgs/ffigen/test/example_tests/simple_example_test.dart b/pkgs/ffigen/test/example_tests/simple_example_test.dart
index 190e65e..343bf1c 100644
--- a/pkgs/ffigen/test/example_tests/simple_example_test.dart
+++ b/pkgs/ffigen/test/example_tests/simple_example_test.dart
@@ -2,12 +2,10 @@
 // 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 'package:ffigen/src/config_provider/config.dart';
 import 'package:ffigen/src/header_parser.dart';
-import 'package:ffigen/src/strings.dart' as strings;
 import 'package:logging/logging.dart';
+import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
-import 'package:yaml/yaml.dart';
 
 import '../test_utils.dart';
 
@@ -18,20 +16,17 @@
     });
 
     test('simple', () {
-      final config = Config.fromYaml(loadYaml('''
-${strings.name}: NativeLibrary
-${strings.description}: Bindings to `headers/example.h`.
-${strings.output}: 'generated_bindings.dart'
-${strings.headers}:
-  ${strings.entryPoints}:
-    - 'example/simple/headers/example.h'
-''') as YamlMap);
+      final config = testConfigFromPath(path.join(
+        'example',
+        'simple',
+        'config.yaml',
+      ));
       final library = parse(config);
 
       matchLibraryWithExpected(
         library,
-        ['test', 'debug_generated', 'example_simple.dart'],
-        ['example', 'simple', config.output],
+        'example_simple.dart',
+        [config.output],
       );
     });
   });
diff --git a/pkgs/ffigen/test/example_tests/swift_example_test.dart b/pkgs/ffigen/test/example_tests/swift_example_test.dart
new file mode 100644
index 0000000..02ed00a
--- /dev/null
+++ b/pkgs/ffigen/test/example_tests/swift_example_test.dart
@@ -0,0 +1,69 @@
+// Copyright (c) 2022, 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.
+
+// Swift support is only available on mac.
+@TestOn('mac-os')
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:ffigen/src/header_parser.dart';
+import 'package:logging/logging.dart';
+import 'package:path/path.dart' as path;
+import 'package:test/test.dart';
+
+import '../test_utils.dart';
+
+void main() {
+  group('swift_example_test', () {
+    setUpAll(() {
+      logWarnings(Level.SEVERE);
+    });
+
+    test('swift', () async {
+      // Run the swiftc command from the example README, to generate the header.
+      final process = await Process.start(
+          'swiftc',
+          [
+            '-c',
+            'swift_api.swift',
+            '-module-name',
+            'swift_module',
+            '-emit-objc-header-path',
+            'swift_api.h',
+            '-emit-library',
+            '-o',
+            'libswiftapi.dylib',
+          ],
+          workingDirectory: path.join(Directory.current.path, 'example/swift'));
+      unawaited(stdout.addStream(process.stdout));
+      unawaited(stderr.addStream(process.stderr));
+      final result = await process.exitCode;
+      expect(result, 0);
+
+      final config = testConfigFromPath(path.join(
+        'example',
+        'swift',
+        'config.yaml',
+      ));
+      final output = parse(config).generate();
+
+      // Verify that the output contains all the methods and classes that the
+      // example app uses.
+      expect(output, contains('class SwiftLibrary{'));
+      expect(output, contains('class NSString extends NSObject {'));
+      expect(output, contains('class SwiftClass extends NSObject {'));
+      expect(output, contains('static SwiftClass new1(SwiftLibrary _lib) {'));
+      expect(output, contains('NSString sayHello() {'));
+      expect(output, contains('int get someField {'));
+      expect(output, contains('set someField(int value) {'));
+
+      // Verify that SwiftClass is loaded using the swift_module prefix.
+      expect(
+          output,
+          contains(RegExp(r'late final _class_SwiftClass.* = '
+              r'_getClass.*\("swift_module\.SwiftClass"\)')));
+    });
+  });
+}
diff --git a/pkgs/ffigen/test/header_parser_tests/comment_markup_test.dart b/pkgs/ffigen/test/header_parser_tests/comment_markup_test.dart
index 3fadaea..e31098a 100644
--- a/pkgs/ffigen/test/header_parser_tests/comment_markup_test.dart
+++ b/pkgs/ffigen/test/header_parser_tests/comment_markup_test.dart
@@ -3,12 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:ffigen/src/code_generator.dart';
-import 'package:ffigen/src/config_provider.dart';
 import 'package:ffigen/src/header_parser.dart' as parser;
 import 'package:ffigen/src/strings.dart' as strings;
 import 'package:logging/logging.dart';
 import 'package:test/test.dart';
-import 'package:yaml/yaml.dart' as yaml;
 
 import '../test_utils.dart';
 
@@ -18,7 +16,7 @@
     setUpAll(() {
       logWarnings(Level.SEVERE);
       actual = parser.parse(
-        Config.fromYaml(yaml.loadYaml('''
+        testConfig('''
 ${strings.name}: 'NativeLibrary'
 ${strings.description}: 'Comment Markup Test'
 ${strings.output}: 'unused'
@@ -28,16 +26,13 @@
 ${strings.comments}:
   ${strings.style}: ${strings.any}
   ${strings.length}: ${strings.full}
-        ''') as yaml.YamlMap),
+        '''),
       );
     });
 
     test('Expected bindings', () {
-      matchLibraryWithExpected(actual, [
-        'test',
-        'debug_generated',
-        'header_parser_comment_markup_test_output.dart'
-      ], [
+      matchLibraryWithExpected(
+          actual, 'header_parser_comment_markup_test_output.dart', [
         'test',
         'header_parser_tests',
         'expected_bindings',
diff --git a/pkgs/ffigen/test/header_parser_tests/dart_handle.h b/pkgs/ffigen/test/header_parser_tests/dart_handle.h
index 8a2d802..26d73fa 100644
--- a/pkgs/ffigen/test/header_parser_tests/dart_handle.h
+++ b/pkgs/ffigen/test/header_parser_tests/dart_handle.h
@@ -12,14 +12,14 @@
 void func4(Typedef1);
 
 // Dart_Handle isn't supported directly, so all members are removed.
-struct Struc1
+struct Struct1
 {
     Dart_Handle h;
     int a;
 };
 
 // Pointer<Handle> works.
-struct Struc2
+struct Struct2
 {
     Dart_Handle *h;
 };
diff --git a/pkgs/ffigen/test/header_parser_tests/dart_handle_test.dart b/pkgs/ffigen/test/header_parser_tests/dart_handle_test.dart
index 9089302..484d8b0 100644
--- a/pkgs/ffigen/test/header_parser_tests/dart_handle_test.dart
+++ b/pkgs/ffigen/test/header_parser_tests/dart_handle_test.dart
@@ -4,12 +4,10 @@
 
 import 'package:cli_util/cli_util.dart';
 import 'package:ffigen/src/code_generator.dart';
-import 'package:ffigen/src/config_provider.dart';
 import 'package:ffigen/src/header_parser.dart' as parser;
 import 'package:ffigen/src/strings.dart' as strings;
 import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
-import 'package:yaml/yaml.dart' as yaml;
 
 import '../test_utils.dart';
 
@@ -20,7 +18,7 @@
     setUpAll(() {
       logWarnings();
       actual = parser.parse(
-        Config.fromYaml(yaml.loadYaml('''
+        testConfig('''
 ${strings.name}: 'NativeLibrary'
 ${strings.description}: 'Dart_Handle Test'
 ${strings.output}: 'unused'
@@ -31,15 +29,12 @@
     - 'test/header_parser_tests/dart_handle.h'
   ${strings.includeDirectives}:
     - '**dart_handle.h'
-        ''') as yaml.YamlMap),
+        '''),
       );
     });
     test('Expected Bindings', () {
-      matchLibraryWithExpected(actual, [
-        'test',
-        'debug_generated',
-        'header_parser_dart_handle_test_output.dart'
-      ], [
+      matchLibraryWithExpected(
+          actual, 'header_parser_dart_handle_test_output.dart', [
         'test',
         'header_parser_tests',
         'expected_bindings',
diff --git a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_comment_markup_bindings.dart b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_comment_markup_bindings.dart
index 6a95e52..ea88b5b 100644
--- a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_comment_markup_bindings.dart
+++ b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_comment_markup_bindings.dart
@@ -1,6 +1,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 //
 // Generated by `package:ffigen`.
+// ignore_for_file: type=lint
 import 'dart:ffi' as ffi;
 
 /// Comment Markup Test
@@ -54,7 +55,7 @@
 class Com4 extends ffi.Struct {
   /// Muli-line test comment for struct field
   /// With multiple line and both // and ///.
-  @ffi.Int32()
+  @ffi.Int()
   external int a;
 
   /// Single line field comment.
diff --git a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_dart_handle_bindings.dart b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_dart_handle_bindings.dart
index b00eaf9..f51bf57 100644
--- a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_dart_handle_bindings.dart
+++ b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_dart_handle_bindings.dart
@@ -1,6 +1,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 //
 // Generated by `package:ffigen`.
+// ignore_for_file: type=lint
 import 'dart:ffi' as ffi;
 
 /// Dart_Handle Test
@@ -70,8 +71,8 @@
 typedef Typedef1
     = ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Handle)>>;
 
-class Struc1 extends ffi.Opaque {}
+class Struct1 extends ffi.Opaque {}
 
-class Struc2 extends ffi.Struct {
+class Struct2 extends ffi.Struct {
   external ffi.Pointer<ffi.Handle> h;
 }
diff --git a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_forward_decl_bindings.dart b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_forward_decl_bindings.dart
index 01fe05c..81cb2e3 100644
--- a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_forward_decl_bindings.dart
+++ b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_forward_decl_bindings.dart
@@ -1,6 +1,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 //
 // Generated by `package:ffigen`.
+// ignore_for_file: type=lint
 import 'dart:ffi' as ffi;
 
 /// Forward Declaration Test
@@ -36,10 +37,10 @@
 }
 
 class A extends ffi.Struct {
-  @ffi.Int32()
+  @ffi.Int()
   external int a;
 
-  @ffi.Int32()
+  @ffi.Int()
   external int b;
 }
 
diff --git a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_functions_bindings.dart b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_functions_bindings.dart
index d42ec32..c4a01b3 100644
--- a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_functions_bindings.dart
+++ b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_functions_bindings.dart
@@ -3,6 +3,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 //
 // Generated by `package:ffigen`.
+// ignore_for_file: type=lint
 import 'dart:ffi' as ffi;
 
 /// Functions Test
@@ -102,6 +103,21 @@
       void Function(ffi.Pointer<shortHand>,
           ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>)>();
 
+  int diffChars(
+    int a,
+    int b,
+  ) {
+    return _diffChars(
+      a,
+      b,
+    );
+  }
+
+  late final _diffCharsPtr = _lookup<
+      ffi.NativeFunction<
+          ffi.Char Function(ffi.UnsignedChar, ffi.SignedChar)>>('diffChars');
+  late final _diffChars = _diffCharsPtr.asFunction<int Function(int, int)>();
+
   late final addresses = _SymbolAddresses(this);
 }
 
@@ -122,4 +138,4 @@
 }
 
 typedef shortHand = ffi.NativeFunction<
-    ffi.Void Function(ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>)>;
+    ffi.Void Function(ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>> b)>;
diff --git a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_imported_types_bindings.dart b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_imported_types_bindings.dart
new file mode 100644
index 0000000..ab0fc5a
--- /dev/null
+++ b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_imported_types_bindings.dart
@@ -0,0 +1,82 @@
+// ignore_for_file: camel_case_types
+
+// AUTO GENERATED FILE, DO NOT EDIT.
+//
+// Generated by `package:ffigen`.
+// ignore_for_file: type=lint
+import 'dart:ffi' as ffi;
+
+/// Imported types test
+class NativeLibrary {
+  /// Holds the symbol lookup function.
+  final ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
+      _lookup;
+
+  /// The symbols are looked up in [dynamicLibrary].
+  NativeLibrary(ffi.DynamicLibrary dynamicLibrary)
+      : _lookup = dynamicLibrary.lookup;
+
+  /// The symbols are looked up with [lookup].
+  NativeLibrary.fromLookup(
+      ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
+          lookup)
+      : _lookup = lookup;
+
+  void default_imported_types(
+    int arg0,
+    int arg1,
+    int arg2,
+    int arg3,
+    int arg4,
+    int arg5,
+    int arg6,
+    int arg7,
+    int arg8,
+    int arg9,
+    int arg10,
+    double arg11,
+    double arg12,
+    int arg13,
+    int arg14,
+  ) {
+    return _default_imported_types(
+      arg0,
+      arg1,
+      arg2,
+      arg3,
+      arg4,
+      arg5,
+      arg6,
+      arg7,
+      arg8,
+      arg9,
+      arg10,
+      arg11,
+      arg12,
+      arg13,
+      arg14,
+    );
+  }
+
+  late final _default_imported_typesPtr = _lookup<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.UnsignedChar,
+              ffi.SignedChar,
+              ffi.Char,
+              ffi.UnsignedShort,
+              ffi.Short,
+              ffi.UnsignedInt,
+              ffi.Int,
+              ffi.UnsignedLong,
+              ffi.Long,
+              ffi.UnsignedLongLong,
+              ffi.LongLong,
+              ffi.Float,
+              ffi.Double,
+              ffi.Size,
+              ffi.WChar)>>('default_imported_types');
+  late final _default_imported_types = _default_imported_typesPtr.asFunction<
+      void Function(int, int, int, int, int, int, int, int, int, int, int,
+          double, double, int, int)>();
+}
diff --git a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_native_func_typedef_bindings.dart b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_native_func_typedef_bindings.dart
index 802d838..6ef30ff 100644
--- a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_native_func_typedef_bindings.dart
+++ b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_native_func_typedef_bindings.dart
@@ -1,6 +1,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 //
 // Generated by `package:ffigen`.
+// ignore_for_file: type=lint
 import 'dart:ffi' as ffi;
 
 /// Native Func Typedef Test.
@@ -23,7 +24,8 @@
     ffi.Pointer<
             ffi.NativeFunction<
                 ffi.Void Function(
-                    ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>)>>
+                    ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>
+                        unnamed2)>>
         unnamed1,
   ) {
     return _func(
@@ -37,16 +39,15 @@
               ffi.Pointer<
                   ffi.NativeFunction<
                       ffi.Void Function(
-                          ffi.Pointer<
-                              ffi.NativeFunction<
-                                  ffi.Void Function()>>)>>)>>('func');
+                          ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>
+                              unnamed2)>>)>>('func');
   late final _func = _funcPtr.asFunction<
       void Function(
           ffi.Pointer<
               ffi.NativeFunction<
                   ffi.Void Function(
-                      ffi.Pointer<
-                          ffi.NativeFunction<ffi.Void Function()>>)>>)>();
+                      ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>
+                          unnamed2)>>)>();
 
   void funcWithNativeFunc(
     WithTypedefReturnType named,
@@ -63,18 +64,19 @@
       _funcWithNativeFuncPtr.asFunction<void Function(WithTypedefReturnType)>();
 }
 
-class Struc extends ffi.Struct {
+class Struct extends ffi.Struct {
   external ffi.Pointer<
       ffi.NativeFunction<
           ffi.Void Function(
-              ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>)>> unnamed1;
+              ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>
+                  unnamed2)>> unnamed1;
 }
 
 typedef WithTypedefReturnType
     = ffi.Pointer<ffi.NativeFunction<InsideReturnType Function()>>;
 typedef InsideReturnType = ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>;
 
-class Struc2 extends ffi.Struct {
+class Struct2 extends ffi.Struct {
   external VoidFuncPointer constFuncPointer;
 }
 
diff --git a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_opaque_dependencies_bindings.dart b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_opaque_dependencies_bindings.dart
index b891dd9..c53f04f 100644
--- a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_opaque_dependencies_bindings.dart
+++ b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_opaque_dependencies_bindings.dart
@@ -1,6 +1,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 //
 // Generated by `package:ffigen`.
+// ignore_for_file: type=lint
 import 'dart:ffi' as ffi;
 
 /// Opaque Dependencies Test
@@ -63,7 +64,7 @@
 class C extends ffi.Opaque {}
 
 class D extends ffi.Struct {
-  @ffi.Int32()
+  @ffi.Int()
   external int a;
 }
 
@@ -80,6 +81,6 @@
 class UC extends ffi.Opaque {}
 
 class UD extends ffi.Union {
-  @ffi.Int32()
+  @ffi.Int()
   external int a;
 }
diff --git a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_packed_structs_bindings.dart b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_packed_structs_bindings.dart
index d27adc4..9dfabd2 100644
--- a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_packed_structs_bindings.dart
+++ b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_packed_structs_bindings.dart
@@ -1,49 +1,50 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 //
 // Generated by `package:ffigen`.
+// ignore_for_file: type=lint
 import 'dart:ffi' as ffi;
 
 class NormalStruct1 extends ffi.Struct {
-  @ffi.Int8()
+  @ffi.Char()
   external int a;
 }
 
 /// Should not be packed.
 class StructWithAttr extends ffi.Struct {
-  external ffi.Pointer<ffi.Int32> a;
+  external ffi.Pointer<ffi.Int> a;
 
-  external ffi.Pointer<ffi.Int32> b;
+  external ffi.Pointer<ffi.Int> b;
 }
 
 /// Should be packed with 1.
 @ffi.Packed(1)
 class PackedAttr extends ffi.Struct {
-  @ffi.Int32()
+  @ffi.Int()
   external int a;
 }
 
 /// Should be packed with 8.
 @ffi.Packed(8)
 class PackedAttrAlign8 extends ffi.Struct {
-  @ffi.Int32()
+  @ffi.Int()
   external int a;
 }
 
 /// Should be packed with 2.
 @ffi.Packed(2)
 class Pack2WithPragma extends ffi.Struct {
-  @ffi.Int32()
+  @ffi.Int()
   external int a;
 }
 
 /// Should be packed with 4.
 @ffi.Packed(4)
 class Pack4WithPragma extends ffi.Struct {
-  @ffi.Int64()
+  @ffi.LongLong()
   external int a;
 }
 
 class NormalStruct2 extends ffi.Struct {
-  @ffi.Int8()
+  @ffi.Char()
   external int a;
 }
diff --git a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_regress_384_bindings.dart b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_regress_384_bindings.dart
new file mode 100644
index 0000000..ab9ec8f
--- /dev/null
+++ b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_regress_384_bindings.dart
@@ -0,0 +1,29 @@
+// AUTO GENERATED FILE, DO NOT EDIT.
+//
+// Generated by `package:ffigen`.
+// ignore_for_file: type=lint
+import 'dart:ffi' as ffi;
+
+/// Regression test for #384
+class NativeLibrary {
+  /// Holds the symbol lookup function.
+  final ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
+      _lookup;
+
+  /// The symbols are looked up in [dynamicLibrary].
+  NativeLibrary(ffi.DynamicLibrary dynamicLibrary)
+      : _lookup = dynamicLibrary.lookup;
+
+  /// The symbols are looked up with [lookup].
+  NativeLibrary.fromLookup(
+      ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
+          lookup)
+      : _lookup = lookup;
+
+  void foo() {
+    return _foo();
+  }
+
+  late final _fooPtr = _lookup<ffi.NativeFunction<ffi.Void Function()>>('foo');
+  late final _foo = _fooPtr.asFunction<void Function()>();
+}
diff --git a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_struct_fptr_fields_bindings.dart b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_struct_fptr_fields_bindings.dart
new file mode 100644
index 0000000..b0490b2
--- /dev/null
+++ b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_struct_fptr_fields_bindings.dart
@@ -0,0 +1,72 @@
+// AUTO GENERATED FILE, DO NOT EDIT.
+//
+// Generated by `package:ffigen`.
+// ignore_for_file: type=lint
+import 'dart:ffi' as ffi;
+
+class S extends ffi.Struct {
+  external ffi.Pointer<ffi.NativeFunction<ffi.Int Function()>> func1;
+
+  external ffi
+          .Pointer<ffi.NativeFunction<ffi.Int Function(ffi.Int a, ffi.Int b)>>
+      comparator;
+
+  external ffi.Pointer<
+      ffi.NativeFunction<
+          ffi.Int Function(ffi.Double a, ffi.Float b, ffi.Pointer<ffi.Char> c,
+              ffi.Int d, ffi.LongLong e)>> veryManyArguments;
+
+  external ffi.Pointer<
+          ffi.NativeFunction<
+              ffi.Int Function(
+                  ffi.Int, ffi.Int, ffi.Int, ffi.Float, ffi.Pointer<ffi.Char>)>>
+      argsDontHaveNames;
+
+  external ArithmeticOperation operation;
+
+  external ffi.Pointer<
+          ffi.Pointer<
+              ffi.NativeFunction<
+                  ffi.Void Function(ffi.Pointer<ffi.Int> array, ffi.Int len)>>>
+      sortPtr;
+
+  external ffi.Pointer<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ffi.Int> array,
+              ffi.Int len,
+              ffi.Pointer<ffi.NativeFunction<ffi.Int Function(ffi.Int x)>>
+                  evaluator)>> sortBy;
+
+  external ffi.Pointer<
+          ffi.NativeFunction<ffi.Void Function(ffi.Int, ffi.Int, ffi.Char)>>
+      improperlyDeclaredParams;
+
+  external ffi.Pointer<
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<ffi.Int> array,
+              ffi.Pointer<ffi.NativeFunction<ffi.Int Function(ffi.Int x)>>
+                  primaryEvaluator,
+              ffi.Pointer<ffi.NativeFunction<ffi.Int Function(ffi.Int x)>>
+                  fallbackEvaluator)>> sortByWithFallback;
+
+  @ffi.Array.multi([2])
+  external ffi.Array<
+          ffi.Pointer<
+              ffi.NativeFunction<ffi.Void Function(ffi.Char, ffi.Char)>>>
+      manyFunctions;
+
+  external ffi.Pointer<
+      ffi.NativeFunction<
+          ffi.Pointer<ffi.NativeFunction<ffi.Int Function(ffi.Int, ffi.Int)>>
+              Function(ffi.Int, ffi.Int)>> functionReturningFunction;
+
+  external ffi.Pointer<
+      ffi.NativeFunction<
+          ffi.Pointer<ffi.NativeFunction<ffi.Int Function(ffi.Int, ffi.Int)>>
+              Function(ffi.Int, ffi.Int)>> functionReturningFunctionImproper;
+}
+
+typedef ArithmeticOperation
+    = ffi.Pointer<ffi.NativeFunction<ffi.Int Function(ffi.Int a, ffi.Int b)>>;
diff --git a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_typedef_bindings.dart b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_typedef_bindings.dart
index ec8eb3f..412acb2 100644
--- a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_typedef_bindings.dart
+++ b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_typedef_bindings.dart
@@ -3,6 +3,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 //
 // Generated by `package:ffigen`.
+// ignore_for_file: type=lint
 import 'dart:ffi' as ffi;
 
 class Bindings {
@@ -21,7 +22,7 @@
 
   NamedFunctionProto func1(
     NamedFunctionProto named,
-    ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Int32)>> unnamed,
+    ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Int)>> unnamed,
   ) {
     return _func1(
       named,
@@ -34,10 +35,10 @@
           NamedFunctionProto Function(
               NamedFunctionProto,
               ffi.Pointer<
-                  ffi.NativeFunction<ffi.Void Function(ffi.Int32)>>)>>('func1');
+                  ffi.NativeFunction<ffi.Void Function(ffi.Int)>>)>>('func1');
   late final _func1 = _func1Ptr.asFunction<
       NamedFunctionProto Function(NamedFunctionProto,
-          ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Int32)>>)>();
+          ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Int)>>)>();
 
   void func2(
     ffi.Pointer<NTyperef1> arg0,
@@ -69,19 +70,18 @@
   late final _func3 = _func3Ptr.asFunction<void Function(int, int)>();
 
   bool func4(
-    ffi.Pointer<ffi.Uint8> a,
+    ffi.Pointer<ffi.Bool> a,
   ) {
     return _func4(
-          a,
-        ) !=
-        0;
+      a,
+    );
   }
 
   late final _func4Ptr =
-      _lookup<ffi.NativeFunction<ffi.Uint8 Function(ffi.Pointer<ffi.Uint8>)>>(
+      _lookup<ffi.NativeFunction<ffi.Bool Function(ffi.Pointer<ffi.Bool>)>>(
           'func4');
   late final _func4 =
-      _func4Ptr.asFunction<int Function(ffi.Pointer<ffi.Uint8>)>();
+      _func4Ptr.asFunction<bool Function(ffi.Pointer<ffi.Bool>)>();
 }
 
 class Struct1 extends ffi.Struct {
@@ -115,6 +115,6 @@
 class Struct2 extends ffi.Opaque {}
 
 class WithBoolAlias extends ffi.Struct {
-  @ffi.Uint8()
-  external int b;
+  @ffi.Bool()
+  external bool b;
 }
diff --git a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_unions_bindings.dart b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_unions_bindings.dart
index 1f62444..585ab9a 100644
--- a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_unions_bindings.dart
+++ b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_unions_bindings.dart
@@ -1,6 +1,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 //
 // Generated by `package:ffigen`.
+// ignore_for_file: type=lint
 import 'dart:ffi' as ffi;
 
 /// Unions Test
@@ -49,7 +50,7 @@
 }
 
 class Union1 extends ffi.Union {
-  @ffi.Int32()
+  @ffi.Int()
   external int a;
 }
 
diff --git a/pkgs/ffigen/test/header_parser_tests/forward_decl_test.dart b/pkgs/ffigen/test/header_parser_tests/forward_decl_test.dart
index ca16de4..73b9f32 100644
--- a/pkgs/ffigen/test/header_parser_tests/forward_decl_test.dart
+++ b/pkgs/ffigen/test/header_parser_tests/forward_decl_test.dart
@@ -3,12 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:ffigen/src/code_generator.dart';
-import 'package:ffigen/src/config_provider.dart';
 import 'package:ffigen/src/header_parser.dart' as parser;
 import 'package:ffigen/src/strings.dart' as strings;
 import 'package:logging/logging.dart';
 import 'package:test/test.dart';
-import 'package:yaml/yaml.dart' as yaml;
 
 import '../test_utils.dart';
 
@@ -18,23 +16,20 @@
     setUpAll(() {
       logWarnings(Level.SEVERE);
       actual = parser.parse(
-        Config.fromYaml(yaml.loadYaml('''
+        testConfig('''
 ${strings.name}: 'NativeLibrary'
 ${strings.description}: 'Forward Declaration Test'
 ${strings.output}: 'unused'
 ${strings.headers}:
   ${strings.entryPoints}:
     - 'test/header_parser_tests/forward_decl.h'
-        ''') as yaml.YamlMap),
+        '''),
       );
     });
 
     test('Expected bindings', () {
-      matchLibraryWithExpected(actual, [
-        'test',
-        'debug_generated',
-        'header_parser_forward_decl_test_output.dart'
-      ], [
+      matchLibraryWithExpected(
+          actual, 'header_parser_forward_decl_test_output.dart', [
         'test',
         'header_parser_tests',
         'expected_bindings',
diff --git a/pkgs/ffigen/test/header_parser_tests/function_n_struct_test.dart b/pkgs/ffigen/test/header_parser_tests/function_n_struct_test.dart
index 3b34013..b61070c 100644
--- a/pkgs/ffigen/test/header_parser_tests/function_n_struct_test.dart
+++ b/pkgs/ffigen/test/header_parser_tests/function_n_struct_test.dart
@@ -3,12 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:ffigen/src/code_generator.dart';
-import 'package:ffigen/src/config_provider.dart';
 import 'package:ffigen/src/header_parser.dart' as parser;
 import 'package:ffigen/src/strings.dart' as strings;
 import 'package:logging/logging.dart';
 import 'package:test/test.dart';
-import 'package:yaml/yaml.dart' as yaml;
 
 import '../test_utils.dart';
 
@@ -20,7 +18,7 @@
       logWarnings(Level.SEVERE);
       expected = expectedLibrary();
       actual = parser.parse(
-        Config.fromYaml(yaml.loadYaml('''
+        testConfig('''
 ${strings.name}: 'NativeLibrary'
 ${strings.description}: 'Function And Struct Test'
 ${strings.output}: 'unused'
@@ -28,7 +26,7 @@
 ${strings.headers}:
   ${strings.entryPoints}:
     - 'test/header_parser_tests/function_n_struct.h'
-        ''') as yaml.YamlMap),
+        '''),
       );
     });
 
@@ -48,13 +46,13 @@
           expected.getBindingAsString('Struct2'));
     });
     test('Struct3 flexible array member', () {
-      expect((actual.getBinding('Struct3') as Struc).members.isEmpty, true);
+      expect((actual.getBinding('Struct3') as Struct).members.isEmpty, true);
     });
     test('Struct4 bit field member', () {
-      expect((actual.getBinding('Struct4') as Struc).members.isEmpty, true);
+      expect((actual.getBinding('Struct4') as Struct).members.isEmpty, true);
     });
     test('Struct5 incompleted struct member', () {
-      expect((actual.getBinding('Struct5') as Struc).members.isEmpty, true);
+      expect((actual.getBinding('Struct5') as Struct).members.isEmpty, true);
     });
     test('Struct6 typedef constant array', () {
       expect(actual.getBindingAsString('Struct6'),
@@ -68,63 +66,56 @@
 }
 
 Library expectedLibrary() {
-  final struc1 = Struc(name: 'Struct1', members: [
+  final struct1 = Struct(name: 'Struct1', members: [
     Member(
       name: 'a',
-      type: Type.nativeType(SupportedNativeType.Int32),
+      type: intType,
     ),
   ]);
-  final struc2 = Struc(name: 'Struct2', members: [
+  final struct2 = Struct(name: 'Struct2', members: [
     Member(
       name: 'a',
-      type: Type.struct(struc1),
+      type: struct1,
     ),
   ]);
-  final struc3 = Struc(name: 'Struct3');
+  final struct3 = Struct(name: 'Struct3');
   return Library(
     name: 'Bindings',
     bindings: [
-      struc1,
-      struc2,
-      struc3,
+      struct1,
+      struct2,
+      struct3,
       Func(
         name: 'func1',
         parameters: [
-          Parameter(name: 's', type: Type.pointer(Type.struct(struc2))),
+          Parameter(name: 's', type: PointerType(struct2)),
         ],
-        returnType: Type.nativeType(
+        returnType: NativeType(
           SupportedNativeType.Void,
         ),
       ),
       Func(
         name: 'func2',
         parameters: [
-          Parameter(name: 's', type: Type.pointer(Type.struct(struc3))),
+          Parameter(name: 's', type: PointerType(struct3)),
         ],
-        returnType: Type.nativeType(
+        returnType: NativeType(
           SupportedNativeType.Void,
         ),
       ),
       Func(
         name: 'func3',
         parameters: [
-          Parameter(
-              name: 'a',
-              type: Type.pointer(Type.nativeType(SupportedNativeType.Int32))),
+          Parameter(name: 'a', type: PointerType(intType)),
         ],
-        returnType: Type.nativeType(
+        returnType: NativeType(
           SupportedNativeType.Void,
         ),
       ),
-      Struc(name: 'Struct4'),
-      Struc(name: 'Struct5'),
-      Struc(name: 'Struct6', members: [
-        Member(
-            name: 'a',
-            type: Type.constantArray(
-                2,
-                Type.constantArray(
-                    10, Type.nativeType(SupportedNativeType.Int32))))
+      Struct(name: 'Struct4'),
+      Struct(name: 'Struct5'),
+      Struct(name: 'Struct6', members: [
+        Member(name: 'a', type: ConstantArray(2, ConstantArray(10, intType)))
       ]),
     ],
   );
diff --git a/pkgs/ffigen/test/header_parser_tests/functions.h b/pkgs/ffigen/test/header_parser_tests/functions.h
index 56ec2be..28b8546 100644
--- a/pkgs/ffigen/test/header_parser_tests/functions.h
+++ b/pkgs/ffigen/test/header_parser_tests/functions.h
@@ -19,3 +19,5 @@
 
 // Should be skipped as inline functions are not supported.
 static inline void inlineFunc();
+
+char diffChars(unsigned char a, signed char b);
diff --git a/pkgs/ffigen/test/header_parser_tests/functions_test.dart b/pkgs/ffigen/test/header_parser_tests/functions_test.dart
index 7b07562..97685b0 100644
--- a/pkgs/ffigen/test/header_parser_tests/functions_test.dart
+++ b/pkgs/ffigen/test/header_parser_tests/functions_test.dart
@@ -3,11 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:ffigen/src/code_generator.dart';
-import 'package:ffigen/src/config_provider.dart';
 import 'package:ffigen/src/header_parser.dart' as parser;
 import 'package:ffigen/src/strings.dart' as strings;
 import 'package:test/test.dart';
-import 'package:yaml/yaml.dart' as yaml;
 
 import '../test_utils.dart';
 
@@ -18,7 +16,7 @@
     setUpAll(() {
       logWarnings();
       actual = parser.parse(
-        Config.fromYaml(yaml.loadYaml('''
+        testConfig('''
 ${strings.name}: 'NativeLibrary'
 ${strings.description}: 'Functions Test'
 ${strings.output}: 'unused'
@@ -40,15 +38,12 @@
 
 ${strings.preamble}: |
   // ignore_for_file: camel_case_types
-        ''') as yaml.YamlMap),
+        '''),
       );
     });
     test('Expected Bindings', () {
-      matchLibraryWithExpected(actual, [
-        'test',
-        'debug_generated',
-        'header_parser_functions_test_output.dart'
-      ], [
+      matchLibraryWithExpected(
+          actual, 'header_parser_functions_test_output.dart', [
         'test',
         'header_parser_tests',
         'expected_bindings',
diff --git a/pkgs/ffigen/test/header_parser_tests/globals_test.dart b/pkgs/ffigen/test/header_parser_tests/globals_test.dart
index be10f3c..55184a8 100644
--- a/pkgs/ffigen/test/header_parser_tests/globals_test.dart
+++ b/pkgs/ffigen/test/header_parser_tests/globals_test.dart
@@ -3,11 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:ffigen/src/code_generator.dart';
-import 'package:ffigen/src/config_provider.dart';
 import 'package:ffigen/src/header_parser.dart' as parser;
 import 'package:ffigen/src/strings.dart' as strings;
 import 'package:test/test.dart';
-import 'package:yaml/yaml.dart' as yaml;
 
 import '../test_utils.dart';
 
@@ -19,7 +17,7 @@
       logWarnings();
       expected = expectedLibrary();
       actual = parser.parse(
-        Config.fromYaml(yaml.loadYaml('''
+        testConfig('''
 ${strings.name}: 'NativeLibrary'
 ${strings.description}: 'Globals Test'
 ${strings.output}: 'unused'
@@ -37,7 +35,7 @@
       - pointerToLongDouble
       - globalStruct
 ${strings.compilerOpts}: '-Wno-nullability-completeness'
-        ''') as yaml.YamlMap),
+        '''),
       );
     });
 
@@ -66,34 +64,32 @@
 }
 
 Library expectedLibrary() {
-  final globalStruc = Struc(name: 'EmptyStruct');
+  final globalStruct = Struct(name: 'EmptyStruct');
   return Library(
     name: 'Bindings',
     bindings: [
-      Global(type: Type.boolean(), name: 'coolGlobal'),
+      Global(type: BooleanType(), name: 'coolGlobal'),
       Global(
-        type: Type.nativeType(SupportedNativeType.Int32),
+        type: NativeType(SupportedNativeType.Int32),
         name: 'myInt',
         exposeSymbolAddress: true,
       ),
       Global(
-        type: Type.pointer(Type.nativeType(SupportedNativeType.Int32)),
+        type: PointerType(NativeType(SupportedNativeType.Int32)),
         name: 'aGlobalPointer',
         exposeSymbolAddress: true,
       ),
-      globalStruc,
+      globalStruct,
       Global(
         name: 'globalStruct',
-        type: Type.struct(globalStruc),
+        type: globalStruct,
         exposeSymbolAddress: true,
       ),
       Global(
         name: 'globalStruct_from_alias',
-        type: Type.typealias(
-          Typealias(
-            name: 'EmptyStruct_Alias',
-            type: Type.struct(globalStruc),
-          ),
+        type: Typealias(
+          name: 'EmptyStruct_Alias',
+          type: globalStruct,
         ),
         exposeSymbolAddress: true,
       )
diff --git a/pkgs/ffigen/test/header_parser_tests/imported_types.h b/pkgs/ffigen/test/header_parser_tests/imported_types.h
new file mode 100644
index 0000000..685e47c
--- /dev/null
+++ b/pkgs/ffigen/test/header_parser_tests/imported_types.h
@@ -0,0 +1,23 @@
+// Copyright (c) 2022, 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.
+
+#include <stddef.h>
+
+void default_imported_types(
+  unsigned char,
+  signed char,
+  char,
+  unsigned short,
+  short,
+  unsigned int,
+  int,
+  unsigned long,
+  long,
+  unsigned long long,
+  long long,
+  float,
+  double,
+  size_t,
+  wchar_t
+);
diff --git a/pkgs/ffigen/test/header_parser_tests/imported_types_test.dart b/pkgs/ffigen/test/header_parser_tests/imported_types_test.dart
new file mode 100644
index 0000000..fc02cff
--- /dev/null
+++ b/pkgs/ffigen/test/header_parser_tests/imported_types_test.dart
@@ -0,0 +1,45 @@
+// Copyright (c) 2022, 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 'package:ffigen/src/code_generator.dart';
+import 'package:ffigen/src/header_parser.dart' as parser;
+import 'package:ffigen/src/strings.dart' as strings;
+import 'package:test/test.dart';
+
+import '../test_utils.dart';
+
+late Library actual, expected;
+
+void main() {
+  group('imported_types_test', () {
+    setUpAll(() {
+      logWarnings();
+      actual = parser.parse(
+        testConfig('''
+${strings.name}: 'NativeLibrary'
+${strings.description}: 'Imported types test'
+${strings.output}: 'unused'
+
+${strings.headers}:
+  ${strings.entryPoints}:
+    - 'test/header_parser_tests/imported_types.h'
+  ${strings.includeDirectives}:
+    - '**imported_types.h'
+
+${strings.preamble}: |
+  // ignore_for_file: camel_case_types
+        '''),
+      );
+    });
+    test('Expected Bindings', () {
+      matchLibraryWithExpected(
+          actual, 'header_parser_imported_types_test_output.dart', [
+        'test',
+        'header_parser_tests',
+        'expected_bindings',
+        '_expected_imported_types_bindings.dart'
+      ]);
+    });
+  });
+}
diff --git a/pkgs/ffigen/test/header_parser_tests/macros.h b/pkgs/ffigen/test/header_parser_tests/macros.h
index 90bbd45..5cae837 100644
--- a/pkgs/ffigen/test/header_parser_tests/macros.h
+++ b/pkgs/ffigen/test/header_parser_tests/macros.h
@@ -30,3 +30,16 @@
 #define TEST14 INFINITY
 #define TEST15 -INFINITY
 #define TEST16 NAN
+
+
+// Inside include guard.
+#ifndef __TEST_INCLUDE_GUARD_1__
+#define __TEST_INCLUDE_GUARD_1__
+
+#define TEST17 TEST_FUNCTION_MACRO(0)
+#define TEST18 TEST_FUNCTION_MACRO(1)
+#define TEST19 TEST_FUNCTION_MACRO(2)
+
+#define TEST_FUNCTION_MACRO(x) ((unsigned long)((x) << (2)))
+
+#endif /* __TEST_INCLUDE_GUARD_1__ */
diff --git a/pkgs/ffigen/test/header_parser_tests/macros_test.dart b/pkgs/ffigen/test/header_parser_tests/macros_test.dart
index d615b26..70439ef 100644
--- a/pkgs/ffigen/test/header_parser_tests/macros_test.dart
+++ b/pkgs/ffigen/test/header_parser_tests/macros_test.dart
@@ -3,12 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:ffigen/src/code_generator.dart';
-import 'package:ffigen/src/config_provider.dart';
 import 'package:ffigen/src/header_parser.dart' as parser;
 import 'package:ffigen/src/strings.dart' as strings;
 import 'package:logging/logging.dart';
 import 'package:test/test.dart';
-import 'package:yaml/yaml.dart' as yaml;
 
 import '../test_utils.dart';
 
@@ -20,7 +18,7 @@
       logWarnings(Level.WARNING);
       expected = expectedLibrary();
       actual = parser.parse(
-        Config.fromYaml(yaml.loadYaml('''
+        testConfig('''
 ${strings.name}: 'NativeLibrary'
 ${strings.description}: 'Macros Test'
 ${strings.output}: 'unused'
@@ -29,7 +27,7 @@
     - 'test/header_parser_tests/macros.h'
   ${strings.includeDirectives}:
     - '**macros.h'
-        ''') as yaml.YamlMap),
+        '''),
       );
     });
     test('Total bindings count', () {
@@ -98,6 +96,18 @@
       expect(actual.getBindingAsString('TEST16'),
           expected.getBindingAsString('TEST16'));
     });
+    test('TEST17', () {
+      expect(actual.getBindingAsString('TEST17'),
+          expected.getBindingAsString('TEST17'));
+    });
+    test('TEST18', () {
+      expect(actual.getBindingAsString('TEST18'),
+          expected.getBindingAsString('TEST18'));
+    });
+    test('TEST19', () {
+      expect(actual.getBindingAsString('TEST19'),
+          expected.getBindingAsString('TEST19'));
+    });
   });
 }
 
@@ -125,6 +135,9 @@
           rawType: 'double',
           rawValue: strings.doubleNegativeInfinity),
       Constant(name: 'TEST16', rawType: 'double', rawValue: strings.doubleNaN),
+      Constant(name: 'TEST17', rawType: 'int', rawValue: "0"),
+      Constant(name: 'TEST18', rawType: 'int', rawValue: "4"),
+      Constant(name: 'TEST19', rawType: 'int', rawValue: "8"),
     ],
   );
 }
diff --git a/pkgs/ffigen/test/header_parser_tests/native_func_typedef.h b/pkgs/ffigen/test/header_parser_tests/native_func_typedef.h
index 8b942d0..0c6f7a0 100644
--- a/pkgs/ffigen/test/header_parser_tests/native_func_typedef.h
+++ b/pkgs/ffigen/test/header_parser_tests/native_func_typedef.h
@@ -2,7 +2,7 @@
 // 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.
 
-struct Struc
+struct Struct
 {
     void (*unnamed1)(void (*unnamed2)());
 };
@@ -17,6 +17,6 @@
 void funcWithNativeFunc(WithTypedefReturnType named);
 
 typedef void (*VoidFuncPointer)();
-struct Struc2{
+struct Struct2{
     const VoidFuncPointer constFuncPointer;
 };
diff --git a/pkgs/ffigen/test/header_parser_tests/native_func_typedef_test.dart b/pkgs/ffigen/test/header_parser_tests/native_func_typedef_test.dart
index 4f9187c..180ff4d 100644
--- a/pkgs/ffigen/test/header_parser_tests/native_func_typedef_test.dart
+++ b/pkgs/ffigen/test/header_parser_tests/native_func_typedef_test.dart
@@ -3,12 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:ffigen/src/code_generator.dart';
-import 'package:ffigen/src/config_provider.dart';
 import 'package:ffigen/src/header_parser.dart' as parser;
 import 'package:ffigen/src/strings.dart' as strings;
 import 'package:logging/logging.dart';
 import 'package:test/test.dart';
-import 'package:yaml/yaml.dart' as yaml;
 
 import '../test_utils.dart';
 
@@ -18,14 +16,14 @@
     setUpAll(() {
       logWarnings(Level.SEVERE);
       actual = parser.parse(
-        Config.fromYaml(yaml.loadYaml('''
+        testConfig('''
 ${strings.name}: 'NativeLibrary'
 ${strings.description}: 'Native Func Typedef Test.'
 ${strings.output}: 'unused'
 ${strings.headers}:
   ${strings.entryPoints}:
     - 'test/header_parser_tests/native_func_typedef.h'
-        ''') as yaml.YamlMap),
+        '''),
       );
     });
 
@@ -35,11 +33,8 @@
     });
 
     test('Expected bindings', () {
-      matchLibraryWithExpected(actual, [
-        'test',
-        'debug_generated',
-        'header_parser_native_func_typedef_test_output.dart'
-      ], [
+      matchLibraryWithExpected(
+          actual, 'header_parser_native_func_typedef_test_output.dart', [
         'test',
         'header_parser_tests',
         'expected_bindings',
diff --git a/pkgs/ffigen/test/header_parser_tests/nested_parsing.h b/pkgs/ffigen/test/header_parser_tests/nested_parsing.h
index cb21825..8557b64 100644
--- a/pkgs/ffigen/test/header_parser_tests/nested_parsing.h
+++ b/pkgs/ffigen/test/header_parser_tests/nested_parsing.h
@@ -40,3 +40,23 @@
     // Incomplete struct array.
     struct EmptyStruct b[3];
 };
+
+struct Struct6
+{
+    // An anonymous, unnamed union.
+    union
+    {
+        float a;
+    };
+
+    // An unnamed union.
+    union
+    {
+        float b;
+    } c;
+
+    union
+    {
+        float d;
+    } e;
+};
diff --git a/pkgs/ffigen/test/header_parser_tests/nested_parsing_test.dart b/pkgs/ffigen/test/header_parser_tests/nested_parsing_test.dart
index d09d972..75803a0 100644
--- a/pkgs/ffigen/test/header_parser_tests/nested_parsing_test.dart
+++ b/pkgs/ffigen/test/header_parser_tests/nested_parsing_test.dart
@@ -3,11 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:ffigen/src/code_generator.dart';
-import 'package:ffigen/src/config_provider.dart';
 import 'package:ffigen/src/header_parser.dart' as parser;
 import 'package:ffigen/src/strings.dart' as strings;
 import 'package:test/test.dart';
-import 'package:yaml/yaml.dart' as yaml;
 
 import '../test_utils.dart';
 
@@ -19,7 +17,7 @@
       logWarnings();
       expected = expectedLibrary();
       actual = parser.parse(
-        Config.fromYaml(yaml.loadYaml('''
+        testConfig('''
 ${strings.name}: 'NativeLibrary'
 ${strings.description}: 'Nested Parsing Test'
 ${strings.output}: 'unused'
@@ -29,7 +27,7 @@
 ${strings.structs}:
   ${strings.exclude}:
     - Struct2
-        ''') as yaml.YamlMap),
+        '''),
       );
     });
 
@@ -57,59 +55,104 @@
       expect(actual.getBindingAsString('Struct5'),
           expected.getBindingAsString('Struct5'));
     });
+    test('Struct6', () {
+      expect(actual.getBindingAsString('Struct6'),
+          expected.getBindingAsString('Struct6'));
+    });
   });
 }
 
 Library expectedLibrary() {
-  final struc2 = Struc(name: 'Struct2', members: [
+  final struct2 = Struct(name: 'Struct2', members: [
     Member(
       name: 'e',
-      type: Type.nativeType(SupportedNativeType.Int32),
+      type: intType,
     ),
     Member(
       name: 'f',
-      type: Type.nativeType(SupportedNativeType.Int32),
+      type: intType,
     ),
   ]);
-  final unnamedInternalStruc = Struc(name: 'UnnamedStruct1', members: [
+  final unnamedInternalStruct = Struct(name: 'UnnamedStruct1', members: [
     Member(
       name: 'a',
-      type: Type.nativeType(SupportedNativeType.Int32),
+      type: intType,
     ),
     Member(
       name: 'b',
-      type: Type.nativeType(SupportedNativeType.Int32),
+      type: intType,
     ),
   ]);
   return Library(
     name: 'Bindings',
     bindings: [
-      unnamedInternalStruc,
-      struc2,
-      Struc(name: 'Struct1', members: [
+      unnamedInternalStruct,
+      struct2,
+      Struct(name: 'Struct1', members: [
         Member(
           name: 'a',
-          type: Type.nativeType(SupportedNativeType.Int32),
+          type: intType,
         ),
         Member(
           name: 'b',
-          type: Type.nativeType(SupportedNativeType.Int32),
+          type: intType,
         ),
-        Member(name: 'struct2', type: Type.pointer(Type.struct(struc2))),
+        Member(name: 'struct2', type: PointerType(struct2)),
       ]),
-      Struc(name: 'Struct3', members: [
+      Struct(name: 'Struct3', members: [
         Member(
           name: 'a',
-          type: Type.nativeType(SupportedNativeType.Int32),
+          type: intType,
         ),
         Member(
           name: 'b',
-          type: Type.struct(unnamedInternalStruc),
+          type: unnamedInternalStruct,
         ),
       ]),
-      Struc(name: 'EmptyStruct'),
-      Struc(name: 'Struct4'),
-      Struc(name: 'Struct5'),
+      Struct(name: 'EmptyStruct'),
+      Struct(name: 'Struct4'),
+      Struct(name: 'Struct5'),
+      Struct(
+        name: 'Struct6',
+        members: [
+          Member(
+            name: '',
+            type: Union(
+              name: 'UnnamedUnion1',
+              members: [
+                Member(
+                  name: 'a',
+                  type: floatType,
+                ),
+              ],
+            ),
+          ),
+          Member(
+            name: 'c',
+            type: Union(
+              name: 'UnnamedUnion2',
+              members: [
+                Member(
+                  name: 'b',
+                  type: floatType,
+                ),
+              ],
+            ),
+          ),
+          Member(
+            name: 'e',
+            type: Union(
+              name: 'UnnamedUnion3',
+              members: [
+                Member(
+                  name: 'd',
+                  type: floatType,
+                ),
+              ],
+            ),
+          ),
+        ],
+      ),
     ],
   );
 }
diff --git a/pkgs/ffigen/test/header_parser_tests/opaque_dependencies_test.dart b/pkgs/ffigen/test/header_parser_tests/opaque_dependencies_test.dart
index 782f761..fc73cfe 100644
--- a/pkgs/ffigen/test/header_parser_tests/opaque_dependencies_test.dart
+++ b/pkgs/ffigen/test/header_parser_tests/opaque_dependencies_test.dart
@@ -3,12 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:ffigen/src/code_generator.dart';
-import 'package:ffigen/src/config_provider.dart';
 import 'package:ffigen/src/header_parser.dart' as parser;
 import 'package:ffigen/src/strings.dart' as strings;
 import 'package:logging/logging.dart';
 import 'package:test/test.dart';
-import 'package:yaml/yaml.dart' as yaml;
 
 import '../test_utils.dart';
 
@@ -18,7 +16,7 @@
     setUpAll(() {
       logWarnings(Level.SEVERE);
       actual = parser.parse(
-        Config.fromYaml(yaml.loadYaml('''
+        testConfig('''
 ${strings.name}: 'NativeLibrary'
 ${strings.description}: 'Opaque Dependencies Test'
 ${strings.output}: 'unused'
@@ -33,15 +31,12 @@
   ${strings.include}:
     - 'UE'
   ${strings.dependencyOnly}: ${strings.opaqueCompoundDependencies}
-        ''') as yaml.YamlMap),
+        '''),
       );
     });
     test('Expected bindings', () {
-      matchLibraryWithExpected(actual, [
-        'test',
-        'debug_generated',
-        'header_parser_opaque_dependencies_test_output.dart'
-      ], [
+      matchLibraryWithExpected(
+          actual, 'header_parser_opaque_dependencies_test_output.dart', [
         'test',
         'header_parser_tests',
         'expected_bindings',
diff --git a/pkgs/ffigen/test/header_parser_tests/packed_structs_test.dart b/pkgs/ffigen/test/header_parser_tests/packed_structs_test.dart
index 357412e..62b7075 100644
--- a/pkgs/ffigen/test/header_parser_tests/packed_structs_test.dart
+++ b/pkgs/ffigen/test/header_parser_tests/packed_structs_test.dart
@@ -3,12 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:ffigen/src/code_generator.dart';
-import 'package:ffigen/src/config_provider.dart';
 import 'package:ffigen/src/header_parser.dart' as parser;
 import 'package:ffigen/src/strings.dart' as strings;
 import 'package:logging/logging.dart';
 import 'package:test/test.dart';
-import 'package:yaml/yaml.dart' as yaml;
 
 import '../test_utils.dart';
 
@@ -18,23 +16,20 @@
     setUpAll(() {
       logWarnings(Level.SEVERE);
       actual = parser.parse(
-        Config.fromYaml(yaml.loadYaml('''
+        testConfig('''
 ${strings.name}: 'NativeLibrary'
 ${strings.description}: 'Packed Structs Test'
 ${strings.output}: 'unused'
 ${strings.headers}:
   ${strings.entryPoints}:
     - 'test/header_parser_tests/packed_structs.h'
-        ''') as yaml.YamlMap),
+        '''),
       );
     });
 
     test('Expected bindings', () {
-      matchLibraryWithExpected(actual, [
-        'test',
-        'debug_generated',
-        'header_parser_packed_structs_test_output.dart'
-      ], [
+      matchLibraryWithExpected(
+          actual, 'header_parser_packed_structs_test_output.dart', [
         'test',
         'header_parser_tests',
         'expected_bindings',
diff --git a/pkgs/ffigen/test/header_parser_tests/regress_384_header_1.h b/pkgs/ffigen/test/header_parser_tests/regress_384_header_1.h
new file mode 100644
index 0000000..3129b2d
--- /dev/null
+++ b/pkgs/ffigen/test/header_parser_tests/regress_384_header_1.h
@@ -0,0 +1,5 @@
+// Copyright (c) 2022, 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.
+
+#include "regress_384_shared.h"
diff --git a/pkgs/ffigen/test/header_parser_tests/regress_384_header_2.h b/pkgs/ffigen/test/header_parser_tests/regress_384_header_2.h
new file mode 100644
index 0000000..3129b2d
--- /dev/null
+++ b/pkgs/ffigen/test/header_parser_tests/regress_384_header_2.h
@@ -0,0 +1,5 @@
+// Copyright (c) 2022, 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.
+
+#include "regress_384_shared.h"
diff --git a/pkgs/ffigen/test/header_parser_tests/regress_384_shared.h b/pkgs/ffigen/test/header_parser_tests/regress_384_shared.h
new file mode 100644
index 0000000..265a786
--- /dev/null
+++ b/pkgs/ffigen/test/header_parser_tests/regress_384_shared.h
@@ -0,0 +1,10 @@
+// Copyright (c) 2022, 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.
+
+#ifndef __REGRESS_384_SHARED__
+#define __REGRESS_384_SHARED__
+
+void foo();
+
+#endif
diff --git a/pkgs/ffigen/test/header_parser_tests/regress_384_test.dart b/pkgs/ffigen/test/header_parser_tests/regress_384_test.dart
new file mode 100644
index 0000000..b5751d1
--- /dev/null
+++ b/pkgs/ffigen/test/header_parser_tests/regress_384_test.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2022, 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 'package:ffigen/src/code_generator.dart';
+import 'package:ffigen/src/header_parser.dart' as parser;
+import 'package:ffigen/src/strings.dart' as strings;
+import 'package:logging/logging.dart';
+import 'package:test/test.dart';
+
+import '../test_utils.dart';
+
+late Library actual;
+void main() {
+  group('regress_384_test', () {
+    setUpAll(() {
+      logWarnings(Level.SEVERE);
+      actual = parser.parse(
+        testConfig('''
+${strings.name}: 'NativeLibrary'
+${strings.description}: 'Regression test for #384'
+${strings.output}: 'unused'
+${strings.headers}:
+  ${strings.entryPoints}:
+    - 'test/header_parser_tests/regress_384_header_1.h'
+    - 'test/header_parser_tests/regress_384_header_2.h'
+        '''),
+      );
+    });
+
+    test('Expected bindings', () {
+      matchLibraryWithExpected(
+          actual, 'header_parser_regress_384_test_output.dart', [
+        'test',
+        'header_parser_tests',
+        'expected_bindings',
+        '_expected_regress_384_bindings.dart'
+      ]);
+    });
+  });
+}
diff --git a/pkgs/ffigen/test/header_parser_tests/separate_definition.h b/pkgs/ffigen/test/header_parser_tests/separate_definition.h
new file mode 100644
index 0000000..4c8584b
--- /dev/null
+++ b/pkgs/ffigen/test/header_parser_tests/separate_definition.h
@@ -0,0 +1,11 @@
+// Copyright (c) 2022, 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.
+
+// Forward declaration to SeparatelyDefinedStruct, with definition in
+// separate_definition_base.h
+struct SeparatelyDefinedStruct;
+
+void func(struct SeparatelyDefinedStruct s);
+
+void func2(struct SeparatelyDefinedStruct *s);
diff --git a/pkgs/ffigen/test/header_parser_tests/separate_definition_base.h b/pkgs/ffigen/test/header_parser_tests/separate_definition_base.h
new file mode 100644
index 0000000..2342bdf
--- /dev/null
+++ b/pkgs/ffigen/test/header_parser_tests/separate_definition_base.h
@@ -0,0 +1,8 @@
+// Copyright (c) 2022, 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.
+
+struct SeparatelyDefinedStruct{
+    int a;
+    int b;
+};
diff --git a/pkgs/ffigen/test/header_parser_tests/separate_definition_test.dart b/pkgs/ffigen/test/header_parser_tests/separate_definition_test.dart
new file mode 100644
index 0000000..663bebf
--- /dev/null
+++ b/pkgs/ffigen/test/header_parser_tests/separate_definition_test.dart
@@ -0,0 +1,49 @@
+// 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 'package:ffigen/src/code_generator.dart';
+import 'package:ffigen/src/config_provider.dart';
+import 'package:ffigen/src/header_parser.dart' as parser;
+import 'package:ffigen/src/strings.dart' as strings;
+import 'package:logging/logging.dart';
+import 'package:test/test.dart';
+
+import '../test_utils.dart';
+
+late Library actual, expected;
+
+void main() {
+  group('separate_definition', () {
+    setUpAll(() {
+      logWarnings(Level.SEVERE);
+    });
+    test('different header order', () {
+      final entryPoints = [
+        "test/header_parser_tests/separate_definition_base.h",
+        "test/header_parser_tests/separate_definition.h"
+      ];
+      final library1String = parser.parse(_makeConfig(entryPoints)).generate();
+      final library2String =
+          parser.parse(_makeConfig(entryPoints.reversed.toList())).generate();
+
+      expect(library1String, library2String);
+    });
+  });
+}
+
+Config _makeConfig(List<String> entryPoints) {
+  final entryPointBuilder = StringBuffer();
+  for (final ep in entryPoints) {
+    entryPointBuilder.writeln("    - $ep");
+  }
+  final config = testConfig('''
+${strings.name}: 'Bindings'
+${strings.output}: 'unused'
+
+${strings.headers}:
+  ${strings.entryPoints}:
+${entryPointBuilder.toString()}
+''');
+  return config;
+}
diff --git a/pkgs/ffigen/test/header_parser_tests/struct_fptr_fields.h b/pkgs/ffigen/test/header_parser_tests/struct_fptr_fields.h
new file mode 100644
index 0000000..e95d1ca
--- /dev/null
+++ b/pkgs/ffigen/test/header_parser_tests/struct_fptr_fields.h
@@ -0,0 +1,41 @@
+// Copyright (c) 2021, 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.
+
+typedef int (*ArithmeticOperation)(int a, int b);
+
+struct S
+{
+    // Function pointer field, but no parameters.
+    int (*func1)(void);
+    // Function pointer field with parameters.
+    int (*comparator)(int a, int b);
+    // Function pointer field with lot of parameters
+    int (*veryManyArguments)(double a, float b, char *c, int d, long long e);
+    // Function pointer field with parameters, but no names
+    int (*argsDontHaveNames)(int, int, int, float, char *);
+    // Function pointer through typedef
+    ArithmeticOperation operation;
+    // Pointer to function pointer
+    void (**sortPtr)(int *array, int len);
+    // Function pointer with a function pointer parameter
+    void (*sortBy)(int *array, int len, int (*evaluator)(int x));
+    // Function where few parameters are named. This should not
+    // produce parameters in output.
+    void (*improperlyDeclaredParams)(int a, int, char);
+    // Function pointer with 2 function pointer parameters
+    void (*sortByWithFallback)(int *array,
+                               int (*primaryEvaluator)(int x),
+                               int (*fallbackEvaluator)(int x));
+
+    // TODO(#545): Handle remaining cases of parsing param names
+    // ---
+    // Array of function pointers. Does not produce proper output right now.
+    void (*manyFunctions[2])(char a, char b);
+    // Function pointer returning function pointer. Does not produce valid output.
+    int (*(*functionReturningFunction)(int a, int b))(int c, int d);
+    // Function pointer returning function pointer. The return type has param
+    // names, but the function itself doesn't. This also shouldn't produce
+    // any parameters in output.
+    int (*(*functionReturningFunctionImproper)(int a, int b))(int, int);
+};
diff --git a/pkgs/ffigen/test/header_parser_tests/struct_fptr_fields_test.dart b/pkgs/ffigen/test/header_parser_tests/struct_fptr_fields_test.dart
new file mode 100644
index 0000000..765b8b0
--- /dev/null
+++ b/pkgs/ffigen/test/header_parser_tests/struct_fptr_fields_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2021, 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 'package:ffigen/src/code_generator.dart';
+import 'package:ffigen/src/config_provider.dart';
+import 'package:ffigen/src/header_parser.dart' as parser;
+import 'package:ffigen/src/strings.dart' as strings;
+import 'package:logging/logging.dart';
+import 'package:test/test.dart';
+import 'package:yaml/yaml.dart' as yaml;
+
+import '../test_utils.dart';
+
+late Library actual;
+void main() {
+  group('Function pointer parameters parsing test', () {
+    setUpAll(() {
+      logWarnings(Level.SEVERE);
+      actual = parser.parse(
+        Config.fromYaml(yaml.loadYaml('''
+${strings.name}: 'NativeLibrary'
+${strings.description}: 'Function pointer fields in structs Test'
+${strings.output}: 'unused'
+${strings.headers}:
+  ${strings.entryPoints}:
+    - 'test/header_parser_tests/struct_fptr_fields.h'
+        ''') as yaml.YamlMap),
+      );
+    });
+
+    test('Expected bindings', () {
+      matchLibraryWithExpected(
+          actual, 'header_parser_struct_fptr_fields_output.dart', [
+        'test',
+        'header_parser_tests',
+        'expected_bindings',
+        '_expected_struct_fptr_fields_bindings.dart',
+      ]);
+    });
+  });
+}
diff --git a/pkgs/ffigen/test/header_parser_tests/typedef_test.dart b/pkgs/ffigen/test/header_parser_tests/typedef_test.dart
index 6759603..51b90e6 100644
--- a/pkgs/ffigen/test/header_parser_tests/typedef_test.dart
+++ b/pkgs/ffigen/test/header_parser_tests/typedef_test.dart
@@ -3,12 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:ffigen/src/code_generator.dart';
-import 'package:ffigen/src/config_provider.dart';
 import 'package:ffigen/src/header_parser.dart' as parser;
 import 'package:ffigen/src/strings.dart' as strings;
 import 'package:logging/logging.dart';
 import 'package:test/test.dart';
-import 'package:yaml/yaml.dart' as yaml;
 
 import '../test_utils.dart';
 
@@ -19,7 +17,7 @@
     setUpAll(() {
       logWarnings(Level.SEVERE);
       actual = parser.parse(
-        Config.fromYaml(yaml.loadYaml('''
+        testConfig('''
 ${strings.name}: 'Bindings'
 ${strings.output}: 'unused'
 
@@ -32,21 +30,21 @@
   ${strings.exclude}:
     - ExcludedStruct
     - _ExcludedStruct
-${strings.typedefmap}:
-  'SpecifiedTypeAsIntPtr': 'IntPtr'
-
+${strings.typeMap}:
+  ${strings.typeMapTypedefs}:
+    'SpecifiedTypeAsIntPtr':
+        lib: 'ffi'
+        c-type: 'IntPtr'
+        dart-type: 'int'
 ${strings.preamble}: |
   // ignore_for_file: unused_element, unused_field
-        ''') as yaml.YamlMap),
+        '''),
       );
     });
 
     test('Expected Bindings', () {
-      matchLibraryWithExpected(actual, [
-        'test',
-        'debug_generated',
-        'header_parser_typedef_test_output.dart'
-      ], [
+      matchLibraryWithExpected(
+          actual, 'header_parser_typedef_test_output.dart', [
         'test',
         'header_parser_tests',
         'expected_bindings',
diff --git a/pkgs/ffigen/test/header_parser_tests/unions_test.dart b/pkgs/ffigen/test/header_parser_tests/unions_test.dart
index 5146d62..e248dfb 100644
--- a/pkgs/ffigen/test/header_parser_tests/unions_test.dart
+++ b/pkgs/ffigen/test/header_parser_tests/unions_test.dart
@@ -3,38 +3,33 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:ffigen/src/code_generator.dart';
-import 'package:ffigen/src/config_provider.dart';
 import 'package:ffigen/src/header_parser.dart' as parser;
 import 'package:ffigen/src/strings.dart' as strings;
 import 'package:logging/logging.dart';
 import 'package:test/test.dart';
-import 'package:yaml/yaml.dart' as yaml;
 
 import '../test_utils.dart';
 
 late Library actual;
 void main() {
-  group('packed_structs_test', () {
+  group('unions_test', () {
     setUpAll(() {
       logWarnings(Level.SEVERE);
       actual = parser.parse(
-        Config.fromYaml(yaml.loadYaml('''
+        testConfig('''
 ${strings.name}: 'NativeLibrary'
 ${strings.description}: 'Unions Test'
 ${strings.output}: 'unused'
 ${strings.headers}:
   ${strings.entryPoints}:
     - 'test/header_parser_tests/unions.h'
-        ''') as yaml.YamlMap),
+        '''),
       );
     });
 
     test('Expected bindings', () {
-      matchLibraryWithExpected(actual, [
-        'test',
-        'debug_generated',
-        'header_parser_unions_test_output.dart'
-      ], [
+      matchLibraryWithExpected(
+          actual, 'header_parser_unions_test_output.dart', [
         'test',
         'header_parser_tests',
         'expected_bindings',
diff --git a/pkgs/ffigen/test/header_parser_tests/unnamed_enums_test.dart b/pkgs/ffigen/test/header_parser_tests/unnamed_enums_test.dart
index ea9f32d..eae9cf3 100644
--- a/pkgs/ffigen/test/header_parser_tests/unnamed_enums_test.dart
+++ b/pkgs/ffigen/test/header_parser_tests/unnamed_enums_test.dart
@@ -3,11 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:ffigen/src/code_generator.dart';
-import 'package:ffigen/src/config_provider.dart';
 import 'package:ffigen/src/header_parser.dart' as parser;
 import 'package:ffigen/src/strings.dart' as strings;
 import 'package:test/test.dart';
-import 'package:yaml/yaml.dart' as yaml;
 
 import '../test_utils.dart';
 
@@ -19,7 +17,7 @@
       logWarnings();
       expected = expectedLibrary();
       actual = parser.parse(
-        Config.fromYaml(yaml.loadYaml('''
+        testConfig('''
 ${strings.name}: 'NativeLibrary'
 ${strings.description}: 'Unnamed Enums Test'
 ${strings.output}: 'unused'
@@ -32,7 +30,7 @@
 ${strings.unnamedEnums}:
   ${strings.exclude}:
     - B
-        ''') as yaml.YamlMap),
+        '''),
       );
     });
 
diff --git a/pkgs/ffigen/test/large_integration_tests/_expected_cjson_bindings.dart b/pkgs/ffigen/test/large_integration_tests/_expected_cjson_bindings.dart
index f16ca6e..fe6b008 100644
--- a/pkgs/ffigen/test/large_integration_tests/_expected_cjson_bindings.dart
+++ b/pkgs/ffigen/test/large_integration_tests/_expected_cjson_bindings.dart
@@ -3,6 +3,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 //
 // Generated by `package:ffigen`.
+// ignore_for_file: type=lint
 import 'dart:ffi' as ffi;
 
 /// Bindings to Cjson.
@@ -20,15 +21,15 @@
           lookup)
       : _lookup = lookup;
 
-  ffi.Pointer<ffi.Int8> cJSON_Version() {
+  ffi.Pointer<ffi.Char> cJSON_Version() {
     return _cJSON_Version();
   }
 
   late final _cJSON_VersionPtr =
-      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Int8> Function()>>(
+      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Char> Function()>>(
           'cJSON_Version');
   late final _cJSON_Version =
-      _cJSON_VersionPtr.asFunction<ffi.Pointer<ffi.Int8> Function()>();
+      _cJSON_VersionPtr.asFunction<ffi.Pointer<ffi.Char> Function()>();
 
   void cJSON_InitHooks(
     ffi.Pointer<cJSON_Hooks> hooks,
@@ -45,7 +46,7 @@
       _cJSON_InitHooksPtr.asFunction<void Function(ffi.Pointer<cJSON_Hooks>)>();
 
   ffi.Pointer<cJSON> cJSON_Parse(
-    ffi.Pointer<ffi.Int8> value,
+    ffi.Pointer<ffi.Char> value,
   ) {
     return _cJSON_Parse(
       value,
@@ -54,13 +55,13 @@
 
   late final _cJSON_ParsePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Int8>)>>('cJSON_Parse');
+          ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Char>)>>('cJSON_Parse');
   late final _cJSON_Parse = _cJSON_ParsePtr
-      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Int8>)>();
+      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_ParseWithOpts(
-    ffi.Pointer<ffi.Int8> value,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> return_parse_end,
+    ffi.Pointer<ffi.Char> value,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> return_parse_end,
     int require_null_terminated,
   ) {
     return _cJSON_ParseWithOpts(
@@ -73,14 +74,14 @@
   late final _cJSON_ParseWithOptsPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
+              ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Pointer<ffi.Char>>,
               cJSON_bool)>>('cJSON_ParseWithOpts');
   late final _cJSON_ParseWithOpts = _cJSON_ParseWithOptsPtr.asFunction<
       ffi.Pointer<cJSON> Function(
-          ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Pointer<ffi.Int8>>, int)>();
+          ffi.Pointer<ffi.Char>, ffi.Pointer<ffi.Pointer<ffi.Char>>, int)>();
 
-  ffi.Pointer<ffi.Int8> cJSON_Print(
+  ffi.Pointer<ffi.Char> cJSON_Print(
     ffi.Pointer<cJSON> item,
   ) {
     return _cJSON_Print(
@@ -90,11 +91,11 @@
 
   late final _cJSON_PrintPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(ffi.Pointer<cJSON>)>>('cJSON_Print');
+          ffi.Pointer<ffi.Char> Function(ffi.Pointer<cJSON>)>>('cJSON_Print');
   late final _cJSON_Print = _cJSON_PrintPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(ffi.Pointer<cJSON>)>();
+      .asFunction<ffi.Pointer<ffi.Char> Function(ffi.Pointer<cJSON>)>();
 
-  ffi.Pointer<ffi.Int8> cJSON_PrintUnformatted(
+  ffi.Pointer<ffi.Char> cJSON_PrintUnformatted(
     ffi.Pointer<cJSON> item,
   ) {
     return _cJSON_PrintUnformatted(
@@ -104,12 +105,12 @@
 
   late final _cJSON_PrintUnformattedPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(
+          ffi.Pointer<ffi.Char> Function(
               ffi.Pointer<cJSON>)>>('cJSON_PrintUnformatted');
   late final _cJSON_PrintUnformatted = _cJSON_PrintUnformattedPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(ffi.Pointer<cJSON>)>();
+      .asFunction<ffi.Pointer<ffi.Char> Function(ffi.Pointer<cJSON>)>();
 
-  ffi.Pointer<ffi.Int8> cJSON_PrintBuffered(
+  ffi.Pointer<ffi.Char> cJSON_PrintBuffered(
     ffi.Pointer<cJSON> item,
     int prebuffer,
     int fmt,
@@ -123,14 +124,14 @@
 
   late final _cJSON_PrintBufferedPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(ffi.Pointer<cJSON>, ffi.Int32,
-              cJSON_bool)>>('cJSON_PrintBuffered');
+          ffi.Pointer<ffi.Char> Function(
+              ffi.Pointer<cJSON>, ffi.Int, cJSON_bool)>>('cJSON_PrintBuffered');
   late final _cJSON_PrintBuffered = _cJSON_PrintBufferedPtr.asFunction<
-      ffi.Pointer<ffi.Int8> Function(ffi.Pointer<cJSON>, int, int)>();
+      ffi.Pointer<ffi.Char> Function(ffi.Pointer<cJSON>, int, int)>();
 
   int cJSON_PrintPreallocated(
     ffi.Pointer<cJSON> item,
-    ffi.Pointer<ffi.Int8> buffer,
+    ffi.Pointer<ffi.Char> buffer,
     int length,
     int format,
   ) {
@@ -144,10 +145,10 @@
 
   late final _cJSON_PrintPreallocatedPtr = _lookup<
       ffi.NativeFunction<
-          cJSON_bool Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
-              ffi.Int32, cJSON_bool)>>('cJSON_PrintPreallocated');
+          cJSON_bool Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>,
+              ffi.Int, cJSON_bool)>>('cJSON_PrintPreallocated');
   late final _cJSON_PrintPreallocated = _cJSON_PrintPreallocatedPtr.asFunction<
-      int Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, int, int)>();
+      int Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>, int, int)>();
 
   void cJSON_Delete(
     ffi.Pointer<cJSON> item,
@@ -172,7 +173,7 @@
   }
 
   late final _cJSON_GetArraySizePtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<cJSON>)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<cJSON>)>>(
           'cJSON_GetArraySize');
   late final _cJSON_GetArraySize =
       _cJSON_GetArraySizePtr.asFunction<int Function(ffi.Pointer<cJSON>)>();
@@ -190,13 +191,13 @@
   late final _cJSON_GetArrayItemPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<cJSON>, ffi.Int32)>>('cJSON_GetArrayItem');
+              ffi.Pointer<cJSON>, ffi.Int)>>('cJSON_GetArrayItem');
   late final _cJSON_GetArrayItem = _cJSON_GetArrayItemPtr
       .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, int)>();
 
   ffi.Pointer<cJSON> cJSON_GetObjectItem(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<ffi.Char> string,
   ) {
     return _cJSON_GetObjectItem(
       object,
@@ -207,13 +208,13 @@
   late final _cJSON_GetObjectItemPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_GetObjectItem');
+              ffi.Pointer<ffi.Char>)>>('cJSON_GetObjectItem');
   late final _cJSON_GetObjectItem = _cJSON_GetObjectItemPtr.asFunction<
-      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_GetObjectItemCaseSensitive(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<ffi.Char> string,
   ) {
     return _cJSON_GetObjectItemCaseSensitive(
       object,
@@ -224,15 +225,15 @@
   late final _cJSON_GetObjectItemCaseSensitivePtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_GetObjectItemCaseSensitive');
+              ffi.Pointer<ffi.Char>)>>('cJSON_GetObjectItemCaseSensitive');
   late final _cJSON_GetObjectItemCaseSensitive =
       _cJSON_GetObjectItemCaseSensitivePtr.asFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+              ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>)>();
 
   int cJSON_HasObjectItem(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<ffi.Char> string,
   ) {
     return _cJSON_HasObjectItem(
       object,
@@ -243,21 +244,21 @@
   late final _cJSON_HasObjectItemPtr = _lookup<
       ffi.NativeFunction<
           cJSON_bool Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_HasObjectItem');
+              ffi.Pointer<ffi.Char>)>>('cJSON_HasObjectItem');
   late final _cJSON_HasObjectItem = _cJSON_HasObjectItemPtr
-      .asFunction<int Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+      .asFunction<int Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>)>();
 
-  ffi.Pointer<ffi.Int8> cJSON_GetErrorPtr() {
+  ffi.Pointer<ffi.Char> cJSON_GetErrorPtr() {
     return _cJSON_GetErrorPtr();
   }
 
   late final _cJSON_GetErrorPtrPtr =
-      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Int8> Function()>>(
+      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Char> Function()>>(
           'cJSON_GetErrorPtr');
   late final _cJSON_GetErrorPtr =
-      _cJSON_GetErrorPtrPtr.asFunction<ffi.Pointer<ffi.Int8> Function()>();
+      _cJSON_GetErrorPtrPtr.asFunction<ffi.Pointer<ffi.Char> Function()>();
 
-  ffi.Pointer<ffi.Int8> cJSON_GetStringValue(
+  ffi.Pointer<ffi.Char> cJSON_GetStringValue(
     ffi.Pointer<cJSON> item,
   ) {
     return _cJSON_GetStringValue(
@@ -267,10 +268,10 @@
 
   late final _cJSON_GetStringValuePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(
+          ffi.Pointer<ffi.Char> Function(
               ffi.Pointer<cJSON>)>>('cJSON_GetStringValue');
   late final _cJSON_GetStringValue = _cJSON_GetStringValuePtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(ffi.Pointer<cJSON>)>();
+      .asFunction<ffi.Pointer<ffi.Char> Function(ffi.Pointer<cJSON>)>();
 
   int cJSON_IsInvalid(
     ffi.Pointer<cJSON> item,
@@ -471,7 +472,7 @@
       _cJSON_CreateNumberPtr.asFunction<ffi.Pointer<cJSON> Function(double)>();
 
   ffi.Pointer<cJSON> cJSON_CreateString(
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<ffi.Char> string,
   ) {
     return _cJSON_CreateString(
       string,
@@ -481,12 +482,12 @@
   late final _cJSON_CreateStringPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<ffi.Int8>)>>('cJSON_CreateString');
+              ffi.Pointer<ffi.Char>)>>('cJSON_CreateString');
   late final _cJSON_CreateString = _cJSON_CreateStringPtr
-      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Int8>)>();
+      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_CreateRaw(
-    ffi.Pointer<ffi.Int8> raw,
+    ffi.Pointer<ffi.Char> raw,
   ) {
     return _cJSON_CreateRaw(
       raw,
@@ -496,9 +497,9 @@
   late final _cJSON_CreateRawPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<ffi.Int8>)>>('cJSON_CreateRaw');
+              ffi.Pointer<ffi.Char>)>>('cJSON_CreateRaw');
   late final _cJSON_CreateRaw = _cJSON_CreateRawPtr
-      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Int8>)>();
+      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_CreateArray() {
     return _cJSON_CreateArray();
@@ -521,7 +522,7 @@
       _cJSON_CreateObjectPtr.asFunction<ffi.Pointer<cJSON> Function()>();
 
   ffi.Pointer<cJSON> cJSON_CreateStringReference(
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<ffi.Char> string,
   ) {
     return _cJSON_CreateStringReference(
       string,
@@ -531,9 +532,9 @@
   late final _cJSON_CreateStringReferencePtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<ffi.Int8>)>>('cJSON_CreateStringReference');
+              ffi.Pointer<ffi.Char>)>>('cJSON_CreateStringReference');
   late final _cJSON_CreateStringReference = _cJSON_CreateStringReferencePtr
-      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Int8>)>();
+      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_CreateObjectReference(
     ffi.Pointer<cJSON> child,
@@ -564,7 +565,7 @@
       .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>)>();
 
   ffi.Pointer<cJSON> cJSON_CreateIntArray(
-    ffi.Pointer<ffi.Int32> numbers,
+    ffi.Pointer<ffi.Int> numbers,
     int count,
   ) {
     return _cJSON_CreateIntArray(
@@ -576,9 +577,9 @@
   late final _cJSON_CreateIntArrayPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<ffi.Int32>, ffi.Int32)>>('cJSON_CreateIntArray');
+              ffi.Pointer<ffi.Int>, ffi.Int)>>('cJSON_CreateIntArray');
   late final _cJSON_CreateIntArray = _cJSON_CreateIntArrayPtr
-      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Int32>, int)>();
+      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Int>, int)>();
 
   ffi.Pointer<cJSON> cJSON_CreateFloatArray(
     ffi.Pointer<ffi.Float> numbers,
@@ -593,7 +594,7 @@
   late final _cJSON_CreateFloatArrayPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<ffi.Float>, ffi.Int32)>>('cJSON_CreateFloatArray');
+              ffi.Pointer<ffi.Float>, ffi.Int)>>('cJSON_CreateFloatArray');
   late final _cJSON_CreateFloatArray = _cJSON_CreateFloatArrayPtr
       .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Float>, int)>();
 
@@ -610,12 +611,12 @@
   late final _cJSON_CreateDoubleArrayPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<ffi.Double>, ffi.Int32)>>('cJSON_CreateDoubleArray');
+              ffi.Pointer<ffi.Double>, ffi.Int)>>('cJSON_CreateDoubleArray');
   late final _cJSON_CreateDoubleArray = _cJSON_CreateDoubleArrayPtr
       .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Double>, int)>();
 
   ffi.Pointer<cJSON> cJSON_CreateStringArray(
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> strings,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> strings,
     int count,
   ) {
     return _cJSON_CreateStringArray(
@@ -626,10 +627,10 @@
 
   late final _cJSON_CreateStringArrayPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              ffi.Int32)>>('cJSON_CreateStringArray');
+          ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Pointer<ffi.Char>>,
+              ffi.Int)>>('cJSON_CreateStringArray');
   late final _cJSON_CreateStringArray = _cJSON_CreateStringArrayPtr.asFunction<
-      ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Pointer<ffi.Int8>>, int)>();
+      ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Pointer<ffi.Char>>, int)>();
 
   void cJSON_AddItemToArray(
     ffi.Pointer<cJSON> array,
@@ -650,7 +651,7 @@
 
   void cJSON_AddItemToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<ffi.Char> string,
     ffi.Pointer<cJSON> item,
   ) {
     return _cJSON_AddItemToObject(
@@ -662,15 +663,15 @@
 
   late final _cJSON_AddItemToObjectPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
+          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>,
               ffi.Pointer<cJSON>)>>('cJSON_AddItemToObject');
   late final _cJSON_AddItemToObject = _cJSON_AddItemToObjectPtr.asFunction<
       void Function(
-          ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, ffi.Pointer<cJSON>)>();
+          ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>, ffi.Pointer<cJSON>)>();
 
   void cJSON_AddItemToObjectCS(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<ffi.Char> string,
     ffi.Pointer<cJSON> item,
   ) {
     return _cJSON_AddItemToObjectCS(
@@ -682,11 +683,11 @@
 
   late final _cJSON_AddItemToObjectCSPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
+          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>,
               ffi.Pointer<cJSON>)>>('cJSON_AddItemToObjectCS');
   late final _cJSON_AddItemToObjectCS = _cJSON_AddItemToObjectCSPtr.asFunction<
       void Function(
-          ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, ffi.Pointer<cJSON>)>();
+          ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>, ffi.Pointer<cJSON>)>();
 
   void cJSON_AddItemReferenceToArray(
     ffi.Pointer<cJSON> array,
@@ -707,7 +708,7 @@
 
   void cJSON_AddItemReferenceToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<ffi.Char> string,
     ffi.Pointer<cJSON> item,
   ) {
     return _cJSON_AddItemReferenceToObject(
@@ -719,12 +720,12 @@
 
   late final _cJSON_AddItemReferenceToObjectPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
+          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>,
               ffi.Pointer<cJSON>)>>('cJSON_AddItemReferenceToObject');
   late final _cJSON_AddItemReferenceToObject =
       _cJSON_AddItemReferenceToObjectPtr.asFunction<
           void Function(
-              ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, ffi.Pointer<cJSON>)>();
+              ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>, ffi.Pointer<cJSON>)>();
 
   ffi.Pointer<cJSON> cJSON_DetachItemViaPointer(
     ffi.Pointer<cJSON> parent,
@@ -758,7 +759,7 @@
   late final _cJSON_DetachItemFromArrayPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<cJSON>, ffi.Int32)>>('cJSON_DetachItemFromArray');
+              ffi.Pointer<cJSON>, ffi.Int)>>('cJSON_DetachItemFromArray');
   late final _cJSON_DetachItemFromArray = _cJSON_DetachItemFromArrayPtr
       .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, int)>();
 
@@ -773,14 +774,14 @@
   }
 
   late final _cJSON_DeleteItemFromArrayPtr = _lookup<
-          ffi.NativeFunction<ffi.Void Function(ffi.Pointer<cJSON>, ffi.Int32)>>(
+          ffi.NativeFunction<ffi.Void Function(ffi.Pointer<cJSON>, ffi.Int)>>(
       'cJSON_DeleteItemFromArray');
   late final _cJSON_DeleteItemFromArray = _cJSON_DeleteItemFromArrayPtr
       .asFunction<void Function(ffi.Pointer<cJSON>, int)>();
 
   ffi.Pointer<cJSON> cJSON_DetachItemFromObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<ffi.Char> string,
   ) {
     return _cJSON_DetachItemFromObject(
       object,
@@ -791,15 +792,15 @@
   late final _cJSON_DetachItemFromObjectPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_DetachItemFromObject');
+              ffi.Pointer<ffi.Char>)>>('cJSON_DetachItemFromObject');
   late final _cJSON_DetachItemFromObject =
       _cJSON_DetachItemFromObjectPtr.asFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+              ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_DetachItemFromObjectCaseSensitive(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<ffi.Char> string,
   ) {
     return _cJSON_DetachItemFromObjectCaseSensitive(
       object,
@@ -810,16 +811,16 @@
   late final _cJSON_DetachItemFromObjectCaseSensitivePtr = _lookup<
           ffi.NativeFunction<
               ffi.Pointer<cJSON> Function(
-                  ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>>(
+                  ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>)>>(
       'cJSON_DetachItemFromObjectCaseSensitive');
   late final _cJSON_DetachItemFromObjectCaseSensitive =
       _cJSON_DetachItemFromObjectCaseSensitivePtr.asFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+              ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>)>();
 
   void cJSON_DeleteItemFromObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<ffi.Char> string,
   ) {
     return _cJSON_DeleteItemFromObject(
       object,
@@ -830,13 +831,13 @@
   late final _cJSON_DeleteItemFromObjectPtr = _lookup<
       ffi.NativeFunction<
           ffi.Void Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_DeleteItemFromObject');
+              ffi.Pointer<ffi.Char>)>>('cJSON_DeleteItemFromObject');
   late final _cJSON_DeleteItemFromObject = _cJSON_DeleteItemFromObjectPtr
-      .asFunction<void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+      .asFunction<void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>)>();
 
   void cJSON_DeleteItemFromObjectCaseSensitive(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<ffi.Char> string,
   ) {
     return _cJSON_DeleteItemFromObjectCaseSensitive(
       object,
@@ -846,11 +847,11 @@
 
   late final _cJSON_DeleteItemFromObjectCaseSensitivePtr = _lookup<
           ffi.NativeFunction<
-              ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>>(
+              ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>)>>(
       'cJSON_DeleteItemFromObjectCaseSensitive');
   late final _cJSON_DeleteItemFromObjectCaseSensitive =
       _cJSON_DeleteItemFromObjectCaseSensitivePtr.asFunction<
-          void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+          void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>)>();
 
   void cJSON_InsertItemInArray(
     ffi.Pointer<cJSON> array,
@@ -866,7 +867,7 @@
 
   late final _cJSON_InsertItemInArrayPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Int32,
+          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Int,
               ffi.Pointer<cJSON>)>>('cJSON_InsertItemInArray');
   late final _cJSON_InsertItemInArray = _cJSON_InsertItemInArrayPtr
       .asFunction<void Function(ffi.Pointer<cJSON>, int, ffi.Pointer<cJSON>)>();
@@ -906,14 +907,14 @@
 
   late final _cJSON_ReplaceItemInArrayPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Int32,
+          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Int,
               ffi.Pointer<cJSON>)>>('cJSON_ReplaceItemInArray');
   late final _cJSON_ReplaceItemInArray = _cJSON_ReplaceItemInArrayPtr
       .asFunction<void Function(ffi.Pointer<cJSON>, int, ffi.Pointer<cJSON>)>();
 
   void cJSON_ReplaceItemInObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<ffi.Char> string,
     ffi.Pointer<cJSON> newitem,
   ) {
     return _cJSON_ReplaceItemInObject(
@@ -925,16 +926,16 @@
 
   late final _cJSON_ReplaceItemInObjectPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
+          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>,
               ffi.Pointer<cJSON>)>>('cJSON_ReplaceItemInObject');
   late final _cJSON_ReplaceItemInObject =
       _cJSON_ReplaceItemInObjectPtr.asFunction<
           void Function(
-              ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, ffi.Pointer<cJSON>)>();
+              ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>, ffi.Pointer<cJSON>)>();
 
   void cJSON_ReplaceItemInObjectCaseSensitive(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<ffi.Char> string,
     ffi.Pointer<cJSON> newitem,
   ) {
     return _cJSON_ReplaceItemInObjectCaseSensitive(
@@ -946,12 +947,12 @@
 
   late final _cJSON_ReplaceItemInObjectCaseSensitivePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
+          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>,
               ffi.Pointer<cJSON>)>>('cJSON_ReplaceItemInObjectCaseSensitive');
   late final _cJSON_ReplaceItemInObjectCaseSensitive =
       _cJSON_ReplaceItemInObjectCaseSensitivePtr.asFunction<
           void Function(
-              ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, ffi.Pointer<cJSON>)>();
+              ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>, ffi.Pointer<cJSON>)>();
 
   ffi.Pointer<cJSON> cJSON_Duplicate(
     ffi.Pointer<cJSON> item,
@@ -990,7 +991,7 @@
       .asFunction<int Function(ffi.Pointer<cJSON>, ffi.Pointer<cJSON>, int)>();
 
   void cJSON_Minify(
-    ffi.Pointer<ffi.Int8> json,
+    ffi.Pointer<ffi.Char> json,
   ) {
     return _cJSON_Minify(
       json,
@@ -998,14 +999,14 @@
   }
 
   late final _cJSON_MinifyPtr =
-      _lookup<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Int8>)>>(
+      _lookup<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Char>)>>(
           'cJSON_Minify');
   late final _cJSON_Minify =
-      _cJSON_MinifyPtr.asFunction<void Function(ffi.Pointer<ffi.Int8>)>();
+      _cJSON_MinifyPtr.asFunction<void Function(ffi.Pointer<ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_AddNullToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<ffi.Char> name,
   ) {
     return _cJSON_AddNullToObject(
       object,
@@ -1016,13 +1017,13 @@
   late final _cJSON_AddNullToObjectPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_AddNullToObject');
+              ffi.Pointer<ffi.Char>)>>('cJSON_AddNullToObject');
   late final _cJSON_AddNullToObject = _cJSON_AddNullToObjectPtr.asFunction<
-      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_AddTrueToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<ffi.Char> name,
   ) {
     return _cJSON_AddTrueToObject(
       object,
@@ -1033,13 +1034,13 @@
   late final _cJSON_AddTrueToObjectPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_AddTrueToObject');
+              ffi.Pointer<ffi.Char>)>>('cJSON_AddTrueToObject');
   late final _cJSON_AddTrueToObject = _cJSON_AddTrueToObjectPtr.asFunction<
-      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_AddFalseToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<ffi.Char> name,
   ) {
     return _cJSON_AddFalseToObject(
       object,
@@ -1050,13 +1051,13 @@
   late final _cJSON_AddFalseToObjectPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_AddFalseToObject');
+              ffi.Pointer<ffi.Char>)>>('cJSON_AddFalseToObject');
   late final _cJSON_AddFalseToObject = _cJSON_AddFalseToObjectPtr.asFunction<
-      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_AddBoolToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<ffi.Char> name,
     int boolean,
   ) {
     return _cJSON_AddBoolToObject(
@@ -1068,15 +1069,15 @@
 
   late final _cJSON_AddBoolToObjectPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
+          ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>,
               cJSON_bool)>>('cJSON_AddBoolToObject');
   late final _cJSON_AddBoolToObject = _cJSON_AddBoolToObjectPtr.asFunction<
       ffi.Pointer<cJSON> Function(
-          ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, int)>();
+          ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>, int)>();
 
   ffi.Pointer<cJSON> cJSON_AddNumberToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<ffi.Char> name,
     double number,
   ) {
     return _cJSON_AddNumberToObject(
@@ -1088,16 +1089,16 @@
 
   late final _cJSON_AddNumberToObjectPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
+          ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>,
               ffi.Double)>>('cJSON_AddNumberToObject');
   late final _cJSON_AddNumberToObject = _cJSON_AddNumberToObjectPtr.asFunction<
       ffi.Pointer<cJSON> Function(
-          ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, double)>();
+          ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>, double)>();
 
   ffi.Pointer<cJSON> cJSON_AddStringToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> name,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<ffi.Char> name,
+    ffi.Pointer<ffi.Char> string,
   ) {
     return _cJSON_AddStringToObject(
       object,
@@ -1108,16 +1109,16 @@
 
   late final _cJSON_AddStringToObjectPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_AddStringToObject');
+          ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Char>)>>('cJSON_AddStringToObject');
   late final _cJSON_AddStringToObject = _cJSON_AddStringToObjectPtr.asFunction<
       ffi.Pointer<cJSON> Function(
-          ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int8>)>();
+          ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>, ffi.Pointer<ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_AddRawToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> name,
-    ffi.Pointer<ffi.Int8> raw,
+    ffi.Pointer<ffi.Char> name,
+    ffi.Pointer<ffi.Char> raw,
   ) {
     return _cJSON_AddRawToObject(
       object,
@@ -1128,15 +1129,15 @@
 
   late final _cJSON_AddRawToObjectPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_AddRawToObject');
+          ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Char>)>>('cJSON_AddRawToObject');
   late final _cJSON_AddRawToObject = _cJSON_AddRawToObjectPtr.asFunction<
       ffi.Pointer<cJSON> Function(
-          ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int8>)>();
+          ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>, ffi.Pointer<ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_AddObjectToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<ffi.Char> name,
   ) {
     return _cJSON_AddObjectToObject(
       object,
@@ -1147,13 +1148,13 @@
   late final _cJSON_AddObjectToObjectPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_AddObjectToObject');
+              ffi.Pointer<ffi.Char>)>>('cJSON_AddObjectToObject');
   late final _cJSON_AddObjectToObject = _cJSON_AddObjectToObjectPtr.asFunction<
-      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_AddArrayToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<ffi.Char> name,
   ) {
     return _cJSON_AddArrayToObject(
       object,
@@ -1164,9 +1165,9 @@
   late final _cJSON_AddArrayToObjectPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_AddArrayToObject');
+              ffi.Pointer<ffi.Char>)>>('cJSON_AddArrayToObject');
   late final _cJSON_AddArrayToObject = _cJSON_AddArrayToObjectPtr.asFunction<
-      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Char>)>();
 
   double cJSON_SetNumberHelper(
     ffi.Pointer<cJSON> object,
@@ -1194,7 +1195,7 @@
   }
 
   late final _cJSON_mallocPtr =
-      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function(ffi.IntPtr)>>(
+      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function(ffi.Size)>>(
           'cJSON_malloc');
   late final _cJSON_malloc =
       _cJSON_mallocPtr.asFunction<ffi.Pointer<ffi.Void> Function(int)>();
@@ -1221,30 +1222,30 @@
 
   external ffi.Pointer<cJSON> child;
 
-  @ffi.Int32()
+  @ffi.Int()
   external int type;
 
-  external ffi.Pointer<ffi.Int8> valuestring;
+  external ffi.Pointer<ffi.Char> valuestring;
 
-  @ffi.Int32()
+  @ffi.Int()
   external int valueint;
 
   @ffi.Double()
   external double valuedouble;
 
-  external ffi.Pointer<ffi.Int8> string;
+  external ffi.Pointer<ffi.Char> string;
 }
 
 class cJSON_Hooks extends ffi.Struct {
   external ffi.Pointer<
-      ffi.NativeFunction<ffi.Pointer<ffi.Void> Function(ffi.IntPtr)>> malloc_fn;
+          ffi.NativeFunction<ffi.Pointer<ffi.Void> Function(ffi.Size sz)>>
+      malloc_fn;
 
-  external ffi
-          .Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
-      free_fn;
+  external ffi.Pointer<
+      ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void> ptr)>> free_fn;
 }
 
-typedef cJSON_bool = ffi.Int32;
+typedef cJSON_bool = ffi.Int;
 
 const int CJSON_VERSION_MAJOR = 1;
 
diff --git a/pkgs/ffigen/test/large_integration_tests/_expected_libclang_bindings.dart b/pkgs/ffigen/test/large_integration_tests/_expected_libclang_bindings.dart
index 78cc9c6..510e0b0 100644
--- a/pkgs/ffigen/test/large_integration_tests/_expected_libclang_bindings.dart
+++ b/pkgs/ffigen/test/large_integration_tests/_expected_libclang_bindings.dart
@@ -3,6 +3,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 //
 // Generated by `package:ffigen`.
+// ignore_for_file: type=lint
 import 'dart:ffi' as ffi;
 
 /// Bindings to LibClang.
@@ -21,7 +22,7 @@
       : _lookup = lookup;
 
   /// Retrieve the character data associated with the given string.
-  ffi.Pointer<ffi.Int8> clang_getCString(
+  ffi.Pointer<ffi.Char> clang_getCString(
     CXString string,
   ) {
     return _clang_getCString(
@@ -30,10 +31,10 @@
   }
 
   late final _clang_getCStringPtr =
-      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Int8> Function(CXString)>>(
+      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Char> Function(CXString)>>(
           'clang_getCString');
   late final _clang_getCString = _clang_getCStringPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(CXString)>();
+      .asFunction<ffi.Pointer<ffi.Char> Function(CXString)>();
 
   /// Free the given string.
   void clang_disposeString(
@@ -72,7 +73,7 @@
   }
 
   late final _clang_getBuildSessionTimestampPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint64 Function()>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedLongLong Function()>>(
           'clang_getBuildSessionTimestamp');
   late final _clang_getBuildSessionTimestamp =
       _clang_getBuildSessionTimestampPtr.asFunction<int Function()>();
@@ -87,9 +88,9 @@
     );
   }
 
-  late final _clang_VirtualFileOverlay_createPtr =
-      _lookup<ffi.NativeFunction<CXVirtualFileOverlay Function(ffi.Uint32)>>(
-          'clang_VirtualFileOverlay_create');
+  late final _clang_VirtualFileOverlay_createPtr = _lookup<
+          ffi.NativeFunction<CXVirtualFileOverlay Function(ffi.UnsignedInt)>>(
+      'clang_VirtualFileOverlay_create');
   late final _clang_VirtualFileOverlay_create =
       _clang_VirtualFileOverlay_createPtr
           .asFunction<CXVirtualFileOverlay Function(int)>();
@@ -98,8 +99,8 @@
   /// path must be canonicalized (not contain "."/"..").
   int clang_VirtualFileOverlay_addFileMapping(
     CXVirtualFileOverlay arg0,
-    ffi.Pointer<ffi.Int8> virtualPath,
-    ffi.Pointer<ffi.Int8> realPath,
+    ffi.Pointer<ffi.Char> virtualPath,
+    ffi.Pointer<ffi.Char> realPath,
   ) {
     return _clang_VirtualFileOverlay_addFileMapping(
       arg0,
@@ -110,13 +111,13 @@
 
   late final _clang_VirtualFileOverlay_addFileMappingPtr = _lookup<
           ffi.NativeFunction<
-              ffi.Int32 Function(CXVirtualFileOverlay, ffi.Pointer<ffi.Int8>,
-                  ffi.Pointer<ffi.Int8>)>>(
+              ffi.Int32 Function(CXVirtualFileOverlay, ffi.Pointer<ffi.Char>,
+                  ffi.Pointer<ffi.Char>)>>(
       'clang_VirtualFileOverlay_addFileMapping');
   late final _clang_VirtualFileOverlay_addFileMapping =
       _clang_VirtualFileOverlay_addFileMappingPtr.asFunction<
-          int Function(CXVirtualFileOverlay, ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>)>();
+          int Function(CXVirtualFileOverlay, ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Char>)>();
 
   /// Set the case sensitivity for the CXVirtualFileOverlay object. The
   /// CXVirtualFileOverlay object is case-sensitive by default, this option can
@@ -134,7 +135,7 @@
   late final _clang_VirtualFileOverlay_setCaseSensitivityPtr = _lookup<
       ffi.NativeFunction<
           ffi.Int32 Function(CXVirtualFileOverlay,
-              ffi.Int32)>>('clang_VirtualFileOverlay_setCaseSensitivity');
+              ffi.Int)>>('clang_VirtualFileOverlay_setCaseSensitivity');
   late final _clang_VirtualFileOverlay_setCaseSensitivity =
       _clang_VirtualFileOverlay_setCaseSensitivityPtr
           .asFunction<int Function(CXVirtualFileOverlay, int)>();
@@ -143,8 +144,8 @@
   int clang_VirtualFileOverlay_writeToBuffer(
     CXVirtualFileOverlay arg0,
     int options,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> out_buffer_ptr,
-    ffi.Pointer<ffi.Uint32> out_buffer_size,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> out_buffer_ptr,
+    ffi.Pointer<ffi.UnsignedInt> out_buffer_size,
   ) {
     return _clang_VirtualFileOverlay_writeToBuffer(
       arg0,
@@ -158,14 +159,17 @@
           ffi.NativeFunction<
               ffi.Int32 Function(
                   CXVirtualFileOverlay,
-                  ffi.Uint32,
-                  ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-                  ffi.Pointer<ffi.Uint32>)>>(
+                  ffi.UnsignedInt,
+                  ffi.Pointer<ffi.Pointer<ffi.Char>>,
+                  ffi.Pointer<ffi.UnsignedInt>)>>(
       'clang_VirtualFileOverlay_writeToBuffer');
   late final _clang_VirtualFileOverlay_writeToBuffer =
       _clang_VirtualFileOverlay_writeToBufferPtr.asFunction<
-          int Function(CXVirtualFileOverlay, int,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>, ffi.Pointer<ffi.Uint32>)>();
+          int Function(
+              CXVirtualFileOverlay,
+              int,
+              ffi.Pointer<ffi.Pointer<ffi.Char>>,
+              ffi.Pointer<ffi.UnsignedInt>)>();
 
   /// free memory allocated by libclang, such as the buffer returned by
   /// CXVirtualFileOverlay() or clang_ModuleMapDescriptor_writeToBuffer().
@@ -209,9 +213,9 @@
     );
   }
 
-  late final _clang_ModuleMapDescriptor_createPtr =
-      _lookup<ffi.NativeFunction<CXModuleMapDescriptor Function(ffi.Uint32)>>(
-          'clang_ModuleMapDescriptor_create');
+  late final _clang_ModuleMapDescriptor_createPtr = _lookup<
+          ffi.NativeFunction<CXModuleMapDescriptor Function(ffi.UnsignedInt)>>(
+      'clang_ModuleMapDescriptor_create');
   late final _clang_ModuleMapDescriptor_create =
       _clang_ModuleMapDescriptor_createPtr
           .asFunction<CXModuleMapDescriptor Function(int)>();
@@ -219,7 +223,7 @@
   /// Sets the framework module name that the module.map describes.
   int clang_ModuleMapDescriptor_setFrameworkModuleName(
     CXModuleMapDescriptor arg0,
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<ffi.Char> name,
   ) {
     return _clang_ModuleMapDescriptor_setFrameworkModuleName(
       arg0,
@@ -230,16 +234,16 @@
   late final _clang_ModuleMapDescriptor_setFrameworkModuleNamePtr = _lookup<
           ffi.NativeFunction<
               ffi.Int32 Function(
-                  CXModuleMapDescriptor, ffi.Pointer<ffi.Int8>)>>(
+                  CXModuleMapDescriptor, ffi.Pointer<ffi.Char>)>>(
       'clang_ModuleMapDescriptor_setFrameworkModuleName');
   late final _clang_ModuleMapDescriptor_setFrameworkModuleName =
       _clang_ModuleMapDescriptor_setFrameworkModuleNamePtr.asFunction<
-          int Function(CXModuleMapDescriptor, ffi.Pointer<ffi.Int8>)>();
+          int Function(CXModuleMapDescriptor, ffi.Pointer<ffi.Char>)>();
 
   /// Sets the umbrealla header name that the module.map describes.
   int clang_ModuleMapDescriptor_setUmbrellaHeader(
     CXModuleMapDescriptor arg0,
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<ffi.Char> name,
   ) {
     return _clang_ModuleMapDescriptor_setUmbrellaHeader(
       arg0,
@@ -250,18 +254,18 @@
   late final _clang_ModuleMapDescriptor_setUmbrellaHeaderPtr = _lookup<
           ffi.NativeFunction<
               ffi.Int32 Function(
-                  CXModuleMapDescriptor, ffi.Pointer<ffi.Int8>)>>(
+                  CXModuleMapDescriptor, ffi.Pointer<ffi.Char>)>>(
       'clang_ModuleMapDescriptor_setUmbrellaHeader');
   late final _clang_ModuleMapDescriptor_setUmbrellaHeader =
       _clang_ModuleMapDescriptor_setUmbrellaHeaderPtr.asFunction<
-          int Function(CXModuleMapDescriptor, ffi.Pointer<ffi.Int8>)>();
+          int Function(CXModuleMapDescriptor, ffi.Pointer<ffi.Char>)>();
 
   /// Write out the CXModuleMapDescriptor object to a char buffer.
   int clang_ModuleMapDescriptor_writeToBuffer(
     CXModuleMapDescriptor arg0,
     int options,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> out_buffer_ptr,
-    ffi.Pointer<ffi.Uint32> out_buffer_size,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> out_buffer_ptr,
+    ffi.Pointer<ffi.UnsignedInt> out_buffer_size,
   ) {
     return _clang_ModuleMapDescriptor_writeToBuffer(
       arg0,
@@ -275,14 +279,17 @@
           ffi.NativeFunction<
               ffi.Int32 Function(
                   CXModuleMapDescriptor,
-                  ffi.Uint32,
-                  ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-                  ffi.Pointer<ffi.Uint32>)>>(
+                  ffi.UnsignedInt,
+                  ffi.Pointer<ffi.Pointer<ffi.Char>>,
+                  ffi.Pointer<ffi.UnsignedInt>)>>(
       'clang_ModuleMapDescriptor_writeToBuffer');
   late final _clang_ModuleMapDescriptor_writeToBuffer =
       _clang_ModuleMapDescriptor_writeToBufferPtr.asFunction<
-          int Function(CXModuleMapDescriptor, int,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>, ffi.Pointer<ffi.Uint32>)>();
+          int Function(
+              CXModuleMapDescriptor,
+              int,
+              ffi.Pointer<ffi.Pointer<ffi.Char>>,
+              ffi.Pointer<ffi.UnsignedInt>)>();
 
   /// Dispose a CXModuleMapDescriptor object.
   void clang_ModuleMapDescriptor_dispose(
@@ -312,7 +319,7 @@
   }
 
   late final _clang_createIndexPtr =
-      _lookup<ffi.NativeFunction<CXIndex Function(ffi.Int32, ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<CXIndex Function(ffi.Int, ffi.Int)>>(
           'clang_createIndex');
   late final _clang_createIndex =
       _clang_createIndexPtr.asFunction<CXIndex Function(int, int)>();
@@ -344,7 +351,7 @@
   }
 
   late final _clang_CXIndex_setGlobalOptionsPtr =
-      _lookup<ffi.NativeFunction<ffi.Void Function(CXIndex, ffi.Uint32)>>(
+      _lookup<ffi.NativeFunction<ffi.Void Function(CXIndex, ffi.UnsignedInt)>>(
           'clang_CXIndex_setGlobalOptions');
   late final _clang_CXIndex_setGlobalOptions =
       _clang_CXIndex_setGlobalOptionsPtr
@@ -360,7 +367,7 @@
   }
 
   late final _clang_CXIndex_getGlobalOptionsPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXIndex)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXIndex)>>(
           'clang_CXIndex_getGlobalOptions');
   late final _clang_CXIndex_getGlobalOptions =
       _clang_CXIndex_getGlobalOptionsPtr.asFunction<int Function(CXIndex)>();
@@ -368,7 +375,7 @@
   /// Sets the invocation emission path option in a CXIndex.
   void clang_CXIndex_setInvocationEmissionPathOption(
     CXIndex arg0,
-    ffi.Pointer<ffi.Int8> Path,
+    ffi.Pointer<ffi.Char> Path,
   ) {
     return _clang_CXIndex_setInvocationEmissionPathOption(
       arg0,
@@ -378,11 +385,11 @@
 
   late final _clang_CXIndex_setInvocationEmissionPathOptionPtr = _lookup<
           ffi.NativeFunction<
-              ffi.Void Function(CXIndex, ffi.Pointer<ffi.Int8>)>>(
+              ffi.Void Function(CXIndex, ffi.Pointer<ffi.Char>)>>(
       'clang_CXIndex_setInvocationEmissionPathOption');
   late final _clang_CXIndex_setInvocationEmissionPathOption =
       _clang_CXIndex_setInvocationEmissionPathOptionPtr
-          .asFunction<void Function(CXIndex, ffi.Pointer<ffi.Int8>)>();
+          .asFunction<void Function(CXIndex, ffi.Pointer<ffi.Char>)>();
 
   /// Retrieve the complete file and path name of the given file.
   CXString clang_getFileName(
@@ -427,7 +434,7 @@
 
   late final _clang_getFileUniqueIDPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               CXFile, ffi.Pointer<CXFileUniqueID>)>>('clang_getFileUniqueID');
   late final _clang_getFileUniqueID = _clang_getFileUniqueIDPtr
       .asFunction<int Function(CXFile, ffi.Pointer<CXFileUniqueID>)>();
@@ -446,8 +453,9 @@
   }
 
   late final _clang_isFileMultipleIncludeGuardedPtr = _lookup<
-          ffi.NativeFunction<ffi.Uint32 Function(CXTranslationUnit, CXFile)>>(
-      'clang_isFileMultipleIncludeGuarded');
+      ffi.NativeFunction<
+          ffi.UnsignedInt Function(CXTranslationUnit,
+              CXFile)>>('clang_isFileMultipleIncludeGuarded');
   late final _clang_isFileMultipleIncludeGuarded =
       _clang_isFileMultipleIncludeGuardedPtr
           .asFunction<int Function(CXTranslationUnit, CXFile)>();
@@ -455,7 +463,7 @@
   /// Retrieve a file handle within the given translation unit.
   CXFile clang_getFile(
     CXTranslationUnit tu,
-    ffi.Pointer<ffi.Int8> file_name,
+    ffi.Pointer<ffi.Char> file_name,
   ) {
     return _clang_getFile(
       tu,
@@ -466,15 +474,15 @@
   late final _clang_getFilePtr = _lookup<
       ffi.NativeFunction<
           CXFile Function(
-              CXTranslationUnit, ffi.Pointer<ffi.Int8>)>>('clang_getFile');
+              CXTranslationUnit, ffi.Pointer<ffi.Char>)>>('clang_getFile');
   late final _clang_getFile = _clang_getFilePtr
-      .asFunction<CXFile Function(CXTranslationUnit, ffi.Pointer<ffi.Int8>)>();
+      .asFunction<CXFile Function(CXTranslationUnit, ffi.Pointer<ffi.Char>)>();
 
   /// Retrieve the buffer associated with the given file.
-  ffi.Pointer<ffi.Int8> clang_getFileContents(
+  ffi.Pointer<ffi.Char> clang_getFileContents(
     CXTranslationUnit tu,
     CXFile file,
-    ffi.Pointer<ffi.IntPtr> size,
+    ffi.Pointer<ffi.Size> size,
   ) {
     return _clang_getFileContents(
       tu,
@@ -485,11 +493,11 @@
 
   late final _clang_getFileContentsPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(CXTranslationUnit, CXFile,
-              ffi.Pointer<ffi.IntPtr>)>>('clang_getFileContents');
+          ffi.Pointer<ffi.Char> Function(CXTranslationUnit, CXFile,
+              ffi.Pointer<ffi.Size>)>>('clang_getFileContents');
   late final _clang_getFileContents = _clang_getFileContentsPtr.asFunction<
-      ffi.Pointer<ffi.Int8> Function(
-          CXTranslationUnit, CXFile, ffi.Pointer<ffi.IntPtr>)>();
+      ffi.Pointer<ffi.Char> Function(
+          CXTranslationUnit, CXFile, ffi.Pointer<ffi.Size>)>();
 
   /// Returns non-zero if the file1 and file2 point to the same file, or they
   /// are both NULL.
@@ -504,7 +512,7 @@
   }
 
   late final _clang_File_isEqualPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXFile, CXFile)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(CXFile, CXFile)>>(
           'clang_File_isEqual');
   late final _clang_File_isEqual =
       _clang_File_isEqualPtr.asFunction<int Function(CXFile, CXFile)>();
@@ -549,7 +557,7 @@
 
   late final _clang_equalLocationsPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Uint32 Function(
+          ffi.UnsignedInt Function(
               CXSourceLocation, CXSourceLocation)>>('clang_equalLocations');
   late final _clang_equalLocations = _clang_equalLocationsPtr
       .asFunction<int Function(CXSourceLocation, CXSourceLocation)>();
@@ -572,8 +580,8 @@
 
   late final _clang_getLocationPtr = _lookup<
       ffi.NativeFunction<
-          CXSourceLocation Function(CXTranslationUnit, CXFile, ffi.Uint32,
-              ffi.Uint32)>>('clang_getLocation');
+          CXSourceLocation Function(CXTranslationUnit, CXFile, ffi.UnsignedInt,
+              ffi.UnsignedInt)>>('clang_getLocation');
   late final _clang_getLocation = _clang_getLocationPtr.asFunction<
       CXSourceLocation Function(CXTranslationUnit, CXFile, int, int)>();
 
@@ -594,7 +602,7 @@
   late final _clang_getLocationForOffsetPtr = _lookup<
       ffi.NativeFunction<
           CXSourceLocation Function(CXTranslationUnit, CXFile,
-              ffi.Uint32)>>('clang_getLocationForOffset');
+              ffi.UnsignedInt)>>('clang_getLocationForOffset');
   late final _clang_getLocationForOffset = _clang_getLocationForOffsetPtr
       .asFunction<CXSourceLocation Function(CXTranslationUnit, CXFile, int)>();
 
@@ -608,7 +616,7 @@
   }
 
   late final _clang_Location_isInSystemHeaderPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXSourceLocation)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(CXSourceLocation)>>(
           'clang_Location_isInSystemHeader');
   late final _clang_Location_isInSystemHeader =
       _clang_Location_isInSystemHeaderPtr
@@ -625,7 +633,7 @@
   }
 
   late final _clang_Location_isFromMainFilePtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXSourceLocation)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(CXSourceLocation)>>(
           'clang_Location_isFromMainFile');
   late final _clang_Location_isFromMainFile = _clang_Location_isFromMainFilePtr
       .asFunction<int Function(CXSourceLocation)>();
@@ -672,7 +680,7 @@
 
   late final _clang_equalRangesPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Uint32 Function(
+          ffi.UnsignedInt Function(
               CXSourceRange, CXSourceRange)>>('clang_equalRanges');
   late final _clang_equalRanges = _clang_equalRangesPtr
       .asFunction<int Function(CXSourceRange, CXSourceRange)>();
@@ -687,7 +695,7 @@
   }
 
   late final _clang_Range_isNullPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXSourceRange)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(CXSourceRange)>>(
           'clang_Range_isNull');
   late final _clang_Range_isNull =
       _clang_Range_isNullPtr.asFunction<int Function(CXSourceRange)>();
@@ -697,9 +705,9 @@
   void clang_getExpansionLocation(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset,
+    ffi.Pointer<ffi.UnsignedInt> line,
+    ffi.Pointer<ffi.UnsignedInt> column,
+    ffi.Pointer<ffi.UnsignedInt> offset,
   ) {
     return _clang_getExpansionLocation(
       location,
@@ -715,25 +723,25 @@
           ffi.Void Function(
               CXSourceLocation,
               ffi.Pointer<CXFile>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>)>>('clang_getExpansionLocation');
+              ffi.Pointer<ffi.UnsignedInt>,
+              ffi.Pointer<ffi.UnsignedInt>,
+              ffi.Pointer<ffi.UnsignedInt>)>>('clang_getExpansionLocation');
   late final _clang_getExpansionLocation =
       _clang_getExpansionLocationPtr.asFunction<
           void Function(
               CXSourceLocation,
               ffi.Pointer<CXFile>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>)>();
+              ffi.Pointer<ffi.UnsignedInt>,
+              ffi.Pointer<ffi.UnsignedInt>,
+              ffi.Pointer<ffi.UnsignedInt>)>();
 
   /// Retrieve the file, line and column represented by the given source
   /// location, as specified in a # line directive.
   void clang_getPresumedLocation(
     CXSourceLocation location,
     ffi.Pointer<CXString> filename,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
+    ffi.Pointer<ffi.UnsignedInt> line,
+    ffi.Pointer<ffi.UnsignedInt> column,
   ) {
     return _clang_getPresumedLocation(
       location,
@@ -748,21 +756,21 @@
           ffi.Void Function(
               CXSourceLocation,
               ffi.Pointer<CXString>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>)>>('clang_getPresumedLocation');
+              ffi.Pointer<ffi.UnsignedInt>,
+              ffi.Pointer<ffi.UnsignedInt>)>>('clang_getPresumedLocation');
   late final _clang_getPresumedLocation =
       _clang_getPresumedLocationPtr.asFunction<
           void Function(CXSourceLocation, ffi.Pointer<CXString>,
-              ffi.Pointer<ffi.Uint32>, ffi.Pointer<ffi.Uint32>)>();
+              ffi.Pointer<ffi.UnsignedInt>, ffi.Pointer<ffi.UnsignedInt>)>();
 
   /// Legacy API to retrieve the file, line, column, and offset represented by
   /// the given source location.
   void clang_getInstantiationLocation(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset,
+    ffi.Pointer<ffi.UnsignedInt> line,
+    ffi.Pointer<ffi.UnsignedInt> column,
+    ffi.Pointer<ffi.UnsignedInt> offset,
   ) {
     return _clang_getInstantiationLocation(
       location,
@@ -778,26 +786,26 @@
           ffi.Void Function(
               CXSourceLocation,
               ffi.Pointer<CXFile>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>)>>('clang_getInstantiationLocation');
+              ffi.Pointer<ffi.UnsignedInt>,
+              ffi.Pointer<ffi.UnsignedInt>,
+              ffi.Pointer<ffi.UnsignedInt>)>>('clang_getInstantiationLocation');
   late final _clang_getInstantiationLocation =
       _clang_getInstantiationLocationPtr.asFunction<
           void Function(
               CXSourceLocation,
               ffi.Pointer<CXFile>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>)>();
+              ffi.Pointer<ffi.UnsignedInt>,
+              ffi.Pointer<ffi.UnsignedInt>,
+              ffi.Pointer<ffi.UnsignedInt>)>();
 
   /// Retrieve the file, line, column, and offset represented by the given
   /// source location.
   void clang_getSpellingLocation(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset,
+    ffi.Pointer<ffi.UnsignedInt> line,
+    ffi.Pointer<ffi.UnsignedInt> column,
+    ffi.Pointer<ffi.UnsignedInt> offset,
   ) {
     return _clang_getSpellingLocation(
       location,
@@ -813,26 +821,26 @@
           ffi.Void Function(
               CXSourceLocation,
               ffi.Pointer<CXFile>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>)>>('clang_getSpellingLocation');
+              ffi.Pointer<ffi.UnsignedInt>,
+              ffi.Pointer<ffi.UnsignedInt>,
+              ffi.Pointer<ffi.UnsignedInt>)>>('clang_getSpellingLocation');
   late final _clang_getSpellingLocation =
       _clang_getSpellingLocationPtr.asFunction<
           void Function(
               CXSourceLocation,
               ffi.Pointer<CXFile>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>)>();
+              ffi.Pointer<ffi.UnsignedInt>,
+              ffi.Pointer<ffi.UnsignedInt>,
+              ffi.Pointer<ffi.UnsignedInt>)>();
 
   /// Retrieve the file, line, column, and offset represented by the given
   /// source location.
   void clang_getFileLocation(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset,
+    ffi.Pointer<ffi.UnsignedInt> line,
+    ffi.Pointer<ffi.UnsignedInt> column,
+    ffi.Pointer<ffi.UnsignedInt> offset,
   ) {
     return _clang_getFileLocation(
       location,
@@ -848,16 +856,16 @@
           ffi.Void Function(
               CXSourceLocation,
               ffi.Pointer<CXFile>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>)>>('clang_getFileLocation');
+              ffi.Pointer<ffi.UnsignedInt>,
+              ffi.Pointer<ffi.UnsignedInt>,
+              ffi.Pointer<ffi.UnsignedInt>)>>('clang_getFileLocation');
   late final _clang_getFileLocation = _clang_getFileLocationPtr.asFunction<
       void Function(
           CXSourceLocation,
           ffi.Pointer<CXFile>,
-          ffi.Pointer<ffi.Uint32>,
-          ffi.Pointer<ffi.Uint32>,
-          ffi.Pointer<ffi.Uint32>)>();
+          ffi.Pointer<ffi.UnsignedInt>,
+          ffi.Pointer<ffi.UnsignedInt>,
+          ffi.Pointer<ffi.UnsignedInt>)>();
 
   /// Retrieve a source location representing the first character within a
   /// source range.
@@ -951,7 +959,7 @@
   }
 
   late final _clang_getNumDiagnosticsInSetPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXDiagnosticSet)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXDiagnosticSet)>>(
           'clang_getNumDiagnosticsInSet');
   late final _clang_getNumDiagnosticsInSet = _clang_getNumDiagnosticsInSetPtr
       .asFunction<int Function(CXDiagnosticSet)>();
@@ -970,13 +978,13 @@
   late final _clang_getDiagnosticInSetPtr = _lookup<
       ffi.NativeFunction<
           CXDiagnostic Function(
-              CXDiagnosticSet, ffi.Uint32)>>('clang_getDiagnosticInSet');
+              CXDiagnosticSet, ffi.UnsignedInt)>>('clang_getDiagnosticInSet');
   late final _clang_getDiagnosticInSet = _clang_getDiagnosticInSetPtr
       .asFunction<CXDiagnostic Function(CXDiagnosticSet, int)>();
 
   /// Deserialize a set of diagnostics from a Clang diagnostics bitcode file.
   CXDiagnosticSet clang_loadDiagnostics(
-    ffi.Pointer<ffi.Int8> file,
+    ffi.Pointer<ffi.Char> file,
     ffi.Pointer<ffi.Int32> error,
     ffi.Pointer<CXString> errorString,
   ) {
@@ -990,11 +998,11 @@
   late final _clang_loadDiagnosticsPtr = _lookup<
       ffi.NativeFunction<
           CXDiagnosticSet Function(
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<ffi.Char>,
               ffi.Pointer<ffi.Int32>,
               ffi.Pointer<CXString>)>>('clang_loadDiagnostics');
   late final _clang_loadDiagnostics = _clang_loadDiagnosticsPtr.asFunction<
-      CXDiagnosticSet Function(ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int32>,
+      CXDiagnosticSet Function(ffi.Pointer<ffi.Char>, ffi.Pointer<ffi.Int32>,
           ffi.Pointer<CXString>)>();
 
   /// Release a CXDiagnosticSet and all of its contained diagnostics.
@@ -1038,7 +1046,7 @@
   }
 
   late final _clang_getNumDiagnosticsPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXTranslationUnit)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXTranslationUnit)>>(
           'clang_getNumDiagnostics');
   late final _clang_getNumDiagnostics =
       _clang_getNumDiagnosticsPtr.asFunction<int Function(CXTranslationUnit)>();
@@ -1057,7 +1065,7 @@
   late final _clang_getDiagnosticPtr = _lookup<
       ffi.NativeFunction<
           CXDiagnostic Function(
-              CXTranslationUnit, ffi.Uint32)>>('clang_getDiagnostic');
+              CXTranslationUnit, ffi.UnsignedInt)>>('clang_getDiagnostic');
   late final _clang_getDiagnostic = _clang_getDiagnosticPtr
       .asFunction<CXDiagnostic Function(CXTranslationUnit, int)>();
 
@@ -1103,9 +1111,9 @@
     );
   }
 
-  late final _clang_formatDiagnosticPtr =
-      _lookup<ffi.NativeFunction<CXString Function(CXDiagnostic, ffi.Uint32)>>(
-          'clang_formatDiagnostic');
+  late final _clang_formatDiagnosticPtr = _lookup<
+          ffi.NativeFunction<CXString Function(CXDiagnostic, ffi.UnsignedInt)>>(
+      'clang_formatDiagnostic');
   late final _clang_formatDiagnostic = _clang_formatDiagnosticPtr
       .asFunction<CXString Function(CXDiagnostic, int)>();
 
@@ -1116,7 +1124,7 @@
   }
 
   late final _clang_defaultDiagnosticDisplayOptionsPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function()>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function()>>(
           'clang_defaultDiagnosticDisplayOptions');
   late final _clang_defaultDiagnosticDisplayOptions =
       _clang_defaultDiagnosticDisplayOptionsPtr.asFunction<int Function()>();
@@ -1194,7 +1202,7 @@
   }
 
   late final _clang_getDiagnosticCategoryPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXDiagnostic)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXDiagnostic)>>(
           'clang_getDiagnosticCategory');
   late final _clang_getDiagnosticCategory =
       _clang_getDiagnosticCategoryPtr.asFunction<int Function(CXDiagnostic)>();
@@ -1210,7 +1218,7 @@
   }
 
   late final _clang_getDiagnosticCategoryNamePtr =
-      _lookup<ffi.NativeFunction<CXString Function(ffi.Uint32)>>(
+      _lookup<ffi.NativeFunction<CXString Function(ffi.UnsignedInt)>>(
           'clang_getDiagnosticCategoryName');
   late final _clang_getDiagnosticCategoryName =
       _clang_getDiagnosticCategoryNamePtr.asFunction<CXString Function(int)>();
@@ -1242,7 +1250,7 @@
   }
 
   late final _clang_getDiagnosticNumRangesPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXDiagnostic)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXDiagnostic)>>(
           'clang_getDiagnosticNumRanges');
   late final _clang_getDiagnosticNumRanges =
       _clang_getDiagnosticNumRangesPtr.asFunction<int Function(CXDiagnostic)>();
@@ -1259,8 +1267,9 @@
   }
 
   late final _clang_getDiagnosticRangePtr = _lookup<
-          ffi.NativeFunction<CXSourceRange Function(CXDiagnostic, ffi.Uint32)>>(
-      'clang_getDiagnosticRange');
+      ffi.NativeFunction<
+          CXSourceRange Function(
+              CXDiagnostic, ffi.UnsignedInt)>>('clang_getDiagnosticRange');
   late final _clang_getDiagnosticRange = _clang_getDiagnosticRangePtr
       .asFunction<CXSourceRange Function(CXDiagnostic, int)>();
 
@@ -1274,7 +1283,7 @@
   }
 
   late final _clang_getDiagnosticNumFixItsPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXDiagnostic)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXDiagnostic)>>(
           'clang_getDiagnosticNumFixIts');
   late final _clang_getDiagnosticNumFixIts =
       _clang_getDiagnosticNumFixItsPtr.asFunction<int Function(CXDiagnostic)>();
@@ -1294,7 +1303,7 @@
 
   late final _clang_getDiagnosticFixItPtr = _lookup<
       ffi.NativeFunction<
-          CXString Function(CXDiagnostic, ffi.Uint32,
+          CXString Function(CXDiagnostic, ffi.UnsignedInt,
               ffi.Pointer<CXSourceRange>)>>('clang_getDiagnosticFixIt');
   late final _clang_getDiagnosticFixIt =
       _clang_getDiagnosticFixItPtr.asFunction<
@@ -1320,9 +1329,9 @@
   /// command line arguments one would pass to the compiler.
   CXTranslationUnit clang_createTranslationUnitFromSourceFile(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> source_filename,
+    ffi.Pointer<ffi.Char> source_filename,
     int num_clang_command_line_args,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> clang_command_line_args,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> clang_command_line_args,
     int num_unsaved_files,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
   ) {
@@ -1340,19 +1349,19 @@
           ffi.NativeFunction<
               CXTranslationUnit Function(
                   CXIndex,
-                  ffi.Pointer<ffi.Int8>,
-                  ffi.Int32,
-                  ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-                  ffi.Uint32,
+                  ffi.Pointer<ffi.Char>,
+                  ffi.Int,
+                  ffi.Pointer<ffi.Pointer<ffi.Char>>,
+                  ffi.UnsignedInt,
                   ffi.Pointer<CXUnsavedFile>)>>(
       'clang_createTranslationUnitFromSourceFile');
   late final _clang_createTranslationUnitFromSourceFile =
       _clang_createTranslationUnitFromSourceFilePtr.asFunction<
           CXTranslationUnit Function(
               CXIndex,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<ffi.Char>,
               int,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
+              ffi.Pointer<ffi.Pointer<ffi.Char>>,
               int,
               ffi.Pointer<CXUnsavedFile>)>();
 
@@ -1361,7 +1370,7 @@
   /// CXTranslationUnit, without further detailed error codes.
   CXTranslationUnit clang_createTranslationUnit(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> ast_filename,
+    ffi.Pointer<ffi.Char> ast_filename,
   ) {
     return _clang_createTranslationUnit(
       CIdx,
@@ -1372,14 +1381,14 @@
   late final _clang_createTranslationUnitPtr = _lookup<
       ffi.NativeFunction<
           CXTranslationUnit Function(
-              CXIndex, ffi.Pointer<ffi.Int8>)>>('clang_createTranslationUnit');
+              CXIndex, ffi.Pointer<ffi.Char>)>>('clang_createTranslationUnit');
   late final _clang_createTranslationUnit = _clang_createTranslationUnitPtr
-      .asFunction<CXTranslationUnit Function(CXIndex, ffi.Pointer<ffi.Int8>)>();
+      .asFunction<CXTranslationUnit Function(CXIndex, ffi.Pointer<ffi.Char>)>();
 
   /// Create a translation unit from an AST file ( -emit-ast).
   int clang_createTranslationUnit2(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> ast_filename,
+    ffi.Pointer<ffi.Char> ast_filename,
     ffi.Pointer<CXTranslationUnit> out_TU,
   ) {
     return _clang_createTranslationUnit2(
@@ -1391,11 +1400,11 @@
 
   late final _clang_createTranslationUnit2Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(CXIndex, ffi.Pointer<ffi.Int8>,
+          ffi.Int32 Function(CXIndex, ffi.Pointer<ffi.Char>,
               ffi.Pointer<CXTranslationUnit>)>>('clang_createTranslationUnit2');
   late final _clang_createTranslationUnit2 =
       _clang_createTranslationUnit2Ptr.asFunction<
-          int Function(CXIndex, ffi.Pointer<ffi.Int8>,
+          int Function(CXIndex, ffi.Pointer<ffi.Char>,
               ffi.Pointer<CXTranslationUnit>)>();
 
   /// Returns the set of flags that is suitable for parsing a translation unit
@@ -1405,7 +1414,7 @@
   }
 
   late final _clang_defaultEditingTranslationUnitOptionsPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function()>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function()>>(
           'clang_defaultEditingTranslationUnitOptions');
   late final _clang_defaultEditingTranslationUnitOptions =
       _clang_defaultEditingTranslationUnitOptionsPtr
@@ -1416,8 +1425,8 @@
   /// CXTranslationUnit, without further detailed error codes.
   CXTranslationUnit clang_parseTranslationUnit(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    ffi.Pointer<ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> command_line_args,
     int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     int num_unsaved_files,
@@ -1438,18 +1447,18 @@
       ffi.NativeFunction<
           CXTranslationUnit Function(
               CXIndex,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              ffi.Int32,
+              ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Pointer<ffi.Char>>,
+              ffi.Int,
               ffi.Pointer<CXUnsavedFile>,
-              ffi.Uint32,
-              ffi.Uint32)>>('clang_parseTranslationUnit');
+              ffi.UnsignedInt,
+              ffi.UnsignedInt)>>('clang_parseTranslationUnit');
   late final _clang_parseTranslationUnit =
       _clang_parseTranslationUnitPtr.asFunction<
           CXTranslationUnit Function(
               CXIndex,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
+              ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Pointer<ffi.Char>>,
               int,
               ffi.Pointer<CXUnsavedFile>,
               int,
@@ -1459,8 +1468,8 @@
   /// file.
   int clang_parseTranslationUnit2(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    ffi.Pointer<ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> command_line_args,
     int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     int num_unsaved_files,
@@ -1483,19 +1492,19 @@
       ffi.NativeFunction<
           ffi.Int32 Function(
               CXIndex,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              ffi.Int32,
+              ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Pointer<ffi.Char>>,
+              ffi.Int,
               ffi.Pointer<CXUnsavedFile>,
-              ffi.Uint32,
-              ffi.Uint32,
+              ffi.UnsignedInt,
+              ffi.UnsignedInt,
               ffi.Pointer<CXTranslationUnit>)>>('clang_parseTranslationUnit2');
   late final _clang_parseTranslationUnit2 =
       _clang_parseTranslationUnit2Ptr.asFunction<
           int Function(
               CXIndex,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
+              ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Pointer<ffi.Char>>,
               int,
               ffi.Pointer<CXUnsavedFile>,
               int,
@@ -1507,8 +1516,8 @@
   /// library paths are relative to the binary.
   int clang_parseTranslationUnit2FullArgv(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    ffi.Pointer<ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> command_line_args,
     int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     int num_unsaved_files,
@@ -1531,20 +1540,20 @@
           ffi.NativeFunction<
               ffi.Int32 Function(
                   CXIndex,
-                  ffi.Pointer<ffi.Int8>,
-                  ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-                  ffi.Int32,
+                  ffi.Pointer<ffi.Char>,
+                  ffi.Pointer<ffi.Pointer<ffi.Char>>,
+                  ffi.Int,
                   ffi.Pointer<CXUnsavedFile>,
-                  ffi.Uint32,
-                  ffi.Uint32,
+                  ffi.UnsignedInt,
+                  ffi.UnsignedInt,
                   ffi.Pointer<CXTranslationUnit>)>>(
       'clang_parseTranslationUnit2FullArgv');
   late final _clang_parseTranslationUnit2FullArgv =
       _clang_parseTranslationUnit2FullArgvPtr.asFunction<
           int Function(
               CXIndex,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
+              ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Pointer<ffi.Char>>,
               int,
               ffi.Pointer<CXUnsavedFile>,
               int,
@@ -1561,7 +1570,7 @@
   }
 
   late final _clang_defaultSaveOptionsPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXTranslationUnit)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXTranslationUnit)>>(
           'clang_defaultSaveOptions');
   late final _clang_defaultSaveOptions = _clang_defaultSaveOptionsPtr
       .asFunction<int Function(CXTranslationUnit)>();
@@ -1570,7 +1579,7 @@
   /// translation unit on disk.
   int clang_saveTranslationUnit(
     CXTranslationUnit TU,
-    ffi.Pointer<ffi.Int8> FileName,
+    ffi.Pointer<ffi.Char> FileName,
     int options,
   ) {
     return _clang_saveTranslationUnit(
@@ -1582,11 +1591,11 @@
 
   late final _clang_saveTranslationUnitPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(CXTranslationUnit, ffi.Pointer<ffi.Int8>,
-              ffi.Uint32)>>('clang_saveTranslationUnit');
+          ffi.Int Function(CXTranslationUnit, ffi.Pointer<ffi.Char>,
+              ffi.UnsignedInt)>>('clang_saveTranslationUnit');
   late final _clang_saveTranslationUnit =
       _clang_saveTranslationUnitPtr.asFunction<
-          int Function(CXTranslationUnit, ffi.Pointer<ffi.Int8>, int)>();
+          int Function(CXTranslationUnit, ffi.Pointer<ffi.Char>, int)>();
 
   /// Suspend a translation unit in order to free memory associated with it.
   int clang_suspendTranslationUnit(
@@ -1598,7 +1607,7 @@
   }
 
   late final _clang_suspendTranslationUnitPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXTranslationUnit)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXTranslationUnit)>>(
           'clang_suspendTranslationUnit');
   late final _clang_suspendTranslationUnit = _clang_suspendTranslationUnitPtr
       .asFunction<int Function(CXTranslationUnit)>();
@@ -1629,7 +1638,7 @@
   }
 
   late final _clang_defaultReparseOptionsPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXTranslationUnit)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXTranslationUnit)>>(
           'clang_defaultReparseOptions');
   late final _clang_defaultReparseOptions = _clang_defaultReparseOptionsPtr
       .asFunction<int Function(CXTranslationUnit)>();
@@ -1651,11 +1660,11 @@
 
   late final _clang_reparseTranslationUnitPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               CXTranslationUnit,
-              ffi.Uint32,
+              ffi.UnsignedInt,
               ffi.Pointer<CXUnsavedFile>,
-              ffi.Uint32)>>('clang_reparseTranslationUnit');
+              ffi.UnsignedInt)>>('clang_reparseTranslationUnit');
   late final _clang_reparseTranslationUnit =
       _clang_reparseTranslationUnitPtr.asFunction<
           int Function(
@@ -1663,7 +1672,7 @@
 
   /// Returns the human-readable null-terminated C string that represents the
   /// name of the memory category. This string should never be freed.
-  ffi.Pointer<ffi.Int8> clang_getTUResourceUsageName(
+  ffi.Pointer<ffi.Char> clang_getTUResourceUsageName(
     int kind,
   ) {
     return _clang_getTUResourceUsageName(
@@ -1672,10 +1681,10 @@
   }
 
   late final _clang_getTUResourceUsageNamePtr =
-      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Int8> Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Char> Function(ffi.Int32)>>(
           'clang_getTUResourceUsageName');
   late final _clang_getTUResourceUsageName = _clang_getTUResourceUsageNamePtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(int)>();
+      .asFunction<ffi.Pointer<ffi.Char> Function(int)>();
 
   /// Return the memory usage of a translation unit. This object should be
   /// released with clang_disposeCXTUResourceUsage().
@@ -1764,7 +1773,7 @@
   }
 
   late final _clang_TargetInfo_getPointerWidthPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXTargetInfo)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(CXTargetInfo)>>(
           'clang_TargetInfo_getPointerWidth');
   late final _clang_TargetInfo_getPointerWidth =
       _clang_TargetInfo_getPointerWidthPtr
@@ -1808,7 +1817,7 @@
   }
 
   late final _clang_equalCursorsPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor, CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCursor, CXCursor)>>(
           'clang_equalCursors');
   late final _clang_equalCursors =
       _clang_equalCursorsPtr.asFunction<int Function(CXCursor, CXCursor)>();
@@ -1823,7 +1832,7 @@
   }
 
   late final _clang_Cursor_isNullPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(CXCursor)>>(
           'clang_Cursor_isNull');
   late final _clang_Cursor_isNull =
       _clang_Cursor_isNullPtr.asFunction<int Function(CXCursor)>();
@@ -1838,7 +1847,7 @@
   }
 
   late final _clang_hashCursorPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCursor)>>(
           'clang_hashCursor');
   late final _clang_hashCursor =
       _clang_hashCursorPtr.asFunction<int Function(CXCursor)>();
@@ -1868,7 +1877,7 @@
   }
 
   late final _clang_isDeclarationPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(ffi.Int32)>>(
           'clang_isDeclaration');
   late final _clang_isDeclaration =
       _clang_isDeclarationPtr.asFunction<int Function(int)>();
@@ -1883,7 +1892,7 @@
   }
 
   late final _clang_isInvalidDeclarationPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCursor)>>(
           'clang_isInvalidDeclaration');
   late final _clang_isInvalidDeclaration =
       _clang_isInvalidDeclarationPtr.asFunction<int Function(CXCursor)>();
@@ -1898,7 +1907,7 @@
   }
 
   late final _clang_isReferencePtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(ffi.Int32)>>(
           'clang_isReference');
   late final _clang_isReference =
       _clang_isReferencePtr.asFunction<int Function(int)>();
@@ -1913,7 +1922,7 @@
   }
 
   late final _clang_isExpressionPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(ffi.Int32)>>(
           'clang_isExpression');
   late final _clang_isExpression =
       _clang_isExpressionPtr.asFunction<int Function(int)>();
@@ -1928,7 +1937,7 @@
   }
 
   late final _clang_isStatementPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(ffi.Int32)>>(
           'clang_isStatement');
   late final _clang_isStatement =
       _clang_isStatementPtr.asFunction<int Function(int)>();
@@ -1943,7 +1952,7 @@
   }
 
   late final _clang_isAttributePtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(ffi.Int32)>>(
           'clang_isAttribute');
   late final _clang_isAttribute =
       _clang_isAttributePtr.asFunction<int Function(int)>();
@@ -1958,7 +1967,7 @@
   }
 
   late final _clang_Cursor_hasAttrsPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCursor)>>(
           'clang_Cursor_hasAttrs');
   late final _clang_Cursor_hasAttrs =
       _clang_Cursor_hasAttrsPtr.asFunction<int Function(CXCursor)>();
@@ -1973,7 +1982,7 @@
   }
 
   late final _clang_isInvalidPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(ffi.Int32)>>(
           'clang_isInvalid');
   late final _clang_isInvalid =
       _clang_isInvalidPtr.asFunction<int Function(int)>();
@@ -1988,7 +1997,7 @@
   }
 
   late final _clang_isTranslationUnitPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(ffi.Int32)>>(
           'clang_isTranslationUnit');
   late final _clang_isTranslationUnit =
       _clang_isTranslationUnitPtr.asFunction<int Function(int)>();
@@ -2004,7 +2013,7 @@
   }
 
   late final _clang_isPreprocessingPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(ffi.Int32)>>(
           'clang_isPreprocessing');
   late final _clang_isPreprocessing =
       _clang_isPreprocessingPtr.asFunction<int Function(int)>();
@@ -2020,7 +2029,7 @@
   }
 
   late final _clang_isUnexposedPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(ffi.Int32)>>(
           'clang_isUnexposed');
   late final _clang_isUnexposed =
       _clang_isUnexposedPtr.asFunction<int Function(int)>();
@@ -2075,9 +2084,9 @@
   /// platforms for which availability information is known.
   int clang_getCursorPlatformAvailability(
     CXCursor cursor,
-    ffi.Pointer<ffi.Int32> always_deprecated,
+    ffi.Pointer<ffi.Int> always_deprecated,
     ffi.Pointer<CXString> deprecated_message,
-    ffi.Pointer<ffi.Int32> always_unavailable,
+    ffi.Pointer<ffi.Int> always_unavailable,
     ffi.Pointer<CXString> unavailable_message,
     ffi.Pointer<CXPlatformAvailability> availability,
     int availability_size,
@@ -2095,21 +2104,21 @@
 
   late final _clang_getCursorPlatformAvailabilityPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               CXCursor,
-              ffi.Pointer<ffi.Int32>,
+              ffi.Pointer<ffi.Int>,
               ffi.Pointer<CXString>,
-              ffi.Pointer<ffi.Int32>,
+              ffi.Pointer<ffi.Int>,
               ffi.Pointer<CXString>,
               ffi.Pointer<CXPlatformAvailability>,
-              ffi.Int32)>>('clang_getCursorPlatformAvailability');
+              ffi.Int)>>('clang_getCursorPlatformAvailability');
   late final _clang_getCursorPlatformAvailability =
       _clang_getCursorPlatformAvailabilityPtr.asFunction<
           int Function(
               CXCursor,
-              ffi.Pointer<ffi.Int32>,
+              ffi.Pointer<ffi.Int>,
               ffi.Pointer<CXString>,
-              ffi.Pointer<ffi.Int32>,
+              ffi.Pointer<ffi.Int>,
               ffi.Pointer<CXString>,
               ffi.Pointer<CXPlatformAvailability>,
               int)>();
@@ -2215,9 +2224,9 @@
     );
   }
 
-  late final _clang_CXCursorSet_containsPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursorSet, CXCursor)>>(
-          'clang_CXCursorSet_contains');
+  late final _clang_CXCursorSet_containsPtr = _lookup<
+          ffi.NativeFunction<ffi.UnsignedInt Function(CXCursorSet, CXCursor)>>(
+      'clang_CXCursorSet_contains');
   late final _clang_CXCursorSet_contains = _clang_CXCursorSet_containsPtr
       .asFunction<int Function(CXCursorSet, CXCursor)>();
 
@@ -2232,9 +2241,9 @@
     );
   }
 
-  late final _clang_CXCursorSet_insertPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursorSet, CXCursor)>>(
-          'clang_CXCursorSet_insert');
+  late final _clang_CXCursorSet_insertPtr = _lookup<
+          ffi.NativeFunction<ffi.UnsignedInt Function(CXCursorSet, CXCursor)>>(
+      'clang_CXCursorSet_insert');
   late final _clang_CXCursorSet_insert = _clang_CXCursorSet_insertPtr
       .asFunction<int Function(CXCursorSet, CXCursor)>();
 
@@ -2272,7 +2281,7 @@
   void clang_getOverriddenCursors(
     CXCursor cursor,
     ffi.Pointer<ffi.Pointer<CXCursor>> overridden,
-    ffi.Pointer<ffi.Uint32> num_overridden,
+    ffi.Pointer<ffi.UnsignedInt> num_overridden,
   ) {
     return _clang_getOverriddenCursors(
       cursor,
@@ -2284,11 +2293,11 @@
   late final _clang_getOverriddenCursorsPtr = _lookup<
       ffi.NativeFunction<
           ffi.Void Function(CXCursor, ffi.Pointer<ffi.Pointer<CXCursor>>,
-              ffi.Pointer<ffi.Uint32>)>>('clang_getOverriddenCursors');
+              ffi.Pointer<ffi.UnsignedInt>)>>('clang_getOverriddenCursors');
   late final _clang_getOverriddenCursors =
       _clang_getOverriddenCursorsPtr.asFunction<
           void Function(CXCursor, ffi.Pointer<ffi.Pointer<CXCursor>>,
-              ffi.Pointer<ffi.Uint32>)>();
+              ffi.Pointer<ffi.UnsignedInt>)>();
 
   /// Free the set of overridden cursors returned by
   /// clang_getOverriddenCursors().
@@ -2447,7 +2456,7 @@
   }
 
   late final _clang_getEnumConstantDeclValuePtr =
-      _lookup<ffi.NativeFunction<ffi.Int64 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.LongLong Function(CXCursor)>>(
           'clang_getEnumConstantDeclValue');
   late final _clang_getEnumConstantDeclValue =
       _clang_getEnumConstantDeclValuePtr.asFunction<int Function(CXCursor)>();
@@ -2463,7 +2472,7 @@
   }
 
   late final _clang_getEnumConstantDeclUnsignedValuePtr =
-      _lookup<ffi.NativeFunction<ffi.Uint64 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedLongLong Function(CXCursor)>>(
           'clang_getEnumConstantDeclUnsignedValue');
   late final _clang_getEnumConstantDeclUnsignedValue =
       _clang_getEnumConstantDeclUnsignedValuePtr
@@ -2479,7 +2488,7 @@
   }
 
   late final _clang_getFieldDeclBitWidthPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(CXCursor)>>(
           'clang_getFieldDeclBitWidth');
   late final _clang_getFieldDeclBitWidth =
       _clang_getFieldDeclBitWidthPtr.asFunction<int Function(CXCursor)>();
@@ -2495,7 +2504,7 @@
   }
 
   late final _clang_Cursor_getNumArgumentsPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(CXCursor)>>(
           'clang_Cursor_getNumArguments');
   late final _clang_Cursor_getNumArguments =
       _clang_Cursor_getNumArgumentsPtr.asFunction<int Function(CXCursor)>();
@@ -2512,7 +2521,7 @@
   }
 
   late final _clang_Cursor_getArgumentPtr =
-      _lookup<ffi.NativeFunction<CXCursor Function(CXCursor, ffi.Uint32)>>(
+      _lookup<ffi.NativeFunction<CXCursor Function(CXCursor, ffi.UnsignedInt)>>(
           'clang_Cursor_getArgument');
   late final _clang_Cursor_getArgument = _clang_Cursor_getArgumentPtr
       .asFunction<CXCursor Function(CXCursor, int)>();
@@ -2528,7 +2537,7 @@
   }
 
   late final _clang_Cursor_getNumTemplateArgumentsPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(CXCursor)>>(
           'clang_Cursor_getNumTemplateArguments');
   late final _clang_Cursor_getNumTemplateArguments =
       _clang_Cursor_getNumTemplateArgumentsPtr
@@ -2545,9 +2554,9 @@
     );
   }
 
-  late final _clang_Cursor_getTemplateArgumentKindPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor, ffi.Uint32)>>(
-          'clang_Cursor_getTemplateArgumentKind');
+  late final _clang_Cursor_getTemplateArgumentKindPtr = _lookup<
+          ffi.NativeFunction<ffi.Int32 Function(CXCursor, ffi.UnsignedInt)>>(
+      'clang_Cursor_getTemplateArgumentKind');
   late final _clang_Cursor_getTemplateArgumentKind =
       _clang_Cursor_getTemplateArgumentKindPtr
           .asFunction<int Function(CXCursor, int)>();
@@ -2565,7 +2574,7 @@
   }
 
   late final _clang_Cursor_getTemplateArgumentTypePtr =
-      _lookup<ffi.NativeFunction<CXType Function(CXCursor, ffi.Uint32)>>(
+      _lookup<ffi.NativeFunction<CXType Function(CXCursor, ffi.UnsignedInt)>>(
           'clang_Cursor_getTemplateArgumentType');
   late final _clang_Cursor_getTemplateArgumentType =
       _clang_Cursor_getTemplateArgumentTypePtr
@@ -2583,9 +2592,9 @@
     );
   }
 
-  late final _clang_Cursor_getTemplateArgumentValuePtr =
-      _lookup<ffi.NativeFunction<ffi.Int64 Function(CXCursor, ffi.Uint32)>>(
-          'clang_Cursor_getTemplateArgumentValue');
+  late final _clang_Cursor_getTemplateArgumentValuePtr = _lookup<
+          ffi.NativeFunction<ffi.LongLong Function(CXCursor, ffi.UnsignedInt)>>(
+      'clang_Cursor_getTemplateArgumentValue');
   late final _clang_Cursor_getTemplateArgumentValue =
       _clang_Cursor_getTemplateArgumentValuePtr
           .asFunction<int Function(CXCursor, int)>();
@@ -2602,9 +2611,10 @@
     );
   }
 
-  late final _clang_Cursor_getTemplateArgumentUnsignedValuePtr =
-      _lookup<ffi.NativeFunction<ffi.Uint64 Function(CXCursor, ffi.Uint32)>>(
-          'clang_Cursor_getTemplateArgumentUnsignedValue');
+  late final _clang_Cursor_getTemplateArgumentUnsignedValuePtr = _lookup<
+          ffi.NativeFunction<
+              ffi.UnsignedLongLong Function(CXCursor, ffi.UnsignedInt)>>(
+      'clang_Cursor_getTemplateArgumentUnsignedValue');
   late final _clang_Cursor_getTemplateArgumentUnsignedValue =
       _clang_Cursor_getTemplateArgumentUnsignedValuePtr
           .asFunction<int Function(CXCursor, int)>();
@@ -2621,7 +2631,7 @@
   }
 
   late final _clang_equalTypesPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXType, CXType)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXType, CXType)>>(
           'clang_equalTypes');
   late final _clang_equalTypes =
       _clang_equalTypesPtr.asFunction<int Function(CXType, CXType)>();
@@ -2652,7 +2662,7 @@
   }
 
   late final _clang_isConstQualifiedTypePtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXType)>>(
           'clang_isConstQualifiedType');
   late final _clang_isConstQualifiedType =
       _clang_isConstQualifiedTypePtr.asFunction<int Function(CXType)>();
@@ -2667,7 +2677,7 @@
   }
 
   late final _clang_Cursor_isMacroFunctionLikePtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCursor)>>(
           'clang_Cursor_isMacroFunctionLike');
   late final _clang_Cursor_isMacroFunctionLike =
       _clang_Cursor_isMacroFunctionLikePtr.asFunction<int Function(CXCursor)>();
@@ -2682,7 +2692,7 @@
   }
 
   late final _clang_Cursor_isMacroBuiltinPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCursor)>>(
           'clang_Cursor_isMacroBuiltin');
   late final _clang_Cursor_isMacroBuiltin =
       _clang_Cursor_isMacroBuiltinPtr.asFunction<int Function(CXCursor)>();
@@ -2698,7 +2708,7 @@
   }
 
   late final _clang_Cursor_isFunctionInlinedPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCursor)>>(
           'clang_Cursor_isFunctionInlined');
   late final _clang_Cursor_isFunctionInlined =
       _clang_Cursor_isFunctionInlinedPtr.asFunction<int Function(CXCursor)>();
@@ -2715,7 +2725,7 @@
   }
 
   late final _clang_isVolatileQualifiedTypePtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXType)>>(
           'clang_isVolatileQualifiedType');
   late final _clang_isVolatileQualifiedType =
       _clang_isVolatileQualifiedTypePtr.asFunction<int Function(CXType)>();
@@ -2732,7 +2742,7 @@
   }
 
   late final _clang_isRestrictQualifiedTypePtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXType)>>(
           'clang_isRestrictQualifiedType');
   late final _clang_isRestrictQualifiedType =
       _clang_isRestrictQualifiedTypePtr.asFunction<int Function(CXType)>();
@@ -2747,7 +2757,7 @@
   }
 
   late final _clang_getAddressSpacePtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXType)>>(
           'clang_getAddressSpace');
   late final _clang_getAddressSpace =
       _clang_getAddressSpacePtr.asFunction<int Function(CXType)>();
@@ -2883,7 +2893,7 @@
   }
 
   late final _clang_getExceptionSpecificationTypePtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(CXType)>>(
           'clang_getExceptionSpecificationType');
   late final _clang_getExceptionSpecificationType =
       _clang_getExceptionSpecificationTypePtr
@@ -2900,7 +2910,7 @@
   }
 
   late final _clang_getNumArgTypesPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(CXType)>>(
           'clang_getNumArgTypes');
   late final _clang_getNumArgTypes =
       _clang_getNumArgTypesPtr.asFunction<int Function(CXType)>();
@@ -2917,7 +2927,7 @@
   }
 
   late final _clang_getArgTypePtr =
-      _lookup<ffi.NativeFunction<CXType Function(CXType, ffi.Uint32)>>(
+      _lookup<ffi.NativeFunction<CXType Function(CXType, ffi.UnsignedInt)>>(
           'clang_getArgType');
   late final _clang_getArgType =
       _clang_getArgTypePtr.asFunction<CXType Function(CXType, int)>();
@@ -2949,7 +2959,7 @@
   }
 
   late final _clang_Type_getNumObjCProtocolRefsPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXType)>>(
           'clang_Type_getNumObjCProtocolRefs');
   late final _clang_Type_getNumObjCProtocolRefs =
       _clang_Type_getNumObjCProtocolRefsPtr.asFunction<int Function(CXType)>();
@@ -2966,7 +2976,7 @@
   }
 
   late final _clang_Type_getObjCProtocolDeclPtr =
-      _lookup<ffi.NativeFunction<CXCursor Function(CXType, ffi.Uint32)>>(
+      _lookup<ffi.NativeFunction<CXCursor Function(CXType, ffi.UnsignedInt)>>(
           'clang_Type_getObjCProtocolDecl');
   late final _clang_Type_getObjCProtocolDecl =
       _clang_Type_getObjCProtocolDeclPtr
@@ -2982,7 +2992,7 @@
   }
 
   late final _clang_Type_getNumObjCTypeArgsPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXType)>>(
           'clang_Type_getNumObjCTypeArgs');
   late final _clang_Type_getNumObjCTypeArgs =
       _clang_Type_getNumObjCTypeArgsPtr.asFunction<int Function(CXType)>();
@@ -2999,7 +3009,7 @@
   }
 
   late final _clang_Type_getObjCTypeArgPtr =
-      _lookup<ffi.NativeFunction<CXType Function(CXType, ffi.Uint32)>>(
+      _lookup<ffi.NativeFunction<CXType Function(CXType, ffi.UnsignedInt)>>(
           'clang_Type_getObjCTypeArg');
   late final _clang_Type_getObjCTypeArg =
       _clang_Type_getObjCTypeArgPtr.asFunction<CXType Function(CXType, int)>();
@@ -3014,7 +3024,7 @@
   }
 
   late final _clang_isFunctionTypeVariadicPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXType)>>(
           'clang_isFunctionTypeVariadic');
   late final _clang_isFunctionTypeVariadic =
       _clang_isFunctionTypeVariadicPtr.asFunction<int Function(CXType)>();
@@ -3045,7 +3055,7 @@
   }
 
   late final _clang_getCursorExceptionSpecificationTypePtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(CXCursor)>>(
           'clang_getCursorExceptionSpecificationType');
   late final _clang_getCursorExceptionSpecificationType =
       _clang_getCursorExceptionSpecificationTypePtr
@@ -3061,7 +3071,7 @@
   }
 
   late final _clang_isPODTypePtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXType)>>(
           'clang_isPODType');
   late final _clang_isPODType =
       _clang_isPODTypePtr.asFunction<int Function(CXType)>();
@@ -3091,7 +3101,7 @@
   }
 
   late final _clang_getNumElementsPtr =
-      _lookup<ffi.NativeFunction<ffi.Int64 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<ffi.LongLong Function(CXType)>>(
           'clang_getNumElements');
   late final _clang_getNumElements =
       _clang_getNumElementsPtr.asFunction<int Function(CXType)>();
@@ -3121,7 +3131,7 @@
   }
 
   late final _clang_getArraySizePtr =
-      _lookup<ffi.NativeFunction<ffi.Int64 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<ffi.LongLong Function(CXType)>>(
           'clang_getArraySize');
   late final _clang_getArraySize =
       _clang_getArraySizePtr.asFunction<int Function(CXType)>();
@@ -3151,7 +3161,7 @@
   }
 
   late final _clang_Type_isTransparentTagTypedefPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXType)>>(
           'clang_Type_isTransparentTagTypedef');
   late final _clang_Type_isTransparentTagTypedef =
       _clang_Type_isTransparentTagTypedefPtr.asFunction<int Function(CXType)>();
@@ -3181,7 +3191,7 @@
   }
 
   late final _clang_Type_getAlignOfPtr =
-      _lookup<ffi.NativeFunction<ffi.Int64 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<ffi.LongLong Function(CXType)>>(
           'clang_Type_getAlignOf');
   late final _clang_Type_getAlignOf =
       _clang_Type_getAlignOfPtr.asFunction<int Function(CXType)>();
@@ -3211,7 +3221,7 @@
   }
 
   late final _clang_Type_getSizeOfPtr =
-      _lookup<ffi.NativeFunction<ffi.Int64 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<ffi.LongLong Function(CXType)>>(
           'clang_Type_getSizeOf');
   late final _clang_Type_getSizeOf =
       _clang_Type_getSizeOfPtr.asFunction<int Function(CXType)>();
@@ -3220,7 +3230,7 @@
   /// would be returned by __offsetof__ as per C++11[18.2p4]
   int clang_Type_getOffsetOf(
     CXType T,
-    ffi.Pointer<ffi.Int8> S,
+    ffi.Pointer<ffi.Char> S,
   ) {
     return _clang_Type_getOffsetOf(
       T,
@@ -3230,10 +3240,10 @@
 
   late final _clang_Type_getOffsetOfPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int64 Function(
-              CXType, ffi.Pointer<ffi.Int8>)>>('clang_Type_getOffsetOf');
+          ffi.LongLong Function(
+              CXType, ffi.Pointer<ffi.Char>)>>('clang_Type_getOffsetOf');
   late final _clang_Type_getOffsetOf = _clang_Type_getOffsetOfPtr
-      .asFunction<int Function(CXType, ffi.Pointer<ffi.Int8>)>();
+      .asFunction<int Function(CXType, ffi.Pointer<ffi.Char>)>();
 
   /// Return the type that was modified by this attributed type.
   CXType clang_Type_getModifiedType(
@@ -3260,7 +3270,7 @@
   }
 
   late final _clang_Cursor_getOffsetOfFieldPtr =
-      _lookup<ffi.NativeFunction<ffi.Int64 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.LongLong Function(CXCursor)>>(
           'clang_Cursor_getOffsetOfField');
   late final _clang_Cursor_getOffsetOfField =
       _clang_Cursor_getOffsetOfFieldPtr.asFunction<int Function(CXCursor)>();
@@ -3276,7 +3286,7 @@
   }
 
   late final _clang_Cursor_isAnonymousPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCursor)>>(
           'clang_Cursor_isAnonymous');
   late final _clang_Cursor_isAnonymous =
       _clang_Cursor_isAnonymousPtr.asFunction<int Function(CXCursor)>();
@@ -3292,7 +3302,7 @@
   }
 
   late final _clang_Cursor_isAnonymousRecordDeclPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCursor)>>(
           'clang_Cursor_isAnonymousRecordDecl');
   late final _clang_Cursor_isAnonymousRecordDecl =
       _clang_Cursor_isAnonymousRecordDeclPtr
@@ -3309,7 +3319,7 @@
   }
 
   late final _clang_Cursor_isInlineNamespacePtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCursor)>>(
           'clang_Cursor_isInlineNamespace');
   late final _clang_Cursor_isInlineNamespace =
       _clang_Cursor_isInlineNamespacePtr.asFunction<int Function(CXCursor)>();
@@ -3325,7 +3335,7 @@
   }
 
   late final _clang_Type_getNumTemplateArgumentsPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(CXType)>>(
           'clang_Type_getNumTemplateArguments');
   late final _clang_Type_getNumTemplateArguments =
       _clang_Type_getNumTemplateArgumentsPtr.asFunction<int Function(CXType)>();
@@ -3343,7 +3353,7 @@
   }
 
   late final _clang_Type_getTemplateArgumentAsTypePtr =
-      _lookup<ffi.NativeFunction<CXType Function(CXType, ffi.Uint32)>>(
+      _lookup<ffi.NativeFunction<CXType Function(CXType, ffi.UnsignedInt)>>(
           'clang_Type_getTemplateArgumentAsType');
   late final _clang_Type_getTemplateArgumentAsType =
       _clang_Type_getTemplateArgumentAsTypePtr
@@ -3375,7 +3385,7 @@
   }
 
   late final _clang_Cursor_isBitFieldPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCursor)>>(
           'clang_Cursor_isBitField');
   late final _clang_Cursor_isBitField =
       _clang_Cursor_isBitFieldPtr.asFunction<int Function(CXCursor)>();
@@ -3391,7 +3401,7 @@
   }
 
   late final _clang_isVirtualBasePtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCursor)>>(
           'clang_isVirtualBase');
   late final _clang_isVirtualBase =
       _clang_isVirtualBasePtr.asFunction<int Function(CXCursor)>();
@@ -3437,7 +3447,7 @@
   }
 
   late final _clang_getNumOverloadedDeclsPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCursor)>>(
           'clang_getNumOverloadedDecls');
   late final _clang_getNumOverloadedDecls =
       _clang_getNumOverloadedDeclsPtr.asFunction<int Function(CXCursor)>();
@@ -3455,7 +3465,7 @@
   }
 
   late final _clang_getOverloadedDeclPtr =
-      _lookup<ffi.NativeFunction<CXCursor Function(CXCursor, ffi.Uint32)>>(
+      _lookup<ffi.NativeFunction<CXCursor Function(CXCursor, ffi.UnsignedInt)>>(
           'clang_getOverloadedDecl');
   late final _clang_getOverloadedDecl = _clang_getOverloadedDeclPtr
       .asFunction<CXCursor Function(CXCursor, int)>();
@@ -3492,7 +3502,7 @@
 
   late final _clang_visitChildrenPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Uint32 Function(
+          ffi.UnsignedInt Function(
               CXCursor, CXCursorVisitor, CXClientData)>>('clang_visitChildren');
   late final _clang_visitChildren = _clang_visitChildrenPtr
       .asFunction<int Function(CXCursor, CXCursorVisitor, CXClientData)>();
@@ -3515,7 +3525,7 @@
 
   /// Construct a USR for a specified Objective-C class.
   CXString clang_constructUSR_ObjCClass(
-    ffi.Pointer<ffi.Int8> class_name,
+    ffi.Pointer<ffi.Char> class_name,
   ) {
     return _clang_constructUSR_ObjCClass(
       class_name,
@@ -3523,15 +3533,15 @@
   }
 
   late final _clang_constructUSR_ObjCClassPtr =
-      _lookup<ffi.NativeFunction<CXString Function(ffi.Pointer<ffi.Int8>)>>(
+      _lookup<ffi.NativeFunction<CXString Function(ffi.Pointer<ffi.Char>)>>(
           'clang_constructUSR_ObjCClass');
   late final _clang_constructUSR_ObjCClass = _clang_constructUSR_ObjCClassPtr
-      .asFunction<CXString Function(ffi.Pointer<ffi.Int8>)>();
+      .asFunction<CXString Function(ffi.Pointer<ffi.Char>)>();
 
   /// Construct a USR for a specified Objective-C category.
   CXString clang_constructUSR_ObjCCategory(
-    ffi.Pointer<ffi.Int8> class_name,
-    ffi.Pointer<ffi.Int8> category_name,
+    ffi.Pointer<ffi.Char> class_name,
+    ffi.Pointer<ffi.Char> category_name,
   ) {
     return _clang_constructUSR_ObjCCategory(
       class_name,
@@ -3541,15 +3551,15 @@
 
   late final _clang_constructUSR_ObjCCategoryPtr = _lookup<
       ffi.NativeFunction<
-          CXString Function(ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>)>>('clang_constructUSR_ObjCCategory');
+          CXString Function(ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Char>)>>('clang_constructUSR_ObjCCategory');
   late final _clang_constructUSR_ObjCCategory =
       _clang_constructUSR_ObjCCategoryPtr.asFunction<
-          CXString Function(ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int8>)>();
+          CXString Function(ffi.Pointer<ffi.Char>, ffi.Pointer<ffi.Char>)>();
 
   /// Construct a USR for a specified Objective-C protocol.
   CXString clang_constructUSR_ObjCProtocol(
-    ffi.Pointer<ffi.Int8> protocol_name,
+    ffi.Pointer<ffi.Char> protocol_name,
   ) {
     return _clang_constructUSR_ObjCProtocol(
       protocol_name,
@@ -3557,16 +3567,16 @@
   }
 
   late final _clang_constructUSR_ObjCProtocolPtr =
-      _lookup<ffi.NativeFunction<CXString Function(ffi.Pointer<ffi.Int8>)>>(
+      _lookup<ffi.NativeFunction<CXString Function(ffi.Pointer<ffi.Char>)>>(
           'clang_constructUSR_ObjCProtocol');
   late final _clang_constructUSR_ObjCProtocol =
       _clang_constructUSR_ObjCProtocolPtr
-          .asFunction<CXString Function(ffi.Pointer<ffi.Int8>)>();
+          .asFunction<CXString Function(ffi.Pointer<ffi.Char>)>();
 
   /// Construct a USR for a specified Objective-C instance variable and the USR
   /// for its containing class.
   CXString clang_constructUSR_ObjCIvar(
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<ffi.Char> name,
     CXString classUSR,
   ) {
     return _clang_constructUSR_ObjCIvar(
@@ -3578,14 +3588,14 @@
   late final _clang_constructUSR_ObjCIvarPtr = _lookup<
       ffi.NativeFunction<
           CXString Function(
-              ffi.Pointer<ffi.Int8>, CXString)>>('clang_constructUSR_ObjCIvar');
+              ffi.Pointer<ffi.Char>, CXString)>>('clang_constructUSR_ObjCIvar');
   late final _clang_constructUSR_ObjCIvar = _clang_constructUSR_ObjCIvarPtr
-      .asFunction<CXString Function(ffi.Pointer<ffi.Int8>, CXString)>();
+      .asFunction<CXString Function(ffi.Pointer<ffi.Char>, CXString)>();
 
   /// Construct a USR for a specified Objective-C method and the USR for its
   /// containing class.
   CXString clang_constructUSR_ObjCMethod(
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<ffi.Char> name,
     int isInstanceMethod,
     CXString classUSR,
   ) {
@@ -3598,15 +3608,15 @@
 
   late final _clang_constructUSR_ObjCMethodPtr = _lookup<
       ffi.NativeFunction<
-          CXString Function(ffi.Pointer<ffi.Int8>, ffi.Uint32,
+          CXString Function(ffi.Pointer<ffi.Char>, ffi.UnsignedInt,
               CXString)>>('clang_constructUSR_ObjCMethod');
   late final _clang_constructUSR_ObjCMethod = _clang_constructUSR_ObjCMethodPtr
-      .asFunction<CXString Function(ffi.Pointer<ffi.Int8>, int, CXString)>();
+      .asFunction<CXString Function(ffi.Pointer<ffi.Char>, int, CXString)>();
 
   /// Construct a USR for a specified Objective-C property and the USR for its
   /// containing class.
   CXString clang_constructUSR_ObjCProperty(
-    ffi.Pointer<ffi.Int8> property,
+    ffi.Pointer<ffi.Char> property,
     CXString classUSR,
   ) {
     return _clang_constructUSR_ObjCProperty(
@@ -3617,11 +3627,11 @@
 
   late final _clang_constructUSR_ObjCPropertyPtr = _lookup<
       ffi.NativeFunction<
-          CXString Function(ffi.Pointer<ffi.Int8>,
+          CXString Function(ffi.Pointer<ffi.Char>,
               CXString)>>('clang_constructUSR_ObjCProperty');
   late final _clang_constructUSR_ObjCProperty =
       _clang_constructUSR_ObjCPropertyPtr
-          .asFunction<CXString Function(ffi.Pointer<ffi.Int8>, CXString)>();
+          .asFunction<CXString Function(ffi.Pointer<ffi.Char>, CXString)>();
 
   /// Retrieve a name for the entity referenced by this cursor.
   CXString clang_getCursorSpelling(
@@ -3656,8 +3666,8 @@
 
   late final _clang_Cursor_getSpellingNameRangePtr = _lookup<
       ffi.NativeFunction<
-          CXSourceRange Function(CXCursor, ffi.Uint32,
-              ffi.Uint32)>>('clang_Cursor_getSpellingNameRange');
+          CXSourceRange Function(CXCursor, ffi.UnsignedInt,
+              ffi.UnsignedInt)>>('clang_Cursor_getSpellingNameRange');
   late final _clang_Cursor_getSpellingNameRange =
       _clang_Cursor_getSpellingNameRangePtr
           .asFunction<CXSourceRange Function(CXCursor, int, int)>();
@@ -3674,8 +3684,9 @@
   }
 
   late final _clang_PrintingPolicy_getPropertyPtr = _lookup<
-          ffi.NativeFunction<ffi.Uint32 Function(CXPrintingPolicy, ffi.Int32)>>(
-      'clang_PrintingPolicy_getProperty');
+      ffi.NativeFunction<
+          ffi.UnsignedInt Function(CXPrintingPolicy,
+              ffi.Int32)>>('clang_PrintingPolicy_getProperty');
   late final _clang_PrintingPolicy_getProperty =
       _clang_PrintingPolicy_getPropertyPtr
           .asFunction<int Function(CXPrintingPolicy, int)>();
@@ -3696,7 +3707,7 @@
   late final _clang_PrintingPolicy_setPropertyPtr = _lookup<
       ffi.NativeFunction<
           ffi.Void Function(CXPrintingPolicy, ffi.Int32,
-              ffi.Uint32)>>('clang_PrintingPolicy_setProperty');
+              ffi.UnsignedInt)>>('clang_PrintingPolicy_setProperty');
   late final _clang_PrintingPolicy_setProperty =
       _clang_PrintingPolicy_setPropertyPtr
           .asFunction<void Function(CXPrintingPolicy, int, int)>();
@@ -3806,7 +3817,7 @@
   }
 
   late final _clang_isCursorDefinitionPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCursor)>>(
           'clang_isCursorDefinition');
   late final _clang_isCursorDefinition =
       _clang_isCursorDefinitionPtr.asFunction<int Function(CXCursor)>();
@@ -3837,7 +3848,7 @@
   }
 
   late final _clang_Cursor_getObjCSelectorIndexPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(CXCursor)>>(
           'clang_Cursor_getObjCSelectorIndex');
   late final _clang_Cursor_getObjCSelectorIndex =
       _clang_Cursor_getObjCSelectorIndexPtr
@@ -3854,7 +3865,7 @@
   }
 
   late final _clang_Cursor_isDynamicCallPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(CXCursor)>>(
           'clang_Cursor_isDynamicCall');
   late final _clang_Cursor_isDynamicCall =
       _clang_Cursor_isDynamicCallPtr.asFunction<int Function(CXCursor)>();
@@ -3888,9 +3899,10 @@
     );
   }
 
-  late final _clang_Cursor_getObjCPropertyAttributesPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor, ffi.Uint32)>>(
-          'clang_Cursor_getObjCPropertyAttributes');
+  late final _clang_Cursor_getObjCPropertyAttributesPtr = _lookup<
+      ffi.NativeFunction<
+          ffi.UnsignedInt Function(CXCursor,
+              ffi.UnsignedInt)>>('clang_Cursor_getObjCPropertyAttributes');
   late final _clang_Cursor_getObjCPropertyAttributes =
       _clang_Cursor_getObjCPropertyAttributesPtr
           .asFunction<int Function(CXCursor, int)>();
@@ -3942,7 +3954,7 @@
   }
 
   late final _clang_Cursor_getObjCDeclQualifiersPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCursor)>>(
           'clang_Cursor_getObjCDeclQualifiers');
   late final _clang_Cursor_getObjCDeclQualifiers =
       _clang_Cursor_getObjCDeclQualifiersPtr
@@ -3950,8 +3962,8 @@
 
   /// Given a cursor that represents an Objective-C method or property
   /// declaration, return non-zero if the declaration was affected by
-  /// "@optional". Returns zero if the cursor is not such a declaration or it is
-  /// "@required".
+  /// "\@optional". Returns zero if the cursor is not such a declaration or it
+  /// is "\@required".
   int clang_Cursor_isObjCOptional(
     CXCursor C,
   ) {
@@ -3961,7 +3973,7 @@
   }
 
   late final _clang_Cursor_isObjCOptionalPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCursor)>>(
           'clang_Cursor_isObjCOptional');
   late final _clang_Cursor_isObjCOptional =
       _clang_Cursor_isObjCOptionalPtr.asFunction<int Function(CXCursor)>();
@@ -3976,7 +3988,7 @@
   }
 
   late final _clang_Cursor_isVariadicPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCursor)>>(
           'clang_Cursor_isVariadic');
   late final _clang_Cursor_isVariadic =
       _clang_Cursor_isVariadicPtr.asFunction<int Function(CXCursor)>();
@@ -3987,7 +3999,7 @@
     CXCursor C,
     ffi.Pointer<CXString> language,
     ffi.Pointer<CXString> definedIn,
-    ffi.Pointer<ffi.Uint32> isGenerated,
+    ffi.Pointer<ffi.UnsignedInt> isGenerated,
   ) {
     return _clang_Cursor_isExternalSymbol(
       C,
@@ -3999,15 +4011,15 @@
 
   late final _clang_Cursor_isExternalSymbolPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Uint32 Function(
+          ffi.UnsignedInt Function(
               CXCursor,
               ffi.Pointer<CXString>,
               ffi.Pointer<CXString>,
-              ffi.Pointer<ffi.Uint32>)>>('clang_Cursor_isExternalSymbol');
+              ffi.Pointer<ffi.UnsignedInt>)>>('clang_Cursor_isExternalSymbol');
   late final _clang_Cursor_isExternalSymbol =
       _clang_Cursor_isExternalSymbolPtr.asFunction<
           int Function(CXCursor, ffi.Pointer<CXString>, ffi.Pointer<CXString>,
-              ffi.Pointer<ffi.Uint32>)>();
+              ffi.Pointer<ffi.UnsignedInt>)>();
 
   /// Given a cursor that represents a declaration, return the associated
   /// comment's source range. The range may include multiple consecutive
@@ -4212,7 +4224,7 @@
   }
 
   late final _clang_Module_isSystemPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXModule)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(CXModule)>>(
           'clang_Module_isSystem');
   late final _clang_Module_isSystem =
       _clang_Module_isSystemPtr.asFunction<int Function(CXModule)>();
@@ -4229,8 +4241,9 @@
   }
 
   late final _clang_Module_getNumTopLevelHeadersPtr = _lookup<
-          ffi.NativeFunction<ffi.Uint32 Function(CXTranslationUnit, CXModule)>>(
-      'clang_Module_getNumTopLevelHeaders');
+      ffi.NativeFunction<
+          ffi.UnsignedInt Function(CXTranslationUnit,
+              CXModule)>>('clang_Module_getNumTopLevelHeaders');
   late final _clang_Module_getNumTopLevelHeaders =
       _clang_Module_getNumTopLevelHeadersPtr
           .asFunction<int Function(CXTranslationUnit, CXModule)>();
@@ -4251,7 +4264,7 @@
   late final _clang_Module_getTopLevelHeaderPtr = _lookup<
       ffi.NativeFunction<
           CXFile Function(CXTranslationUnit, CXModule,
-              ffi.Uint32)>>('clang_Module_getTopLevelHeader');
+              ffi.UnsignedInt)>>('clang_Module_getTopLevelHeader');
   late final _clang_Module_getTopLevelHeader =
       _clang_Module_getTopLevelHeaderPtr
           .asFunction<CXFile Function(CXTranslationUnit, CXModule, int)>();
@@ -4266,7 +4279,7 @@
   }
 
   late final _clang_CXXConstructor_isConvertingConstructorPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCursor)>>(
           'clang_CXXConstructor_isConvertingConstructor');
   late final _clang_CXXConstructor_isConvertingConstructor =
       _clang_CXXConstructor_isConvertingConstructorPtr
@@ -4282,7 +4295,7 @@
   }
 
   late final _clang_CXXConstructor_isCopyConstructorPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCursor)>>(
           'clang_CXXConstructor_isCopyConstructor');
   late final _clang_CXXConstructor_isCopyConstructor =
       _clang_CXXConstructor_isCopyConstructorPtr
@@ -4298,7 +4311,7 @@
   }
 
   late final _clang_CXXConstructor_isDefaultConstructorPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCursor)>>(
           'clang_CXXConstructor_isDefaultConstructor');
   late final _clang_CXXConstructor_isDefaultConstructor =
       _clang_CXXConstructor_isDefaultConstructorPtr
@@ -4314,7 +4327,7 @@
   }
 
   late final _clang_CXXConstructor_isMoveConstructorPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCursor)>>(
           'clang_CXXConstructor_isMoveConstructor');
   late final _clang_CXXConstructor_isMoveConstructor =
       _clang_CXXConstructor_isMoveConstructorPtr
@@ -4330,7 +4343,7 @@
   }
 
   late final _clang_CXXField_isMutablePtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCursor)>>(
           'clang_CXXField_isMutable');
   late final _clang_CXXField_isMutable =
       _clang_CXXField_isMutablePtr.asFunction<int Function(CXCursor)>();
@@ -4345,7 +4358,7 @@
   }
 
   late final _clang_CXXMethod_isDefaultedPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCursor)>>(
           'clang_CXXMethod_isDefaulted');
   late final _clang_CXXMethod_isDefaulted =
       _clang_CXXMethod_isDefaultedPtr.asFunction<int Function(CXCursor)>();
@@ -4361,7 +4374,7 @@
   }
 
   late final _clang_CXXMethod_isPureVirtualPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCursor)>>(
           'clang_CXXMethod_isPureVirtual');
   late final _clang_CXXMethod_isPureVirtual =
       _clang_CXXMethod_isPureVirtualPtr.asFunction<int Function(CXCursor)>();
@@ -4377,7 +4390,7 @@
   }
 
   late final _clang_CXXMethod_isStaticPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCursor)>>(
           'clang_CXXMethod_isStatic');
   late final _clang_CXXMethod_isStatic =
       _clang_CXXMethod_isStaticPtr.asFunction<int Function(CXCursor)>();
@@ -4394,7 +4407,7 @@
   }
 
   late final _clang_CXXMethod_isVirtualPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCursor)>>(
           'clang_CXXMethod_isVirtual');
   late final _clang_CXXMethod_isVirtual =
       _clang_CXXMethod_isVirtualPtr.asFunction<int Function(CXCursor)>();
@@ -4410,7 +4423,7 @@
   }
 
   late final _clang_CXXRecord_isAbstractPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCursor)>>(
           'clang_CXXRecord_isAbstract');
   late final _clang_CXXRecord_isAbstract =
       _clang_CXXRecord_isAbstractPtr.asFunction<int Function(CXCursor)>();
@@ -4425,7 +4438,7 @@
   }
 
   late final _clang_EnumDecl_isScopedPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCursor)>>(
           'clang_EnumDecl_isScoped');
   late final _clang_EnumDecl_isScoped =
       _clang_EnumDecl_isScopedPtr.asFunction<int Function(CXCursor)>();
@@ -4441,7 +4454,7 @@
   }
 
   late final _clang_CXXMethod_isConstPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCursor)>>(
           'clang_CXXMethod_isConst');
   late final _clang_CXXMethod_isConst =
       _clang_CXXMethod_isConstPtr.asFunction<int Function(CXCursor)>();
@@ -4496,8 +4509,8 @@
 
   late final _clang_getCursorReferenceNameRangePtr = _lookup<
       ffi.NativeFunction<
-          CXSourceRange Function(CXCursor, ffi.Uint32,
-              ffi.Uint32)>>('clang_getCursorReferenceNameRange');
+          CXSourceRange Function(CXCursor, ffi.UnsignedInt,
+              ffi.UnsignedInt)>>('clang_getCursorReferenceNameRange');
   late final _clang_getCursorReferenceNameRange =
       _clang_getCursorReferenceNameRangePtr
           .asFunction<CXSourceRange Function(CXCursor, int, int)>();
@@ -4594,7 +4607,7 @@
     CXTranslationUnit TU,
     CXSourceRange Range,
     ffi.Pointer<ffi.Pointer<CXToken>> Tokens,
-    ffi.Pointer<ffi.Uint32> NumTokens,
+    ffi.Pointer<ffi.UnsignedInt> NumTokens,
   ) {
     return _clang_tokenize(
       TU,
@@ -4610,10 +4623,10 @@
               CXTranslationUnit,
               CXSourceRange,
               ffi.Pointer<ffi.Pointer<CXToken>>,
-              ffi.Pointer<ffi.Uint32>)>>('clang_tokenize');
+              ffi.Pointer<ffi.UnsignedInt>)>>('clang_tokenize');
   late final _clang_tokenize = _clang_tokenizePtr.asFunction<
       void Function(CXTranslationUnit, CXSourceRange,
-          ffi.Pointer<ffi.Pointer<CXToken>>, ffi.Pointer<ffi.Uint32>)>();
+          ffi.Pointer<ffi.Pointer<CXToken>>, ffi.Pointer<ffi.UnsignedInt>)>();
 
   /// Annotate the given set of tokens by providing cursors for each token that
   /// can be mapped to a specific entity within the abstract syntax tree.
@@ -4633,8 +4646,8 @@
 
   late final _clang_annotateTokensPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(CXTranslationUnit, ffi.Pointer<CXToken>, ffi.Uint32,
-              ffi.Pointer<CXCursor>)>>('clang_annotateTokens');
+          ffi.Void Function(CXTranslationUnit, ffi.Pointer<CXToken>,
+              ffi.UnsignedInt, ffi.Pointer<CXCursor>)>>('clang_annotateTokens');
   late final _clang_annotateTokens = _clang_annotateTokensPtr.asFunction<
       void Function(CXTranslationUnit, ffi.Pointer<CXToken>, int,
           ffi.Pointer<CXCursor>)>();
@@ -4655,7 +4668,7 @@
   late final _clang_disposeTokensPtr = _lookup<
       ffi.NativeFunction<
           ffi.Void Function(CXTranslationUnit, ffi.Pointer<CXToken>,
-              ffi.Uint32)>>('clang_disposeTokens');
+              ffi.UnsignedInt)>>('clang_disposeTokens');
   late final _clang_disposeTokens = _clang_disposeTokensPtr.asFunction<
       void Function(CXTranslationUnit, ffi.Pointer<CXToken>, int)>();
 
@@ -4677,12 +4690,12 @@
 
   void clang_getDefinitionSpellingAndExtent(
     CXCursor arg0,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> startBuf,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> endBuf,
-    ffi.Pointer<ffi.Uint32> startLine,
-    ffi.Pointer<ffi.Uint32> startColumn,
-    ffi.Pointer<ffi.Uint32> endLine,
-    ffi.Pointer<ffi.Uint32> endColumn,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> startBuf,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> endBuf,
+    ffi.Pointer<ffi.UnsignedInt> startLine,
+    ffi.Pointer<ffi.UnsignedInt> startColumn,
+    ffi.Pointer<ffi.UnsignedInt> endLine,
+    ffi.Pointer<ffi.UnsignedInt> endColumn,
   ) {
     return _clang_getDefinitionSpellingAndExtent(
       arg0,
@@ -4699,23 +4712,23 @@
           ffi.NativeFunction<
               ffi.Void Function(
                   CXCursor,
-                  ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-                  ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-                  ffi.Pointer<ffi.Uint32>,
-                  ffi.Pointer<ffi.Uint32>,
-                  ffi.Pointer<ffi.Uint32>,
-                  ffi.Pointer<ffi.Uint32>)>>(
+                  ffi.Pointer<ffi.Pointer<ffi.Char>>,
+                  ffi.Pointer<ffi.Pointer<ffi.Char>>,
+                  ffi.Pointer<ffi.UnsignedInt>,
+                  ffi.Pointer<ffi.UnsignedInt>,
+                  ffi.Pointer<ffi.UnsignedInt>,
+                  ffi.Pointer<ffi.UnsignedInt>)>>(
       'clang_getDefinitionSpellingAndExtent');
   late final _clang_getDefinitionSpellingAndExtent =
       _clang_getDefinitionSpellingAndExtentPtr.asFunction<
           void Function(
               CXCursor,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>)>();
+              ffi.Pointer<ffi.Pointer<ffi.Char>>,
+              ffi.Pointer<ffi.Pointer<ffi.Char>>,
+              ffi.Pointer<ffi.UnsignedInt>,
+              ffi.Pointer<ffi.UnsignedInt>,
+              ffi.Pointer<ffi.UnsignedInt>,
+              ffi.Pointer<ffi.UnsignedInt>)>();
 
   void clang_enableStackTraces() {
     return _clang_enableStackTraces();
@@ -4746,7 +4759,7 @@
               ffi.Pointer<
                   ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>,
               ffi.Pointer<ffi.Void>,
-              ffi.Uint32)>>('clang_executeOnThread');
+              ffi.UnsignedInt)>>('clang_executeOnThread');
   late final _clang_executeOnThread = _clang_executeOnThreadPtr.asFunction<
       void Function(
           ffi.Pointer<
@@ -4767,8 +4780,8 @@
 
   late final _clang_getCompletionChunkKindPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
-              CXCompletionString, ffi.Uint32)>>('clang_getCompletionChunkKind');
+          ffi.Int32 Function(CXCompletionString,
+              ffi.UnsignedInt)>>('clang_getCompletionChunkKind');
   late final _clang_getCompletionChunkKind = _clang_getCompletionChunkKindPtr
       .asFunction<int Function(CXCompletionString, int)>();
 
@@ -4786,8 +4799,8 @@
 
   late final _clang_getCompletionChunkTextPtr = _lookup<
       ffi.NativeFunction<
-          CXString Function(
-              CXCompletionString, ffi.Uint32)>>('clang_getCompletionChunkText');
+          CXString Function(CXCompletionString,
+              ffi.UnsignedInt)>>('clang_getCompletionChunkText');
   late final _clang_getCompletionChunkText = _clang_getCompletionChunkTextPtr
       .asFunction<CXString Function(CXCompletionString, int)>();
 
@@ -4806,7 +4819,7 @@
   late final _clang_getCompletionChunkCompletionStringPtr = _lookup<
       ffi.NativeFunction<
           CXCompletionString Function(CXCompletionString,
-              ffi.Uint32)>>('clang_getCompletionChunkCompletionString');
+              ffi.UnsignedInt)>>('clang_getCompletionChunkCompletionString');
   late final _clang_getCompletionChunkCompletionString =
       _clang_getCompletionChunkCompletionStringPtr
           .asFunction<CXCompletionString Function(CXCompletionString, int)>();
@@ -4821,7 +4834,7 @@
   }
 
   late final _clang_getNumCompletionChunksPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCompletionString)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCompletionString)>>(
           'clang_getNumCompletionChunks');
   late final _clang_getNumCompletionChunks = _clang_getNumCompletionChunksPtr
       .asFunction<int Function(CXCompletionString)>();
@@ -4836,7 +4849,7 @@
   }
 
   late final _clang_getCompletionPriorityPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCompletionString)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCompletionString)>>(
           'clang_getCompletionPriority');
   late final _clang_getCompletionPriority = _clang_getCompletionPriorityPtr
       .asFunction<int Function(CXCompletionString)>();
@@ -4869,7 +4882,7 @@
   }
 
   late final _clang_getCompletionNumAnnotationsPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCompletionString)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXCompletionString)>>(
           'clang_getCompletionNumAnnotations');
   late final _clang_getCompletionNumAnnotations =
       _clang_getCompletionNumAnnotationsPtr
@@ -4889,7 +4902,7 @@
   late final _clang_getCompletionAnnotationPtr = _lookup<
       ffi.NativeFunction<
           CXString Function(CXCompletionString,
-              ffi.Uint32)>>('clang_getCompletionAnnotation');
+              ffi.UnsignedInt)>>('clang_getCompletionAnnotation');
   late final _clang_getCompletionAnnotation = _clang_getCompletionAnnotationPtr
       .asFunction<CXString Function(CXCompletionString, int)>();
 
@@ -4959,8 +4972,8 @@
 
   late final _clang_getCompletionNumFixItsPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Uint32 Function(ffi.Pointer<CXCodeCompleteResults>,
-              ffi.Uint32)>>('clang_getCompletionNumFixIts');
+          ffi.UnsignedInt Function(ffi.Pointer<CXCodeCompleteResults>,
+              ffi.UnsignedInt)>>('clang_getCompletionNumFixIts');
   late final _clang_getCompletionNumFixIts = _clang_getCompletionNumFixItsPtr
       .asFunction<int Function(ffi.Pointer<CXCodeCompleteResults>, int)>();
 
@@ -4984,8 +4997,8 @@
       ffi.NativeFunction<
           CXString Function(
               ffi.Pointer<CXCodeCompleteResults>,
-              ffi.Uint32,
-              ffi.Uint32,
+              ffi.UnsignedInt,
+              ffi.UnsignedInt,
               ffi.Pointer<CXSourceRange>)>>('clang_getCompletionFixIt');
   late final _clang_getCompletionFixIt =
       _clang_getCompletionFixItPtr.asFunction<
@@ -4999,7 +5012,7 @@
   }
 
   late final _clang_defaultCodeCompleteOptionsPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function()>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function()>>(
           'clang_defaultCodeCompleteOptions');
   late final _clang_defaultCodeCompleteOptions =
       _clang_defaultCodeCompleteOptionsPtr.asFunction<int Function()>();
@@ -5007,7 +5020,7 @@
   /// Perform code completion at a given location in a translation unit.
   ffi.Pointer<CXCodeCompleteResults> clang_codeCompleteAt(
     CXTranslationUnit TU,
-    ffi.Pointer<ffi.Int8> complete_filename,
+    ffi.Pointer<ffi.Char> complete_filename,
     int complete_line,
     int complete_column,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
@@ -5029,16 +5042,16 @@
       ffi.NativeFunction<
           ffi.Pointer<CXCodeCompleteResults> Function(
               CXTranslationUnit,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Uint32,
-              ffi.Uint32,
+              ffi.Pointer<ffi.Char>,
+              ffi.UnsignedInt,
+              ffi.UnsignedInt,
               ffi.Pointer<CXUnsavedFile>,
-              ffi.Uint32,
-              ffi.Uint32)>>('clang_codeCompleteAt');
+              ffi.UnsignedInt,
+              ffi.UnsignedInt)>>('clang_codeCompleteAt');
   late final _clang_codeCompleteAt = _clang_codeCompleteAtPtr.asFunction<
       ffi.Pointer<CXCodeCompleteResults> Function(
           CXTranslationUnit,
-          ffi.Pointer<ffi.Int8>,
+          ffi.Pointer<ffi.Char>,
           int,
           int,
           ffi.Pointer<CXUnsavedFile>,
@@ -5059,7 +5072,7 @@
   late final _clang_sortCodeCompletionResultsPtr = _lookup<
       ffi.NativeFunction<
           ffi.Void Function(ffi.Pointer<CXCompletionResult>,
-              ffi.Uint32)>>('clang_sortCodeCompletionResults');
+              ffi.UnsignedInt)>>('clang_sortCodeCompletionResults');
   late final _clang_sortCodeCompletionResults =
       _clang_sortCodeCompletionResultsPtr
           .asFunction<void Function(ffi.Pointer<CXCompletionResult>, int)>();
@@ -5093,7 +5106,7 @@
 
   late final _clang_codeCompleteGetNumDiagnosticsPtr = _lookup<
           ffi.NativeFunction<
-              ffi.Uint32 Function(ffi.Pointer<CXCodeCompleteResults>)>>(
+              ffi.UnsignedInt Function(ffi.Pointer<CXCodeCompleteResults>)>>(
       'clang_codeCompleteGetNumDiagnostics');
   late final _clang_codeCompleteGetNumDiagnostics =
       _clang_codeCompleteGetNumDiagnosticsPtr
@@ -5113,7 +5126,7 @@
   late final _clang_codeCompleteGetDiagnosticPtr = _lookup<
       ffi.NativeFunction<
           CXDiagnostic Function(ffi.Pointer<CXCodeCompleteResults>,
-              ffi.Uint32)>>('clang_codeCompleteGetDiagnostic');
+              ffi.UnsignedInt)>>('clang_codeCompleteGetDiagnostic');
   late final _clang_codeCompleteGetDiagnostic =
       _clang_codeCompleteGetDiagnosticPtr.asFunction<
           CXDiagnostic Function(ffi.Pointer<CXCodeCompleteResults>, int)>();
@@ -5130,7 +5143,8 @@
 
   late final _clang_codeCompleteGetContextsPtr = _lookup<
           ffi.NativeFunction<
-              ffi.Uint64 Function(ffi.Pointer<CXCodeCompleteResults>)>>(
+              ffi.UnsignedLongLong Function(
+                  ffi.Pointer<CXCodeCompleteResults>)>>(
       'clang_codeCompleteGetContexts');
   late final _clang_codeCompleteGetContexts = _clang_codeCompleteGetContextsPtr
       .asFunction<int Function(ffi.Pointer<CXCodeCompleteResults>)>();
@@ -5141,7 +5155,7 @@
   /// there is not a container, this function will return CXCursor_InvalidCode.
   int clang_codeCompleteGetContainerKind(
     ffi.Pointer<CXCodeCompleteResults> Results,
-    ffi.Pointer<ffi.Uint32> IsIncomplete,
+    ffi.Pointer<ffi.UnsignedInt> IsIncomplete,
   ) {
     return _clang_codeCompleteGetContainerKind(
       Results,
@@ -5150,13 +5164,14 @@
   }
 
   late final _clang_codeCompleteGetContainerKindPtr = _lookup<
-      ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<CXCodeCompleteResults>,
-              ffi.Pointer<ffi.Uint32>)>>('clang_codeCompleteGetContainerKind');
+          ffi.NativeFunction<
+              ffi.Int32 Function(ffi.Pointer<CXCodeCompleteResults>,
+                  ffi.Pointer<ffi.UnsignedInt>)>>(
+      'clang_codeCompleteGetContainerKind');
   late final _clang_codeCompleteGetContainerKind =
       _clang_codeCompleteGetContainerKindPtr.asFunction<
-          int Function(
-              ffi.Pointer<CXCodeCompleteResults>, ffi.Pointer<ffi.Uint32>)>();
+          int Function(ffi.Pointer<CXCodeCompleteResults>,
+              ffi.Pointer<ffi.UnsignedInt>)>();
 
   /// Returns the USR for the container for the current code completion context.
   /// If there is not a container for the current context, this function will
@@ -5218,7 +5233,7 @@
   }
 
   late final _clang_toggleCrashRecoveryPtr =
-      _lookup<ffi.NativeFunction<ffi.Void Function(ffi.Uint32)>>(
+      _lookup<ffi.NativeFunction<ffi.Void Function(ffi.UnsignedInt)>>(
           'clang_toggleCrashRecovery');
   late final _clang_toggleCrashRecovery =
       _clang_toggleCrashRecoveryPtr.asFunction<void Function(int)>();
@@ -5288,7 +5303,7 @@
   }
 
   late final _clang_EvalResult_getAsIntPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXEvalResult)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(CXEvalResult)>>(
           'clang_EvalResult_getAsInt');
   late final _clang_EvalResult_getAsInt =
       _clang_EvalResult_getAsIntPtr.asFunction<int Function(CXEvalResult)>();
@@ -5305,7 +5320,7 @@
   }
 
   late final _clang_EvalResult_getAsLongLongPtr =
-      _lookup<ffi.NativeFunction<ffi.Int64 Function(CXEvalResult)>>(
+      _lookup<ffi.NativeFunction<ffi.LongLong Function(CXEvalResult)>>(
           'clang_EvalResult_getAsLongLong');
   late final _clang_EvalResult_getAsLongLong =
       _clang_EvalResult_getAsLongLongPtr
@@ -5322,7 +5337,7 @@
   }
 
   late final _clang_EvalResult_isUnsignedIntPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXEvalResult)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXEvalResult)>>(
           'clang_EvalResult_isUnsignedInt');
   late final _clang_EvalResult_isUnsignedInt =
       _clang_EvalResult_isUnsignedIntPtr
@@ -5339,7 +5354,7 @@
   }
 
   late final _clang_EvalResult_getAsUnsignedPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint64 Function(CXEvalResult)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedLongLong Function(CXEvalResult)>>(
           'clang_EvalResult_getAsUnsigned');
   late final _clang_EvalResult_getAsUnsigned =
       _clang_EvalResult_getAsUnsignedPtr
@@ -5364,7 +5379,7 @@
   /// than Int or float. User must not free this pointer, instead call
   /// clang_EvalResult_dispose on the CXEvalResult returned by
   /// clang_Cursor_Evaluate.
-  ffi.Pointer<ffi.Int8> clang_EvalResult_getAsStr(
+  ffi.Pointer<ffi.Char> clang_EvalResult_getAsStr(
     CXEvalResult E,
   ) {
     return _clang_EvalResult_getAsStr(
@@ -5373,10 +5388,10 @@
   }
 
   late final _clang_EvalResult_getAsStrPtr =
-      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Int8> Function(CXEvalResult)>>(
+      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Char> Function(CXEvalResult)>>(
           'clang_EvalResult_getAsStr');
   late final _clang_EvalResult_getAsStr = _clang_EvalResult_getAsStrPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(CXEvalResult)>();
+      .asFunction<ffi.Pointer<ffi.Char> Function(CXEvalResult)>();
 
   /// Disposes the created Eval memory.
   void clang_EvalResult_dispose(
@@ -5395,7 +5410,7 @@
 
   /// Retrieve a remapping.
   CXRemapping clang_getRemappings(
-    ffi.Pointer<ffi.Int8> path,
+    ffi.Pointer<ffi.Char> path,
   ) {
     return _clang_getRemappings(
       path,
@@ -5403,14 +5418,14 @@
   }
 
   late final _clang_getRemappingsPtr =
-      _lookup<ffi.NativeFunction<CXRemapping Function(ffi.Pointer<ffi.Int8>)>>(
+      _lookup<ffi.NativeFunction<CXRemapping Function(ffi.Pointer<ffi.Char>)>>(
           'clang_getRemappings');
   late final _clang_getRemappings = _clang_getRemappingsPtr
-      .asFunction<CXRemapping Function(ffi.Pointer<ffi.Int8>)>();
+      .asFunction<CXRemapping Function(ffi.Pointer<ffi.Char>)>();
 
   /// Retrieve a remapping.
   CXRemapping clang_getRemappingsFromFileList(
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> filePaths,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> filePaths,
     int numFiles,
   ) {
     return _clang_getRemappingsFromFileList(
@@ -5421,11 +5436,11 @@
 
   late final _clang_getRemappingsFromFileListPtr = _lookup<
       ffi.NativeFunction<
-          CXRemapping Function(ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              ffi.Uint32)>>('clang_getRemappingsFromFileList');
+          CXRemapping Function(ffi.Pointer<ffi.Pointer<ffi.Char>>,
+              ffi.UnsignedInt)>>('clang_getRemappingsFromFileList');
   late final _clang_getRemappingsFromFileList =
       _clang_getRemappingsFromFileListPtr.asFunction<
-          CXRemapping Function(ffi.Pointer<ffi.Pointer<ffi.Int8>>, int)>();
+          CXRemapping Function(ffi.Pointer<ffi.Pointer<ffi.Char>>, int)>();
 
   /// Determine the number of remappings.
   int clang_remap_getNumFiles(
@@ -5437,7 +5452,7 @@
   }
 
   late final _clang_remap_getNumFilesPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXRemapping)>>(
+      _lookup<ffi.NativeFunction<ffi.UnsignedInt Function(CXRemapping)>>(
           'clang_remap_getNumFiles');
   late final _clang_remap_getNumFiles =
       _clang_remap_getNumFilesPtr.asFunction<int Function(CXRemapping)>();
@@ -5459,7 +5474,7 @@
 
   late final _clang_remap_getFilenamesPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(CXRemapping, ffi.Uint32, ffi.Pointer<CXString>,
+          ffi.Void Function(CXRemapping, ffi.UnsignedInt, ffi.Pointer<CXString>,
               ffi.Pointer<CXString>)>>('clang_remap_getFilenames');
   late final _clang_remap_getFilenames =
       _clang_remap_getFilenamesPtr.asFunction<
@@ -5531,7 +5546,7 @@
   }
 
   late final _clang_index_isEntityObjCContainerKindPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Int32)>>(
           'clang_index_isEntityObjCContainerKind');
   late final _clang_index_isEntityObjCContainerKind =
       _clang_index_isEntityObjCContainerKindPtr.asFunction<int Function(int)>();
@@ -5774,8 +5789,8 @@
     ffi.Pointer<IndexerCallbacks> index_callbacks,
     int index_callbacks_size,
     int index_options,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    ffi.Pointer<ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> command_line_args,
     int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     int num_unsaved_files,
@@ -5800,19 +5815,19 @@
 
   late final _clang_indexSourceFilePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               CXIndexAction,
               CXClientData,
               ffi.Pointer<IndexerCallbacks>,
-              ffi.Uint32,
-              ffi.Uint32,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              ffi.Int32,
+              ffi.UnsignedInt,
+              ffi.UnsignedInt,
+              ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Pointer<ffi.Char>>,
+              ffi.Int,
               ffi.Pointer<CXUnsavedFile>,
-              ffi.Uint32,
+              ffi.UnsignedInt,
               ffi.Pointer<CXTranslationUnit>,
-              ffi.Uint32)>>('clang_indexSourceFile');
+              ffi.UnsignedInt)>>('clang_indexSourceFile');
   late final _clang_indexSourceFile = _clang_indexSourceFilePtr.asFunction<
       int Function(
           CXIndexAction,
@@ -5820,8 +5835,8 @@
           ffi.Pointer<IndexerCallbacks>,
           int,
           int,
-          ffi.Pointer<ffi.Int8>,
-          ffi.Pointer<ffi.Pointer<ffi.Int8>>,
+          ffi.Pointer<ffi.Char>,
+          ffi.Pointer<ffi.Pointer<ffi.Char>>,
           int,
           ffi.Pointer<CXUnsavedFile>,
           int,
@@ -5837,8 +5852,8 @@
     ffi.Pointer<IndexerCallbacks> index_callbacks,
     int index_callbacks_size,
     int index_options,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    ffi.Pointer<ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> command_line_args,
     int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     int num_unsaved_files,
@@ -5863,19 +5878,19 @@
 
   late final _clang_indexSourceFileFullArgvPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               CXIndexAction,
               CXClientData,
               ffi.Pointer<IndexerCallbacks>,
-              ffi.Uint32,
-              ffi.Uint32,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              ffi.Int32,
+              ffi.UnsignedInt,
+              ffi.UnsignedInt,
+              ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Pointer<ffi.Char>>,
+              ffi.Int,
               ffi.Pointer<CXUnsavedFile>,
-              ffi.Uint32,
+              ffi.UnsignedInt,
               ffi.Pointer<CXTranslationUnit>,
-              ffi.Uint32)>>('clang_indexSourceFileFullArgv');
+              ffi.UnsignedInt)>>('clang_indexSourceFileFullArgv');
   late final _clang_indexSourceFileFullArgv =
       _clang_indexSourceFileFullArgvPtr.asFunction<
           int Function(
@@ -5884,8 +5899,8 @@
               ffi.Pointer<IndexerCallbacks>,
               int,
               int,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
+              ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Pointer<ffi.Char>>,
               int,
               ffi.Pointer<CXUnsavedFile>,
               int,
@@ -5914,12 +5929,12 @@
 
   late final _clang_indexTranslationUnitPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               CXIndexAction,
               CXClientData,
               ffi.Pointer<IndexerCallbacks>,
-              ffi.Uint32,
-              ffi.Uint32,
+              ffi.UnsignedInt,
+              ffi.UnsignedInt,
               CXTranslationUnit)>>('clang_indexTranslationUnit');
   late final _clang_indexTranslationUnit =
       _clang_indexTranslationUnitPtr.asFunction<
@@ -5932,9 +5947,9 @@
     CXIdxLoc loc,
     ffi.Pointer<CXIdxClientFile> indexFile,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset,
+    ffi.Pointer<ffi.UnsignedInt> line,
+    ffi.Pointer<ffi.UnsignedInt> column,
+    ffi.Pointer<ffi.UnsignedInt> offset,
   ) {
     return _clang_indexLoc_getFileLocation(
       loc,
@@ -5952,18 +5967,18 @@
               CXIdxLoc,
               ffi.Pointer<CXIdxClientFile>,
               ffi.Pointer<CXFile>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>)>>('clang_indexLoc_getFileLocation');
+              ffi.Pointer<ffi.UnsignedInt>,
+              ffi.Pointer<ffi.UnsignedInt>,
+              ffi.Pointer<ffi.UnsignedInt>)>>('clang_indexLoc_getFileLocation');
   late final _clang_indexLoc_getFileLocation =
       _clang_indexLoc_getFileLocationPtr.asFunction<
           void Function(
               CXIdxLoc,
               ffi.Pointer<CXIdxClientFile>,
               ffi.Pointer<CXFile>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>)>();
+              ffi.Pointer<ffi.UnsignedInt>,
+              ffi.Pointer<ffi.UnsignedInt>,
+              ffi.Pointer<ffi.UnsignedInt>)>();
 
   /// Retrieve the CXSourceLocation represented by the given CXIdxLoc.
   CXSourceLocation clang_indexLoc_getCXSourceLocation(
@@ -5996,7 +6011,7 @@
 
   late final _clang_Type_visitFieldsPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Uint32 Function(
+          ffi.UnsignedInt Function(
               CXType, CXFieldVisitor, CXClientData)>>('clang_Type_visitFields');
   late final _clang_Type_visitFields = _clang_Type_visitFieldsPtr
       .asFunction<int Function(CXType, CXFieldVisitor, CXClientData)>();
@@ -6024,14 +6039,14 @@
 class CXString extends ffi.Struct {
   external ffi.Pointer<ffi.Void> data;
 
-  @ffi.Uint32()
+  @ffi.UnsignedInt()
   external int private_flags;
 }
 
 class CXStringSet extends ffi.Struct {
   external ffi.Pointer<CXString> Strings;
 
-  @ffi.Uint32()
+  @ffi.UnsignedInt()
   external int Count;
 }
 
@@ -6053,13 +6068,13 @@
 /// Provides the contents of a file that has not yet been saved to disk.
 class CXUnsavedFile extends ffi.Struct {
   /// The file whose contents have not yet been saved.
-  external ffi.Pointer<ffi.Int8> Filename;
+  external ffi.Pointer<ffi.Char> Filename;
 
   /// A buffer containing the unsaved contents of this file.
-  external ffi.Pointer<ffi.Int8> Contents;
+  external ffi.Pointer<ffi.Char> Contents;
 
   /// The length of the unsaved contents of this buffer.
-  @ffi.Uint64()
+  @ffi.UnsignedLong()
   external int Length;
 }
 
@@ -6086,18 +6101,18 @@
 class CXVersion extends ffi.Struct {
   /// The major version number, e.g., the '10' in '10.7.3'. A negative value
   /// indicates that there is no version number at all.
-  @ffi.Int32()
+  @ffi.Int()
   external int Major;
 
   /// The minor version number, e.g., the '7' in '10.7.3'. This value will be
   /// negative if no minor version number was provided, e.g., for version '10'.
-  @ffi.Int32()
+  @ffi.Int()
   external int Minor;
 
   /// The subminor version number, e.g., the '3' in '10.7.3'. This value will be
   /// negative if no minor or subminor version number was provided, e.g., in
   /// version '10' or '10.7'.
-  @ffi.Int32()
+  @ffi.Int()
   external int Subminor;
 }
 
@@ -6162,7 +6177,7 @@
 /// across an indexing session.
 class CXFileUniqueID extends ffi.Struct {
   @ffi.Array.multi([3])
-  external ffi.Array<ffi.Uint64> data;
+  external ffi.Array<ffi.UnsignedLongLong> data;
 }
 
 /// A single translation unit, which resides in an index.
@@ -6173,7 +6188,7 @@
   @ffi.Array.multi([2])
   external ffi.Array<ffi.Pointer<ffi.Void>> ptr_data;
 
-  @ffi.Uint32()
+  @ffi.UnsignedInt()
   external int int_data;
 }
 
@@ -6182,17 +6197,17 @@
   @ffi.Array.multi([2])
   external ffi.Array<ffi.Pointer<ffi.Void>> ptr_data;
 
-  @ffi.Uint32()
+  @ffi.UnsignedInt()
   external int begin_int_data;
 
-  @ffi.Uint32()
+  @ffi.UnsignedInt()
   external int end_int_data;
 }
 
 /// Identifies an array of ranges.
 class CXSourceRangeList extends ffi.Struct {
   /// The number of ranges in the ranges array.
-  @ffi.Uint32()
+  @ffi.UnsignedInt()
   external int count;
 
   /// An array of CXSourceRanges.
@@ -6388,7 +6403,7 @@
   @ffi.Int32()
   external int kind;
 
-  @ffi.Uint64()
+  @ffi.UnsignedLong()
   external int amount;
 }
 
@@ -6396,7 +6411,7 @@
 class CXTUResourceUsage extends ffi.Struct {
   external ffi.Pointer<ffi.Void> data;
 
-  @ffi.Uint32()
+  @ffi.UnsignedInt()
   external int numEntries;
 
   external ffi.Pointer<CXTUResourceUsageEntry> entries;
@@ -7063,7 +7078,7 @@
   @ffi.Int32()
   external int kind;
 
-  @ffi.Int32()
+  @ffi.Int()
   external int xdata;
 
   @ffi.Array.multi([3])
@@ -7125,7 +7140,7 @@
   external CXVersion Obsoleted;
 
   /// Whether the entity is unconditionally unavailable on this platform.
-  @ffi.Int32()
+  @ffi.Int()
   external int Unavailable;
 
   /// An optional message to provide to a user of this API, e.g., to suggest
@@ -7416,7 +7431,9 @@
 
 /// Visitor invoked for each cursor found by a traversal.
 typedef CXCursorVisitor = ffi.Pointer<
-    ffi.NativeFunction<ffi.Int32 Function(CXCursor, CXCursor, CXClientData)>>;
+    ffi.NativeFunction<
+        ffi.Int32 Function(
+            CXCursor cursor, CXCursor parent, CXClientData client_data)>>;
 
 /// Opaque pointer representing client data that will be passed through to
 /// various callbacks and visitors.
@@ -7523,7 +7540,7 @@
 /// Describes a single preprocessing token.
 class CXToken extends ffi.Struct {
   @ffi.Array.multi([4])
-  external ffi.Array<ffi.Uint32> int_data;
+  external ffi.Array<ffi.UnsignedInt> int_data;
 
   external ffi.Pointer<ffi.Void> ptr_data;
 }
@@ -7621,7 +7638,7 @@
   external ffi.Pointer<CXCompletionResult> Results;
 
   /// The number of code-completion results stored in the Results array.
-  @ffi.Uint32()
+  @ffi.UnsignedInt()
   external int NumResults;
 }
 
@@ -7747,7 +7764,10 @@
 typedef CXInclusionVisitor = ffi.Pointer<
     ffi.NativeFunction<
         ffi.Void Function(
-            CXFile, ffi.Pointer<CXSourceLocation>, ffi.Uint32, CXClientData)>>;
+            CXFile included_file,
+            ffi.Pointer<CXSourceLocation> inclusion_stack,
+            ffi.UnsignedInt include_len,
+            CXClientData client_data)>>;
 
 abstract class CXEvalResultKind {
   static const int CXEval_Int = 1;
@@ -7796,7 +7816,7 @@
   @ffi.Array.multi([2])
   external ffi.Array<ffi.Pointer<ffi.Void>> ptr_data;
 
-  @ffi.Uint32()
+  @ffi.UnsignedInt()
   external int int_data;
 }
 
@@ -7806,19 +7826,19 @@
   external CXIdxLoc hashLoc;
 
   /// Filename as written in the #include/#import directive.
-  external ffi.Pointer<ffi.Int8> filename;
+  external ffi.Pointer<ffi.Char> filename;
 
   /// The actual file that the #include/#import directive resolved to.
   external CXFile file;
 
-  @ffi.Int32()
+  @ffi.Int()
   external int isImport;
 
-  @ffi.Int32()
+  @ffi.Int()
   external int isAngled;
 
   /// Non-zero if the directive was automatically turned into a module import.
-  @ffi.Int32()
+  @ffi.Int()
   external int isModuleImport;
 }
 
@@ -7835,7 +7855,7 @@
 
   /// Non-zero if an inclusion directive was automatically turned into a module
   /// import. Applicable only for modules.
-  @ffi.Int32()
+  @ffi.Int()
   external int isImplicit;
 }
 
@@ -7914,15 +7934,15 @@
   @ffi.Int32()
   external int lang;
 
-  external ffi.Pointer<ffi.Int8> name;
+  external ffi.Pointer<ffi.Char> name;
 
-  external ffi.Pointer<ffi.Int8> USR;
+  external ffi.Pointer<ffi.Char> USR;
 
   external CXCursor cursor;
 
   external ffi.Pointer<ffi.Pointer<CXIdxAttrInfo>> attributes;
 
-  @ffi.Uint32()
+  @ffi.UnsignedInt()
   external int numAttributes;
 }
 
@@ -7957,28 +7977,28 @@
   /// out-of-line C++ member functions.
   external ffi.Pointer<CXIdxContainerInfo> lexicalContainer;
 
-  @ffi.Int32()
+  @ffi.Int()
   external int isRedeclaration;
 
-  @ffi.Int32()
+  @ffi.Int()
   external int isDefinition;
 
-  @ffi.Int32()
+  @ffi.Int()
   external int isContainer;
 
   external ffi.Pointer<CXIdxContainerInfo> declAsContainer;
 
   /// Whether the declaration exists in code or was created implicitly by the
   /// compiler, e.g. implicit Objective-C methods for properties.
-  @ffi.Int32()
+  @ffi.Int()
   external int isImplicit;
 
   external ffi.Pointer<ffi.Pointer<CXIdxAttrInfo>> attributes;
 
-  @ffi.Uint32()
+  @ffi.UnsignedInt()
   external int numAttributes;
 
-  @ffi.Uint32()
+  @ffi.UnsignedInt()
   external int flags;
 }
 
@@ -8014,7 +8034,7 @@
 class CXIdxObjCProtocolRefListInfo extends ffi.Struct {
   external ffi.Pointer<ffi.Pointer<CXIdxObjCProtocolRefInfo>> protocols;
 
-  @ffi.Uint32()
+  @ffi.UnsignedInt()
   external int numProtocols;
 }
 
@@ -8051,7 +8071,7 @@
 
   external ffi.Pointer<ffi.Pointer<CXIdxBaseClassInfo>> bases;
 
-  @ffi.Uint32()
+  @ffi.UnsignedInt()
   external int numBases;
 }
 
@@ -8109,8 +8129,10 @@
   /// Called periodically to check whether indexing should be aborted. Should
   /// return 0 to continue, and non-zero to abort.
   external ffi.Pointer<
-      ffi.NativeFunction<
-          ffi.Int32 Function(CXClientData, ffi.Pointer<ffi.Void>)>> abortQuery;
+          ffi.NativeFunction<
+              ffi.Int Function(
+                  CXClientData client_data, ffi.Pointer<ffi.Void> reserved)>>
+      abortQuery;
 
   /// Called at the end of indexing; passes the complete diagnostic set.
   external ffi.Pointer<
@@ -8121,8 +8143,8 @@
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          CXIdxClientFile Function(
-              CXClientData, CXFile, ffi.Pointer<ffi.Void>)>> enteredMainFile;
+          CXIdxClientFile Function(CXClientData client_data, CXFile mainFile,
+              ffi.Pointer<ffi.Void> reserved)>> enteredMainFile;
 
   /// Called when a file gets #included/#imported.
   external ffi.Pointer<
@@ -8140,9 +8162,10 @@
 
   /// Called at the beginning of indexing a translation unit.
   external ffi.Pointer<
-      ffi.NativeFunction<
-          CXIdxClientContainer Function(
-              CXClientData, ffi.Pointer<ffi.Void>)>> startedTranslationUnit;
+          ffi.NativeFunction<
+              CXIdxClientContainer Function(
+                  CXClientData client_data, ffi.Pointer<ffi.Void> reserved)>>
+      startedTranslationUnit;
 
   external ffi.Pointer<
           ffi.NativeFunction<
@@ -8201,8 +8224,9 @@
 }
 
 /// Visitor invoked for each field found by a traversal.
-typedef CXFieldVisitor = ffi
-    .Pointer<ffi.NativeFunction<ffi.Int32 Function(CXCursor, CXClientData)>>;
+typedef CXFieldVisitor = ffi.Pointer<
+    ffi.NativeFunction<
+        ffi.Int32 Function(CXCursor C, CXClientData client_data)>>;
 
 const int CINDEX_VERSION_MAJOR = 0;
 
diff --git a/pkgs/ffigen/test/large_integration_tests/_expected_sqlite_bindings.dart b/pkgs/ffigen/test/large_integration_tests/_expected_sqlite_bindings.dart
index 2980faa..d3b48db 100644
--- a/pkgs/ffigen/test/large_integration_tests/_expected_sqlite_bindings.dart
+++ b/pkgs/ffigen/test/large_integration_tests/_expected_sqlite_bindings.dart
@@ -3,6 +3,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 //
 // Generated by `package:ffigen`.
+// ignore_for_file: type=lint
 import 'dart:ffi' as ffi;
 
 /// Bindings to SQLite.
@@ -50,46 +51,46 @@
   /// of the hash might be different from [SQLITE_SOURCE_ID].)^
   ///
   /// See also: [sqlite_version()] and [sqlite_source_id()].
-  late final ffi.Pointer<ffi.Pointer<ffi.Int8>> _sqlite3_version =
-      _lookup<ffi.Pointer<ffi.Int8>>('sqlite3_version');
+  late final ffi.Pointer<ffi.Pointer<ffi.Char>> _sqlite3_version =
+      _lookup<ffi.Pointer<ffi.Char>>('sqlite3_version');
 
-  ffi.Pointer<ffi.Int8> get sqlite3_version => _sqlite3_version.value;
+  ffi.Pointer<ffi.Char> get sqlite3_version => _sqlite3_version.value;
 
-  set sqlite3_version(ffi.Pointer<ffi.Int8> value) =>
+  set sqlite3_version(ffi.Pointer<ffi.Char> value) =>
       _sqlite3_version.value = value;
 
-  ffi.Pointer<ffi.Int8> sqlite3_libversion() {
+  ffi.Pointer<ffi.Char> sqlite3_libversion() {
     return _sqlite3_libversion();
   }
 
   late final _sqlite3_libversionPtr =
-      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Int8> Function()>>(
+      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Char> Function()>>(
           'sqlite3_libversion');
   late final _sqlite3_libversion =
-      _sqlite3_libversionPtr.asFunction<ffi.Pointer<ffi.Int8> Function()>();
+      _sqlite3_libversionPtr.asFunction<ffi.Pointer<ffi.Char> Function()>();
 
-  ffi.Pointer<ffi.Int8> sqlite3_sourceid() {
+  ffi.Pointer<ffi.Char> sqlite3_sourceid() {
     return _sqlite3_sourceid();
   }
 
   late final _sqlite3_sourceidPtr =
-      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Int8> Function()>>(
+      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Char> Function()>>(
           'sqlite3_sourceid');
   late final _sqlite3_sourceid =
-      _sqlite3_sourceidPtr.asFunction<ffi.Pointer<ffi.Int8> Function()>();
+      _sqlite3_sourceidPtr.asFunction<ffi.Pointer<ffi.Char> Function()>();
 
   int sqlite3_libversion_number() {
     return _sqlite3_libversion_number();
   }
 
   late final _sqlite3_libversion_numberPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function()>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function()>>(
           'sqlite3_libversion_number');
   late final _sqlite3_libversion_number =
       _sqlite3_libversion_numberPtr.asFunction<int Function()>();
 
   int sqlite3_compileoption_used(
-    ffi.Pointer<ffi.Int8> zOptName,
+    ffi.Pointer<ffi.Char> zOptName,
   ) {
     return _sqlite3_compileoption_used(
       zOptName,
@@ -97,12 +98,12 @@
   }
 
   late final _sqlite3_compileoption_usedPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<ffi.Int8>)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<ffi.Char>)>>(
           'sqlite3_compileoption_used');
   late final _sqlite3_compileoption_used = _sqlite3_compileoption_usedPtr
-      .asFunction<int Function(ffi.Pointer<ffi.Int8>)>();
+      .asFunction<int Function(ffi.Pointer<ffi.Char>)>();
 
-  ffi.Pointer<ffi.Int8> sqlite3_compileoption_get(
+  ffi.Pointer<ffi.Char> sqlite3_compileoption_get(
     int N,
   ) {
     return _sqlite3_compileoption_get(
@@ -111,10 +112,10 @@
   }
 
   late final _sqlite3_compileoption_getPtr =
-      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Int8> Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Char> Function(ffi.Int)>>(
           'sqlite3_compileoption_get');
   late final _sqlite3_compileoption_get = _sqlite3_compileoption_getPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(int)>();
+      .asFunction<ffi.Pointer<ffi.Char> Function(int)>();
 
   /// CAPI3REF: Test To See If The Library Is Threadsafe
   ///
@@ -155,7 +156,7 @@
   }
 
   late final _sqlite3_threadsafePtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function()>>('sqlite3_threadsafe');
+      _lookup<ffi.NativeFunction<ffi.Int Function()>>('sqlite3_threadsafe');
   late final _sqlite3_threadsafe =
       _sqlite3_threadsafePtr.asFunction<int Function()>();
 
@@ -204,7 +205,7 @@
   }
 
   late final _sqlite3_closePtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3>)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3>)>>(
           'sqlite3_close');
   late final _sqlite3_close =
       _sqlite3_closePtr.asFunction<int Function(ffi.Pointer<sqlite3>)>();
@@ -218,7 +219,7 @@
   }
 
   late final _sqlite3_close_v2Ptr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3>)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3>)>>(
           'sqlite3_close_v2');
   late final _sqlite3_close_v2 =
       _sqlite3_close_v2Ptr.asFunction<int Function(ffi.Pointer<sqlite3>)>();
@@ -285,17 +286,17 @@
   /// </ul>
   int sqlite3_exec(
     ffi.Pointer<sqlite3> arg0,
-    ffi.Pointer<ffi.Int8> sql,
+    ffi.Pointer<ffi.Char> sql,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Int32 Function(
+                ffi.Int Function(
                     ffi.Pointer<ffi.Void>,
-                    ffi.Int32,
-                    ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-                    ffi.Pointer<ffi.Pointer<ffi.Int8>>)>>
+                    ffi.Int,
+                    ffi.Pointer<ffi.Pointer<ffi.Char>>,
+                    ffi.Pointer<ffi.Pointer<ffi.Char>>)>>
         callback,
     ffi.Pointer<ffi.Void> arg3,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> errmsg,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> errmsg,
   ) {
     return _sqlite3_exec(
       arg0,
@@ -308,31 +309,31 @@
 
   late final _sqlite3_execPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<ffi.Char>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Int32 Function(
+                      ffi.Int Function(
                           ffi.Pointer<ffi.Void>,
-                          ffi.Int32,
-                          ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-                          ffi.Pointer<ffi.Pointer<ffi.Int8>>)>>,
+                          ffi.Int,
+                          ffi.Pointer<ffi.Pointer<ffi.Char>>,
+                          ffi.Pointer<ffi.Pointer<ffi.Char>>)>>,
               ffi.Pointer<ffi.Void>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>)>>('sqlite3_exec');
+              ffi.Pointer<ffi.Pointer<ffi.Char>>)>>('sqlite3_exec');
   late final _sqlite3_exec = _sqlite3_execPtr.asFunction<
       int Function(
           ffi.Pointer<sqlite3>,
-          ffi.Pointer<ffi.Int8>,
+          ffi.Pointer<ffi.Char>,
           ffi.Pointer<
               ffi.NativeFunction<
-                  ffi.Int32 Function(
+                  ffi.Int Function(
                       ffi.Pointer<ffi.Void>,
-                      ffi.Int32,
-                      ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-                      ffi.Pointer<ffi.Pointer<ffi.Int8>>)>>,
+                      ffi.Int,
+                      ffi.Pointer<ffi.Pointer<ffi.Char>>,
+                      ffi.Pointer<ffi.Pointer<ffi.Char>>)>>,
           ffi.Pointer<ffi.Void>,
-          ffi.Pointer<ffi.Pointer<ffi.Int8>>)>();
+          ffi.Pointer<ffi.Pointer<ffi.Char>>)>();
 
   /// CAPI3REF: Initialize The SQLite Library
   ///
@@ -412,7 +413,7 @@
   }
 
   late final _sqlite3_initializePtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function()>>('sqlite3_initialize');
+      _lookup<ffi.NativeFunction<ffi.Int Function()>>('sqlite3_initialize');
   late final _sqlite3_initialize =
       _sqlite3_initializePtr.asFunction<int Function()>();
 
@@ -421,7 +422,7 @@
   }
 
   late final _sqlite3_shutdownPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function()>>('sqlite3_shutdown');
+      _lookup<ffi.NativeFunction<ffi.Int Function()>>('sqlite3_shutdown');
   late final _sqlite3_shutdown =
       _sqlite3_shutdownPtr.asFunction<int Function()>();
 
@@ -430,7 +431,7 @@
   }
 
   late final _sqlite3_os_initPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function()>>('sqlite3_os_init');
+      _lookup<ffi.NativeFunction<ffi.Int Function()>>('sqlite3_os_init');
   late final _sqlite3_os_init =
       _sqlite3_os_initPtr.asFunction<int Function()>();
 
@@ -439,7 +440,7 @@
   }
 
   late final _sqlite3_os_endPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function()>>('sqlite3_os_end');
+      _lookup<ffi.NativeFunction<ffi.Int Function()>>('sqlite3_os_end');
   late final _sqlite3_os_end = _sqlite3_os_endPtr.asFunction<int Function()>();
 
   /// CAPI3REF: Configuring The SQLite Library
@@ -480,8 +481,7 @@
   }
 
   late final _sqlite3_configPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Int32)>>(
-          'sqlite3_config');
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Int)>>('sqlite3_config');
   late final _sqlite3_config =
       _sqlite3_configPtr.asFunction<int Function(int)>();
 
@@ -511,9 +511,8 @@
   }
 
   late final _sqlite3_db_configPtr = _lookup<
-      ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<sqlite3>, ffi.Int32)>>('sqlite3_db_config');
+          ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3>, ffi.Int)>>(
+      'sqlite3_db_config');
   late final _sqlite3_db_config = _sqlite3_db_configPtr
       .asFunction<int Function(ffi.Pointer<sqlite3>, int)>();
 
@@ -534,9 +533,8 @@
   }
 
   late final _sqlite3_extended_result_codesPtr = _lookup<
-      ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3>,
-              ffi.Int32)>>('sqlite3_extended_result_codes');
+          ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3>, ffi.Int)>>(
+      'sqlite3_extended_result_codes');
   late final _sqlite3_extended_result_codes = _sqlite3_extended_result_codesPtr
       .asFunction<int Function(ffi.Pointer<sqlite3>, int)>();
 
@@ -698,7 +696,7 @@
   }
 
   late final _sqlite3_changesPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3>)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3>)>>(
           'sqlite3_changes');
   late final _sqlite3_changes =
       _sqlite3_changesPtr.asFunction<int Function(ffi.Pointer<sqlite3>)>();
@@ -745,7 +743,7 @@
   }
 
   late final _sqlite3_total_changesPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3>)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3>)>>(
           'sqlite3_total_changes');
   late final _sqlite3_total_changes = _sqlite3_total_changesPtr
       .asFunction<int Function(ffi.Pointer<sqlite3>)>();
@@ -829,7 +827,7 @@
   /// The input to [sqlite3_complete16()] must be a zero-terminated
   /// UTF-16 string in native byte order.
   int sqlite3_complete(
-    ffi.Pointer<ffi.Int8> sql,
+    ffi.Pointer<ffi.Char> sql,
   ) {
     return _sqlite3_complete(
       sql,
@@ -837,10 +835,10 @@
   }
 
   late final _sqlite3_completePtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<ffi.Int8>)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<ffi.Char>)>>(
           'sqlite3_complete');
   late final _sqlite3_complete =
-      _sqlite3_completePtr.asFunction<int Function(ffi.Pointer<ffi.Int8>)>();
+      _sqlite3_completePtr.asFunction<int Function(ffi.Pointer<ffi.Char>)>();
 
   int sqlite3_complete16(
     ffi.Pointer<ffi.Void> sql,
@@ -851,7 +849,7 @@
   }
 
   late final _sqlite3_complete16Ptr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<ffi.Void>)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<ffi.Void>)>>(
           'sqlite3_complete16');
   late final _sqlite3_complete16 =
       _sqlite3_complete16Ptr.asFunction<int Function(ffi.Pointer<ffi.Void>)>();
@@ -917,7 +915,7 @@
     ffi.Pointer<sqlite3> arg0,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Int32 Function(ffi.Pointer<ffi.Void>, ffi.Int32)>>
+                ffi.Int Function(ffi.Pointer<ffi.Void>, ffi.Int)>>
         arg1,
     ffi.Pointer<ffi.Void> arg2,
   ) {
@@ -930,18 +928,18 @@
 
   late final _sqlite3_busy_handlerPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<sqlite3>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Int32 Function(ffi.Pointer<ffi.Void>, ffi.Int32)>>,
+                      ffi.Int Function(ffi.Pointer<ffi.Void>, ffi.Int)>>,
               ffi.Pointer<ffi.Void>)>>('sqlite3_busy_handler');
   late final _sqlite3_busy_handler = _sqlite3_busy_handlerPtr.asFunction<
       int Function(
           ffi.Pointer<sqlite3>,
           ffi.Pointer<
               ffi.NativeFunction<
-                  ffi.Int32 Function(ffi.Pointer<ffi.Void>, ffi.Int32)>>,
+                  ffi.Int Function(ffi.Pointer<ffi.Void>, ffi.Int)>>,
           ffi.Pointer<ffi.Void>)>();
 
   /// CAPI3REF: Set A Busy Timeout
@@ -974,9 +972,8 @@
   }
 
   late final _sqlite3_busy_timeoutPtr = _lookup<
-      ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<sqlite3>, ffi.Int32)>>('sqlite3_busy_timeout');
+          ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3>, ffi.Int)>>(
+      'sqlite3_busy_timeout');
   late final _sqlite3_busy_timeout = _sqlite3_busy_timeoutPtr
       .asFunction<int Function(ffi.Pointer<sqlite3>, int)>();
 
@@ -1053,11 +1050,11 @@
   /// [sqlite3_errmsg()].
   int sqlite3_get_table(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zSql,
-    ffi.Pointer<ffi.Pointer<ffi.Pointer<ffi.Int8>>> pazResult,
-    ffi.Pointer<ffi.Int32> pnRow,
-    ffi.Pointer<ffi.Int32> pnColumn,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> pzErrmsg,
+    ffi.Pointer<ffi.Char> zSql,
+    ffi.Pointer<ffi.Pointer<ffi.Pointer<ffi.Char>>> pazResult,
+    ffi.Pointer<ffi.Int> pnRow,
+    ffi.Pointer<ffi.Int> pnColumn,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> pzErrmsg,
   ) {
     return _sqlite3_get_table(
       db,
@@ -1071,24 +1068,24 @@
 
   late final _sqlite3_get_tablePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Pointer<ffi.Int8>>>,
-              ffi.Pointer<ffi.Int32>,
-              ffi.Pointer<ffi.Int32>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>)>>('sqlite3_get_table');
+              ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Pointer<ffi.Pointer<ffi.Char>>>,
+              ffi.Pointer<ffi.Int>,
+              ffi.Pointer<ffi.Int>,
+              ffi.Pointer<ffi.Pointer<ffi.Char>>)>>('sqlite3_get_table');
   late final _sqlite3_get_table = _sqlite3_get_tablePtr.asFunction<
       int Function(
           ffi.Pointer<sqlite3>,
-          ffi.Pointer<ffi.Int8>,
-          ffi.Pointer<ffi.Pointer<ffi.Pointer<ffi.Int8>>>,
-          ffi.Pointer<ffi.Int32>,
-          ffi.Pointer<ffi.Int32>,
-          ffi.Pointer<ffi.Pointer<ffi.Int8>>)>();
+          ffi.Pointer<ffi.Char>,
+          ffi.Pointer<ffi.Pointer<ffi.Pointer<ffi.Char>>>,
+          ffi.Pointer<ffi.Int>,
+          ffi.Pointer<ffi.Int>,
+          ffi.Pointer<ffi.Pointer<ffi.Char>>)>();
 
   void sqlite3_free_table(
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> result,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> result,
   ) {
     return _sqlite3_free_table(
       result,
@@ -1098,9 +1095,9 @@
   late final _sqlite3_free_tablePtr = _lookup<
       ffi.NativeFunction<
           ffi.Void Function(
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>)>>('sqlite3_free_table');
+              ffi.Pointer<ffi.Pointer<ffi.Char>>)>>('sqlite3_free_table');
   late final _sqlite3_free_table = _sqlite3_free_tablePtr
-      .asFunction<void Function(ffi.Pointer<ffi.Pointer<ffi.Int8>>)>();
+      .asFunction<void Function(ffi.Pointer<ffi.Pointer<ffi.Char>>)>();
 
   /// CAPI3REF: Formatted String Printing Functions
   ///
@@ -1140,8 +1137,8 @@
   /// ^The sqlite3_vsnprintf() routine is a varargs version of sqlite3_snprintf().
   ///
   /// See also:  [built-in printf()], [printf() SQL function]
-  ffi.Pointer<ffi.Int8> sqlite3_mprintf(
-    ffi.Pointer<ffi.Int8> arg0,
+  ffi.Pointer<ffi.Char> sqlite3_mprintf(
+    ffi.Pointer<ffi.Char> arg0,
   ) {
     return _sqlite3_mprintf(
       arg0,
@@ -1150,15 +1147,15 @@
 
   late final _sqlite3_mprintfPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_mprintf');
+          ffi.Pointer<ffi.Char> Function(
+              ffi.Pointer<ffi.Char>)>>('sqlite3_mprintf');
   late final _sqlite3_mprintf = _sqlite3_mprintfPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(ffi.Pointer<ffi.Int8>)>();
+      .asFunction<ffi.Pointer<ffi.Char> Function(ffi.Pointer<ffi.Char>)>();
 
-  ffi.Pointer<ffi.Int8> sqlite3_snprintf(
+  ffi.Pointer<ffi.Char> sqlite3_snprintf(
     int arg0,
-    ffi.Pointer<ffi.Int8> arg1,
-    ffi.Pointer<ffi.Int8> arg2,
+    ffi.Pointer<ffi.Char> arg1,
+    ffi.Pointer<ffi.Char> arg2,
   ) {
     return _sqlite3_snprintf(
       arg0,
@@ -1169,11 +1166,11 @@
 
   late final _sqlite3_snprintfPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(ffi.Int32, ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_snprintf');
+          ffi.Pointer<ffi.Char> Function(ffi.Int, ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Char>)>>('sqlite3_snprintf');
   late final _sqlite3_snprintf = _sqlite3_snprintfPtr.asFunction<
-      ffi.Pointer<ffi.Int8> Function(
-          int, ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int8>)>();
+      ffi.Pointer<ffi.Char> Function(
+          int, ffi.Pointer<ffi.Char>, ffi.Pointer<ffi.Char>)>();
 
   /// CAPI3REF: Memory Allocation Subsystem
   ///
@@ -1257,7 +1254,7 @@
   }
 
   late final _sqlite3_mallocPtr =
-      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function(ffi.Int)>>(
           'sqlite3_malloc');
   late final _sqlite3_malloc =
       _sqlite3_mallocPtr.asFunction<ffi.Pointer<ffi.Void> Function(int)>();
@@ -1289,7 +1286,7 @@
   late final _sqlite3_reallocPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<ffi.Void> Function(
-              ffi.Pointer<ffi.Void>, ffi.Int32)>>('sqlite3_realloc');
+              ffi.Pointer<ffi.Void>, ffi.Int)>>('sqlite3_realloc');
   late final _sqlite3_realloc = _sqlite3_reallocPtr
       .asFunction<ffi.Pointer<ffi.Void> Function(ffi.Pointer<ffi.Void>, int)>();
 
@@ -1378,7 +1375,7 @@
   }
 
   late final _sqlite3_memory_highwaterPtr =
-      _lookup<ffi.NativeFunction<sqlite3_int64 Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<sqlite3_int64 Function(ffi.Int)>>(
           'sqlite3_memory_highwater');
   late final _sqlite3_memory_highwater =
       _sqlite3_memory_highwaterPtr.asFunction<int Function(int)>();
@@ -1415,7 +1412,7 @@
   late final _sqlite3_randomnessPtr = _lookup<
       ffi.NativeFunction<
           ffi.Void Function(
-              ffi.Int32, ffi.Pointer<ffi.Void>)>>('sqlite3_randomness');
+              ffi.Int, ffi.Pointer<ffi.Void>)>>('sqlite3_randomness');
   late final _sqlite3_randomness = _sqlite3_randomnessPtr
       .asFunction<void Function(int, ffi.Pointer<ffi.Void>)>();
 
@@ -1510,13 +1507,13 @@
     ffi.Pointer<sqlite3> arg0,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Int32 Function(
+                ffi.Int Function(
                     ffi.Pointer<ffi.Void>,
-                    ffi.Int32,
-                    ffi.Pointer<ffi.Int8>,
-                    ffi.Pointer<ffi.Int8>,
-                    ffi.Pointer<ffi.Int8>,
-                    ffi.Pointer<ffi.Int8>)>>
+                    ffi.Int,
+                    ffi.Pointer<ffi.Char>,
+                    ffi.Pointer<ffi.Char>,
+                    ffi.Pointer<ffi.Char>,
+                    ffi.Pointer<ffi.Char>)>>
         xAuth,
     ffi.Pointer<ffi.Void> pUserData,
   ) {
@@ -1529,30 +1526,30 @@
 
   late final _sqlite3_set_authorizerPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<sqlite3>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Int32 Function(
+                      ffi.Int Function(
                           ffi.Pointer<ffi.Void>,
-                          ffi.Int32,
-                          ffi.Pointer<ffi.Int8>,
-                          ffi.Pointer<ffi.Int8>,
-                          ffi.Pointer<ffi.Int8>,
-                          ffi.Pointer<ffi.Int8>)>>,
+                          ffi.Int,
+                          ffi.Pointer<ffi.Char>,
+                          ffi.Pointer<ffi.Char>,
+                          ffi.Pointer<ffi.Char>,
+                          ffi.Pointer<ffi.Char>)>>,
               ffi.Pointer<ffi.Void>)>>('sqlite3_set_authorizer');
   late final _sqlite3_set_authorizer = _sqlite3_set_authorizerPtr.asFunction<
       int Function(
           ffi.Pointer<sqlite3>,
           ffi.Pointer<
               ffi.NativeFunction<
-                  ffi.Int32 Function(
+                  ffi.Int Function(
                       ffi.Pointer<ffi.Void>,
-                      ffi.Int32,
-                      ffi.Pointer<ffi.Int8>,
-                      ffi.Pointer<ffi.Int8>,
-                      ffi.Pointer<ffi.Int8>,
-                      ffi.Pointer<ffi.Int8>)>>,
+                      ffi.Int,
+                      ffi.Pointer<ffi.Char>,
+                      ffi.Pointer<ffi.Char>,
+                      ffi.Pointer<ffi.Char>,
+                      ffi.Pointer<ffi.Char>)>>,
           ffi.Pointer<ffi.Void>)>();
 
   /// CAPI3REF: Tracing And Profiling Functions
@@ -1590,7 +1587,7 @@
     ffi.Pointer<
             ffi.NativeFunction<
                 ffi.Void Function(
-                    ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Int8>)>>
+                    ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Char>)>>
         xTrace,
     ffi.Pointer<ffi.Void> arg2,
   ) {
@@ -1608,7 +1605,7 @@
               ffi.Pointer<
                   ffi.NativeFunction<
                       ffi.Void Function(
-                          ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Int8>)>>,
+                          ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Char>)>>,
               ffi.Pointer<ffi.Void>)>>('sqlite3_trace');
   late final _sqlite3_trace = _sqlite3_tracePtr.asFunction<
       ffi.Pointer<ffi.Void> Function(
@@ -1616,14 +1613,14 @@
           ffi.Pointer<
               ffi.NativeFunction<
                   ffi.Void Function(
-                      ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Int8>)>>,
+                      ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Char>)>>,
           ffi.Pointer<ffi.Void>)>();
 
   ffi.Pointer<ffi.Void> sqlite3_profile(
     ffi.Pointer<sqlite3> arg0,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Int8>,
+                ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Char>,
                     sqlite3_uint64)>>
         xProfile,
     ffi.Pointer<ffi.Void> arg2,
@@ -1642,7 +1639,7 @@
               ffi.Pointer<
                   ffi.NativeFunction<
                       ffi.Void Function(ffi.Pointer<ffi.Void>,
-                          ffi.Pointer<ffi.Int8>, sqlite3_uint64)>>,
+                          ffi.Pointer<ffi.Char>, sqlite3_uint64)>>,
               ffi.Pointer<ffi.Void>)>>('sqlite3_profile');
   late final _sqlite3_profile = _sqlite3_profilePtr.asFunction<
       ffi.Pointer<ffi.Void> Function(
@@ -1650,7 +1647,7 @@
           ffi.Pointer<
               ffi.NativeFunction<
                   ffi.Void Function(ffi.Pointer<ffi.Void>,
-                      ffi.Pointer<ffi.Int8>, sqlite3_uint64)>>,
+                      ffi.Pointer<ffi.Char>, sqlite3_uint64)>>,
           ffi.Pointer<ffi.Void>)>();
 
   /// CAPI3REF: SQL Trace Hook
@@ -1685,7 +1682,7 @@
     int uMask,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Int32 Function(ffi.Uint32, ffi.Pointer<ffi.Void>,
+                ffi.Int Function(ffi.UnsignedInt, ffi.Pointer<ffi.Void>,
                     ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>>
         xCallback,
     ffi.Pointer<ffi.Void> pCtx,
@@ -1700,12 +1697,12 @@
 
   late final _sqlite3_trace_v2Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Uint32,
+              ffi.UnsignedInt,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Int32 Function(ffi.Uint32, ffi.Pointer<ffi.Void>,
+                      ffi.Int Function(ffi.UnsignedInt, ffi.Pointer<ffi.Void>,
                           ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>>,
               ffi.Pointer<ffi.Void>)>>('sqlite3_trace_v2');
   late final _sqlite3_trace_v2 = _sqlite3_trace_v2Ptr.asFunction<
@@ -1714,7 +1711,7 @@
           int,
           ffi.Pointer<
               ffi.NativeFunction<
-                  ffi.Int32 Function(ffi.Uint32, ffi.Pointer<ffi.Void>,
+                  ffi.Int Function(ffi.UnsignedInt, ffi.Pointer<ffi.Void>,
                       ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>>,
           ffi.Pointer<ffi.Void>)>();
 
@@ -1750,7 +1747,7 @@
   void sqlite3_progress_handler(
     ffi.Pointer<sqlite3> arg0,
     int arg1,
-    ffi.Pointer<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<ffi.Void>)>>
+    ffi.Pointer<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<ffi.Void>)>>
         arg2,
     ffi.Pointer<ffi.Void> arg3,
   ) {
@@ -1766,10 +1763,9 @@
       ffi.NativeFunction<
           ffi.Void Function(
               ffi.Pointer<sqlite3>,
-              ffi.Int32,
+              ffi.Int,
               ffi.Pointer<
-                  ffi.NativeFunction<
-                      ffi.Int32 Function(ffi.Pointer<ffi.Void>)>>,
+                  ffi.NativeFunction<ffi.Int Function(ffi.Pointer<ffi.Void>)>>,
               ffi.Pointer<ffi.Void>)>>('sqlite3_progress_handler');
   late final _sqlite3_progress_handler =
       _sqlite3_progress_handlerPtr.asFunction<
@@ -1777,8 +1773,7 @@
               ffi.Pointer<sqlite3>,
               int,
               ffi.Pointer<
-                  ffi.NativeFunction<
-                      ffi.Int32 Function(ffi.Pointer<ffi.Void>)>>,
+                  ffi.NativeFunction<ffi.Int Function(ffi.Pointer<ffi.Void>)>>,
               ffi.Pointer<ffi.Void>)>();
 
   /// CAPI3REF: Opening A New Database Connection
@@ -2033,7 +2028,7 @@
   ///
   /// See also: [sqlite3_temp_directory]
   int sqlite3_open(
-    ffi.Pointer<ffi.Int8> filename,
+    ffi.Pointer<ffi.Char> filename,
     ffi.Pointer<ffi.Pointer<sqlite3>> ppDb,
   ) {
     return _sqlite3_open(
@@ -2044,10 +2039,10 @@
 
   late final _sqlite3_openPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<ffi.Int8>,
+          ffi.Int Function(ffi.Pointer<ffi.Char>,
               ffi.Pointer<ffi.Pointer<sqlite3>>)>>('sqlite3_open');
   late final _sqlite3_open = _sqlite3_openPtr.asFunction<
-      int Function(ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Pointer<sqlite3>>)>();
+      int Function(ffi.Pointer<ffi.Char>, ffi.Pointer<ffi.Pointer<sqlite3>>)>();
 
   int sqlite3_open16(
     ffi.Pointer<ffi.Void> filename,
@@ -2061,16 +2056,16 @@
 
   late final _sqlite3_open16Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<ffi.Void>,
+          ffi.Int Function(ffi.Pointer<ffi.Void>,
               ffi.Pointer<ffi.Pointer<sqlite3>>)>>('sqlite3_open16');
   late final _sqlite3_open16 = _sqlite3_open16Ptr.asFunction<
       int Function(ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Pointer<sqlite3>>)>();
 
   int sqlite3_open_v2(
-    ffi.Pointer<ffi.Int8> filename,
+    ffi.Pointer<ffi.Char> filename,
     ffi.Pointer<ffi.Pointer<sqlite3>> ppDb,
     int flags,
-    ffi.Pointer<ffi.Int8> zVfs,
+    ffi.Pointer<ffi.Char> zVfs,
   ) {
     return _sqlite3_open_v2(
       filename,
@@ -2082,14 +2077,14 @@
 
   late final _sqlite3_open_v2Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<ffi.Int8>,
+          ffi.Int Function(
+              ffi.Pointer<ffi.Char>,
               ffi.Pointer<ffi.Pointer<sqlite3>>,
-              ffi.Int32,
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_open_v2');
+              ffi.Int,
+              ffi.Pointer<ffi.Char>)>>('sqlite3_open_v2');
   late final _sqlite3_open_v2 = _sqlite3_open_v2Ptr.asFunction<
-      int Function(ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Pointer<sqlite3>>,
-          int, ffi.Pointer<ffi.Int8>)>();
+      int Function(ffi.Pointer<ffi.Char>, ffi.Pointer<ffi.Pointer<sqlite3>>,
+          int, ffi.Pointer<ffi.Char>)>();
 
   /// CAPI3REF: Obtain Values For URI Parameters
   ///
@@ -2155,9 +2150,9 @@
   /// main database file.
   ///
   /// See the [URI filename] documentation for additional information.
-  ffi.Pointer<ffi.Int8> sqlite3_uri_parameter(
-    ffi.Pointer<ffi.Int8> zFilename,
-    ffi.Pointer<ffi.Int8> zParam,
+  ffi.Pointer<ffi.Char> sqlite3_uri_parameter(
+    ffi.Pointer<ffi.Char> zFilename,
+    ffi.Pointer<ffi.Char> zParam,
   ) {
     return _sqlite3_uri_parameter(
       zFilename,
@@ -2167,15 +2162,15 @@
 
   late final _sqlite3_uri_parameterPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_uri_parameter');
+          ffi.Pointer<ffi.Char> Function(ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Char>)>>('sqlite3_uri_parameter');
   late final _sqlite3_uri_parameter = _sqlite3_uri_parameterPtr.asFunction<
-      ffi.Pointer<ffi.Int8> Function(
-          ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int8>)>();
+      ffi.Pointer<ffi.Char> Function(
+          ffi.Pointer<ffi.Char>, ffi.Pointer<ffi.Char>)>();
 
   int sqlite3_uri_boolean(
-    ffi.Pointer<ffi.Int8> zFile,
-    ffi.Pointer<ffi.Int8> zParam,
+    ffi.Pointer<ffi.Char> zFile,
+    ffi.Pointer<ffi.Char> zParam,
     int bDefault,
   ) {
     return _sqlite3_uri_boolean(
@@ -2187,14 +2182,14 @@
 
   late final _sqlite3_uri_booleanPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int8>,
-              ffi.Int32)>>('sqlite3_uri_boolean');
+          ffi.Int Function(ffi.Pointer<ffi.Char>, ffi.Pointer<ffi.Char>,
+              ffi.Int)>>('sqlite3_uri_boolean');
   late final _sqlite3_uri_boolean = _sqlite3_uri_booleanPtr.asFunction<
-      int Function(ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int8>, int)>();
+      int Function(ffi.Pointer<ffi.Char>, ffi.Pointer<ffi.Char>, int)>();
 
   int sqlite3_uri_int64(
-    ffi.Pointer<ffi.Int8> arg0,
-    ffi.Pointer<ffi.Int8> arg1,
+    ffi.Pointer<ffi.Char> arg0,
+    ffi.Pointer<ffi.Char> arg1,
     int arg2,
   ) {
     return _sqlite3_uri_int64(
@@ -2206,13 +2201,13 @@
 
   late final _sqlite3_uri_int64Ptr = _lookup<
       ffi.NativeFunction<
-          sqlite3_int64 Function(ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int8>,
+          sqlite3_int64 Function(ffi.Pointer<ffi.Char>, ffi.Pointer<ffi.Char>,
               sqlite3_int64)>>('sqlite3_uri_int64');
   late final _sqlite3_uri_int64 = _sqlite3_uri_int64Ptr.asFunction<
-      int Function(ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int8>, int)>();
+      int Function(ffi.Pointer<ffi.Char>, ffi.Pointer<ffi.Char>, int)>();
 
-  ffi.Pointer<ffi.Int8> sqlite3_uri_key(
-    ffi.Pointer<ffi.Int8> zFilename,
+  ffi.Pointer<ffi.Char> sqlite3_uri_key(
+    ffi.Pointer<ffi.Char> zFilename,
     int N,
   ) {
     return _sqlite3_uri_key(
@@ -2223,10 +2218,10 @@
 
   late final _sqlite3_uri_keyPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(
-              ffi.Pointer<ffi.Int8>, ffi.Int32)>>('sqlite3_uri_key');
+          ffi.Pointer<ffi.Char> Function(
+              ffi.Pointer<ffi.Char>, ffi.Int)>>('sqlite3_uri_key');
   late final _sqlite3_uri_key = _sqlite3_uri_keyPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(ffi.Pointer<ffi.Int8>, int)>();
+      .asFunction<ffi.Pointer<ffi.Char> Function(ffi.Pointer<ffi.Char>, int)>();
 
   /// CAPI3REF:  Translate filenames
   ///
@@ -2253,8 +2248,8 @@
   /// filename passed into the VFS from the SQLite core and F is not the
   /// return value from [sqlite3_db_filename()], then the result is
   /// undefined and is likely a memory access violation.
-  ffi.Pointer<ffi.Int8> sqlite3_filename_database(
-    ffi.Pointer<ffi.Int8> arg0,
+  ffi.Pointer<ffi.Char> sqlite3_filename_database(
+    ffi.Pointer<ffi.Char> arg0,
   ) {
     return _sqlite3_filename_database(
       arg0,
@@ -2263,13 +2258,13 @@
 
   late final _sqlite3_filename_databasePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_filename_database');
+          ffi.Pointer<ffi.Char> Function(
+              ffi.Pointer<ffi.Char>)>>('sqlite3_filename_database');
   late final _sqlite3_filename_database = _sqlite3_filename_databasePtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(ffi.Pointer<ffi.Int8>)>();
+      .asFunction<ffi.Pointer<ffi.Char> Function(ffi.Pointer<ffi.Char>)>();
 
-  ffi.Pointer<ffi.Int8> sqlite3_filename_journal(
-    ffi.Pointer<ffi.Int8> arg0,
+  ffi.Pointer<ffi.Char> sqlite3_filename_journal(
+    ffi.Pointer<ffi.Char> arg0,
   ) {
     return _sqlite3_filename_journal(
       arg0,
@@ -2278,13 +2273,13 @@
 
   late final _sqlite3_filename_journalPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_filename_journal');
+          ffi.Pointer<ffi.Char> Function(
+              ffi.Pointer<ffi.Char>)>>('sqlite3_filename_journal');
   late final _sqlite3_filename_journal = _sqlite3_filename_journalPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(ffi.Pointer<ffi.Int8>)>();
+      .asFunction<ffi.Pointer<ffi.Char> Function(ffi.Pointer<ffi.Char>)>();
 
-  ffi.Pointer<ffi.Int8> sqlite3_filename_wal(
-    ffi.Pointer<ffi.Int8> arg0,
+  ffi.Pointer<ffi.Char> sqlite3_filename_wal(
+    ffi.Pointer<ffi.Char> arg0,
   ) {
     return _sqlite3_filename_wal(
       arg0,
@@ -2293,10 +2288,10 @@
 
   late final _sqlite3_filename_walPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_filename_wal');
+          ffi.Pointer<ffi.Char> Function(
+              ffi.Pointer<ffi.Char>)>>('sqlite3_filename_wal');
   late final _sqlite3_filename_wal = _sqlite3_filename_walPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(ffi.Pointer<ffi.Int8>)>();
+      .asFunction<ffi.Pointer<ffi.Char> Function(ffi.Pointer<ffi.Char>)>();
 
   /// CAPI3REF:  Database File Corresponding To A Journal
   ///
@@ -2314,7 +2309,7 @@
   /// of this routine results in undefined and probably undesirable
   /// behavior.
   ffi.Pointer<sqlite3_file> sqlite3_database_file_object(
-    ffi.Pointer<ffi.Int8> arg0,
+    ffi.Pointer<ffi.Char> arg0,
   ) {
     return _sqlite3_database_file_object(
       arg0,
@@ -2324,9 +2319,9 @@
   late final _sqlite3_database_file_objectPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<sqlite3_file> Function(
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_database_file_object');
+              ffi.Pointer<ffi.Char>)>>('sqlite3_database_file_object');
   late final _sqlite3_database_file_object = _sqlite3_database_file_objectPtr
-      .asFunction<ffi.Pointer<sqlite3_file> Function(ffi.Pointer<ffi.Int8>)>();
+      .asFunction<ffi.Pointer<sqlite3_file> Function(ffi.Pointer<ffi.Char>)>();
 
   /// CAPI3REF: Create and Destroy VFS Filenames
   ///
@@ -2371,12 +2366,12 @@
   /// that if the [sqlite3_vfs.xOpen()] method of a VFS has been called using Y,
   /// then the corresponding [sqlite3_module.xClose() method should also be
   /// invoked prior to calling sqlite3_free_filename(Y).
-  ffi.Pointer<ffi.Int8> sqlite3_create_filename(
-    ffi.Pointer<ffi.Int8> zDatabase,
-    ffi.Pointer<ffi.Int8> zJournal,
-    ffi.Pointer<ffi.Int8> zWal,
+  ffi.Pointer<ffi.Char> sqlite3_create_filename(
+    ffi.Pointer<ffi.Char> zDatabase,
+    ffi.Pointer<ffi.Char> zJournal,
+    ffi.Pointer<ffi.Char> zWal,
     int nParam,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> azParam,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> azParam,
   ) {
     return _sqlite3_create_filename(
       zDatabase,
@@ -2389,22 +2384,22 @@
 
   late final _sqlite3_create_filenamePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Int32,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>)>>('sqlite3_create_filename');
+          ffi.Pointer<ffi.Char> Function(
+              ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Char>,
+              ffi.Int,
+              ffi.Pointer<ffi.Pointer<ffi.Char>>)>>('sqlite3_create_filename');
   late final _sqlite3_create_filename = _sqlite3_create_filenamePtr.asFunction<
-      ffi.Pointer<ffi.Int8> Function(
-          ffi.Pointer<ffi.Int8>,
-          ffi.Pointer<ffi.Int8>,
-          ffi.Pointer<ffi.Int8>,
+      ffi.Pointer<ffi.Char> Function(
+          ffi.Pointer<ffi.Char>,
+          ffi.Pointer<ffi.Char>,
+          ffi.Pointer<ffi.Char>,
           int,
-          ffi.Pointer<ffi.Pointer<ffi.Int8>>)>();
+          ffi.Pointer<ffi.Pointer<ffi.Char>>)>();
 
   void sqlite3_free_filename(
-    ffi.Pointer<ffi.Int8> arg0,
+    ffi.Pointer<ffi.Char> arg0,
   ) {
     return _sqlite3_free_filename(
       arg0,
@@ -2412,10 +2407,10 @@
   }
 
   late final _sqlite3_free_filenamePtr =
-      _lookup<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Int8>)>>(
+      _lookup<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Char>)>>(
           'sqlite3_free_filename');
   late final _sqlite3_free_filename = _sqlite3_free_filenamePtr
-      .asFunction<void Function(ffi.Pointer<ffi.Int8>)>();
+      .asFunction<void Function(ffi.Pointer<ffi.Char>)>();
 
   /// CAPI3REF: Error Codes And Messages
   /// METHOD: sqlite3
@@ -2476,7 +2471,7 @@
   }
 
   late final _sqlite3_errcodePtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3>)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3>)>>(
           'sqlite3_errcode');
   late final _sqlite3_errcode =
       _sqlite3_errcodePtr.asFunction<int Function(ffi.Pointer<sqlite3>)>();
@@ -2490,12 +2485,12 @@
   }
 
   late final _sqlite3_extended_errcodePtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3>)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3>)>>(
           'sqlite3_extended_errcode');
   late final _sqlite3_extended_errcode = _sqlite3_extended_errcodePtr
       .asFunction<int Function(ffi.Pointer<sqlite3>)>();
 
-  ffi.Pointer<ffi.Int8> sqlite3_errmsg(
+  ffi.Pointer<ffi.Char> sqlite3_errmsg(
     ffi.Pointer<sqlite3> arg0,
   ) {
     return _sqlite3_errmsg(
@@ -2505,10 +2500,10 @@
 
   late final _sqlite3_errmsgPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(
+          ffi.Pointer<ffi.Char> Function(
               ffi.Pointer<sqlite3>)>>('sqlite3_errmsg');
   late final _sqlite3_errmsg = _sqlite3_errmsgPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3>)>();
+      .asFunction<ffi.Pointer<ffi.Char> Function(ffi.Pointer<sqlite3>)>();
 
   ffi.Pointer<ffi.Void> sqlite3_errmsg16(
     ffi.Pointer<sqlite3> arg0,
@@ -2525,7 +2520,7 @@
   late final _sqlite3_errmsg16 = _sqlite3_errmsg16Ptr
       .asFunction<ffi.Pointer<ffi.Void> Function(ffi.Pointer<sqlite3>)>();
 
-  ffi.Pointer<ffi.Int8> sqlite3_errstr(
+  ffi.Pointer<ffi.Char> sqlite3_errstr(
     int arg0,
   ) {
     return _sqlite3_errstr(
@@ -2534,10 +2529,10 @@
   }
 
   late final _sqlite3_errstrPtr =
-      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Int8> Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Char> Function(ffi.Int)>>(
           'sqlite3_errstr');
   late final _sqlite3_errstr =
-      _sqlite3_errstrPtr.asFunction<ffi.Pointer<ffi.Int8> Function(int)>();
+      _sqlite3_errstrPtr.asFunction<ffi.Pointer<ffi.Char> Function(int)>();
 
   /// CAPI3REF: Run-time Limits
   /// METHOD: sqlite3
@@ -2591,8 +2586,8 @@
 
   late final _sqlite3_limitPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<sqlite3>, ffi.Int32, ffi.Int32)>>('sqlite3_limit');
+          ffi.Int Function(
+              ffi.Pointer<sqlite3>, ffi.Int, ffi.Int)>>('sqlite3_limit');
   late final _sqlite3_limit = _sqlite3_limitPtr
       .asFunction<int Function(ffi.Pointer<sqlite3>, int, int)>();
 
@@ -2696,10 +2691,10 @@
   /// sqlite3_prepare_v3() with a zero prepFlags parameter.
   int sqlite3_prepare(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zSql,
+    ffi.Pointer<ffi.Char> zSql,
     int nByte,
     ffi.Pointer<ffi.Pointer<sqlite3_stmt>> ppStmt,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> pzTail,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> pzTail,
   ) {
     return _sqlite3_prepare(
       db,
@@ -2712,26 +2707,26 @@
 
   late final _sqlite3_preparePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Int32,
+              ffi.Pointer<ffi.Char>,
+              ffi.Int,
               ffi.Pointer<ffi.Pointer<sqlite3_stmt>>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>)>>('sqlite3_prepare');
+              ffi.Pointer<ffi.Pointer<ffi.Char>>)>>('sqlite3_prepare');
   late final _sqlite3_prepare = _sqlite3_preparePtr.asFunction<
       int Function(
           ffi.Pointer<sqlite3>,
-          ffi.Pointer<ffi.Int8>,
+          ffi.Pointer<ffi.Char>,
           int,
           ffi.Pointer<ffi.Pointer<sqlite3_stmt>>,
-          ffi.Pointer<ffi.Pointer<ffi.Int8>>)>();
+          ffi.Pointer<ffi.Pointer<ffi.Char>>)>();
 
   int sqlite3_prepare_v2(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zSql,
+    ffi.Pointer<ffi.Char> zSql,
     int nByte,
     ffi.Pointer<ffi.Pointer<sqlite3_stmt>> ppStmt,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> pzTail,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> pzTail,
   ) {
     return _sqlite3_prepare_v2(
       db,
@@ -2744,27 +2739,27 @@
 
   late final _sqlite3_prepare_v2Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Int32,
+              ffi.Pointer<ffi.Char>,
+              ffi.Int,
               ffi.Pointer<ffi.Pointer<sqlite3_stmt>>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>)>>('sqlite3_prepare_v2');
+              ffi.Pointer<ffi.Pointer<ffi.Char>>)>>('sqlite3_prepare_v2');
   late final _sqlite3_prepare_v2 = _sqlite3_prepare_v2Ptr.asFunction<
       int Function(
           ffi.Pointer<sqlite3>,
-          ffi.Pointer<ffi.Int8>,
+          ffi.Pointer<ffi.Char>,
           int,
           ffi.Pointer<ffi.Pointer<sqlite3_stmt>>,
-          ffi.Pointer<ffi.Pointer<ffi.Int8>>)>();
+          ffi.Pointer<ffi.Pointer<ffi.Char>>)>();
 
   int sqlite3_prepare_v3(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zSql,
+    ffi.Pointer<ffi.Char> zSql,
     int nByte,
     int prepFlags,
     ffi.Pointer<ffi.Pointer<sqlite3_stmt>> ppStmt,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> pzTail,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> pzTail,
   ) {
     return _sqlite3_prepare_v3(
       db,
@@ -2778,21 +2773,21 @@
 
   late final _sqlite3_prepare_v3Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Int32,
-              ffi.Uint32,
+              ffi.Pointer<ffi.Char>,
+              ffi.Int,
+              ffi.UnsignedInt,
               ffi.Pointer<ffi.Pointer<sqlite3_stmt>>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>)>>('sqlite3_prepare_v3');
+              ffi.Pointer<ffi.Pointer<ffi.Char>>)>>('sqlite3_prepare_v3');
   late final _sqlite3_prepare_v3 = _sqlite3_prepare_v3Ptr.asFunction<
       int Function(
           ffi.Pointer<sqlite3>,
-          ffi.Pointer<ffi.Int8>,
+          ffi.Pointer<ffi.Char>,
           int,
           int,
           ffi.Pointer<ffi.Pointer<sqlite3_stmt>>,
-          ffi.Pointer<ffi.Pointer<ffi.Int8>>)>();
+          ffi.Pointer<ffi.Pointer<ffi.Char>>)>();
 
   int sqlite3_prepare16(
     ffi.Pointer<sqlite3> db,
@@ -2812,10 +2807,10 @@
 
   late final _sqlite3_prepare16Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<sqlite3>,
               ffi.Pointer<ffi.Void>,
-              ffi.Int32,
+              ffi.Int,
               ffi.Pointer<ffi.Pointer<sqlite3_stmt>>,
               ffi.Pointer<ffi.Pointer<ffi.Void>>)>>('sqlite3_prepare16');
   late final _sqlite3_prepare16 = _sqlite3_prepare16Ptr.asFunction<
@@ -2844,10 +2839,10 @@
 
   late final _sqlite3_prepare16_v2Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<sqlite3>,
               ffi.Pointer<ffi.Void>,
-              ffi.Int32,
+              ffi.Int,
               ffi.Pointer<ffi.Pointer<sqlite3_stmt>>,
               ffi.Pointer<ffi.Pointer<ffi.Void>>)>>('sqlite3_prepare16_v2');
   late final _sqlite3_prepare16_v2 = _sqlite3_prepare16_v2Ptr.asFunction<
@@ -2878,11 +2873,11 @@
 
   late final _sqlite3_prepare16_v3Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<sqlite3>,
               ffi.Pointer<ffi.Void>,
-              ffi.Int32,
-              ffi.Uint32,
+              ffi.Int,
+              ffi.UnsignedInt,
               ffi.Pointer<ffi.Pointer<sqlite3_stmt>>,
               ffi.Pointer<ffi.Pointer<ffi.Void>>)>>('sqlite3_prepare16_v3');
   late final _sqlite3_prepare16_v3 = _sqlite3_prepare16_v3Ptr.asFunction<
@@ -2930,7 +2925,7 @@
   /// ^The string returned by sqlite3_expanded_sql(P), on the other hand,
   /// is obtained from [sqlite3_malloc()] and must be free by the application
   /// by passing it to [sqlite3_free()].
-  ffi.Pointer<ffi.Int8> sqlite3_sql(
+  ffi.Pointer<ffi.Char> sqlite3_sql(
     ffi.Pointer<sqlite3_stmt> pStmt,
   ) {
     return _sqlite3_sql(
@@ -2940,12 +2935,12 @@
 
   late final _sqlite3_sqlPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(
+          ffi.Pointer<ffi.Char> Function(
               ffi.Pointer<sqlite3_stmt>)>>('sqlite3_sql');
   late final _sqlite3_sql = _sqlite3_sqlPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3_stmt>)>();
+      .asFunction<ffi.Pointer<ffi.Char> Function(ffi.Pointer<sqlite3_stmt>)>();
 
-  ffi.Pointer<ffi.Int8> sqlite3_expanded_sql(
+  ffi.Pointer<ffi.Char> sqlite3_expanded_sql(
     ffi.Pointer<sqlite3_stmt> pStmt,
   ) {
     return _sqlite3_expanded_sql(
@@ -2955,12 +2950,12 @@
 
   late final _sqlite3_expanded_sqlPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(
+          ffi.Pointer<ffi.Char> Function(
               ffi.Pointer<sqlite3_stmt>)>>('sqlite3_expanded_sql');
   late final _sqlite3_expanded_sql = _sqlite3_expanded_sqlPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3_stmt>)>();
+      .asFunction<ffi.Pointer<ffi.Char> Function(ffi.Pointer<sqlite3_stmt>)>();
 
-  ffi.Pointer<ffi.Int8> sqlite3_normalized_sql(
+  ffi.Pointer<ffi.Char> sqlite3_normalized_sql(
     ffi.Pointer<sqlite3_stmt> pStmt,
   ) {
     return _sqlite3_normalized_sql(
@@ -2970,10 +2965,10 @@
 
   late final _sqlite3_normalized_sqlPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(
+          ffi.Pointer<ffi.Char> Function(
               ffi.Pointer<sqlite3_stmt>)>>('sqlite3_normalized_sql');
   late final _sqlite3_normalized_sql = _sqlite3_normalized_sqlPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3_stmt>)>();
+      .asFunction<ffi.Pointer<ffi.Char> Function(ffi.Pointer<sqlite3_stmt>)>();
 
   /// CAPI3REF: Determine If An SQL Statement Writes The Database
   /// METHOD: sqlite3_stmt
@@ -3015,9 +3010,9 @@
     );
   }
 
-  late final _sqlite3_stmt_readonlyPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>)>>(
-      'sqlite3_stmt_readonly');
+  late final _sqlite3_stmt_readonlyPtr =
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_stmt>)>>(
+          'sqlite3_stmt_readonly');
   late final _sqlite3_stmt_readonly = _sqlite3_stmt_readonlyPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>)>();
 
@@ -3037,9 +3032,9 @@
     );
   }
 
-  late final _sqlite3_stmt_isexplainPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>)>>(
-      'sqlite3_stmt_isexplain');
+  late final _sqlite3_stmt_isexplainPtr =
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_stmt>)>>(
+          'sqlite3_stmt_isexplain');
   late final _sqlite3_stmt_isexplain = _sqlite3_stmt_isexplainPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>)>();
 
@@ -3068,9 +3063,9 @@
     );
   }
 
-  late final _sqlite3_stmt_busyPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>)>>(
-      'sqlite3_stmt_busy');
+  late final _sqlite3_stmt_busyPtr =
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_stmt>)>>(
+          'sqlite3_stmt_busy');
   late final _sqlite3_stmt_busy = _sqlite3_stmt_busyPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>)>();
 
@@ -3227,11 +3222,11 @@
 
   late final _sqlite3_bind_blobPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<sqlite3_stmt>,
-              ffi.Int32,
+              ffi.Int,
               ffi.Pointer<ffi.Void>,
-              ffi.Int32,
+              ffi.Int,
               ffi.Pointer<
                   ffi.NativeFunction<
                       ffi.Void Function(
@@ -3264,9 +3259,9 @@
 
   late final _sqlite3_bind_blob64Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<sqlite3_stmt>,
-              ffi.Int32,
+              ffi.Int,
               ffi.Pointer<ffi.Void>,
               sqlite3_uint64,
               ffi.Pointer<
@@ -3296,7 +3291,7 @@
 
   late final _sqlite3_bind_doublePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>, ffi.Int32,
+          ffi.Int Function(ffi.Pointer<sqlite3_stmt>, ffi.Int,
               ffi.Double)>>('sqlite3_bind_double');
   late final _sqlite3_bind_double = _sqlite3_bind_doublePtr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>, int, double)>();
@@ -3315,8 +3310,8 @@
 
   late final _sqlite3_bind_intPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>, ffi.Int32,
-              ffi.Int32)>>('sqlite3_bind_int');
+          ffi.Int Function(ffi.Pointer<sqlite3_stmt>, ffi.Int,
+              ffi.Int)>>('sqlite3_bind_int');
   late final _sqlite3_bind_int = _sqlite3_bind_intPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>, int, int)>();
 
@@ -3334,7 +3329,7 @@
 
   late final _sqlite3_bind_int64Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>, ffi.Int32,
+          ffi.Int Function(ffi.Pointer<sqlite3_stmt>, ffi.Int,
               sqlite3_int64)>>('sqlite3_bind_int64');
   late final _sqlite3_bind_int64 = _sqlite3_bind_int64Ptr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>, int, int)>();
@@ -3351,15 +3346,15 @@
 
   late final _sqlite3_bind_nullPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<sqlite3_stmt>, ffi.Int32)>>('sqlite3_bind_null');
+          ffi.Int Function(
+              ffi.Pointer<sqlite3_stmt>, ffi.Int)>>('sqlite3_bind_null');
   late final _sqlite3_bind_null = _sqlite3_bind_nullPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
   int sqlite3_bind_text(
     ffi.Pointer<sqlite3_stmt> arg0,
     int arg1,
-    ffi.Pointer<ffi.Int8> arg2,
+    ffi.Pointer<ffi.Char> arg2,
     int arg3,
     ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
         arg4,
@@ -3375,11 +3370,11 @@
 
   late final _sqlite3_bind_textPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<sqlite3_stmt>,
-              ffi.Int32,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Int32,
+              ffi.Int,
+              ffi.Pointer<ffi.Char>,
+              ffi.Int,
               ffi.Pointer<
                   ffi.NativeFunction<
                       ffi.Void Function(
@@ -3388,7 +3383,7 @@
       int Function(
           ffi.Pointer<sqlite3_stmt>,
           int,
-          ffi.Pointer<ffi.Int8>,
+          ffi.Pointer<ffi.Char>,
           int,
           ffi.Pointer<
               ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>();
@@ -3412,11 +3407,11 @@
 
   late final _sqlite3_bind_text16Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<sqlite3_stmt>,
-              ffi.Int32,
+              ffi.Int,
               ffi.Pointer<ffi.Void>,
-              ffi.Int32,
+              ffi.Int,
               ffi.Pointer<
                   ffi.NativeFunction<
                       ffi.Void Function(
@@ -3433,7 +3428,7 @@
   int sqlite3_bind_text64(
     ffi.Pointer<sqlite3_stmt> arg0,
     int arg1,
-    ffi.Pointer<ffi.Int8> arg2,
+    ffi.Pointer<ffi.Char> arg2,
     int arg3,
     ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
         arg4,
@@ -3451,19 +3446,19 @@
 
   late final _sqlite3_bind_text64Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<sqlite3_stmt>,
-              ffi.Int32,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Int,
+              ffi.Pointer<ffi.Char>,
               sqlite3_uint64,
               ffi.Pointer<
                   ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>,
-              ffi.Uint8)>>('sqlite3_bind_text64');
+              ffi.UnsignedChar)>>('sqlite3_bind_text64');
   late final _sqlite3_bind_text64 = _sqlite3_bind_text64Ptr.asFunction<
       int Function(
           ffi.Pointer<sqlite3_stmt>,
           int,
-          ffi.Pointer<ffi.Int8>,
+          ffi.Pointer<ffi.Char>,
           int,
           ffi.Pointer<
               ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>,
@@ -3483,7 +3478,7 @@
 
   late final _sqlite3_bind_valuePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>, ffi.Int32,
+          ffi.Int Function(ffi.Pointer<sqlite3_stmt>, ffi.Int,
               ffi.Pointer<sqlite3_value>)>>('sqlite3_bind_value');
   late final _sqlite3_bind_value = _sqlite3_bind_valuePtr.asFunction<
       int Function(
@@ -3493,7 +3488,7 @@
     ffi.Pointer<sqlite3_stmt> arg0,
     int arg1,
     ffi.Pointer<ffi.Void> arg2,
-    ffi.Pointer<ffi.Int8> arg3,
+    ffi.Pointer<ffi.Char> arg3,
     ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
         arg4,
   ) {
@@ -3508,11 +3503,11 @@
 
   late final _sqlite3_bind_pointerPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<sqlite3_stmt>,
-              ffi.Int32,
+              ffi.Int,
               ffi.Pointer<ffi.Void>,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<ffi.Char>,
               ffi.Pointer<
                   ffi.NativeFunction<
                       ffi.Void Function(
@@ -3522,7 +3517,7 @@
           ffi.Pointer<sqlite3_stmt>,
           int,
           ffi.Pointer<ffi.Void>,
-          ffi.Pointer<ffi.Int8>,
+          ffi.Pointer<ffi.Char>,
           ffi.Pointer<
               ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>();
 
@@ -3540,8 +3535,8 @@
 
   late final _sqlite3_bind_zeroblobPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>, ffi.Int32,
-              ffi.Int32)>>('sqlite3_bind_zeroblob');
+          ffi.Int Function(ffi.Pointer<sqlite3_stmt>, ffi.Int,
+              ffi.Int)>>('sqlite3_bind_zeroblob');
   late final _sqlite3_bind_zeroblob = _sqlite3_bind_zeroblobPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>, int, int)>();
 
@@ -3559,7 +3554,7 @@
 
   late final _sqlite3_bind_zeroblob64Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>, ffi.Int32,
+          ffi.Int Function(ffi.Pointer<sqlite3_stmt>, ffi.Int,
               sqlite3_uint64)>>('sqlite3_bind_zeroblob64');
   late final _sqlite3_bind_zeroblob64 = _sqlite3_bind_zeroblob64Ptr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>, int, int)>();
@@ -3589,9 +3584,9 @@
     );
   }
 
-  late final _sqlite3_bind_parameter_countPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>)>>(
-      'sqlite3_bind_parameter_count');
+  late final _sqlite3_bind_parameter_countPtr =
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_stmt>)>>(
+          'sqlite3_bind_parameter_count');
   late final _sqlite3_bind_parameter_count = _sqlite3_bind_parameter_countPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>)>();
 
@@ -3619,7 +3614,7 @@
   /// See also: [sqlite3_bind_blob|sqlite3_bind()],
   /// [sqlite3_bind_parameter_count()], and
   /// [sqlite3_bind_parameter_index()].
-  ffi.Pointer<ffi.Int8> sqlite3_bind_parameter_name(
+  ffi.Pointer<ffi.Char> sqlite3_bind_parameter_name(
     ffi.Pointer<sqlite3_stmt> arg0,
     int arg1,
   ) {
@@ -3631,11 +3626,11 @@
 
   late final _sqlite3_bind_parameter_namePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3_stmt>,
-              ffi.Int32)>>('sqlite3_bind_parameter_name');
+          ffi.Pointer<ffi.Char> Function(ffi.Pointer<sqlite3_stmt>,
+              ffi.Int)>>('sqlite3_bind_parameter_name');
   late final _sqlite3_bind_parameter_name =
       _sqlite3_bind_parameter_namePtr.asFunction<
-          ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3_stmt>, int)>();
+          ffi.Pointer<ffi.Char> Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
   /// CAPI3REF: Index Of A Parameter With A Given Name
   /// METHOD: sqlite3_stmt
@@ -3653,7 +3648,7 @@
   /// [sqlite3_bind_parameter_name()].
   int sqlite3_bind_parameter_index(
     ffi.Pointer<sqlite3_stmt> arg0,
-    ffi.Pointer<ffi.Int8> zName,
+    ffi.Pointer<ffi.Char> zName,
   ) {
     return _sqlite3_bind_parameter_index(
       arg0,
@@ -3663,11 +3658,11 @@
 
   late final _sqlite3_bind_parameter_indexPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>,
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_bind_parameter_index');
+          ffi.Int Function(ffi.Pointer<sqlite3_stmt>,
+              ffi.Pointer<ffi.Char>)>>('sqlite3_bind_parameter_index');
   late final _sqlite3_bind_parameter_index =
       _sqlite3_bind_parameter_indexPtr.asFunction<
-          int Function(ffi.Pointer<sqlite3_stmt>, ffi.Pointer<ffi.Int8>)>();
+          int Function(ffi.Pointer<sqlite3_stmt>, ffi.Pointer<ffi.Char>)>();
 
   /// CAPI3REF: Reset All Bindings On A Prepared Statement
   /// METHOD: sqlite3_stmt
@@ -3683,9 +3678,9 @@
     );
   }
 
-  late final _sqlite3_clear_bindingsPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>)>>(
-      'sqlite3_clear_bindings');
+  late final _sqlite3_clear_bindingsPtr =
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_stmt>)>>(
+          'sqlite3_clear_bindings');
   late final _sqlite3_clear_bindings = _sqlite3_clear_bindingsPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>)>();
 
@@ -3709,9 +3704,9 @@
     );
   }
 
-  late final _sqlite3_column_countPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>)>>(
-      'sqlite3_column_count');
+  late final _sqlite3_column_countPtr =
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_stmt>)>>(
+          'sqlite3_column_count');
   late final _sqlite3_column_count = _sqlite3_column_countPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>)>();
 
@@ -3740,7 +3735,7 @@
   /// that column, if there is an AS clause.  If there is no AS clause
   /// then the name of the column is unspecified and may change from
   /// one release of SQLite to the next.
-  ffi.Pointer<ffi.Int8> sqlite3_column_name(
+  ffi.Pointer<ffi.Char> sqlite3_column_name(
     ffi.Pointer<sqlite3_stmt> arg0,
     int N,
   ) {
@@ -3752,10 +3747,10 @@
 
   late final _sqlite3_column_namePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(
-              ffi.Pointer<sqlite3_stmt>, ffi.Int32)>>('sqlite3_column_name');
+          ffi.Pointer<ffi.Char> Function(
+              ffi.Pointer<sqlite3_stmt>, ffi.Int)>>('sqlite3_column_name');
   late final _sqlite3_column_name = _sqlite3_column_namePtr.asFunction<
-      ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3_stmt>, int)>();
+      ffi.Pointer<ffi.Char> Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
   ffi.Pointer<ffi.Void> sqlite3_column_name16(
     ffi.Pointer<sqlite3_stmt> arg0,
@@ -3770,7 +3765,7 @@
   late final _sqlite3_column_name16Ptr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<ffi.Void> Function(
-              ffi.Pointer<sqlite3_stmt>, ffi.Int32)>>('sqlite3_column_name16');
+              ffi.Pointer<sqlite3_stmt>, ffi.Int)>>('sqlite3_column_name16');
   late final _sqlite3_column_name16 = _sqlite3_column_name16Ptr.asFunction<
       ffi.Pointer<ffi.Void> Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
@@ -3814,7 +3809,7 @@
   /// [sqlite3_column_database_name | column metadata interfaces]
   /// for the same [prepared statement] and result column
   /// at the same time then the results are undefined.
-  ffi.Pointer<ffi.Int8> sqlite3_column_database_name(
+  ffi.Pointer<ffi.Char> sqlite3_column_database_name(
     ffi.Pointer<sqlite3_stmt> arg0,
     int arg1,
   ) {
@@ -3826,11 +3821,11 @@
 
   late final _sqlite3_column_database_namePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3_stmt>,
-              ffi.Int32)>>('sqlite3_column_database_name');
+          ffi.Pointer<ffi.Char> Function(ffi.Pointer<sqlite3_stmt>,
+              ffi.Int)>>('sqlite3_column_database_name');
   late final _sqlite3_column_database_name =
       _sqlite3_column_database_namePtr.asFunction<
-          ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3_stmt>, int)>();
+          ffi.Pointer<ffi.Char> Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
   ffi.Pointer<ffi.Void> sqlite3_column_database_name16(
     ffi.Pointer<sqlite3_stmt> arg0,
@@ -3845,12 +3840,12 @@
   late final _sqlite3_column_database_name16Ptr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<ffi.Void> Function(ffi.Pointer<sqlite3_stmt>,
-              ffi.Int32)>>('sqlite3_column_database_name16');
+              ffi.Int)>>('sqlite3_column_database_name16');
   late final _sqlite3_column_database_name16 =
       _sqlite3_column_database_name16Ptr.asFunction<
           ffi.Pointer<ffi.Void> Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
-  ffi.Pointer<ffi.Int8> sqlite3_column_table_name(
+  ffi.Pointer<ffi.Char> sqlite3_column_table_name(
     ffi.Pointer<sqlite3_stmt> arg0,
     int arg1,
   ) {
@@ -3862,11 +3857,11 @@
 
   late final _sqlite3_column_table_namePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3_stmt>,
-              ffi.Int32)>>('sqlite3_column_table_name');
+          ffi.Pointer<ffi.Char> Function(ffi.Pointer<sqlite3_stmt>,
+              ffi.Int)>>('sqlite3_column_table_name');
   late final _sqlite3_column_table_name =
       _sqlite3_column_table_namePtr.asFunction<
-          ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3_stmt>, int)>();
+          ffi.Pointer<ffi.Char> Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
   ffi.Pointer<ffi.Void> sqlite3_column_table_name16(
     ffi.Pointer<sqlite3_stmt> arg0,
@@ -3881,12 +3876,12 @@
   late final _sqlite3_column_table_name16Ptr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<ffi.Void> Function(ffi.Pointer<sqlite3_stmt>,
-              ffi.Int32)>>('sqlite3_column_table_name16');
+              ffi.Int)>>('sqlite3_column_table_name16');
   late final _sqlite3_column_table_name16 =
       _sqlite3_column_table_name16Ptr.asFunction<
           ffi.Pointer<ffi.Void> Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
-  ffi.Pointer<ffi.Int8> sqlite3_column_origin_name(
+  ffi.Pointer<ffi.Char> sqlite3_column_origin_name(
     ffi.Pointer<sqlite3_stmt> arg0,
     int arg1,
   ) {
@@ -3898,11 +3893,11 @@
 
   late final _sqlite3_column_origin_namePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3_stmt>,
-              ffi.Int32)>>('sqlite3_column_origin_name');
+          ffi.Pointer<ffi.Char> Function(ffi.Pointer<sqlite3_stmt>,
+              ffi.Int)>>('sqlite3_column_origin_name');
   late final _sqlite3_column_origin_name =
       _sqlite3_column_origin_namePtr.asFunction<
-          ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3_stmt>, int)>();
+          ffi.Pointer<ffi.Char> Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
   ffi.Pointer<ffi.Void> sqlite3_column_origin_name16(
     ffi.Pointer<sqlite3_stmt> arg0,
@@ -3917,7 +3912,7 @@
   late final _sqlite3_column_origin_name16Ptr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<ffi.Void> Function(ffi.Pointer<sqlite3_stmt>,
-              ffi.Int32)>>('sqlite3_column_origin_name16');
+              ffi.Int)>>('sqlite3_column_origin_name16');
   late final _sqlite3_column_origin_name16 =
       _sqlite3_column_origin_name16Ptr.asFunction<
           ffi.Pointer<ffi.Void> Function(ffi.Pointer<sqlite3_stmt>, int)>();
@@ -3950,7 +3945,7 @@
   /// strongly typed, but the typing is dynamic not static.  ^Type
   /// is associated with individual values, not with the containers
   /// used to hold those values.
-  ffi.Pointer<ffi.Int8> sqlite3_column_decltype(
+  ffi.Pointer<ffi.Char> sqlite3_column_decltype(
     ffi.Pointer<sqlite3_stmt> arg0,
     int arg1,
   ) {
@@ -3962,10 +3957,10 @@
 
   late final _sqlite3_column_decltypePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3_stmt>,
-              ffi.Int32)>>('sqlite3_column_decltype');
+          ffi.Pointer<ffi.Char> Function(
+              ffi.Pointer<sqlite3_stmt>, ffi.Int)>>('sqlite3_column_decltype');
   late final _sqlite3_column_decltype = _sqlite3_column_decltypePtr.asFunction<
-      ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3_stmt>, int)>();
+      ffi.Pointer<ffi.Char> Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
   ffi.Pointer<ffi.Void> sqlite3_column_decltype16(
     ffi.Pointer<sqlite3_stmt> arg0,
@@ -3980,7 +3975,7 @@
   late final _sqlite3_column_decltype16Ptr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<ffi.Void> Function(ffi.Pointer<sqlite3_stmt>,
-              ffi.Int32)>>('sqlite3_column_decltype16');
+              ffi.Int)>>('sqlite3_column_decltype16');
   late final _sqlite3_column_decltype16 =
       _sqlite3_column_decltype16Ptr.asFunction<
           ffi.Pointer<ffi.Void> Function(ffi.Pointer<sqlite3_stmt>, int)>();
@@ -4073,9 +4068,9 @@
     );
   }
 
-  late final _sqlite3_stepPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>)>>(
-      'sqlite3_step');
+  late final _sqlite3_stepPtr =
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_stmt>)>>(
+          'sqlite3_step');
   late final _sqlite3_step =
       _sqlite3_stepPtr.asFunction<int Function(ffi.Pointer<sqlite3_stmt>)>();
 
@@ -4104,9 +4099,9 @@
     );
   }
 
-  late final _sqlite3_data_countPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>)>>(
-      'sqlite3_data_count');
+  late final _sqlite3_data_countPtr =
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_stmt>)>>(
+          'sqlite3_data_count');
   late final _sqlite3_data_count = _sqlite3_data_countPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>)>();
 
@@ -4330,7 +4325,7 @@
   late final _sqlite3_column_blobPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<ffi.Void> Function(
-              ffi.Pointer<sqlite3_stmt>, ffi.Int32)>>('sqlite3_column_blob');
+              ffi.Pointer<sqlite3_stmt>, ffi.Int)>>('sqlite3_column_blob');
   late final _sqlite3_column_blob = _sqlite3_column_blobPtr.asFunction<
       ffi.Pointer<ffi.Void> Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
@@ -4347,7 +4342,7 @@
   late final _sqlite3_column_doublePtr = _lookup<
       ffi.NativeFunction<
           ffi.Double Function(
-              ffi.Pointer<sqlite3_stmt>, ffi.Int32)>>('sqlite3_column_double');
+              ffi.Pointer<sqlite3_stmt>, ffi.Int)>>('sqlite3_column_double');
   late final _sqlite3_column_double = _sqlite3_column_doublePtr
       .asFunction<double Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
@@ -4363,8 +4358,8 @@
 
   late final _sqlite3_column_intPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<sqlite3_stmt>, ffi.Int32)>>('sqlite3_column_int');
+          ffi.Int Function(
+              ffi.Pointer<sqlite3_stmt>, ffi.Int)>>('sqlite3_column_int');
   late final _sqlite3_column_int = _sqlite3_column_intPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
@@ -4381,11 +4376,11 @@
   late final _sqlite3_column_int64Ptr = _lookup<
       ffi.NativeFunction<
           sqlite3_int64 Function(
-              ffi.Pointer<sqlite3_stmt>, ffi.Int32)>>('sqlite3_column_int64');
+              ffi.Pointer<sqlite3_stmt>, ffi.Int)>>('sqlite3_column_int64');
   late final _sqlite3_column_int64 = _sqlite3_column_int64Ptr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
-  ffi.Pointer<ffi.Uint8> sqlite3_column_text(
+  ffi.Pointer<ffi.UnsignedChar> sqlite3_column_text(
     ffi.Pointer<sqlite3_stmt> arg0,
     int iCol,
   ) {
@@ -4397,10 +4392,10 @@
 
   late final _sqlite3_column_textPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Uint8> Function(
-              ffi.Pointer<sqlite3_stmt>, ffi.Int32)>>('sqlite3_column_text');
+          ffi.Pointer<ffi.UnsignedChar> Function(
+              ffi.Pointer<sqlite3_stmt>, ffi.Int)>>('sqlite3_column_text');
   late final _sqlite3_column_text = _sqlite3_column_textPtr.asFunction<
-      ffi.Pointer<ffi.Uint8> Function(ffi.Pointer<sqlite3_stmt>, int)>();
+      ffi.Pointer<ffi.UnsignedChar> Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
   ffi.Pointer<ffi.Void> sqlite3_column_text16(
     ffi.Pointer<sqlite3_stmt> arg0,
@@ -4415,7 +4410,7 @@
   late final _sqlite3_column_text16Ptr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<ffi.Void> Function(
-              ffi.Pointer<sqlite3_stmt>, ffi.Int32)>>('sqlite3_column_text16');
+              ffi.Pointer<sqlite3_stmt>, ffi.Int)>>('sqlite3_column_text16');
   late final _sqlite3_column_text16 = _sqlite3_column_text16Ptr.asFunction<
       ffi.Pointer<ffi.Void> Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
@@ -4432,7 +4427,7 @@
   late final _sqlite3_column_valuePtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<sqlite3_value> Function(
-              ffi.Pointer<sqlite3_stmt>, ffi.Int32)>>('sqlite3_column_value');
+              ffi.Pointer<sqlite3_stmt>, ffi.Int)>>('sqlite3_column_value');
   late final _sqlite3_column_value = _sqlite3_column_valuePtr.asFunction<
       ffi.Pointer<sqlite3_value> Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
@@ -4448,8 +4443,8 @@
 
   late final _sqlite3_column_bytesPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<sqlite3_stmt>, ffi.Int32)>>('sqlite3_column_bytes');
+          ffi.Int Function(
+              ffi.Pointer<sqlite3_stmt>, ffi.Int)>>('sqlite3_column_bytes');
   late final _sqlite3_column_bytes = _sqlite3_column_bytesPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
@@ -4465,8 +4460,8 @@
 
   late final _sqlite3_column_bytes16Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<sqlite3_stmt>, ffi.Int32)>>('sqlite3_column_bytes16');
+          ffi.Int Function(
+              ffi.Pointer<sqlite3_stmt>, ffi.Int)>>('sqlite3_column_bytes16');
   late final _sqlite3_column_bytes16 = _sqlite3_column_bytes16Ptr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
@@ -4482,8 +4477,8 @@
 
   late final _sqlite3_column_typePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<sqlite3_stmt>, ffi.Int32)>>('sqlite3_column_type');
+          ffi.Int Function(
+              ffi.Pointer<sqlite3_stmt>, ffi.Int)>>('sqlite3_column_type');
   late final _sqlite3_column_type = _sqlite3_column_typePtr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
@@ -4519,9 +4514,9 @@
     );
   }
 
-  late final _sqlite3_finalizePtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>)>>(
-      'sqlite3_finalize');
+  late final _sqlite3_finalizePtr =
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_stmt>)>>(
+          'sqlite3_finalize');
   late final _sqlite3_finalize = _sqlite3_finalizePtr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>)>();
 
@@ -4556,9 +4551,9 @@
     );
   }
 
-  late final _sqlite3_resetPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>)>>(
-      'sqlite3_reset');
+  late final _sqlite3_resetPtr =
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_stmt>)>>(
+          'sqlite3_reset');
   late final _sqlite3_reset =
       _sqlite3_resetPtr.asFunction<int Function(ffi.Pointer<sqlite3_stmt>)>();
 
@@ -4687,18 +4682,18 @@
   /// statement in which the function is running.
   int sqlite3_create_function(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zFunctionName,
+    ffi.Pointer<ffi.Char> zFunctionName,
     int nArg,
     int eTextRep,
     ffi.Pointer<ffi.Void> pApp,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int32,
+                ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int,
                     ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>
         xFunc,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int32,
+                ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int,
                     ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>
         xStep,
     ffi.Pointer<
@@ -4720,23 +4715,23 @@
   late final _sqlite3_create_functionPtr =
       _lookup<
               ffi.NativeFunction<
-                  ffi.Int32 Function(
+                  ffi.Int Function(
                       ffi.Pointer<sqlite3>,
-                      ffi.Pointer<ffi.Int8>,
-                      ffi.Int32,
-                      ffi.Int32,
+                      ffi.Pointer<ffi.Char>,
+                      ffi.Int,
+                      ffi.Int,
                       ffi.Pointer<ffi.Void>,
                       ffi.Pointer<
                           ffi.NativeFunction<
                               ffi.Void Function(
                                   ffi.Pointer<sqlite3_context>,
-                                  ffi.Int32,
+                                  ffi.Int,
                                   ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
                       ffi.Pointer<
                           ffi.NativeFunction<
                               ffi.Void Function(
                                   ffi.Pointer<sqlite3_context>,
-                                  ffi.Int32,
+                                  ffi.Int,
                                   ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
                       ffi.Pointer<
                           ffi.NativeFunction<
@@ -4746,17 +4741,17 @@
   late final _sqlite3_create_function = _sqlite3_create_functionPtr.asFunction<
       int Function(
           ffi.Pointer<sqlite3>,
-          ffi.Pointer<ffi.Int8>,
+          ffi.Pointer<ffi.Char>,
           int,
           int,
           ffi.Pointer<ffi.Void>,
           ffi.Pointer<
               ffi.NativeFunction<
-                  ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int32,
+                  ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int,
                       ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
           ffi.Pointer<
               ffi.NativeFunction<
-                  ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int32,
+                  ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int,
                       ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
           ffi.Pointer<
               ffi.NativeFunction<
@@ -4770,12 +4765,12 @@
     ffi.Pointer<ffi.Void> pApp,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int32,
+                ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int,
                     ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>
         xFunc,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int32,
+                ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int,
                     ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>
         xStep,
     ffi.Pointer<
@@ -4797,23 +4792,23 @@
   late final _sqlite3_create_function16Ptr =
       _lookup<
               ffi.NativeFunction<
-                  ffi.Int32 Function(
+                  ffi.Int Function(
                       ffi.Pointer<sqlite3>,
                       ffi.Pointer<ffi.Void>,
-                      ffi.Int32,
-                      ffi.Int32,
+                      ffi.Int,
+                      ffi.Int,
                       ffi.Pointer<ffi.Void>,
                       ffi.Pointer<
                           ffi.NativeFunction<
                               ffi.Void Function(
                                   ffi.Pointer<sqlite3_context>,
-                                  ffi.Int32,
+                                  ffi.Int,
                                   ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
                       ffi.Pointer<
                           ffi.NativeFunction<
                               ffi.Void Function(
                                   ffi.Pointer<sqlite3_context>,
-                                  ffi.Int32,
+                                  ffi.Int,
                                   ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
                       ffi.Pointer<
                           ffi.NativeFunction<
@@ -4830,11 +4825,11 @@
               ffi.Pointer<ffi.Void>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int32,
+                      ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int,
                           ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int32,
+                      ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int,
                           ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
               ffi.Pointer<
                   ffi.NativeFunction<
@@ -4842,18 +4837,18 @@
 
   int sqlite3_create_function_v2(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zFunctionName,
+    ffi.Pointer<ffi.Char> zFunctionName,
     int nArg,
     int eTextRep,
     ffi.Pointer<ffi.Void> pApp,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int32,
+                ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int,
                     ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>
         xFunc,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int32,
+                ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int,
                     ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>
         xStep,
     ffi.Pointer<
@@ -4878,23 +4873,23 @@
   late final _sqlite3_create_function_v2Ptr =
       _lookup<
               ffi.NativeFunction<
-                  ffi.Int32 Function(
+                  ffi.Int Function(
                       ffi.Pointer<sqlite3>,
-                      ffi.Pointer<ffi.Int8>,
-                      ffi.Int32,
-                      ffi.Int32,
+                      ffi.Pointer<ffi.Char>,
+                      ffi.Int,
+                      ffi.Int,
                       ffi.Pointer<ffi.Void>,
                       ffi.Pointer<
                           ffi.NativeFunction<
                               ffi.Void Function(
                                   ffi.Pointer<sqlite3_context>,
-                                  ffi.Int32,
+                                  ffi.Int,
                                   ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
                       ffi.Pointer<
                           ffi.NativeFunction<
                               ffi.Void Function(
                                   ffi.Pointer<sqlite3_context>,
-                                  ffi.Int32,
+                                  ffi.Int,
                                   ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
                       ffi.Pointer<
                           ffi.NativeFunction<
@@ -4907,17 +4902,17 @@
       _sqlite3_create_function_v2Ptr.asFunction<
           int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<ffi.Char>,
               int,
               int,
               ffi.Pointer<ffi.Void>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int32,
+                      ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int,
                           ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int32,
+                      ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int,
                           ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
               ffi.Pointer<
                   ffi.NativeFunction<
@@ -4928,13 +4923,13 @@
 
   int sqlite3_create_window_function(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zFunctionName,
+    ffi.Pointer<ffi.Char> zFunctionName,
     int nArg,
     int eTextRep,
     ffi.Pointer<ffi.Void> pApp,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int32,
+                ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int,
                     ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>
         xStep,
     ffi.Pointer<
@@ -4945,7 +4940,7 @@
         xValue,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int32,
+                ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int,
                     ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>
         xInverse,
     ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
@@ -4968,17 +4963,17 @@
   late final _sqlite3_create_window_functionPtr =
       _lookup<
               ffi.NativeFunction<
-                  ffi.Int32 Function(
+                  ffi.Int Function(
                       ffi.Pointer<sqlite3>,
-                      ffi.Pointer<ffi.Int8>,
-                      ffi.Int32,
-                      ffi.Int32,
+                      ffi.Pointer<ffi.Char>,
+                      ffi.Int,
+                      ffi.Int,
                       ffi.Pointer<ffi.Void>,
                       ffi.Pointer<
                           ffi.NativeFunction<
                               ffi.Void Function(
                                   ffi.Pointer<sqlite3_context>,
-                                  ffi.Int32,
+                                  ffi.Int,
                                   ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
                       ffi.Pointer<
                           ffi.NativeFunction<
@@ -4990,7 +4985,7 @@
                           ffi.NativeFunction<
                               ffi.Void Function(
                                   ffi.Pointer<sqlite3_context>,
-                                  ffi.Int32,
+                                  ffi.Int,
                                   ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
                       ffi.Pointer<
                           ffi.NativeFunction<
@@ -5000,13 +4995,13 @@
       _sqlite3_create_window_functionPtr.asFunction<
           int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<ffi.Char>,
               int,
               int,
               ffi.Pointer<ffi.Void>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int32,
+                      ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int,
                           ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
               ffi.Pointer<
                   ffi.NativeFunction<
@@ -5016,7 +5011,7 @@
                       ffi.Void Function(ffi.Pointer<sqlite3_context>)>>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int32,
+                      ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int,
                           ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
               ffi.Pointer<
                   ffi.NativeFunction<
@@ -5031,7 +5026,7 @@
   }
 
   late final _sqlite3_aggregate_countPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_context>)>>(
+          ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_context>)>>(
       'sqlite3_aggregate_count');
   late final _sqlite3_aggregate_count = _sqlite3_aggregate_countPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_context>)>();
@@ -5044,9 +5039,9 @@
     );
   }
 
-  late final _sqlite3_expiredPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>)>>(
-      'sqlite3_expired');
+  late final _sqlite3_expiredPtr =
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_stmt>)>>(
+          'sqlite3_expired');
   late final _sqlite3_expired =
       _sqlite3_expiredPtr.asFunction<int Function(ffi.Pointer<sqlite3_stmt>)>();
 
@@ -5062,7 +5057,7 @@
 
   late final _sqlite3_transfer_bindingsPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>,
+          ffi.Int Function(ffi.Pointer<sqlite3_stmt>,
               ffi.Pointer<sqlite3_stmt>)>>('sqlite3_transfer_bindings');
   late final _sqlite3_transfer_bindings =
       _sqlite3_transfer_bindingsPtr.asFunction<
@@ -5073,8 +5068,7 @@
   }
 
   late final _sqlite3_global_recoverPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function()>>(
-          'sqlite3_global_recover');
+      _lookup<ffi.NativeFunction<ffi.Int Function()>>('sqlite3_global_recover');
   late final _sqlite3_global_recover =
       _sqlite3_global_recoverPtr.asFunction<int Function()>();
 
@@ -5092,7 +5086,7 @@
     ffi.Pointer<
             ffi.NativeFunction<
                 ffi.Void Function(
-                    ffi.Pointer<ffi.Void>, sqlite3_int64, ffi.Int32)>>
+                    ffi.Pointer<ffi.Void>, sqlite3_int64, ffi.Int)>>
         arg0,
     ffi.Pointer<ffi.Void> arg1,
     int arg2,
@@ -5106,11 +5100,11 @@
 
   late final _sqlite3_memory_alarmPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<
                   ffi.NativeFunction<
                       ffi.Void Function(
-                          ffi.Pointer<ffi.Void>, sqlite3_int64, ffi.Int32)>>,
+                          ffi.Pointer<ffi.Void>, sqlite3_int64, ffi.Int)>>,
               ffi.Pointer<ffi.Void>,
               sqlite3_int64)>>('sqlite3_memory_alarm');
   late final _sqlite3_memory_alarm = _sqlite3_memory_alarmPtr.asFunction<
@@ -5118,7 +5112,7 @@
           ffi.Pointer<
               ffi.NativeFunction<
                   ffi.Void Function(
-                      ffi.Pointer<ffi.Void>, sqlite3_int64, ffi.Int32)>>,
+                      ffi.Pointer<ffi.Void>, sqlite3_int64, ffi.Int)>>,
           ffi.Pointer<ffi.Void>,
           int)>();
 
@@ -5285,9 +5279,9 @@
     );
   }
 
-  late final _sqlite3_value_intPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_value>)>>(
-      'sqlite3_value_int');
+  late final _sqlite3_value_intPtr =
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_value>)>>(
+          'sqlite3_value_int');
   late final _sqlite3_value_int = _sqlite3_value_intPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_value>)>();
 
@@ -5308,7 +5302,7 @@
 
   ffi.Pointer<ffi.Void> sqlite3_value_pointer(
     ffi.Pointer<sqlite3_value> arg0,
-    ffi.Pointer<ffi.Int8> arg1,
+    ffi.Pointer<ffi.Char> arg1,
   ) {
     return _sqlite3_value_pointer(
       arg0,
@@ -5319,12 +5313,12 @@
   late final _sqlite3_value_pointerPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<ffi.Void> Function(ffi.Pointer<sqlite3_value>,
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_value_pointer');
+              ffi.Pointer<ffi.Char>)>>('sqlite3_value_pointer');
   late final _sqlite3_value_pointer = _sqlite3_value_pointerPtr.asFunction<
       ffi.Pointer<ffi.Void> Function(
-          ffi.Pointer<sqlite3_value>, ffi.Pointer<ffi.Int8>)>();
+          ffi.Pointer<sqlite3_value>, ffi.Pointer<ffi.Char>)>();
 
-  ffi.Pointer<ffi.Uint8> sqlite3_value_text(
+  ffi.Pointer<ffi.UnsignedChar> sqlite3_value_text(
     ffi.Pointer<sqlite3_value> arg0,
   ) {
     return _sqlite3_value_text(
@@ -5334,10 +5328,10 @@
 
   late final _sqlite3_value_textPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Uint8> Function(
+          ffi.Pointer<ffi.UnsignedChar> Function(
               ffi.Pointer<sqlite3_value>)>>('sqlite3_value_text');
   late final _sqlite3_value_text = _sqlite3_value_textPtr.asFunction<
-      ffi.Pointer<ffi.Uint8> Function(ffi.Pointer<sqlite3_value>)>();
+      ffi.Pointer<ffi.UnsignedChar> Function(ffi.Pointer<sqlite3_value>)>();
 
   ffi.Pointer<ffi.Void> sqlite3_value_text16(
     ffi.Pointer<sqlite3_value> arg0,
@@ -5392,9 +5386,9 @@
     );
   }
 
-  late final _sqlite3_value_bytesPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_value>)>>(
-      'sqlite3_value_bytes');
+  late final _sqlite3_value_bytesPtr =
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_value>)>>(
+          'sqlite3_value_bytes');
   late final _sqlite3_value_bytes = _sqlite3_value_bytesPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_value>)>();
 
@@ -5406,9 +5400,9 @@
     );
   }
 
-  late final _sqlite3_value_bytes16Ptr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_value>)>>(
-      'sqlite3_value_bytes16');
+  late final _sqlite3_value_bytes16Ptr =
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_value>)>>(
+          'sqlite3_value_bytes16');
   late final _sqlite3_value_bytes16 = _sqlite3_value_bytes16Ptr
       .asFunction<int Function(ffi.Pointer<sqlite3_value>)>();
 
@@ -5420,9 +5414,9 @@
     );
   }
 
-  late final _sqlite3_value_typePtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_value>)>>(
-      'sqlite3_value_type');
+  late final _sqlite3_value_typePtr =
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_value>)>>(
+          'sqlite3_value_type');
   late final _sqlite3_value_type = _sqlite3_value_typePtr
       .asFunction<int Function(ffi.Pointer<sqlite3_value>)>();
 
@@ -5434,9 +5428,9 @@
     );
   }
 
-  late final _sqlite3_value_numeric_typePtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_value>)>>(
-      'sqlite3_value_numeric_type');
+  late final _sqlite3_value_numeric_typePtr =
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_value>)>>(
+          'sqlite3_value_numeric_type');
   late final _sqlite3_value_numeric_type = _sqlite3_value_numeric_typePtr
       .asFunction<int Function(ffi.Pointer<sqlite3_value>)>();
 
@@ -5448,9 +5442,9 @@
     );
   }
 
-  late final _sqlite3_value_nochangePtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_value>)>>(
-      'sqlite3_value_nochange');
+  late final _sqlite3_value_nochangePtr =
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_value>)>>(
+          'sqlite3_value_nochange');
   late final _sqlite3_value_nochange = _sqlite3_value_nochangePtr
       .asFunction<int Function(ffi.Pointer<sqlite3_value>)>();
 
@@ -5462,9 +5456,9 @@
     );
   }
 
-  late final _sqlite3_value_frombindPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_value>)>>(
-      'sqlite3_value_frombind');
+  late final _sqlite3_value_frombindPtr =
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_value>)>>(
+          'sqlite3_value_frombind');
   late final _sqlite3_value_frombind = _sqlite3_value_frombindPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_value>)>();
 
@@ -5485,8 +5479,9 @@
   }
 
   late final _sqlite3_value_subtypePtr = _lookup<
-          ffi.NativeFunction<ffi.Uint32 Function(ffi.Pointer<sqlite3_value>)>>(
-      'sqlite3_value_subtype');
+      ffi.NativeFunction<
+          ffi.UnsignedInt Function(
+              ffi.Pointer<sqlite3_value>)>>('sqlite3_value_subtype');
   late final _sqlite3_value_subtype = _sqlite3_value_subtypePtr
       .asFunction<int Function(ffi.Pointer<sqlite3_value>)>();
 
@@ -5585,7 +5580,7 @@
   late final _sqlite3_aggregate_contextPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<ffi.Void> Function(ffi.Pointer<sqlite3_context>,
-              ffi.Int32)>>('sqlite3_aggregate_context');
+              ffi.Int)>>('sqlite3_aggregate_context');
   late final _sqlite3_aggregate_context =
       _sqlite3_aggregate_contextPtr.asFunction<
           ffi.Pointer<ffi.Void> Function(ffi.Pointer<sqlite3_context>, int)>();
@@ -5708,7 +5703,7 @@
   late final _sqlite3_get_auxdataPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<ffi.Void> Function(
-              ffi.Pointer<sqlite3_context>, ffi.Int32)>>('sqlite3_get_auxdata');
+              ffi.Pointer<sqlite3_context>, ffi.Int)>>('sqlite3_get_auxdata');
   late final _sqlite3_get_auxdata = _sqlite3_get_auxdataPtr.asFunction<
       ffi.Pointer<ffi.Void> Function(ffi.Pointer<sqlite3_context>, int)>();
 
@@ -5731,7 +5726,7 @@
       ffi.NativeFunction<
           ffi.Void Function(
               ffi.Pointer<sqlite3_context>,
-              ffi.Int32,
+              ffi.Int,
               ffi.Pointer<ffi.Void>,
               ffi.Pointer<
                   ffi.NativeFunction<
@@ -5909,7 +5904,7 @@
           ffi.Void Function(
               ffi.Pointer<sqlite3_context>,
               ffi.Pointer<ffi.Void>,
-              ffi.Int32,
+              ffi.Int,
               ffi.Pointer<
                   ffi.NativeFunction<
                       ffi.Void Function(
@@ -5974,7 +5969,7 @@
 
   void sqlite3_result_error(
     ffi.Pointer<sqlite3_context> arg0,
-    ffi.Pointer<ffi.Int8> arg1,
+    ffi.Pointer<ffi.Char> arg1,
     int arg2,
   ) {
     return _sqlite3_result_error(
@@ -5986,11 +5981,11 @@
 
   late final _sqlite3_result_errorPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Pointer<ffi.Int8>,
-              ffi.Int32)>>('sqlite3_result_error');
+          ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Pointer<ffi.Char>,
+              ffi.Int)>>('sqlite3_result_error');
   late final _sqlite3_result_error = _sqlite3_result_errorPtr.asFunction<
       void Function(
-          ffi.Pointer<sqlite3_context>, ffi.Pointer<ffi.Int8>, int)>();
+          ffi.Pointer<sqlite3_context>, ffi.Pointer<ffi.Char>, int)>();
 
   void sqlite3_result_error16(
     ffi.Pointer<sqlite3_context> arg0,
@@ -6007,7 +6002,7 @@
   late final _sqlite3_result_error16Ptr = _lookup<
       ffi.NativeFunction<
           ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Pointer<ffi.Void>,
-              ffi.Int32)>>('sqlite3_result_error16');
+              ffi.Int)>>('sqlite3_result_error16');
   late final _sqlite3_result_error16 = _sqlite3_result_error16Ptr.asFunction<
       void Function(
           ffi.Pointer<sqlite3_context>, ffi.Pointer<ffi.Void>, int)>();
@@ -6053,7 +6048,7 @@
   late final _sqlite3_result_error_codePtr = _lookup<
       ffi.NativeFunction<
           ffi.Void Function(ffi.Pointer<sqlite3_context>,
-              ffi.Int32)>>('sqlite3_result_error_code');
+              ffi.Int)>>('sqlite3_result_error_code');
   late final _sqlite3_result_error_code = _sqlite3_result_error_codePtr
       .asFunction<void Function(ffi.Pointer<sqlite3_context>, int)>();
 
@@ -6070,7 +6065,7 @@
   late final _sqlite3_result_intPtr = _lookup<
       ffi.NativeFunction<
           ffi.Void Function(
-              ffi.Pointer<sqlite3_context>, ffi.Int32)>>('sqlite3_result_int');
+              ffi.Pointer<sqlite3_context>, ffi.Int)>>('sqlite3_result_int');
   late final _sqlite3_result_int = _sqlite3_result_intPtr
       .asFunction<void Function(ffi.Pointer<sqlite3_context>, int)>();
 
@@ -6107,7 +6102,7 @@
 
   void sqlite3_result_text(
     ffi.Pointer<sqlite3_context> arg0,
-    ffi.Pointer<ffi.Int8> arg1,
+    ffi.Pointer<ffi.Char> arg1,
     int arg2,
     ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
         arg3,
@@ -6124,8 +6119,8 @@
       ffi.NativeFunction<
           ffi.Void Function(
               ffi.Pointer<sqlite3_context>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Int32,
+              ffi.Pointer<ffi.Char>,
+              ffi.Int,
               ffi.Pointer<
                   ffi.NativeFunction<
                       ffi.Void Function(
@@ -6133,14 +6128,14 @@
   late final _sqlite3_result_text = _sqlite3_result_textPtr.asFunction<
       void Function(
           ffi.Pointer<sqlite3_context>,
-          ffi.Pointer<ffi.Int8>,
+          ffi.Pointer<ffi.Char>,
           int,
           ffi.Pointer<
               ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>();
 
   void sqlite3_result_text64(
     ffi.Pointer<sqlite3_context> arg0,
-    ffi.Pointer<ffi.Int8> arg1,
+    ffi.Pointer<ffi.Char> arg1,
     int arg2,
     ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
         arg3,
@@ -6159,15 +6154,15 @@
       ffi.NativeFunction<
           ffi.Void Function(
               ffi.Pointer<sqlite3_context>,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<ffi.Char>,
               sqlite3_uint64,
               ffi.Pointer<
                   ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>,
-              ffi.Uint8)>>('sqlite3_result_text64');
+              ffi.UnsignedChar)>>('sqlite3_result_text64');
   late final _sqlite3_result_text64 = _sqlite3_result_text64Ptr.asFunction<
       void Function(
           ffi.Pointer<sqlite3_context>,
-          ffi.Pointer<ffi.Int8>,
+          ffi.Pointer<ffi.Char>,
           int,
           ffi.Pointer<
               ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>,
@@ -6193,7 +6188,7 @@
           ffi.Void Function(
               ffi.Pointer<sqlite3_context>,
               ffi.Pointer<ffi.Void>,
-              ffi.Int32,
+              ffi.Int,
               ffi.Pointer<
                   ffi.NativeFunction<
                       ffi.Void Function(
@@ -6226,7 +6221,7 @@
               ffi.Void Function(
                   ffi.Pointer<sqlite3_context>,
                   ffi.Pointer<ffi.Void>,
-                  ffi.Int32,
+                  ffi.Int,
                   ffi.Pointer<
                       ffi.NativeFunction<
                           ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>>(
@@ -6259,7 +6254,7 @@
               ffi.Void Function(
                   ffi.Pointer<sqlite3_context>,
                   ffi.Pointer<ffi.Void>,
-                  ffi.Int32,
+                  ffi.Int,
                   ffi.Pointer<
                       ffi.NativeFunction<
                           ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>>(
@@ -6293,7 +6288,7 @@
   void sqlite3_result_pointer(
     ffi.Pointer<sqlite3_context> arg0,
     ffi.Pointer<ffi.Void> arg1,
-    ffi.Pointer<ffi.Int8> arg2,
+    ffi.Pointer<ffi.Char> arg2,
     ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
         arg3,
   ) {
@@ -6310,7 +6305,7 @@
           ffi.Void Function(
               ffi.Pointer<sqlite3_context>,
               ffi.Pointer<ffi.Void>,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<ffi.Char>,
               ffi.Pointer<
                   ffi.NativeFunction<
                       ffi.Void Function(
@@ -6319,7 +6314,7 @@
       void Function(
           ffi.Pointer<sqlite3_context>,
           ffi.Pointer<ffi.Void>,
-          ffi.Pointer<ffi.Int8>,
+          ffi.Pointer<ffi.Char>,
           ffi.Pointer<
               ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>();
 
@@ -6336,7 +6331,7 @@
   late final _sqlite3_result_zeroblobPtr = _lookup<
       ffi.NativeFunction<
           ffi.Void Function(ffi.Pointer<sqlite3_context>,
-              ffi.Int32)>>('sqlite3_result_zeroblob');
+              ffi.Int)>>('sqlite3_result_zeroblob');
   late final _sqlite3_result_zeroblob = _sqlite3_result_zeroblobPtr
       .asFunction<void Function(ffi.Pointer<sqlite3_context>, int)>();
 
@@ -6352,7 +6347,7 @@
 
   late final _sqlite3_result_zeroblob64Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_context>,
+          ffi.Int Function(ffi.Pointer<sqlite3_context>,
               sqlite3_uint64)>>('sqlite3_result_zeroblob64');
   late final _sqlite3_result_zeroblob64 = _sqlite3_result_zeroblob64Ptr
       .asFunction<int Function(ffi.Pointer<sqlite3_context>, int)>();
@@ -6380,7 +6375,7 @@
   late final _sqlite3_result_subtypePtr = _lookup<
       ffi.NativeFunction<
           ffi.Void Function(ffi.Pointer<sqlite3_context>,
-              ffi.Uint32)>>('sqlite3_result_subtype');
+              ffi.UnsignedInt)>>('sqlite3_result_subtype');
   late final _sqlite3_result_subtype = _sqlite3_result_subtypePtr
       .asFunction<void Function(ffi.Pointer<sqlite3_context>, int)>();
 
@@ -6465,13 +6460,13 @@
   /// See also:  [sqlite3_collation_needed()] and [sqlite3_collation_needed16()].
   int sqlite3_create_collation(
     ffi.Pointer<sqlite3> arg0,
-    ffi.Pointer<ffi.Int8> zName,
+    ffi.Pointer<ffi.Char> zName,
     int eTextRep,
     ffi.Pointer<ffi.Void> pArg,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Int32 Function(ffi.Pointer<ffi.Void>, ffi.Int32,
-                    ffi.Pointer<ffi.Void>, ffi.Int32, ffi.Pointer<ffi.Void>)>>
+                ffi.Int Function(ffi.Pointer<ffi.Void>, ffi.Int,
+                    ffi.Pointer<ffi.Void>, ffi.Int, ffi.Pointer<ffi.Void>)>>
         xCompare,
   ) {
     return _sqlite3_create_collation(
@@ -6485,45 +6480,45 @@
 
   late final _sqlite3_create_collationPtr = _lookup<
           ffi.NativeFunction<
-              ffi.Int32 Function(
+              ffi.Int Function(
                   ffi.Pointer<sqlite3>,
-                  ffi.Pointer<ffi.Int8>,
-                  ffi.Int32,
+                  ffi.Pointer<ffi.Char>,
+                  ffi.Int,
                   ffi.Pointer<ffi.Void>,
                   ffi.Pointer<
                       ffi.NativeFunction<
-                          ffi.Int32 Function(
+                          ffi.Int Function(
                               ffi.Pointer<ffi.Void>,
-                              ffi.Int32,
+                              ffi.Int,
                               ffi.Pointer<ffi.Void>,
-                              ffi.Int32,
+                              ffi.Int,
                               ffi.Pointer<ffi.Void>)>>)>>(
       'sqlite3_create_collation');
   late final _sqlite3_create_collation =
       _sqlite3_create_collationPtr.asFunction<
           int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<ffi.Char>,
               int,
               ffi.Pointer<ffi.Void>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Int32 Function(
+                      ffi.Int Function(
                           ffi.Pointer<ffi.Void>,
-                          ffi.Int32,
+                          ffi.Int,
                           ffi.Pointer<ffi.Void>,
-                          ffi.Int32,
+                          ffi.Int,
                           ffi.Pointer<ffi.Void>)>>)>();
 
   int sqlite3_create_collation_v2(
     ffi.Pointer<sqlite3> arg0,
-    ffi.Pointer<ffi.Int8> zName,
+    ffi.Pointer<ffi.Char> zName,
     int eTextRep,
     ffi.Pointer<ffi.Void> pArg,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Int32 Function(ffi.Pointer<ffi.Void>, ffi.Int32,
-                    ffi.Pointer<ffi.Void>, ffi.Int32, ffi.Pointer<ffi.Void>)>>
+                ffi.Int Function(ffi.Pointer<ffi.Void>, ffi.Int,
+                    ffi.Pointer<ffi.Void>, ffi.Int, ffi.Pointer<ffi.Void>)>>
         xCompare,
     ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
         xDestroy,
@@ -6540,18 +6535,18 @@
 
   late final _sqlite3_create_collation_v2Ptr = _lookup<
           ffi.NativeFunction<
-              ffi.Int32 Function(
+              ffi.Int Function(
                   ffi.Pointer<sqlite3>,
-                  ffi.Pointer<ffi.Int8>,
-                  ffi.Int32,
+                  ffi.Pointer<ffi.Char>,
+                  ffi.Int,
                   ffi.Pointer<ffi.Void>,
                   ffi.Pointer<
                       ffi.NativeFunction<
-                          ffi.Int32 Function(
+                          ffi.Int Function(
                               ffi.Pointer<ffi.Void>,
-                              ffi.Int32,
+                              ffi.Int,
                               ffi.Pointer<ffi.Void>,
-                              ffi.Int32,
+                              ffi.Int,
                               ffi.Pointer<ffi.Void>)>>,
                   ffi.Pointer<
                       ffi.NativeFunction<
@@ -6561,16 +6556,16 @@
       _sqlite3_create_collation_v2Ptr.asFunction<
           int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<ffi.Char>,
               int,
               ffi.Pointer<ffi.Void>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Int32 Function(
+                      ffi.Int Function(
                           ffi.Pointer<ffi.Void>,
-                          ffi.Int32,
+                          ffi.Int,
                           ffi.Pointer<ffi.Void>,
-                          ffi.Int32,
+                          ffi.Int,
                           ffi.Pointer<ffi.Void>)>>,
               ffi.Pointer<
                   ffi.NativeFunction<
@@ -6583,8 +6578,8 @@
     ffi.Pointer<ffi.Void> pArg,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Int32 Function(ffi.Pointer<ffi.Void>, ffi.Int32,
-                    ffi.Pointer<ffi.Void>, ffi.Int32, ffi.Pointer<ffi.Void>)>>
+                ffi.Int Function(ffi.Pointer<ffi.Void>, ffi.Int,
+                    ffi.Pointer<ffi.Void>, ffi.Int, ffi.Pointer<ffi.Void>)>>
         xCompare,
   ) {
     return _sqlite3_create_collation16(
@@ -6598,18 +6593,18 @@
 
   late final _sqlite3_create_collation16Ptr = _lookup<
           ffi.NativeFunction<
-              ffi.Int32 Function(
+              ffi.Int Function(
                   ffi.Pointer<sqlite3>,
                   ffi.Pointer<ffi.Void>,
-                  ffi.Int32,
+                  ffi.Int,
                   ffi.Pointer<ffi.Void>,
                   ffi.Pointer<
                       ffi.NativeFunction<
-                          ffi.Int32 Function(
+                          ffi.Int Function(
                               ffi.Pointer<ffi.Void>,
-                              ffi.Int32,
+                              ffi.Int,
                               ffi.Pointer<ffi.Void>,
-                              ffi.Int32,
+                              ffi.Int,
                               ffi.Pointer<ffi.Void>)>>)>>(
       'sqlite3_create_collation16');
   late final _sqlite3_create_collation16 =
@@ -6621,11 +6616,11 @@
               ffi.Pointer<ffi.Void>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Int32 Function(
+                      ffi.Int Function(
                           ffi.Pointer<ffi.Void>,
-                          ffi.Int32,
+                          ffi.Int,
                           ffi.Pointer<ffi.Void>,
-                          ffi.Int32,
+                          ffi.Int,
                           ffi.Pointer<ffi.Void>)>>)>();
 
   /// CAPI3REF: Collation Needed Callbacks
@@ -6659,7 +6654,7 @@
     ffi.Pointer<
             ffi.NativeFunction<
                 ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Pointer<sqlite3>,
-                    ffi.Int32, ffi.Pointer<ffi.Int8>)>>
+                    ffi.Int, ffi.Pointer<ffi.Char>)>>
         arg2,
   ) {
     return _sqlite3_collation_needed(
@@ -6671,7 +6666,7 @@
 
   late final _sqlite3_collation_neededPtr = _lookup<
           ffi.NativeFunction<
-              ffi.Int32 Function(
+              ffi.Int Function(
                   ffi.Pointer<sqlite3>,
                   ffi.Pointer<ffi.Void>,
                   ffi.Pointer<
@@ -6679,8 +6674,8 @@
                           ffi.Void Function(
                               ffi.Pointer<ffi.Void>,
                               ffi.Pointer<sqlite3>,
-                              ffi.Int32,
-                              ffi.Pointer<ffi.Int8>)>>)>>(
+                              ffi.Int,
+                              ffi.Pointer<ffi.Char>)>>)>>(
       'sqlite3_collation_needed');
   late final _sqlite3_collation_needed =
       _sqlite3_collation_neededPtr.asFunction<
@@ -6692,8 +6687,8 @@
                       ffi.Void Function(
                           ffi.Pointer<ffi.Void>,
                           ffi.Pointer<sqlite3>,
-                          ffi.Int32,
-                          ffi.Pointer<ffi.Int8>)>>)>();
+                          ffi.Int,
+                          ffi.Pointer<ffi.Char>)>>)>();
 
   int sqlite3_collation_needed16(
     ffi.Pointer<sqlite3> arg0,
@@ -6701,7 +6696,7 @@
     ffi.Pointer<
             ffi.NativeFunction<
                 ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Pointer<sqlite3>,
-                    ffi.Int32, ffi.Pointer<ffi.Void>)>>
+                    ffi.Int, ffi.Pointer<ffi.Void>)>>
         arg2,
   ) {
     return _sqlite3_collation_needed16(
@@ -6713,7 +6708,7 @@
 
   late final _sqlite3_collation_needed16Ptr = _lookup<
           ffi.NativeFunction<
-              ffi.Int32 Function(
+              ffi.Int Function(
                   ffi.Pointer<sqlite3>,
                   ffi.Pointer<ffi.Void>,
                   ffi.Pointer<
@@ -6721,7 +6716,7 @@
                           ffi.Void Function(
                               ffi.Pointer<ffi.Void>,
                               ffi.Pointer<sqlite3>,
-                              ffi.Int32,
+                              ffi.Int,
                               ffi.Pointer<ffi.Void>)>>)>>(
       'sqlite3_collation_needed16');
   late final _sqlite3_collation_needed16 =
@@ -6734,7 +6729,7 @@
                       ffi.Void Function(
                           ffi.Pointer<ffi.Void>,
                           ffi.Pointer<sqlite3>,
-                          ffi.Int32,
+                          ffi.Int,
                           ffi.Pointer<ffi.Void>)>>)>();
 
   /// CAPI3REF: Suspend Execution For A Short Time
@@ -6761,8 +6756,7 @@
   }
 
   late final _sqlite3_sleepPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Int32)>>(
-          'sqlite3_sleep');
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Int)>>('sqlite3_sleep');
   late final _sqlite3_sleep = _sqlite3_sleepPtr.asFunction<int Function(int)>();
 
   /// CAPI3REF: Name Of The Folder Holding Temporary Files
@@ -6819,13 +6813,13 @@
   /// &nbsp;     NULL, NULL);
   /// sqlite3_temp_directory = sqlite3_mprintf("%s", zPathBuf);
   /// </pre></blockquote>
-  late final ffi.Pointer<ffi.Pointer<ffi.Int8>> _sqlite3_temp_directory =
-      _lookup<ffi.Pointer<ffi.Int8>>('sqlite3_temp_directory');
+  late final ffi.Pointer<ffi.Pointer<ffi.Char>> _sqlite3_temp_directory =
+      _lookup<ffi.Pointer<ffi.Char>>('sqlite3_temp_directory');
 
-  ffi.Pointer<ffi.Int8> get sqlite3_temp_directory =>
+  ffi.Pointer<ffi.Char> get sqlite3_temp_directory =>
       _sqlite3_temp_directory.value;
 
-  set sqlite3_temp_directory(ffi.Pointer<ffi.Int8> value) =>
+  set sqlite3_temp_directory(ffi.Pointer<ffi.Char> value) =>
       _sqlite3_temp_directory.value = value;
 
   /// CAPI3REF: Name Of The Folder Holding Database Files
@@ -6861,13 +6855,13 @@
   /// Hence, if this variable is modified directly, either it should be
   /// made NULL or made to point to memory obtained from [sqlite3_malloc]
   /// or else the use of the [data_store_directory pragma] should be avoided.
-  late final ffi.Pointer<ffi.Pointer<ffi.Int8>> _sqlite3_data_directory =
-      _lookup<ffi.Pointer<ffi.Int8>>('sqlite3_data_directory');
+  late final ffi.Pointer<ffi.Pointer<ffi.Char>> _sqlite3_data_directory =
+      _lookup<ffi.Pointer<ffi.Char>>('sqlite3_data_directory');
 
-  ffi.Pointer<ffi.Int8> get sqlite3_data_directory =>
+  ffi.Pointer<ffi.Char> get sqlite3_data_directory =>
       _sqlite3_data_directory.value;
 
-  set sqlite3_data_directory(ffi.Pointer<ffi.Int8> value) =>
+  set sqlite3_data_directory(ffi.Pointer<ffi.Char> value) =>
       _sqlite3_data_directory.value = value;
 
   /// CAPI3REF: Win32 Specific Interface
@@ -6899,14 +6893,14 @@
 
   late final _sqlite3_win32_set_directoryPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Uint64,
+          ffi.Int Function(ffi.UnsignedLong,
               ffi.Pointer<ffi.Void>)>>('sqlite3_win32_set_directory');
   late final _sqlite3_win32_set_directory = _sqlite3_win32_set_directoryPtr
       .asFunction<int Function(int, ffi.Pointer<ffi.Void>)>();
 
   int sqlite3_win32_set_directory8(
     int type,
-    ffi.Pointer<ffi.Int8> zValue,
+    ffi.Pointer<ffi.Char> zValue,
   ) {
     return _sqlite3_win32_set_directory8(
       type,
@@ -6916,10 +6910,10 @@
 
   late final _sqlite3_win32_set_directory8Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Uint64,
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_win32_set_directory8');
+          ffi.Int Function(ffi.UnsignedLong,
+              ffi.Pointer<ffi.Char>)>>('sqlite3_win32_set_directory8');
   late final _sqlite3_win32_set_directory8 = _sqlite3_win32_set_directory8Ptr
-      .asFunction<int Function(int, ffi.Pointer<ffi.Int8>)>();
+      .asFunction<int Function(int, ffi.Pointer<ffi.Char>)>();
 
   int sqlite3_win32_set_directory16(
     int type,
@@ -6933,7 +6927,7 @@
 
   late final _sqlite3_win32_set_directory16Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Uint64,
+          ffi.Int Function(ffi.UnsignedLong,
               ffi.Pointer<ffi.Void>)>>('sqlite3_win32_set_directory16');
   late final _sqlite3_win32_set_directory16 = _sqlite3_win32_set_directory16Ptr
       .asFunction<int Function(int, ffi.Pointer<ffi.Void>)>();
@@ -6967,7 +6961,7 @@
   }
 
   late final _sqlite3_get_autocommitPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3>)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3>)>>(
           'sqlite3_get_autocommit');
   late final _sqlite3_get_autocommit = _sqlite3_get_autocommitPtr
       .asFunction<int Function(ffi.Pointer<sqlite3>)>();
@@ -7024,9 +7018,9 @@
   /// <li> [sqlite3_filename_journal()]
   /// <li> [sqlite3_filename_wal()]
   /// </ul>
-  ffi.Pointer<ffi.Int8> sqlite3_db_filename(
+  ffi.Pointer<ffi.Char> sqlite3_db_filename(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zDbName,
+    ffi.Pointer<ffi.Char> zDbName,
   ) {
     return _sqlite3_db_filename(
       db,
@@ -7036,11 +7030,11 @@
 
   late final _sqlite3_db_filenamePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_db_filename');
+          ffi.Pointer<ffi.Char> Function(ffi.Pointer<sqlite3>,
+              ffi.Pointer<ffi.Char>)>>('sqlite3_db_filename');
   late final _sqlite3_db_filename = _sqlite3_db_filenamePtr.asFunction<
-      ffi.Pointer<ffi.Int8> Function(
-          ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Int8>)>();
+      ffi.Pointer<ffi.Char> Function(
+          ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Char>)>();
 
   /// CAPI3REF: Determine if a database is read-only
   /// METHOD: sqlite3
@@ -7050,7 +7044,7 @@
   /// the name of a database on connection D.
   int sqlite3_db_readonly(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zDbName,
+    ffi.Pointer<ffi.Char> zDbName,
   ) {
     return _sqlite3_db_readonly(
       db,
@@ -7060,10 +7054,10 @@
 
   late final _sqlite3_db_readonlyPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_db_readonly');
+          ffi.Int Function(ffi.Pointer<sqlite3>,
+              ffi.Pointer<ffi.Char>)>>('sqlite3_db_readonly');
   late final _sqlite3_db_readonly = _sqlite3_db_readonlyPtr
-      .asFunction<int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Int8>)>();
+      .asFunction<int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Char>)>();
 
   /// CAPI3REF: Find the next prepared statement
   /// METHOD: sqlite3
@@ -7142,7 +7136,7 @@
   /// See also the [sqlite3_update_hook()] interface.
   ffi.Pointer<ffi.Void> sqlite3_commit_hook(
     ffi.Pointer<sqlite3> arg0,
-    ffi.Pointer<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<ffi.Void>)>>
+    ffi.Pointer<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<ffi.Void>)>>
         arg1,
     ffi.Pointer<ffi.Void> arg2,
   ) {
@@ -7158,14 +7152,13 @@
           ffi.Pointer<ffi.Void> Function(
               ffi.Pointer<sqlite3>,
               ffi.Pointer<
-                  ffi.NativeFunction<
-                      ffi.Int32 Function(ffi.Pointer<ffi.Void>)>>,
+                  ffi.NativeFunction<ffi.Int Function(ffi.Pointer<ffi.Void>)>>,
               ffi.Pointer<ffi.Void>)>>('sqlite3_commit_hook');
   late final _sqlite3_commit_hook = _sqlite3_commit_hookPtr.asFunction<
       ffi.Pointer<ffi.Void> Function(
           ffi.Pointer<sqlite3>,
           ffi.Pointer<
-              ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<ffi.Void>)>>,
+              ffi.NativeFunction<ffi.Int Function(ffi.Pointer<ffi.Void>)>>,
           ffi.Pointer<ffi.Void>)>();
 
   ffi.Pointer<ffi.Void> sqlite3_rollback_hook(
@@ -7248,9 +7241,9 @@
             ffi.NativeFunction<
                 ffi.Void Function(
                     ffi.Pointer<ffi.Void>,
-                    ffi.Int32,
-                    ffi.Pointer<ffi.Int8>,
-                    ffi.Pointer<ffi.Int8>,
+                    ffi.Int,
+                    ffi.Pointer<ffi.Char>,
+                    ffi.Pointer<ffi.Char>,
                     sqlite3_int64)>>
         arg1,
     ffi.Pointer<ffi.Void> arg2,
@@ -7270,9 +7263,9 @@
                   ffi.NativeFunction<
                       ffi.Void Function(
                           ffi.Pointer<ffi.Void>,
-                          ffi.Int32,
-                          ffi.Pointer<ffi.Int8>,
-                          ffi.Pointer<ffi.Int8>,
+                          ffi.Int,
+                          ffi.Pointer<ffi.Char>,
+                          ffi.Pointer<ffi.Char>,
                           sqlite3_int64)>>,
               ffi.Pointer<ffi.Void>)>>('sqlite3_update_hook');
   late final _sqlite3_update_hook = _sqlite3_update_hookPtr.asFunction<
@@ -7282,9 +7275,9 @@
               ffi.NativeFunction<
                   ffi.Void Function(
                       ffi.Pointer<ffi.Void>,
-                      ffi.Int32,
-                      ffi.Pointer<ffi.Int8>,
-                      ffi.Pointer<ffi.Int8>,
+                      ffi.Int,
+                      ffi.Pointer<ffi.Char>,
+                      ffi.Pointer<ffi.Char>,
                       sqlite3_int64)>>,
           ffi.Pointer<ffi.Void>)>();
 
@@ -7334,7 +7327,7 @@
   }
 
   late final _sqlite3_enable_shared_cachePtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Int)>>(
           'sqlite3_enable_shared_cache');
   late final _sqlite3_enable_shared_cache =
       _sqlite3_enable_shared_cachePtr.asFunction<int Function(int)>();
@@ -7360,7 +7353,7 @@
   }
 
   late final _sqlite3_release_memoryPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Int)>>(
           'sqlite3_release_memory');
   late final _sqlite3_release_memory =
       _sqlite3_release_memoryPtr.asFunction<int Function(int)>();
@@ -7384,7 +7377,7 @@
   }
 
   late final _sqlite3_db_release_memoryPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3>)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3>)>>(
           'sqlite3_db_release_memory');
   late final _sqlite3_db_release_memory = _sqlite3_db_release_memoryPtr
       .asFunction<int Function(ffi.Pointer<sqlite3>)>();
@@ -7495,7 +7488,7 @@
   }
 
   late final _sqlite3_soft_heap_limitPtr =
-      _lookup<ffi.NativeFunction<ffi.Void Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<ffi.Void Function(ffi.Int)>>(
           'sqlite3_soft_heap_limit');
   late final _sqlite3_soft_heap_limit =
       _sqlite3_soft_heap_limitPtr.asFunction<void Function(int)>();
@@ -7569,14 +7562,14 @@
   /// any errors are encountered while loading the schema.
   int sqlite3_table_column_metadata(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zDbName,
-    ffi.Pointer<ffi.Int8> zTableName,
-    ffi.Pointer<ffi.Int8> zColumnName,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> pzDataType,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> pzCollSeq,
-    ffi.Pointer<ffi.Int32> pNotNull,
-    ffi.Pointer<ffi.Int32> pPrimaryKey,
-    ffi.Pointer<ffi.Int32> pAutoinc,
+    ffi.Pointer<ffi.Char> zDbName,
+    ffi.Pointer<ffi.Char> zTableName,
+    ffi.Pointer<ffi.Char> zColumnName,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> pzDataType,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> pzCollSeq,
+    ffi.Pointer<ffi.Int> pNotNull,
+    ffi.Pointer<ffi.Int> pPrimaryKey,
+    ffi.Pointer<ffi.Int> pAutoinc,
   ) {
     return _sqlite3_table_column_metadata(
       db,
@@ -7593,28 +7586,28 @@
 
   late final _sqlite3_table_column_metadataPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              ffi.Pointer<ffi.Int32>,
-              ffi.Pointer<ffi.Int32>,
-              ffi.Pointer<ffi.Int32>)>>('sqlite3_table_column_metadata');
+              ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Pointer<ffi.Char>>,
+              ffi.Pointer<ffi.Pointer<ffi.Char>>,
+              ffi.Pointer<ffi.Int>,
+              ffi.Pointer<ffi.Int>,
+              ffi.Pointer<ffi.Int>)>>('sqlite3_table_column_metadata');
   late final _sqlite3_table_column_metadata =
       _sqlite3_table_column_metadataPtr.asFunction<
           int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              ffi.Pointer<ffi.Int32>,
-              ffi.Pointer<ffi.Int32>,
-              ffi.Pointer<ffi.Int32>)>();
+              ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Pointer<ffi.Char>>,
+              ffi.Pointer<ffi.Pointer<ffi.Char>>,
+              ffi.Pointer<ffi.Int>,
+              ffi.Pointer<ffi.Int>,
+              ffi.Pointer<ffi.Int>)>();
 
   /// CAPI3REF: Load An Extension
   /// METHOD: sqlite3
@@ -7660,9 +7653,9 @@
   /// See also the [load_extension() SQL function].
   int sqlite3_load_extension(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zFile,
-    ffi.Pointer<ffi.Int8> zProc,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> pzErrMsg,
+    ffi.Pointer<ffi.Char> zFile,
+    ffi.Pointer<ffi.Char> zProc,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> pzErrMsg,
   ) {
     return _sqlite3_load_extension(
       db,
@@ -7674,14 +7667,14 @@
 
   late final _sqlite3_load_extensionPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>)>>('sqlite3_load_extension');
+              ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Pointer<ffi.Char>>)>>('sqlite3_load_extension');
   late final _sqlite3_load_extension = _sqlite3_load_extensionPtr.asFunction<
-      int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Int8>,
-          ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Pointer<ffi.Int8>>)>();
+      int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Char>,
+          ffi.Pointer<ffi.Char>, ffi.Pointer<ffi.Pointer<ffi.Char>>)>();
 
   /// CAPI3REF: Enable Or Disable Extension Loading
   /// METHOD: sqlite3
@@ -7717,9 +7710,8 @@
   }
 
   late final _sqlite3_enable_load_extensionPtr = _lookup<
-      ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3>,
-              ffi.Int32)>>('sqlite3_enable_load_extension');
+          ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3>, ffi.Int)>>(
+      'sqlite3_enable_load_extension');
   late final _sqlite3_enable_load_extension = _sqlite3_enable_load_extensionPtr
       .asFunction<int Function(ffi.Pointer<sqlite3>, int)>();
 
@@ -7767,7 +7759,7 @@
 
   late final _sqlite3_auto_extensionPtr = _lookup<
           ffi.NativeFunction<
-              ffi.Int32 Function(
+              ffi.Int Function(
                   ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>)>>(
       'sqlite3_auto_extension');
   late final _sqlite3_auto_extension = _sqlite3_auto_extensionPtr.asFunction<
@@ -7791,7 +7783,7 @@
 
   late final _sqlite3_cancel_auto_extensionPtr = _lookup<
           ffi.NativeFunction<
-              ffi.Int32 Function(
+              ffi.Int Function(
                   ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>)>>(
       'sqlite3_cancel_auto_extension');
   late final _sqlite3_cancel_auto_extension =
@@ -7844,7 +7836,7 @@
   /// See also: [sqlite3_drop_modules()]
   int sqlite3_create_module(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zName,
+    ffi.Pointer<ffi.Char> zName,
     ffi.Pointer<sqlite3_module> p,
     ffi.Pointer<ffi.Void> pClientData,
   ) {
@@ -7858,18 +7850,18 @@
 
   late final _sqlite3_create_modulePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<ffi.Char>,
               ffi.Pointer<sqlite3_module>,
               ffi.Pointer<ffi.Void>)>>('sqlite3_create_module');
   late final _sqlite3_create_module = _sqlite3_create_modulePtr.asFunction<
-      int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Int8>,
+      int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Char>,
           ffi.Pointer<sqlite3_module>, ffi.Pointer<ffi.Void>)>();
 
   int sqlite3_create_module_v2(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zName,
+    ffi.Pointer<ffi.Char> zName,
     ffi.Pointer<sqlite3_module> p,
     ffi.Pointer<ffi.Void> pClientData,
     ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
@@ -7886,9 +7878,9 @@
 
   late final _sqlite3_create_module_v2Ptr = _lookup<
           ffi.NativeFunction<
-              ffi.Int32 Function(
+              ffi.Int Function(
                   ffi.Pointer<sqlite3>,
-                  ffi.Pointer<ffi.Int8>,
+                  ffi.Pointer<ffi.Char>,
                   ffi.Pointer<sqlite3_module>,
                   ffi.Pointer<ffi.Void>,
                   ffi.Pointer<
@@ -7899,7 +7891,7 @@
       _sqlite3_create_module_v2Ptr.asFunction<
           int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<ffi.Char>,
               ffi.Pointer<sqlite3_module>,
               ffi.Pointer<ffi.Void>,
               ffi.Pointer<
@@ -7918,7 +7910,7 @@
   /// See also: [sqlite3_create_module()]
   int sqlite3_drop_modules(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> azKeep,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> azKeep,
   ) {
     return _sqlite3_drop_modules(
       db,
@@ -7928,10 +7920,10 @@
 
   late final _sqlite3_drop_modulesPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>)>>('sqlite3_drop_modules');
+          ffi.Int Function(ffi.Pointer<sqlite3>,
+              ffi.Pointer<ffi.Pointer<ffi.Char>>)>>('sqlite3_drop_modules');
   late final _sqlite3_drop_modules = _sqlite3_drop_modulesPtr.asFunction<
-      int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Pointer<ffi.Int8>>)>();
+      int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Pointer<ffi.Char>>)>();
 
   /// CAPI3REF: Declare The Schema Of A Virtual Table
   ///
@@ -7941,7 +7933,7 @@
   /// the virtual tables they implement.
   int sqlite3_declare_vtab(
     ffi.Pointer<sqlite3> arg0,
-    ffi.Pointer<ffi.Int8> zSQL,
+    ffi.Pointer<ffi.Char> zSQL,
   ) {
     return _sqlite3_declare_vtab(
       arg0,
@@ -7951,10 +7943,10 @@
 
   late final _sqlite3_declare_vtabPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_declare_vtab');
+          ffi.Int Function(ffi.Pointer<sqlite3>,
+              ffi.Pointer<ffi.Char>)>>('sqlite3_declare_vtab');
   late final _sqlite3_declare_vtab = _sqlite3_declare_vtabPtr
-      .asFunction<int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Int8>)>();
+      .asFunction<int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Char>)>();
 
   /// CAPI3REF: Overload A Function For A Virtual Table
   /// METHOD: sqlite3
@@ -7973,7 +7965,7 @@
   /// by a [virtual table].
   int sqlite3_overload_function(
     ffi.Pointer<sqlite3> arg0,
-    ffi.Pointer<ffi.Int8> zFuncName,
+    ffi.Pointer<ffi.Char> zFuncName,
     int nArg,
   ) {
     return _sqlite3_overload_function(
@@ -7985,11 +7977,11 @@
 
   late final _sqlite3_overload_functionPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Int8>,
-              ffi.Int32)>>('sqlite3_overload_function');
+          ffi.Int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Char>,
+              ffi.Int)>>('sqlite3_overload_function');
   late final _sqlite3_overload_function =
       _sqlite3_overload_functionPtr.asFunction<
-          int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Int8>, int)>();
+          int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Char>, int)>();
 
   /// CAPI3REF: Open A BLOB For Incremental I/O
   /// METHOD: sqlite3
@@ -8074,9 +8066,9 @@
   /// [sqlite3_blob_bytes()], [sqlite3_blob_write()].
   int sqlite3_blob_open(
     ffi.Pointer<sqlite3> arg0,
-    ffi.Pointer<ffi.Int8> zDb,
-    ffi.Pointer<ffi.Int8> zTable,
-    ffi.Pointer<ffi.Int8> zColumn,
+    ffi.Pointer<ffi.Char> zDb,
+    ffi.Pointer<ffi.Char> zTable,
+    ffi.Pointer<ffi.Char> zColumn,
     int iRow,
     int flags,
     ffi.Pointer<ffi.Pointer<sqlite3_blob>> ppBlob,
@@ -8094,20 +8086,20 @@
 
   late final _sqlite3_blob_openPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Char>,
               sqlite3_int64,
-              ffi.Int32,
+              ffi.Int,
               ffi.Pointer<ffi.Pointer<sqlite3_blob>>)>>('sqlite3_blob_open');
   late final _sqlite3_blob_open = _sqlite3_blob_openPtr.asFunction<
       int Function(
           ffi.Pointer<sqlite3>,
-          ffi.Pointer<ffi.Int8>,
-          ffi.Pointer<ffi.Int8>,
-          ffi.Pointer<ffi.Int8>,
+          ffi.Pointer<ffi.Char>,
+          ffi.Pointer<ffi.Char>,
+          ffi.Pointer<ffi.Char>,
           int,
           int,
           ffi.Pointer<ffi.Pointer<sqlite3_blob>>)>();
@@ -8145,7 +8137,7 @@
 
   late final _sqlite3_blob_reopenPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_blob>,
+          ffi.Int Function(ffi.Pointer<sqlite3_blob>,
               sqlite3_int64)>>('sqlite3_blob_reopen');
   late final _sqlite3_blob_reopen = _sqlite3_blob_reopenPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_blob>, int)>();
@@ -8177,9 +8169,9 @@
     );
   }
 
-  late final _sqlite3_blob_closePtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_blob>)>>(
-      'sqlite3_blob_close');
+  late final _sqlite3_blob_closePtr =
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_blob>)>>(
+          'sqlite3_blob_close');
   late final _sqlite3_blob_close = _sqlite3_blob_closePtr
       .asFunction<int Function(ffi.Pointer<sqlite3_blob>)>();
 
@@ -8203,9 +8195,9 @@
     );
   }
 
-  late final _sqlite3_blob_bytesPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_blob>)>>(
-      'sqlite3_blob_bytes');
+  late final _sqlite3_blob_bytesPtr =
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_blob>)>>(
+          'sqlite3_blob_bytes');
   late final _sqlite3_blob_bytes = _sqlite3_blob_bytesPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_blob>)>();
 
@@ -8250,8 +8242,8 @@
 
   late final _sqlite3_blob_readPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_blob>, ffi.Pointer<ffi.Void>,
-              ffi.Int32, ffi.Int32)>>('sqlite3_blob_read');
+          ffi.Int Function(ffi.Pointer<sqlite3_blob>, ffi.Pointer<ffi.Void>,
+              ffi.Int, ffi.Int)>>('sqlite3_blob_read');
   late final _sqlite3_blob_read = _sqlite3_blob_readPtr.asFunction<
       int Function(
           ffi.Pointer<sqlite3_blob>, ffi.Pointer<ffi.Void>, int, int)>();
@@ -8310,8 +8302,8 @@
 
   late final _sqlite3_blob_writePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_blob>, ffi.Pointer<ffi.Void>,
-              ffi.Int32, ffi.Int32)>>('sqlite3_blob_write');
+          ffi.Int Function(ffi.Pointer<sqlite3_blob>, ffi.Pointer<ffi.Void>,
+              ffi.Int, ffi.Int)>>('sqlite3_blob_write');
   late final _sqlite3_blob_write = _sqlite3_blob_writePtr.asFunction<
       int Function(
           ffi.Pointer<sqlite3_blob>, ffi.Pointer<ffi.Void>, int, int)>();
@@ -8344,7 +8336,7 @@
   /// ^(If the default VFS is unregistered, another VFS is chosen as
   /// the default.  The choice for the new VFS is arbitrary.)^
   ffi.Pointer<sqlite3_vfs> sqlite3_vfs_find(
-    ffi.Pointer<ffi.Int8> zVfsName,
+    ffi.Pointer<ffi.Char> zVfsName,
   ) {
     return _sqlite3_vfs_find(
       zVfsName,
@@ -8354,9 +8346,9 @@
   late final _sqlite3_vfs_findPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<sqlite3_vfs> Function(
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_vfs_find');
+              ffi.Pointer<ffi.Char>)>>('sqlite3_vfs_find');
   late final _sqlite3_vfs_find = _sqlite3_vfs_findPtr
-      .asFunction<ffi.Pointer<sqlite3_vfs> Function(ffi.Pointer<ffi.Int8>)>();
+      .asFunction<ffi.Pointer<sqlite3_vfs> Function(ffi.Pointer<ffi.Char>)>();
 
   int sqlite3_vfs_register(
     ffi.Pointer<sqlite3_vfs> arg0,
@@ -8370,8 +8362,8 @@
 
   late final _sqlite3_vfs_registerPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<sqlite3_vfs>, ffi.Int32)>>('sqlite3_vfs_register');
+          ffi.Int Function(
+              ffi.Pointer<sqlite3_vfs>, ffi.Int)>>('sqlite3_vfs_register');
   late final _sqlite3_vfs_register = _sqlite3_vfs_registerPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_vfs>, int)>();
 
@@ -8384,7 +8376,7 @@
   }
 
   late final _sqlite3_vfs_unregisterPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_vfs>)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_vfs>)>>(
           'sqlite3_vfs_unregister');
   late final _sqlite3_vfs_unregister = _sqlite3_vfs_unregisterPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_vfs>)>();
@@ -8509,9 +8501,9 @@
     );
   }
 
-  late final _sqlite3_mutex_allocPtr = _lookup<
-          ffi.NativeFunction<ffi.Pointer<sqlite3_mutex> Function(ffi.Int32)>>(
-      'sqlite3_mutex_alloc');
+  late final _sqlite3_mutex_allocPtr =
+      _lookup<ffi.NativeFunction<ffi.Pointer<sqlite3_mutex> Function(ffi.Int)>>(
+          'sqlite3_mutex_alloc');
   late final _sqlite3_mutex_alloc = _sqlite3_mutex_allocPtr
       .asFunction<ffi.Pointer<sqlite3_mutex> Function(int)>();
 
@@ -8551,9 +8543,9 @@
     );
   }
 
-  late final _sqlite3_mutex_tryPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_mutex>)>>(
-      'sqlite3_mutex_try');
+  late final _sqlite3_mutex_tryPtr =
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_mutex>)>>(
+          'sqlite3_mutex_try');
   late final _sqlite3_mutex_try = _sqlite3_mutex_tryPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_mutex>)>();
 
@@ -8579,9 +8571,9 @@
     );
   }
 
-  late final _sqlite3_mutex_heldPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_mutex>)>>(
-      'sqlite3_mutex_held');
+  late final _sqlite3_mutex_heldPtr =
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_mutex>)>>(
+          'sqlite3_mutex_held');
   late final _sqlite3_mutex_held = _sqlite3_mutex_heldPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_mutex>)>();
 
@@ -8593,9 +8585,9 @@
     );
   }
 
-  late final _sqlite3_mutex_notheldPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_mutex>)>>(
-      'sqlite3_mutex_notheld');
+  late final _sqlite3_mutex_notheldPtr =
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_mutex>)>>(
+          'sqlite3_mutex_notheld');
   late final _sqlite3_mutex_notheld = _sqlite3_mutex_notheldPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_mutex>)>();
 
@@ -8663,7 +8655,7 @@
   /// See also: [file control opcodes]
   int sqlite3_file_control(
     ffi.Pointer<sqlite3> arg0,
-    ffi.Pointer<ffi.Int8> zDbName,
+    ffi.Pointer<ffi.Char> zDbName,
     int op,
     ffi.Pointer<ffi.Void> arg3,
   ) {
@@ -8677,10 +8669,10 @@
 
   late final _sqlite3_file_controlPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Int8>,
-              ffi.Int32, ffi.Pointer<ffi.Void>)>>('sqlite3_file_control');
+          ffi.Int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Char>, ffi.Int,
+              ffi.Pointer<ffi.Void>)>>('sqlite3_file_control');
   late final _sqlite3_file_control = _sqlite3_file_controlPtr.asFunction<
-      int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Int8>, int,
+      int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Char>, int,
           ffi.Pointer<ffi.Void>)>();
 
   /// CAPI3REF: Testing Interface
@@ -8707,7 +8699,7 @@
   }
 
   late final _sqlite3_test_controlPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Int)>>(
           'sqlite3_test_control');
   late final _sqlite3_test_control =
       _sqlite3_test_controlPtr.asFunction<int Function(int)>();
@@ -8762,15 +8754,14 @@
   }
 
   late final _sqlite3_keyword_countPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function()>>(
-          'sqlite3_keyword_count');
+      _lookup<ffi.NativeFunction<ffi.Int Function()>>('sqlite3_keyword_count');
   late final _sqlite3_keyword_count =
       _sqlite3_keyword_countPtr.asFunction<int Function()>();
 
   int sqlite3_keyword_name(
     int arg0,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> arg1,
-    ffi.Pointer<ffi.Int32> arg2,
+    ffi.Pointer<ffi.Pointer<ffi.Char>> arg1,
+    ffi.Pointer<ffi.Int> arg2,
   ) {
     return _sqlite3_keyword_name(
       arg0,
@@ -8781,14 +8772,14 @@
 
   late final _sqlite3_keyword_namePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Int32, ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              ffi.Pointer<ffi.Int32>)>>('sqlite3_keyword_name');
+          ffi.Int Function(ffi.Int, ffi.Pointer<ffi.Pointer<ffi.Char>>,
+              ffi.Pointer<ffi.Int>)>>('sqlite3_keyword_name');
   late final _sqlite3_keyword_name = _sqlite3_keyword_namePtr.asFunction<
       int Function(
-          int, ffi.Pointer<ffi.Pointer<ffi.Int8>>, ffi.Pointer<ffi.Int32>)>();
+          int, ffi.Pointer<ffi.Pointer<ffi.Char>>, ffi.Pointer<ffi.Int>)>();
 
   int sqlite3_keyword_check(
-    ffi.Pointer<ffi.Int8> arg0,
+    ffi.Pointer<ffi.Char> arg0,
     int arg1,
   ) {
     return _sqlite3_keyword_check(
@@ -8798,11 +8789,10 @@
   }
 
   late final _sqlite3_keyword_checkPtr = _lookup<
-      ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<ffi.Int8>, ffi.Int32)>>('sqlite3_keyword_check');
+          ffi.NativeFunction<ffi.Int Function(ffi.Pointer<ffi.Char>, ffi.Int)>>(
+      'sqlite3_keyword_check');
   late final _sqlite3_keyword_check = _sqlite3_keyword_checkPtr
-      .asFunction<int Function(ffi.Pointer<ffi.Int8>, int)>();
+      .asFunction<int Function(ffi.Pointer<ffi.Char>, int)>();
 
   /// CAPI3REF: Create A New Dynamic String Object
   /// CONSTRUCTOR: sqlite3_str
@@ -8853,7 +8843,7 @@
   /// errors were encountered during construction of the string.  ^The
   /// [sqlite3_str_finish(X)] interface will also return a NULL pointer if the
   /// string in [sqlite3_str] object X is zero bytes long.
-  ffi.Pointer<ffi.Int8> sqlite3_str_finish(
+  ffi.Pointer<ffi.Char> sqlite3_str_finish(
     ffi.Pointer<sqlite3_str> arg0,
   ) {
     return _sqlite3_str_finish(
@@ -8863,10 +8853,10 @@
 
   late final _sqlite3_str_finishPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(
+          ffi.Pointer<ffi.Char> Function(
               ffi.Pointer<sqlite3_str>)>>('sqlite3_str_finish');
   late final _sqlite3_str_finish = _sqlite3_str_finishPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3_str>)>();
+      .asFunction<ffi.Pointer<ffi.Char> Function(ffi.Pointer<sqlite3_str>)>();
 
   /// CAPI3REF: Add Content To A Dynamic String
   /// METHOD: sqlite3_str
@@ -8900,7 +8890,7 @@
   /// subsequent call to [sqlite3_str_errcode(X)].
   void sqlite3_str_appendf(
     ffi.Pointer<sqlite3_str> arg0,
-    ffi.Pointer<ffi.Int8> zFormat,
+    ffi.Pointer<ffi.Char> zFormat,
   ) {
     return _sqlite3_str_appendf(
       arg0,
@@ -8911,13 +8901,13 @@
   late final _sqlite3_str_appendfPtr = _lookup<
       ffi.NativeFunction<
           ffi.Void Function(ffi.Pointer<sqlite3_str>,
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_str_appendf');
+              ffi.Pointer<ffi.Char>)>>('sqlite3_str_appendf');
   late final _sqlite3_str_appendf = _sqlite3_str_appendfPtr.asFunction<
-      void Function(ffi.Pointer<sqlite3_str>, ffi.Pointer<ffi.Int8>)>();
+      void Function(ffi.Pointer<sqlite3_str>, ffi.Pointer<ffi.Char>)>();
 
   void sqlite3_str_append(
     ffi.Pointer<sqlite3_str> arg0,
-    ffi.Pointer<ffi.Int8> zIn,
+    ffi.Pointer<ffi.Char> zIn,
     int N,
   ) {
     return _sqlite3_str_append(
@@ -8929,14 +8919,14 @@
 
   late final _sqlite3_str_appendPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(ffi.Pointer<sqlite3_str>, ffi.Pointer<ffi.Int8>,
-              ffi.Int32)>>('sqlite3_str_append');
+          ffi.Void Function(ffi.Pointer<sqlite3_str>, ffi.Pointer<ffi.Char>,
+              ffi.Int)>>('sqlite3_str_append');
   late final _sqlite3_str_append = _sqlite3_str_appendPtr.asFunction<
-      void Function(ffi.Pointer<sqlite3_str>, ffi.Pointer<ffi.Int8>, int)>();
+      void Function(ffi.Pointer<sqlite3_str>, ffi.Pointer<ffi.Char>, int)>();
 
   void sqlite3_str_appendall(
     ffi.Pointer<sqlite3_str> arg0,
-    ffi.Pointer<ffi.Int8> zIn,
+    ffi.Pointer<ffi.Char> zIn,
   ) {
     return _sqlite3_str_appendall(
       arg0,
@@ -8947,9 +8937,9 @@
   late final _sqlite3_str_appendallPtr = _lookup<
       ffi.NativeFunction<
           ffi.Void Function(ffi.Pointer<sqlite3_str>,
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_str_appendall');
+              ffi.Pointer<ffi.Char>)>>('sqlite3_str_appendall');
   late final _sqlite3_str_appendall = _sqlite3_str_appendallPtr.asFunction<
-      void Function(ffi.Pointer<sqlite3_str>, ffi.Pointer<ffi.Int8>)>();
+      void Function(ffi.Pointer<sqlite3_str>, ffi.Pointer<ffi.Char>)>();
 
   void sqlite3_str_appendchar(
     ffi.Pointer<sqlite3_str> arg0,
@@ -8965,8 +8955,8 @@
 
   late final _sqlite3_str_appendcharPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(ffi.Pointer<sqlite3_str>, ffi.Int32,
-              ffi.Int8)>>('sqlite3_str_appendchar');
+          ffi.Void Function(ffi.Pointer<sqlite3_str>, ffi.Int,
+              ffi.Char)>>('sqlite3_str_appendchar');
   late final _sqlite3_str_appendchar = _sqlite3_str_appendcharPtr
       .asFunction<void Function(ffi.Pointer<sqlite3_str>, int, int)>();
 
@@ -9020,7 +9010,7 @@
   }
 
   late final _sqlite3_str_errcodePtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_str>)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_str>)>>(
           'sqlite3_str_errcode');
   late final _sqlite3_str_errcode = _sqlite3_str_errcodePtr
       .asFunction<int Function(ffi.Pointer<sqlite3_str>)>();
@@ -9034,12 +9024,12 @@
   }
 
   late final _sqlite3_str_lengthPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_str>)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_str>)>>(
           'sqlite3_str_length');
   late final _sqlite3_str_length = _sqlite3_str_lengthPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_str>)>();
 
-  ffi.Pointer<ffi.Int8> sqlite3_str_value(
+  ffi.Pointer<ffi.Char> sqlite3_str_value(
     ffi.Pointer<sqlite3_str> arg0,
   ) {
     return _sqlite3_str_value(
@@ -9049,10 +9039,10 @@
 
   late final _sqlite3_str_valuePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(
+          ffi.Pointer<ffi.Char> Function(
               ffi.Pointer<sqlite3_str>)>>('sqlite3_str_value');
   late final _sqlite3_str_value = _sqlite3_str_valuePtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3_str>)>();
+      .asFunction<ffi.Pointer<ffi.Char> Function(ffi.Pointer<sqlite3_str>)>();
 
   /// CAPI3REF: SQLite Runtime Status
   ///
@@ -9080,8 +9070,8 @@
   /// See also: [sqlite3_db_status()]
   int sqlite3_status(
     int op,
-    ffi.Pointer<ffi.Int32> pCurrent,
-    ffi.Pointer<ffi.Int32> pHighwater,
+    ffi.Pointer<ffi.Int> pCurrent,
+    ffi.Pointer<ffi.Int> pHighwater,
     int resetFlag,
   ) {
     return _sqlite3_status(
@@ -9094,10 +9084,10 @@
 
   late final _sqlite3_statusPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Int32, ffi.Pointer<ffi.Int32>,
-              ffi.Pointer<ffi.Int32>, ffi.Int32)>>('sqlite3_status');
+          ffi.Int Function(ffi.Int, ffi.Pointer<ffi.Int>, ffi.Pointer<ffi.Int>,
+              ffi.Int)>>('sqlite3_status');
   late final _sqlite3_status = _sqlite3_statusPtr.asFunction<
-      int Function(int, ffi.Pointer<ffi.Int32>, ffi.Pointer<ffi.Int32>, int)>();
+      int Function(int, ffi.Pointer<ffi.Int>, ffi.Pointer<ffi.Int>, int)>();
 
   int sqlite3_status64(
     int op,
@@ -9115,8 +9105,8 @@
 
   late final _sqlite3_status64Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Int32, ffi.Pointer<sqlite3_int64>,
-              ffi.Pointer<sqlite3_int64>, ffi.Int32)>>('sqlite3_status64');
+          ffi.Int Function(ffi.Int, ffi.Pointer<sqlite3_int64>,
+              ffi.Pointer<sqlite3_int64>, ffi.Int)>>('sqlite3_status64');
   late final _sqlite3_status64 = _sqlite3_status64Ptr.asFunction<
       int Function(
           int, ffi.Pointer<sqlite3_int64>, ffi.Pointer<sqlite3_int64>, int)>();
@@ -9145,8 +9135,8 @@
   int sqlite3_db_status(
     ffi.Pointer<sqlite3> arg0,
     int op,
-    ffi.Pointer<ffi.Int32> pCur,
-    ffi.Pointer<ffi.Int32> pHiwtr,
+    ffi.Pointer<ffi.Int> pCur,
+    ffi.Pointer<ffi.Int> pHiwtr,
     int resetFlg,
   ) {
     return _sqlite3_db_status(
@@ -9160,15 +9150,11 @@
 
   late final _sqlite3_db_statusPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<sqlite3>,
-              ffi.Int32,
-              ffi.Pointer<ffi.Int32>,
-              ffi.Pointer<ffi.Int32>,
-              ffi.Int32)>>('sqlite3_db_status');
+          ffi.Int Function(ffi.Pointer<sqlite3>, ffi.Int, ffi.Pointer<ffi.Int>,
+              ffi.Pointer<ffi.Int>, ffi.Int)>>('sqlite3_db_status');
   late final _sqlite3_db_status = _sqlite3_db_statusPtr.asFunction<
-      int Function(ffi.Pointer<sqlite3>, int, ffi.Pointer<ffi.Int32>,
-          ffi.Pointer<ffi.Int32>, int)>();
+      int Function(ffi.Pointer<sqlite3>, int, ffi.Pointer<ffi.Int>,
+          ffi.Pointer<ffi.Int>, int)>();
 
   /// CAPI3REF: Prepared Statement Status
   /// METHOD: sqlite3_stmt
@@ -9206,8 +9192,8 @@
 
   late final _sqlite3_stmt_statusPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>, ffi.Int32,
-              ffi.Int32)>>('sqlite3_stmt_status');
+          ffi.Int Function(ffi.Pointer<sqlite3_stmt>, ffi.Int,
+              ffi.Int)>>('sqlite3_stmt_status');
   late final _sqlite3_stmt_status = _sqlite3_stmt_statusPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>, int, int)>();
 
@@ -9397,9 +9383,9 @@
   /// possible that they return invalid values.
   ffi.Pointer<sqlite3_backup> sqlite3_backup_init(
     ffi.Pointer<sqlite3> pDest,
-    ffi.Pointer<ffi.Int8> zDestName,
+    ffi.Pointer<ffi.Char> zDestName,
     ffi.Pointer<sqlite3> pSource,
-    ffi.Pointer<ffi.Int8> zSourceName,
+    ffi.Pointer<ffi.Char> zSourceName,
   ) {
     return _sqlite3_backup_init(
       pDest,
@@ -9413,15 +9399,15 @@
       ffi.NativeFunction<
           ffi.Pointer<sqlite3_backup> Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<ffi.Char>,
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_backup_init');
+              ffi.Pointer<ffi.Char>)>>('sqlite3_backup_init');
   late final _sqlite3_backup_init = _sqlite3_backup_initPtr.asFunction<
       ffi.Pointer<sqlite3_backup> Function(
           ffi.Pointer<sqlite3>,
-          ffi.Pointer<ffi.Int8>,
+          ffi.Pointer<ffi.Char>,
           ffi.Pointer<sqlite3>,
-          ffi.Pointer<ffi.Int8>)>();
+          ffi.Pointer<ffi.Char>)>();
 
   int sqlite3_backup_step(
     ffi.Pointer<sqlite3_backup> p,
@@ -9435,8 +9421,8 @@
 
   late final _sqlite3_backup_stepPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<sqlite3_backup>, ffi.Int32)>>('sqlite3_backup_step');
+          ffi.Int Function(
+              ffi.Pointer<sqlite3_backup>, ffi.Int)>>('sqlite3_backup_step');
   late final _sqlite3_backup_step = _sqlite3_backup_stepPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_backup>, int)>();
 
@@ -9449,7 +9435,7 @@
   }
 
   late final _sqlite3_backup_finishPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_backup>)>>(
+          ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_backup>)>>(
       'sqlite3_backup_finish');
   late final _sqlite3_backup_finish = _sqlite3_backup_finishPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_backup>)>();
@@ -9463,7 +9449,7 @@
   }
 
   late final _sqlite3_backup_remainingPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_backup>)>>(
+          ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_backup>)>>(
       'sqlite3_backup_remaining');
   late final _sqlite3_backup_remaining = _sqlite3_backup_remainingPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_backup>)>();
@@ -9477,7 +9463,7 @@
   }
 
   late final _sqlite3_backup_pagecountPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_backup>)>>(
+          ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_backup>)>>(
       'sqlite3_backup_pagecount');
   late final _sqlite3_backup_pagecount = _sqlite3_backup_pagecountPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_backup>)>();
@@ -9600,7 +9586,7 @@
     ffi.Pointer<
             ffi.NativeFunction<
                 ffi.Void Function(
-                    ffi.Pointer<ffi.Pointer<ffi.Void>>, ffi.Int32)>>
+                    ffi.Pointer<ffi.Pointer<ffi.Void>> apArg, ffi.Int nArg)>>
         xNotify,
     ffi.Pointer<ffi.Void> pNotifyArg,
   ) {
@@ -9613,12 +9599,13 @@
 
   late final _sqlite3_unlock_notifyPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<sqlite3>,
               ffi.Pointer<
                   ffi.NativeFunction<
                       ffi.Void Function(
-                          ffi.Pointer<ffi.Pointer<ffi.Void>>, ffi.Int32)>>,
+                          ffi.Pointer<ffi.Pointer<ffi.Void>> apArg,
+                          ffi.Int nArg)>>,
               ffi.Pointer<ffi.Void>)>>('sqlite3_unlock_notify');
   late final _sqlite3_unlock_notify = _sqlite3_unlock_notifyPtr.asFunction<
       int Function(
@@ -9626,7 +9613,7 @@
           ffi.Pointer<
               ffi.NativeFunction<
                   ffi.Void Function(
-                      ffi.Pointer<ffi.Pointer<ffi.Void>>, ffi.Int32)>>,
+                      ffi.Pointer<ffi.Pointer<ffi.Void>> apArg, ffi.Int nArg)>>,
           ffi.Pointer<ffi.Void>)>();
 
   /// CAPI3REF: String Comparison
@@ -9636,8 +9623,8 @@
   /// strings in a case-independent fashion, using the same definition of "case
   /// independence" that SQLite uses internally when comparing identifiers.
   int sqlite3_stricmp(
-    ffi.Pointer<ffi.Int8> arg0,
-    ffi.Pointer<ffi.Int8> arg1,
+    ffi.Pointer<ffi.Char> arg0,
+    ffi.Pointer<ffi.Char> arg1,
   ) {
     return _sqlite3_stricmp(
       arg0,
@@ -9647,14 +9634,14 @@
 
   late final _sqlite3_stricmpPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_stricmp');
+          ffi.Int Function(ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Char>)>>('sqlite3_stricmp');
   late final _sqlite3_stricmp = _sqlite3_stricmpPtr
-      .asFunction<int Function(ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int8>)>();
+      .asFunction<int Function(ffi.Pointer<ffi.Char>, ffi.Pointer<ffi.Char>)>();
 
   int sqlite3_strnicmp(
-    ffi.Pointer<ffi.Int8> arg0,
-    ffi.Pointer<ffi.Int8> arg1,
+    ffi.Pointer<ffi.Char> arg0,
+    ffi.Pointer<ffi.Char> arg1,
     int arg2,
   ) {
     return _sqlite3_strnicmp(
@@ -9666,10 +9653,10 @@
 
   late final _sqlite3_strnicmpPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int8>,
-              ffi.Int32)>>('sqlite3_strnicmp');
+          ffi.Int Function(ffi.Pointer<ffi.Char>, ffi.Pointer<ffi.Char>,
+              ffi.Int)>>('sqlite3_strnicmp');
   late final _sqlite3_strnicmp = _sqlite3_strnicmpPtr.asFunction<
-      int Function(ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int8>, int)>();
+      int Function(ffi.Pointer<ffi.Char>, ffi.Pointer<ffi.Char>, int)>();
 
   /// CAPI3REF: String Globbing
   ///
@@ -9685,8 +9672,8 @@
   ///
   /// See also: [sqlite3_strlike()].
   int sqlite3_strglob(
-    ffi.Pointer<ffi.Int8> zGlob,
-    ffi.Pointer<ffi.Int8> zStr,
+    ffi.Pointer<ffi.Char> zGlob,
+    ffi.Pointer<ffi.Char> zStr,
   ) {
     return _sqlite3_strglob(
       zGlob,
@@ -9696,10 +9683,10 @@
 
   late final _sqlite3_strglobPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_strglob');
+          ffi.Int Function(ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.Char>)>>('sqlite3_strglob');
   late final _sqlite3_strglob = _sqlite3_strglobPtr
-      .asFunction<int Function(ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int8>)>();
+      .asFunction<int Function(ffi.Pointer<ffi.Char>, ffi.Pointer<ffi.Char>)>();
 
   /// CAPI3REF: String LIKE Matching
   ///
@@ -9721,8 +9708,8 @@
   ///
   /// See also: [sqlite3_strglob()].
   int sqlite3_strlike(
-    ffi.Pointer<ffi.Int8> zGlob,
-    ffi.Pointer<ffi.Int8> zStr,
+    ffi.Pointer<ffi.Char> zGlob,
+    ffi.Pointer<ffi.Char> zStr,
     int cEsc,
   ) {
     return _sqlite3_strlike(
@@ -9734,10 +9721,10 @@
 
   late final _sqlite3_strlikePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int8>,
-              ffi.Uint32)>>('sqlite3_strlike');
+          ffi.Int Function(ffi.Pointer<ffi.Char>, ffi.Pointer<ffi.Char>,
+              ffi.UnsignedInt)>>('sqlite3_strlike');
   late final _sqlite3_strlike = _sqlite3_strlikePtr.asFunction<
-      int Function(ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int8>, int)>();
+      int Function(ffi.Pointer<ffi.Char>, ffi.Pointer<ffi.Char>, int)>();
 
   /// CAPI3REF: Error Logging Interface
   ///
@@ -9760,7 +9747,7 @@
   /// buffer.
   void sqlite3_log(
     int iErrCode,
-    ffi.Pointer<ffi.Int8> zFormat,
+    ffi.Pointer<ffi.Char> zFormat,
   ) {
     return _sqlite3_log(
       iErrCode,
@@ -9770,9 +9757,9 @@
 
   late final _sqlite3_logPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(ffi.Int32, ffi.Pointer<ffi.Int8>)>>('sqlite3_log');
+          ffi.Void Function(ffi.Int, ffi.Pointer<ffi.Char>)>>('sqlite3_log');
   late final _sqlite3_log =
-      _sqlite3_logPtr.asFunction<void Function(int, ffi.Pointer<ffi.Int8>)>();
+      _sqlite3_logPtr.asFunction<void Function(int, ffi.Pointer<ffi.Char>)>();
 
   /// CAPI3REF: Write-Ahead Log Commit Hook
   /// METHOD: sqlite3
@@ -9810,8 +9797,8 @@
     ffi.Pointer<sqlite3> arg0,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Int32 Function(ffi.Pointer<ffi.Void>, ffi.Pointer<sqlite3>,
-                    ffi.Pointer<ffi.Int8>, ffi.Int32)>>
+                ffi.Int Function(ffi.Pointer<ffi.Void>, ffi.Pointer<sqlite3>,
+                    ffi.Pointer<ffi.Char>, ffi.Int)>>
         arg1,
     ffi.Pointer<ffi.Void> arg2,
   ) {
@@ -9828,19 +9815,19 @@
               ffi.Pointer<sqlite3>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Int32 Function(
+                      ffi.Int Function(
                           ffi.Pointer<ffi.Void>,
                           ffi.Pointer<sqlite3>,
-                          ffi.Pointer<ffi.Int8>,
-                          ffi.Int32)>>,
+                          ffi.Pointer<ffi.Char>,
+                          ffi.Int)>>,
               ffi.Pointer<ffi.Void>)>>('sqlite3_wal_hook');
   late final _sqlite3_wal_hook = _sqlite3_wal_hookPtr.asFunction<
       ffi.Pointer<ffi.Void> Function(
           ffi.Pointer<sqlite3>,
           ffi.Pointer<
               ffi.NativeFunction<
-                  ffi.Int32 Function(ffi.Pointer<ffi.Void>,
-                      ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Int8>, ffi.Int32)>>,
+                  ffi.Int Function(ffi.Pointer<ffi.Void>, ffi.Pointer<sqlite3>,
+                      ffi.Pointer<ffi.Char>, ffi.Int)>>,
           ffi.Pointer<ffi.Void>)>();
 
   /// CAPI3REF: Configure an auto-checkpoint
@@ -9881,9 +9868,8 @@
   }
 
   late final _sqlite3_wal_autocheckpointPtr = _lookup<
-      ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<sqlite3>, ffi.Int32)>>('sqlite3_wal_autocheckpoint');
+          ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3>, ffi.Int)>>(
+      'sqlite3_wal_autocheckpoint');
   late final _sqlite3_wal_autocheckpoint = _sqlite3_wal_autocheckpointPtr
       .asFunction<int Function(ffi.Pointer<sqlite3>, int)>();
 
@@ -9907,7 +9893,7 @@
   /// complication) of [sqlite3_wal_checkpoint_v2()].
   int sqlite3_wal_checkpoint(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zDb,
+    ffi.Pointer<ffi.Char> zDb,
   ) {
     return _sqlite3_wal_checkpoint(
       db,
@@ -9917,10 +9903,10 @@
 
   late final _sqlite3_wal_checkpointPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_wal_checkpoint');
+          ffi.Int Function(ffi.Pointer<sqlite3>,
+              ffi.Pointer<ffi.Char>)>>('sqlite3_wal_checkpoint');
   late final _sqlite3_wal_checkpoint = _sqlite3_wal_checkpointPtr
-      .asFunction<int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Int8>)>();
+      .asFunction<int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Char>)>();
 
   /// CAPI3REF: Checkpoint a database
   /// METHOD: sqlite3
@@ -10014,10 +10000,10 @@
   /// from SQL.
   int sqlite3_wal_checkpoint_v2(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zDb,
+    ffi.Pointer<ffi.Char> zDb,
     int eMode,
-    ffi.Pointer<ffi.Int32> pnLog,
-    ffi.Pointer<ffi.Int32> pnCkpt,
+    ffi.Pointer<ffi.Int> pnLog,
+    ffi.Pointer<ffi.Int> pnCkpt,
   ) {
     return _sqlite3_wal_checkpoint_v2(
       db,
@@ -10030,16 +10016,16 @@
 
   late final _sqlite3_wal_checkpoint_v2Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Int32,
-              ffi.Pointer<ffi.Int32>,
-              ffi.Pointer<ffi.Int32>)>>('sqlite3_wal_checkpoint_v2');
+              ffi.Pointer<ffi.Char>,
+              ffi.Int,
+              ffi.Pointer<ffi.Int>,
+              ffi.Pointer<ffi.Int>)>>('sqlite3_wal_checkpoint_v2');
   late final _sqlite3_wal_checkpoint_v2 =
       _sqlite3_wal_checkpoint_v2Ptr.asFunction<
-          int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Int8>, int,
-              ffi.Pointer<ffi.Int32>, ffi.Pointer<ffi.Int32>)>();
+          int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Char>, int,
+              ffi.Pointer<ffi.Int>, ffi.Pointer<ffi.Int>)>();
 
   /// CAPI3REF: Virtual Table Interface Configuration
   ///
@@ -10068,9 +10054,8 @@
   }
 
   late final _sqlite3_vtab_configPtr = _lookup<
-      ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<sqlite3>, ffi.Int32)>>('sqlite3_vtab_config');
+          ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3>, ffi.Int)>>(
+      'sqlite3_vtab_config');
   late final _sqlite3_vtab_config = _sqlite3_vtab_configPtr
       .asFunction<int Function(ffi.Pointer<sqlite3>, int)>();
 
@@ -10091,7 +10076,7 @@
   }
 
   late final _sqlite3_vtab_on_conflictPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3>)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3>)>>(
           'sqlite3_vtab_on_conflict');
   late final _sqlite3_vtab_on_conflict = _sqlite3_vtab_on_conflictPtr
       .asFunction<int Function(ffi.Pointer<sqlite3>)>();
@@ -10120,7 +10105,7 @@
   }
 
   late final _sqlite3_vtab_nochangePtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_context>)>>(
+          ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_context>)>>(
       'sqlite3_vtab_nochange');
   late final _sqlite3_vtab_nochange = _sqlite3_vtab_nochangePtr
       .asFunction<int Function(ffi.Pointer<sqlite3_context>)>();
@@ -10136,7 +10121,7 @@
   /// structure passed to xBestIndex. This function returns a pointer to a buffer
   /// containing the name of the collation sequence for the corresponding
   /// constraint.
-  ffi.Pointer<ffi.Int8> sqlite3_vtab_collation(
+  ffi.Pointer<ffi.Char> sqlite3_vtab_collation(
     ffi.Pointer<sqlite3_index_info> arg0,
     int arg1,
   ) {
@@ -10148,10 +10133,10 @@
 
   late final _sqlite3_vtab_collationPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3_index_info>,
-              ffi.Int32)>>('sqlite3_vtab_collation');
+          ffi.Pointer<ffi.Char> Function(ffi.Pointer<sqlite3_index_info>,
+              ffi.Int)>>('sqlite3_vtab_collation');
   late final _sqlite3_vtab_collation = _sqlite3_vtab_collationPtr.asFunction<
-      ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3_index_info>, int)>();
+      ffi.Pointer<ffi.Char> Function(ffi.Pointer<sqlite3_index_info>, int)>();
 
   /// CAPI3REF: Prepared Statement Scan Status
   /// METHOD: sqlite3_stmt
@@ -10198,7 +10183,7 @@
 
   late final _sqlite3_stmt_scanstatusPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>, ffi.Int32, ffi.Int32,
+          ffi.Int Function(ffi.Pointer<sqlite3_stmt>, ffi.Int, ffi.Int,
               ffi.Pointer<ffi.Void>)>>('sqlite3_stmt_scanstatus');
   late final _sqlite3_stmt_scanstatus = _sqlite3_stmt_scanstatusPtr.asFunction<
       int Function(
@@ -10262,7 +10247,7 @@
   }
 
   late final _sqlite3_db_cacheflushPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3>)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3>)>>(
           'sqlite3_db_cacheflush');
   late final _sqlite3_db_cacheflush = _sqlite3_db_cacheflushPtr
       .asFunction<int Function(ffi.Pointer<sqlite3>)>();
@@ -10284,7 +10269,7 @@
   }
 
   late final _sqlite3_system_errnoPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3>)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3>)>>(
           'sqlite3_system_errno');
   late final _sqlite3_system_errno =
       _sqlite3_system_errnoPtr.asFunction<int Function(ffi.Pointer<sqlite3>)>();
@@ -10332,7 +10317,7 @@
   /// [SQLITE_ENABLE_SNAPSHOT] compile-time option is used.
   int sqlite3_snapshot_get(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zSchema,
+    ffi.Pointer<ffi.Char> zSchema,
     ffi.Pointer<ffi.Pointer<sqlite3_snapshot>> ppSnapshot,
   ) {
     return _sqlite3_snapshot_get(
@@ -10344,11 +10329,11 @@
 
   late final _sqlite3_snapshot_getPtr = _lookup<
           ffi.NativeFunction<
-              ffi.Int32 Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Int8>,
+              ffi.Int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Char>,
                   ffi.Pointer<ffi.Pointer<sqlite3_snapshot>>)>>(
       'sqlite3_snapshot_get');
   late final _sqlite3_snapshot_get = _sqlite3_snapshot_getPtr.asFunction<
-      int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Int8>,
+      int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Char>,
           ffi.Pointer<ffi.Pointer<sqlite3_snapshot>>)>();
 
   /// CAPI3REF: Start a read transaction on an historical snapshot
@@ -10394,7 +10379,7 @@
   /// [SQLITE_ENABLE_SNAPSHOT] compile-time option is used.
   int sqlite3_snapshot_open(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zSchema,
+    ffi.Pointer<ffi.Char> zSchema,
     ffi.Pointer<sqlite3_snapshot> pSnapshot,
   ) {
     return _sqlite3_snapshot_open(
@@ -10406,10 +10391,10 @@
 
   late final _sqlite3_snapshot_openPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Int8>,
+          ffi.Int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Char>,
               ffi.Pointer<sqlite3_snapshot>)>>('sqlite3_snapshot_open');
   late final _sqlite3_snapshot_open = _sqlite3_snapshot_openPtr.asFunction<
-      int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Int8>,
+      int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Char>,
           ffi.Pointer<sqlite3_snapshot>)>();
 
   /// CAPI3REF: Destroy a snapshot
@@ -10470,7 +10455,7 @@
 
   late final _sqlite3_snapshot_cmpPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_snapshot>,
+          ffi.Int Function(ffi.Pointer<sqlite3_snapshot>,
               ffi.Pointer<sqlite3_snapshot>)>>('sqlite3_snapshot_cmp');
   late final _sqlite3_snapshot_cmp = _sqlite3_snapshot_cmpPtr.asFunction<
       int Function(
@@ -10499,7 +10484,7 @@
   /// [SQLITE_ENABLE_SNAPSHOT] option.
   int sqlite3_snapshot_recover(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zDb,
+    ffi.Pointer<ffi.Char> zDb,
   ) {
     return _sqlite3_snapshot_recover(
       db,
@@ -10509,10 +10494,10 @@
 
   late final _sqlite3_snapshot_recoverPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_snapshot_recover');
+          ffi.Int Function(ffi.Pointer<sqlite3>,
+              ffi.Pointer<ffi.Char>)>>('sqlite3_snapshot_recover');
   late final _sqlite3_snapshot_recover = _sqlite3_snapshot_recoverPtr
-      .asFunction<int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Int8>)>();
+      .asFunction<int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Char>)>();
 
   /// CAPI3REF: Serialize a database
   ///
@@ -10548,9 +10533,9 @@
   ///
   /// This interface is only available if SQLite is compiled with the
   /// [SQLITE_ENABLE_DESERIALIZE] option.
-  ffi.Pointer<ffi.Uint8> sqlite3_serialize(
+  ffi.Pointer<ffi.UnsignedChar> sqlite3_serialize(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zSchema,
+    ffi.Pointer<ffi.Char> zSchema,
     ffi.Pointer<sqlite3_int64> piSize,
     int mFlags,
   ) {
@@ -10564,14 +10549,14 @@
 
   late final _sqlite3_serializePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Uint8> Function(
+          ffi.Pointer<ffi.UnsignedChar> Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<ffi.Char>,
               ffi.Pointer<sqlite3_int64>,
-              ffi.Uint32)>>('sqlite3_serialize');
+              ffi.UnsignedInt)>>('sqlite3_serialize');
   late final _sqlite3_serialize = _sqlite3_serializePtr.asFunction<
-      ffi.Pointer<ffi.Uint8> Function(ffi.Pointer<sqlite3>,
-          ffi.Pointer<ffi.Int8>, ffi.Pointer<sqlite3_int64>, int)>();
+      ffi.Pointer<ffi.UnsignedChar> Function(ffi.Pointer<sqlite3>,
+          ffi.Pointer<ffi.Char>, ffi.Pointer<sqlite3_int64>, int)>();
 
   /// CAPI3REF: Deserialize a database
   ///
@@ -10602,8 +10587,8 @@
   /// [SQLITE_ENABLE_DESERIALIZE] option.
   int sqlite3_deserialize(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zSchema,
-    ffi.Pointer<ffi.Uint8> pData,
+    ffi.Pointer<ffi.Char> zSchema,
+    ffi.Pointer<ffi.UnsignedChar> pData,
     int szDb,
     int szBuf,
     int mFlags,
@@ -10620,16 +10605,16 @@
 
   late final _sqlite3_deserializePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Uint8>,
+              ffi.Pointer<ffi.Char>,
+              ffi.Pointer<ffi.UnsignedChar>,
               sqlite3_int64,
               sqlite3_int64,
-              ffi.Uint32)>>('sqlite3_deserialize');
+              ffi.UnsignedInt)>>('sqlite3_deserialize');
   late final _sqlite3_deserialize = _sqlite3_deserializePtr.asFunction<
-      int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Int8>,
-          ffi.Pointer<ffi.Uint8>, int, int, int)>();
+      int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Char>,
+          ffi.Pointer<ffi.UnsignedChar>, int, int, int)>();
 
   /// Register a geometry callback named zGeom that can be used as part of an
   /// R-Tree geometry query as follows:
@@ -10637,14 +10622,11 @@
   /// SELECT ... FROM <rtree> WHERE <rtree col> MATCH $zGeom(... params ...)
   int sqlite3_rtree_geometry_callback(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zGeom,
+    ffi.Pointer<ffi.Char> zGeom,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Int32 Function(
-                    ffi.Pointer<sqlite3_rtree_geometry>,
-                    ffi.Int32,
-                    ffi.Pointer<sqlite3_rtree_dbl>,
-                    ffi.Pointer<ffi.Int32>)>>
+                ffi.Int Function(ffi.Pointer<sqlite3_rtree_geometry>, ffi.Int,
+                    ffi.Pointer<sqlite3_rtree_dbl>, ffi.Pointer<ffi.Int>)>>
         xGeom,
     ffi.Pointer<ffi.Void> pContext,
   ) {
@@ -10658,29 +10640,29 @@
 
   late final _sqlite3_rtree_geometry_callbackPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<ffi.Char>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Int32 Function(
+                      ffi.Int Function(
                           ffi.Pointer<sqlite3_rtree_geometry>,
-                          ffi.Int32,
+                          ffi.Int,
                           ffi.Pointer<sqlite3_rtree_dbl>,
-                          ffi.Pointer<ffi.Int32>)>>,
+                          ffi.Pointer<ffi.Int>)>>,
               ffi.Pointer<ffi.Void>)>>('sqlite3_rtree_geometry_callback');
   late final _sqlite3_rtree_geometry_callback =
       _sqlite3_rtree_geometry_callbackPtr.asFunction<
           int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<ffi.Char>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Int32 Function(
+                      ffi.Int Function(
                           ffi.Pointer<sqlite3_rtree_geometry>,
-                          ffi.Int32,
+                          ffi.Int,
                           ffi.Pointer<sqlite3_rtree_dbl>,
-                          ffi.Pointer<ffi.Int32>)>>,
+                          ffi.Pointer<ffi.Int>)>>,
               ffi.Pointer<ffi.Void>)>();
 
   /// Register a 2nd-generation geometry callback named zScore that can be
@@ -10689,10 +10671,10 @@
   /// SELECT ... FROM <rtree> WHERE <rtree col> MATCH $zQueryFunc(... params ...)
   int sqlite3_rtree_query_callback(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zQueryFunc,
+    ffi.Pointer<ffi.Char> zQueryFunc,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Int32 Function(ffi.Pointer<sqlite3_rtree_query_info>)>>
+                ffi.Int Function(ffi.Pointer<sqlite3_rtree_query_info>)>>
         xQueryFunc,
     ffi.Pointer<ffi.Void> pContext,
     ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
@@ -10707,29 +10689,29 @@
     );
   }
 
-  late final _sqlite3_rtree_query_callbackPtr = _lookup<
-          ffi.NativeFunction<
-              ffi.Int32 Function(
-                  ffi.Pointer<sqlite3>,
-                  ffi.Pointer<ffi.Int8>,
-                  ffi.Pointer<
-                      ffi.NativeFunction<
-                          ffi.Int32 Function(
-                              ffi.Pointer<sqlite3_rtree_query_info>)>>,
-                  ffi.Pointer<ffi.Void>,
-                  ffi.Pointer<
-                      ffi.NativeFunction<
-                          ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>>(
-      'sqlite3_rtree_query_callback');
+  late final _sqlite3_rtree_query_callbackPtr =
+      _lookup<
+              ffi.NativeFunction<
+                  ffi.Int Function(
+                      ffi.Pointer<sqlite3>,
+                      ffi.Pointer<ffi.Char>,
+                      ffi.Pointer<
+                          ffi.NativeFunction<
+                              ffi.Int Function(
+                                  ffi.Pointer<sqlite3_rtree_query_info>)>>,
+                      ffi.Pointer<ffi.Void>,
+                      ffi.Pointer<
+                          ffi.NativeFunction<
+                              ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>>(
+          'sqlite3_rtree_query_callback');
   late final _sqlite3_rtree_query_callback =
       _sqlite3_rtree_query_callbackPtr.asFunction<
           int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<ffi.Char>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Int32 Function(
-                          ffi.Pointer<sqlite3_rtree_query_info>)>>,
+                      ffi.Int Function(ffi.Pointer<sqlite3_rtree_query_info>)>>,
               ffi.Pointer<ffi.Void>,
               ffi.Pointer<
                   ffi.NativeFunction<
@@ -10743,100 +10725,7 @@
   external ffi.Pointer<sqlite3_io_methods> pMethods;
 }
 
-class sqlite3_io_methods extends ffi.Struct {
-  @ffi.Int32()
-  external int iVersion;
-
-  external ffi.Pointer<
-      ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_file>)>> xClose;
-
-  external ffi.Pointer<
-      ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_file>, ffi.Pointer<ffi.Void>,
-              ffi.Int32, sqlite3_int64)>> xRead;
-
-  external ffi.Pointer<
-      ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_file>, ffi.Pointer<ffi.Void>,
-              ffi.Int32, sqlite3_int64)>> xWrite;
-
-  external ffi.Pointer<
-          ffi.NativeFunction<
-              ffi.Int32 Function(ffi.Pointer<sqlite3_file>, sqlite3_int64)>>
-      xTruncate;
-
-  external ffi.Pointer<
-      ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_file>, ffi.Int32)>> xSync;
-
-  external ffi.Pointer<
-          ffi.NativeFunction<
-              ffi.Int32 Function(
-                  ffi.Pointer<sqlite3_file>, ffi.Pointer<sqlite3_int64>)>>
-      xFileSize;
-
-  external ffi.Pointer<
-      ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_file>, ffi.Int32)>> xLock;
-
-  external ffi.Pointer<
-      ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_file>, ffi.Int32)>> xUnlock;
-
-  external ffi.Pointer<
-          ffi.NativeFunction<
-              ffi.Int32 Function(
-                  ffi.Pointer<sqlite3_file>, ffi.Pointer<ffi.Int32>)>>
-      xCheckReservedLock;
-
-  external ffi.Pointer<
-          ffi.NativeFunction<
-              ffi.Int32 Function(
-                  ffi.Pointer<sqlite3_file>, ffi.Int32, ffi.Pointer<ffi.Void>)>>
-      xFileControl;
-
-  external ffi.Pointer<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_file>)>>
-      xSectorSize;
-
-  external ffi.Pointer<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_file>)>>
-      xDeviceCharacteristics;
-
-  /// Methods above are valid for version 1
-  external ffi.Pointer<
-      ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_file>, ffi.Int32, ffi.Int32,
-              ffi.Int32, ffi.Pointer<ffi.Pointer<ffi.Void>>)>> xShmMap;
-
-  external ffi.Pointer<
-          ffi.NativeFunction<
-              ffi.Int32 Function(
-                  ffi.Pointer<sqlite3_file>, ffi.Int32, ffi.Int32, ffi.Int32)>>
-      xShmLock;
-
-  external ffi.Pointer<
-          ffi.NativeFunction<ffi.Void Function(ffi.Pointer<sqlite3_file>)>>
-      xShmBarrier;
-
-  external ffi.Pointer<
-      ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_file>, ffi.Int32)>> xShmUnmap;
-
-  /// Methods above are valid for version 2
-  external ffi.Pointer<
-      ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_file>, sqlite3_int64,
-              ffi.Int32, ffi.Pointer<ffi.Pointer<ffi.Void>>)>> xFetch;
-
-  external ffi.Pointer<
-      ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_file>, sqlite3_int64,
-              ffi.Pointer<ffi.Void>)>> xUnfetch;
-}
-
-typedef sqlite3_int64 = sqlite_int64;
-typedef sqlite_int64 = ffi.Int64;
+class sqlite3_io_methods extends ffi.Opaque {}
 
 class sqlite3_mutex extends ffi.Opaque {}
 
@@ -10844,60 +10733,56 @@
 
 class sqlite3_vfs extends ffi.Struct {
   /// Structure version number (currently 3)
-  @ffi.Int32()
+  @ffi.Int()
   external int iVersion;
 
   /// Size of subclassed sqlite3_file
-  @ffi.Int32()
+  @ffi.Int()
   external int szOsFile;
 
   /// Maximum file pathname length
-  @ffi.Int32()
+  @ffi.Int()
   external int mxPathname;
 
   /// Next registered VFS
   external ffi.Pointer<sqlite3_vfs> pNext;
 
   /// Name of this virtual file system
-  external ffi.Pointer<ffi.Int8> zName;
+  external ffi.Pointer<ffi.Char> zName;
 
   /// Pointer to application-specific data
   external ffi.Pointer<ffi.Void> pAppData;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<sqlite3_vfs>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<sqlite3_file>,
-              ffi.Int32,
-              ffi.Pointer<ffi.Int32>)>> xOpen;
+          ffi.Int Function(ffi.Pointer<sqlite3_vfs>, ffi.Pointer<ffi.Char>,
+              ffi.Pointer<sqlite3_file>, ffi.Int, ffi.Pointer<ffi.Int>)>> xOpen;
 
   external ffi.Pointer<
           ffi.NativeFunction<
-              ffi.Int32 Function(
-                  ffi.Pointer<sqlite3_vfs>, ffi.Pointer<ffi.Int8>, ffi.Int32)>>
+              ffi.Int Function(
+                  ffi.Pointer<sqlite3_vfs>, ffi.Pointer<ffi.Char>, ffi.Int)>>
       xDelete;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_vfs>, ffi.Pointer<ffi.Int8>,
-              ffi.Int32, ffi.Pointer<ffi.Int32>)>> xAccess;
+          ffi.Int Function(ffi.Pointer<sqlite3_vfs>, ffi.Pointer<ffi.Char>,
+              ffi.Int, ffi.Pointer<ffi.Int>)>> xAccess;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_vfs>, ffi.Pointer<ffi.Int8>,
-              ffi.Int32, ffi.Pointer<ffi.Int8>)>> xFullPathname;
+          ffi.Int Function(ffi.Pointer<sqlite3_vfs>, ffi.Pointer<ffi.Char>,
+              ffi.Int, ffi.Pointer<ffi.Char>)>> xFullPathname;
 
   external ffi.Pointer<
       ffi.NativeFunction<
           ffi.Pointer<ffi.Void> Function(
-              ffi.Pointer<sqlite3_vfs>, ffi.Pointer<ffi.Int8>)>> xDlOpen;
+              ffi.Pointer<sqlite3_vfs>, ffi.Pointer<ffi.Char>)>> xDlOpen;
 
   external ffi.Pointer<
           ffi.NativeFunction<
               ffi.Void Function(
-                  ffi.Pointer<sqlite3_vfs>, ffi.Int32, ffi.Pointer<ffi.Int8>)>>
+                  ffi.Pointer<sqlite3_vfs>, ffi.Int, ffi.Pointer<ffi.Char>)>>
       xDlError;
 
   external ffi.Pointer<
@@ -10905,7 +10790,7 @@
           ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>> Function(
               ffi.Pointer<sqlite3_vfs>,
               ffi.Pointer<ffi.Void>,
-              ffi.Pointer<ffi.Int8>)>> xDlSym;
+              ffi.Pointer<ffi.Char>)>> xDlSym;
 
   external ffi.Pointer<
       ffi.NativeFunction<
@@ -10914,30 +10799,30 @@
 
   external ffi.Pointer<
           ffi.NativeFunction<
-              ffi.Int32 Function(
-                  ffi.Pointer<sqlite3_vfs>, ffi.Int32, ffi.Pointer<ffi.Int8>)>>
+              ffi.Int Function(
+                  ffi.Pointer<sqlite3_vfs>, ffi.Int, ffi.Pointer<ffi.Char>)>>
       xRandomness;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_vfs>, ffi.Int32)>> xSleep;
+          ffi.Int Function(ffi.Pointer<sqlite3_vfs>, ffi.Int)>> xSleep;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<sqlite3_vfs>, ffi.Pointer<ffi.Double>)>> xCurrentTime;
 
   external ffi.Pointer<
           ffi.NativeFunction<
-              ffi.Int32 Function(
-                  ffi.Pointer<sqlite3_vfs>, ffi.Int32, ffi.Pointer<ffi.Int8>)>>
+              ffi.Int Function(
+                  ffi.Pointer<sqlite3_vfs>, ffi.Int, ffi.Pointer<ffi.Char>)>>
       xGetLastError;
 
   /// The methods above are in version 1 of the sqlite_vfs object
   /// definition.  Those that follow are added in version 2 or later
   external ffi.Pointer<
           ffi.NativeFunction<
-              ffi.Int32 Function(
+              ffi.Int Function(
                   ffi.Pointer<sqlite3_vfs>, ffi.Pointer<sqlite3_int64>)>>
       xCurrentTimeInt64;
 
@@ -10945,28 +10830,31 @@
   /// Those below are for version 3 and greater.
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_vfs>, ffi.Pointer<ffi.Int8>,
+          ffi.Int Function(ffi.Pointer<sqlite3_vfs>, ffi.Pointer<ffi.Char>,
               sqlite3_syscall_ptr)>> xSetSystemCall;
 
   external ffi.Pointer<
       ffi.NativeFunction<
           sqlite3_syscall_ptr Function(
-              ffi.Pointer<sqlite3_vfs>, ffi.Pointer<ffi.Int8>)>> xGetSystemCall;
+              ffi.Pointer<sqlite3_vfs>, ffi.Pointer<ffi.Char>)>> xGetSystemCall;
 
   external ffi.Pointer<
           ffi.NativeFunction<
-              ffi.Pointer<ffi.Int8> Function(
-                  ffi.Pointer<sqlite3_vfs>, ffi.Pointer<ffi.Int8>)>>
+              ffi.Pointer<ffi.Char> Function(
+                  ffi.Pointer<sqlite3_vfs>, ffi.Pointer<ffi.Char>)>>
       xNextSystemCall;
 }
 
+typedef sqlite3_int64 = sqlite_int64;
+typedef sqlite_int64 = ffi.LongLong;
 typedef sqlite3_syscall_ptr
     = ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>;
 
 class sqlite3_mem_methods extends ffi.Struct {
   /// Memory allocation function
-  external ffi.Pointer<
-      ffi.NativeFunction<ffi.Pointer<ffi.Void> Function(ffi.Int32)>> xMalloc;
+  external ffi
+          .Pointer<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function(ffi.Int)>>
+      xMalloc;
 
   /// Free a prior allocation
   external ffi
@@ -10976,20 +10864,21 @@
   /// Resize an allocation
   external ffi.Pointer<
           ffi.NativeFunction<
-              ffi.Pointer<ffi.Void> Function(ffi.Pointer<ffi.Void>, ffi.Int32)>>
+              ffi.Pointer<ffi.Void> Function(ffi.Pointer<ffi.Void>, ffi.Int)>>
       xRealloc;
 
   /// Return the size of an allocation
-  external ffi.Pointer<
-      ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<ffi.Void>)>> xSize;
+  external ffi
+          .Pointer<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<ffi.Void>)>>
+      xSize;
 
   /// Round up request size to allocation size
-  external ffi.Pointer<ffi.NativeFunction<ffi.Int32 Function(ffi.Int32)>>
-      xRoundup;
+  external ffi.Pointer<ffi.NativeFunction<ffi.Int Function(ffi.Int)>> xRoundup;
 
   /// Initialize the memory allocator
-  external ffi.Pointer<
-      ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<ffi.Void>)>> xInit;
+  external ffi
+          .Pointer<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<ffi.Void>)>>
+      xInit;
 
   /// Deinitialize the memory allocator
   external ffi
@@ -11001,7 +10890,7 @@
 }
 
 typedef sqlite3_uint64 = sqlite_uint64;
-typedef sqlite_uint64 = ffi.Uint64;
+typedef sqlite_uint64 = ffi.UnsignedLongLong;
 
 class sqlite3_stmt extends ffi.Opaque {}
 
@@ -11030,11 +10919,11 @@
   external ffi.Pointer<sqlite3_module> pModule;
 
   /// Number of open cursors
-  @ffi.Int32()
+  @ffi.Int()
   external int nRef;
 
   /// Error message from sqlite3_mprintf()
-  external ffi.Pointer<ffi.Int8> zErrMsg;
+  external ffi.Pointer<ffi.Char> zErrMsg;
 }
 
 /// CAPI3REF: Virtual Table Object
@@ -11052,140 +10941,143 @@
 /// of this structure must not change while it is registered with
 /// any database connection.
 class sqlite3_module extends ffi.Struct {
-  @ffi.Int32()
+  @ffi.Int()
   external int iVersion;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<sqlite3>,
               ffi.Pointer<ffi.Void>,
-              ffi.Int32,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
+              ffi.Int,
+              ffi.Pointer<ffi.Pointer<ffi.Char>>,
               ffi.Pointer<ffi.Pointer<sqlite3_vtab>>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>)>> xCreate;
+              ffi.Pointer<ffi.Pointer<ffi.Char>>)>> xCreate;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<sqlite3>,
               ffi.Pointer<ffi.Void>,
-              ffi.Int32,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
+              ffi.Int,
+              ffi.Pointer<ffi.Pointer<ffi.Char>>,
               ffi.Pointer<ffi.Pointer<sqlite3_vtab>>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>)>> xConnect;
+              ffi.Pointer<ffi.Pointer<ffi.Char>>)>> xConnect;
 
   external ffi.Pointer<
           ffi.NativeFunction<
-              ffi.Int32 Function(
+              ffi.Int Function(
                   ffi.Pointer<sqlite3_vtab>, ffi.Pointer<sqlite3_index_info>)>>
       xBestIndex;
 
   external ffi.Pointer<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_vtab>)>>
+          ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_vtab> pVTab)>>
       xDisconnect;
 
   external ffi.Pointer<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_vtab>)>>
+          ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_vtab> pVTab)>>
       xDestroy;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_vtab>,
-              ffi.Pointer<ffi.Pointer<sqlite3_vtab_cursor>>)>> xOpen;
+          ffi.Int Function(ffi.Pointer<sqlite3_vtab> pVTab,
+              ffi.Pointer<ffi.Pointer<sqlite3_vtab_cursor>> ppCursor)>> xOpen;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_vtab_cursor>)>> xClose;
+          ffi.Int Function(ffi.Pointer<sqlite3_vtab_cursor>)>> xClose;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<sqlite3_vtab_cursor>,
-              ffi.Int32,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Int32,
+              ffi.Int,
+              ffi.Pointer<ffi.Char>,
+              ffi.Int,
               ffi.Pointer<ffi.Pointer<sqlite3_value>>)>> xFilter;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_vtab_cursor>)>> xNext;
+          ffi.Int Function(ffi.Pointer<sqlite3_vtab_cursor>)>> xNext;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_vtab_cursor>)>> xEof;
+          ffi.Int Function(ffi.Pointer<sqlite3_vtab_cursor>)>> xEof;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_vtab_cursor>,
-              ffi.Pointer<sqlite3_context>, ffi.Int32)>> xColumn;
+          ffi.Int Function(ffi.Pointer<sqlite3_vtab_cursor>,
+              ffi.Pointer<sqlite3_context>, ffi.Int)>> xColumn;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_vtab_cursor>,
+          ffi.Int Function(ffi.Pointer<sqlite3_vtab_cursor>,
               ffi.Pointer<sqlite3_int64>)>> xRowid;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<sqlite3_vtab>,
-              ffi.Int32,
+              ffi.Int,
               ffi.Pointer<ffi.Pointer<sqlite3_value>>,
               ffi.Pointer<sqlite3_int64>)>> xUpdate;
 
   external ffi.Pointer<
-      ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_vtab>)>> xBegin;
+          ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_vtab> pVTab)>>
+      xBegin;
 
   external ffi.Pointer<
-      ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_vtab>)>> xSync;
+          ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_vtab> pVTab)>>
+      xSync;
 
   external ffi.Pointer<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_vtab>)>>
+          ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_vtab> pVTab)>>
       xCommit;
 
   external ffi.Pointer<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_vtab>)>>
+          ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_vtab> pVTab)>>
       xRollback;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<sqlite3_vtab>,
-              ffi.Int32,
-              ffi.Pointer<ffi.Int8>,
+          ffi.Int Function(
+              ffi.Pointer<sqlite3_vtab> pVtab,
+              ffi.Int nArg,
+              ffi.Pointer<ffi.Char> zName,
               ffi.Pointer<
-                  ffi.Pointer<
-                      ffi.NativeFunction<
-                          ffi.Void Function(
-                              ffi.Pointer<sqlite3_context>,
-                              ffi.Int32,
-                              ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>>,
-              ffi.Pointer<ffi.Pointer<ffi.Void>>)>> xFindFunction;
+                      ffi.Pointer<
+                          ffi.NativeFunction<
+                              ffi.Void Function(
+                                  ffi.Pointer<sqlite3_context>,
+                                  ffi.Int,
+                                  ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>>
+                  pxFunc,
+              ffi.Pointer<ffi.Pointer<ffi.Void>> ppArg)>> xFindFunction;
 
   external ffi.Pointer<
-      ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<sqlite3_vtab>, ffi.Pointer<ffi.Int8>)>> xRename;
+          ffi.NativeFunction<
+              ffi.Int Function(
+                  ffi.Pointer<sqlite3_vtab> pVtab, ffi.Pointer<ffi.Char> zNew)>>
+      xRename;
 
   /// The methods above are in version 1 of the sqlite_module object. Those
   /// below are for version 2 and greater.
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_vtab>, ffi.Int32)>> xSavepoint;
+          ffi.Int Function(ffi.Pointer<sqlite3_vtab>, ffi.Int)>> xSavepoint;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_vtab>, ffi.Int32)>> xRelease;
+          ffi.Int Function(ffi.Pointer<sqlite3_vtab>, ffi.Int)>> xRelease;
 
   external ffi.Pointer<
-          ffi.NativeFunction<
-              ffi.Int32 Function(ffi.Pointer<sqlite3_vtab>, ffi.Int32)>>
-      xRollbackTo;
+      ffi.NativeFunction<
+          ffi.Int Function(ffi.Pointer<sqlite3_vtab>, ffi.Int)>> xRollbackTo;
 
   /// The methods above are in versions 1 and 2 of the sqlite_module object.
   /// Those below are for version 3 and greater.
-  external ffi.Pointer<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<ffi.Int8>)>>
+  external ffi
+          .Pointer<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<ffi.Char>)>>
       xShadowName;
 }
 
@@ -11291,14 +11183,14 @@
 /// 3009000.
 class sqlite3_index_info extends ffi.Struct {
   /// Number of entries in aConstraint
-  @ffi.Int32()
+  @ffi.Int()
   external int nConstraint;
 
   /// Table of WHERE clause constraints
   external ffi.Pointer<sqlite3_index_constraint> aConstraint;
 
   /// Number of terms in the ORDER BY clause
-  @ffi.Int32()
+  @ffi.Int()
   external int nOrderBy;
 
   /// The ORDER BY clause
@@ -11307,18 +11199,18 @@
   external ffi.Pointer<sqlite3_index_constraint_usage> aConstraintUsage;
 
   /// Number used to identify the index
-  @ffi.Int32()
+  @ffi.Int()
   external int idxNum;
 
   /// String, possibly obtained from sqlite3_malloc
-  external ffi.Pointer<ffi.Int8> idxStr;
+  external ffi.Pointer<ffi.Char> idxStr;
 
   /// Free idxStr using sqlite3_free() if true
-  @ffi.Int32()
+  @ffi.Int()
   external int needToFreeIdxStr;
 
   /// True if output is already ordered
-  @ffi.Int32()
+  @ffi.Int()
   external int orderByConsumed;
 
   /// Estimated cost of using this index
@@ -11330,7 +11222,7 @@
   external int estimatedRows;
 
   /// Mask of SQLITE_INDEX_SCAN_* flags
-  @ffi.Int32()
+  @ffi.Int()
   external int idxFlags;
 
   /// Input: Mask of columns used by statement
@@ -11340,40 +11232,40 @@
 
 class sqlite3_index_constraint extends ffi.Struct {
   /// Column constrained.  -1 for ROWID
-  @ffi.Int32()
+  @ffi.Int()
   external int iColumn;
 
   /// Constraint operator
-  @ffi.Uint8()
+  @ffi.UnsignedChar()
   external int op;
 
   /// True if this constraint is usable
-  @ffi.Uint8()
+  @ffi.UnsignedChar()
   external int usable;
 
   /// Used internally - xBestIndex should ignore
-  @ffi.Int32()
+  @ffi.Int()
   external int iTermOffset;
 }
 
 class sqlite3_index_orderby extends ffi.Struct {
   /// Column number
-  @ffi.Int32()
+  @ffi.Int()
   external int iColumn;
 
   /// True for DESC.  False for ASC.
-  @ffi.Uint8()
+  @ffi.UnsignedChar()
   external int desc;
 }
 
 /// Outputs
 class sqlite3_index_constraint_usage extends ffi.Struct {
   /// if >0, constraint is part of argv to xFilter
-  @ffi.Int32()
+  @ffi.Int()
   external int argvIndex;
 
   /// Do not code a test for this constraint
-  @ffi.Uint8()
+  @ffi.UnsignedChar()
   external int omit;
 }
 
@@ -11400,12 +11292,12 @@
 class sqlite3_blob extends ffi.Opaque {}
 
 class sqlite3_mutex_methods extends ffi.Struct {
-  external ffi.Pointer<ffi.NativeFunction<ffi.Int32 Function()>> xMutexInit;
+  external ffi.Pointer<ffi.NativeFunction<ffi.Int Function()>> xMutexInit;
 
-  external ffi.Pointer<ffi.NativeFunction<ffi.Int32 Function()>> xMutexEnd;
+  external ffi.Pointer<ffi.NativeFunction<ffi.Int Function()>> xMutexEnd;
 
   external ffi.Pointer<
-          ffi.NativeFunction<ffi.Pointer<sqlite3_mutex> Function(ffi.Int32)>>
+          ffi.NativeFunction<ffi.Pointer<sqlite3_mutex> Function(ffi.Int)>>
       xMutexAlloc;
 
   external ffi.Pointer<
@@ -11417,7 +11309,7 @@
       xMutexEnter;
 
   external ffi.Pointer<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_mutex>)>>
+          ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_mutex>)>>
       xMutexTry;
 
   external ffi.Pointer<
@@ -11425,11 +11317,11 @@
       xMutexLeave;
 
   external ffi.Pointer<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_mutex>)>>
+          ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_mutex>)>>
       xMutexHeld;
 
   external ffi.Pointer<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_mutex>)>>
+          ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_mutex>)>>
       xMutexNotheld;
 }
 
@@ -11446,13 +11338,14 @@
 }
 
 class sqlite3_pcache_methods2 extends ffi.Struct {
-  @ffi.Int32()
+  @ffi.Int()
   external int iVersion;
 
   external ffi.Pointer<ffi.Void> pArg;
 
-  external ffi.Pointer<
-      ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<ffi.Void>)>> xInit;
+  external ffi
+          .Pointer<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<ffi.Void>)>>
+      xInit;
 
   external ffi
           .Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
@@ -11461,38 +11354,37 @@
   external ffi.Pointer<
       ffi.NativeFunction<
           ffi.Pointer<sqlite3_pcache> Function(
-              ffi.Int32, ffi.Int32, ffi.Int32)>> xCreate;
+              ffi.Int szPage, ffi.Int szExtra, ffi.Int bPurgeable)>> xCreate;
 
   external ffi.Pointer<
-          ffi.NativeFunction<
-              ffi.Void Function(ffi.Pointer<sqlite3_pcache>, ffi.Int32)>>
-      xCachesize;
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<sqlite3_pcache>, ffi.Int)>> xCachesize;
 
   external ffi.Pointer<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_pcache>)>>
+          ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_pcache>)>>
       xPagecount;
 
   external ffi.Pointer<
       ffi.NativeFunction<
           ffi.Pointer<sqlite3_pcache_page> Function(
-              ffi.Pointer<sqlite3_pcache>, ffi.Uint32, ffi.Int32)>> xFetch;
+              ffi.Pointer<sqlite3_pcache>, ffi.UnsignedInt, ffi.Int)>> xFetch;
 
   external ffi.Pointer<
       ffi.NativeFunction<
           ffi.Void Function(ffi.Pointer<sqlite3_pcache>,
-              ffi.Pointer<sqlite3_pcache_page>, ffi.Int32)>> xUnpin;
+              ffi.Pointer<sqlite3_pcache_page>, ffi.Int)>> xUnpin;
 
   external ffi.Pointer<
       ffi.NativeFunction<
           ffi.Void Function(
               ffi.Pointer<sqlite3_pcache>,
               ffi.Pointer<sqlite3_pcache_page>,
-              ffi.Uint32,
-              ffi.Uint32)>> xRekey;
+              ffi.UnsignedInt,
+              ffi.UnsignedInt)>> xRekey;
 
   external ffi.Pointer<
           ffi.NativeFunction<
-              ffi.Void Function(ffi.Pointer<sqlite3_pcache>, ffi.Uint32)>>
+              ffi.Void Function(ffi.Pointer<sqlite3_pcache>, ffi.UnsignedInt)>>
       xTruncate;
 
   external ffi.Pointer<
@@ -11507,8 +11399,9 @@
 class sqlite3_pcache_methods extends ffi.Struct {
   external ffi.Pointer<ffi.Void> pArg;
 
-  external ffi.Pointer<
-      ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<ffi.Void>)>> xInit;
+  external ffi
+          .Pointer<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<ffi.Void>)>>
+      xInit;
 
   external ffi
           .Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
@@ -11516,35 +11409,36 @@
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Pointer<sqlite3_pcache> Function(ffi.Int32, ffi.Int32)>> xCreate;
+          ffi.Pointer<sqlite3_pcache> Function(
+              ffi.Int szPage, ffi.Int bPurgeable)>> xCreate;
 
   external ffi.Pointer<
-          ffi.NativeFunction<
-              ffi.Void Function(ffi.Pointer<sqlite3_pcache>, ffi.Int32)>>
-      xCachesize;
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<sqlite3_pcache>, ffi.Int)>> xCachesize;
 
   external ffi.Pointer<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_pcache>)>>
+          ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_pcache>)>>
       xPagecount;
 
   external ffi.Pointer<
       ffi.NativeFunction<
           ffi.Pointer<ffi.Void> Function(
-              ffi.Pointer<sqlite3_pcache>, ffi.Uint32, ffi.Int32)>> xFetch;
-
-  external ffi.Pointer<
-      ffi.NativeFunction<
-          ffi.Void Function(ffi.Pointer<sqlite3_pcache>, ffi.Pointer<ffi.Void>,
-              ffi.Int32)>> xUnpin;
-
-  external ffi.Pointer<
-      ffi.NativeFunction<
-          ffi.Void Function(ffi.Pointer<sqlite3_pcache>, ffi.Pointer<ffi.Void>,
-              ffi.Uint32, ffi.Uint32)>> xRekey;
+              ffi.Pointer<sqlite3_pcache>, ffi.UnsignedInt, ffi.Int)>> xFetch;
 
   external ffi.Pointer<
           ffi.NativeFunction<
-              ffi.Void Function(ffi.Pointer<sqlite3_pcache>, ffi.Uint32)>>
+              ffi.Void Function(
+                  ffi.Pointer<sqlite3_pcache>, ffi.Pointer<ffi.Void>, ffi.Int)>>
+      xUnpin;
+
+  external ffi.Pointer<
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<sqlite3_pcache>, ffi.Pointer<ffi.Void>,
+              ffi.UnsignedInt, ffi.UnsignedInt)>> xRekey;
+
+  external ffi.Pointer<
+          ffi.NativeFunction<
+              ffi.Void Function(ffi.Pointer<sqlite3_pcache>, ffi.UnsignedInt)>>
       xTruncate;
 
   external ffi.Pointer<
@@ -11574,7 +11468,7 @@
 /// the most recent version.
 class sqlite3_snapshot extends ffi.Struct {
   @ffi.Array.multi([48])
-  external ffi.Array<ffi.Uint8> hidden;
+  external ffi.Array<ffi.UnsignedChar> hidden;
 }
 
 /// A pointer to a structure of the following type is passed as the first
@@ -11584,7 +11478,7 @@
   external ffi.Pointer<ffi.Void> pContext;
 
   /// Size of array aParam[]
-  @ffi.Int32()
+  @ffi.Int()
   external int nParam;
 
   /// Parameters passed to SQL geom function
@@ -11613,7 +11507,7 @@
   external ffi.Pointer<ffi.Void> pContext;
 
   /// Number of function parameters
-  @ffi.Int32()
+  @ffi.Int()
   external int nParam;
 
   /// value of function parameters
@@ -11631,18 +11525,18 @@
   external ffi.Pointer<sqlite3_rtree_dbl> aCoord;
 
   /// Number of pending entries in the queue
-  external ffi.Pointer<ffi.Uint32> anQueue;
+  external ffi.Pointer<ffi.UnsignedInt> anQueue;
 
   /// Number of coordinates
-  @ffi.Int32()
+  @ffi.Int()
   external int nCoord;
 
   /// Level of current node or entry
-  @ffi.Int32()
+  @ffi.Int()
   external int iLevel;
 
   /// The largest iLevel value in the tree
-  @ffi.Int32()
+  @ffi.Int()
   external int mxLevel;
 
   /// Rowid for current entry
@@ -11654,11 +11548,11 @@
   external double rParentScore;
 
   /// Visibility of parent node
-  @ffi.Int32()
+  @ffi.Int()
   external int eParentWithin;
 
   /// OUT: Visibility
-  @ffi.Int32()
+  @ffi.Int()
   external int eWithin;
 
   /// OUT: Write the score here
@@ -11880,7 +11774,7 @@
 /// See xPhraseFirstColumn above.
 class Fts5ExtensionApi extends ffi.Struct {
   /// Currently always set to 3
-  @ffi.Int32()
+  @ffi.Int()
   external int iVersion;
 
   external ffi.Pointer<
@@ -11888,57 +11782,57 @@
           ffi.Pointer<ffi.Void> Function(ffi.Pointer<Fts5Context>)>> xUserData;
 
   external ffi.Pointer<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<Fts5Context>)>>
+          ffi.NativeFunction<ffi.Int Function(ffi.Pointer<Fts5Context>)>>
       xColumnCount;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<Fts5Context>, ffi.Pointer<sqlite3_int64>)>> xRowCount;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<Fts5Context>, ffi.Int32,
+          ffi.Int Function(ffi.Pointer<Fts5Context>, ffi.Int,
               ffi.Pointer<sqlite3_int64>)>> xColumnTotalSize;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<Fts5Context>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Int32,
+              ffi.Pointer<ffi.Char>,
+              ffi.Int,
               ffi.Pointer<ffi.Void>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Int32 Function(
+                      ffi.Int Function(
                           ffi.Pointer<ffi.Void>,
-                          ffi.Int32,
-                          ffi.Pointer<ffi.Int8>,
-                          ffi.Int32,
-                          ffi.Int32,
-                          ffi.Int32)>>)>> xTokenize;
+                          ffi.Int,
+                          ffi.Pointer<ffi.Char>,
+                          ffi.Int,
+                          ffi.Int,
+                          ffi.Int)>>)>> xTokenize;
 
   external ffi.Pointer<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<Fts5Context>)>>
+          ffi.NativeFunction<ffi.Int Function(ffi.Pointer<Fts5Context>)>>
       xPhraseCount;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<Fts5Context>, ffi.Int32)>> xPhraseSize;
+          ffi.Int Function(ffi.Pointer<Fts5Context>, ffi.Int)>> xPhraseSize;
+
+  external ffi.Pointer<
+          ffi.NativeFunction<
+              ffi.Int Function(ffi.Pointer<Fts5Context>, ffi.Pointer<ffi.Int>)>>
+      xInstCount;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<Fts5Context>, ffi.Pointer<ffi.Int32>)>> xInstCount;
-
-  external ffi.Pointer<
-      ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<Fts5Context>,
-              ffi.Int32,
-              ffi.Pointer<ffi.Int32>,
-              ffi.Pointer<ffi.Int32>,
-              ffi.Pointer<ffi.Int32>)>> xInst;
+              ffi.Int,
+              ffi.Pointer<ffi.Int>,
+              ffi.Pointer<ffi.Int>,
+              ffi.Pointer<ffi.Int>)>> xInst;
 
   external ffi.Pointer<
           ffi.NativeFunction<sqlite3_int64 Function(ffi.Pointer<Fts5Context>)>>
@@ -11946,34 +11840,34 @@
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<Fts5Context>,
-              ffi.Int32,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              ffi.Pointer<ffi.Int32>)>> xColumnText;
+              ffi.Int,
+              ffi.Pointer<ffi.Pointer<ffi.Char>>,
+              ffi.Pointer<ffi.Int>)>> xColumnText;
 
   external ffi.Pointer<
           ffi.NativeFunction<
-              ffi.Int32 Function(
-                  ffi.Pointer<Fts5Context>, ffi.Int32, ffi.Pointer<ffi.Int32>)>>
+              ffi.Int Function(
+                  ffi.Pointer<Fts5Context>, ffi.Int, ffi.Pointer<ffi.Int>)>>
       xColumnSize;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<Fts5Context>,
-              ffi.Int32,
+              ffi.Int,
               ffi.Pointer<ffi.Void>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Int32 Function(
+                      ffi.Int Function(
                           ffi.Pointer<Fts5ExtensionApi>,
                           ffi.Pointer<Fts5Context>,
                           ffi.Pointer<ffi.Void>)>>)>> xQueryPhrase;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<Fts5Context>,
               ffi.Pointer<ffi.Void>,
               ffi.Pointer<
@@ -11983,47 +11877,47 @@
   external ffi.Pointer<
       ffi.NativeFunction<
           ffi.Pointer<ffi.Void> Function(
-              ffi.Pointer<Fts5Context>, ffi.Int32)>> xGetAuxdata;
+              ffi.Pointer<Fts5Context>, ffi.Int)>> xGetAuxdata;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<Fts5Context>,
-              ffi.Int32,
+              ffi.Int,
               ffi.Pointer<Fts5PhraseIter>,
-              ffi.Pointer<ffi.Int32>,
-              ffi.Pointer<ffi.Int32>)>> xPhraseFirst;
+              ffi.Pointer<ffi.Int>,
+              ffi.Pointer<ffi.Int>)>> xPhraseFirst;
 
   external ffi.Pointer<
       ffi.NativeFunction<
           ffi.Void Function(
               ffi.Pointer<Fts5Context>,
               ffi.Pointer<Fts5PhraseIter>,
-              ffi.Pointer<ffi.Int32>,
-              ffi.Pointer<ffi.Int32>)>> xPhraseNext;
+              ffi.Pointer<ffi.Int>,
+              ffi.Pointer<ffi.Int>)>> xPhraseNext;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<Fts5Context>,
-              ffi.Int32,
+              ffi.Int,
               ffi.Pointer<Fts5PhraseIter>,
-              ffi.Pointer<ffi.Int32>)>> xPhraseFirstColumn;
+              ffi.Pointer<ffi.Int>)>> xPhraseFirstColumn;
 
   external ffi.Pointer<
       ffi.NativeFunction<
           ffi.Void Function(
               ffi.Pointer<Fts5Context>,
               ffi.Pointer<Fts5PhraseIter>,
-              ffi.Pointer<ffi.Int32>)>> xPhraseNextColumn;
+              ffi.Pointer<ffi.Int>)>> xPhraseNextColumn;
 }
 
 class Fts5Context extends ffi.Opaque {}
 
 class Fts5PhraseIter extends ffi.Struct {
-  external ffi.Pointer<ffi.Uint8> a;
+  external ffi.Pointer<ffi.UnsignedChar> a;
 
-  external ffi.Pointer<ffi.Uint8> b;
+  external ffi.Pointer<ffi.UnsignedChar> b;
 }
 
 class Fts5Tokenizer extends ffi.Opaque {}
@@ -12031,10 +11925,10 @@
 class fts5_tokenizer extends ffi.Struct {
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<ffi.Void>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<ffi.Char>>,
+              ffi.Int,
               ffi.Pointer<ffi.Pointer<Fts5Tokenizer>>)>> xCreate;
 
   external ffi.Pointer<
@@ -12043,72 +11937,72 @@
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          ffi.Int Function(
               ffi.Pointer<Fts5Tokenizer>,
               ffi.Pointer<ffi.Void>,
-              ffi.Int32,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Int32,
+              ffi.Int,
+              ffi.Pointer<ffi.Char>,
+              ffi.Int,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Int32 Function(
+                      ffi.Int Function(
                           ffi.Pointer<ffi.Void>,
-                          ffi.Int32,
-                          ffi.Pointer<ffi.Int8>,
-                          ffi.Int32,
-                          ffi.Int32,
-                          ffi.Int32)>>)>> xTokenize;
+                          ffi.Int,
+                          ffi.Pointer<ffi.Char>,
+                          ffi.Int,
+                          ffi.Int,
+                          ffi.Int)>>)>> xTokenize;
 }
 
 class fts5_api extends ffi.Struct {
   /// Currently always set to 2
-  @ffi.Int32()
+  @ffi.Int()
   external int iVersion;
 
   /// Create a new tokenizer
   external ffi.Pointer<
-          ffi.NativeFunction<
-              ffi.Int32 Function(
-                  ffi.Pointer<fts5_api>,
-                  ffi.Pointer<ffi.Int8>,
-                  ffi.Pointer<ffi.Void>,
-                  ffi.Pointer<fts5_tokenizer>,
-                  ffi.Pointer<
+      ffi.NativeFunction<
+          ffi.Int Function(
+              ffi.Pointer<fts5_api> pApi,
+              ffi.Pointer<ffi.Char> zName,
+              ffi.Pointer<ffi.Void> pContext,
+              ffi.Pointer<fts5_tokenizer> pTokenizer,
+              ffi.Pointer<
                       ffi.NativeFunction<
-                          ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>>
-      xCreateTokenizer;
+                          ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+                  xDestroy)>> xCreateTokenizer;
 
   /// Find an existing tokenizer
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<fts5_api>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Void>>,
-              ffi.Pointer<fts5_tokenizer>)>> xFindTokenizer;
+          ffi.Int Function(
+              ffi.Pointer<fts5_api> pApi,
+              ffi.Pointer<ffi.Char> zName,
+              ffi.Pointer<ffi.Pointer<ffi.Void>> ppContext,
+              ffi.Pointer<fts5_tokenizer> pTokenizer)>> xFindTokenizer;
 
   /// Create a new auxiliary function
   external ffi.Pointer<
-          ffi.NativeFunction<
-              ffi.Int32 Function(
-                  ffi.Pointer<fts5_api>,
-                  ffi.Pointer<ffi.Int8>,
-                  ffi.Pointer<ffi.Void>,
-                  fts5_extension_function,
-                  ffi.Pointer<
+      ffi.NativeFunction<
+          ffi.Int Function(
+              ffi.Pointer<fts5_api> pApi,
+              ffi.Pointer<ffi.Char> zName,
+              ffi.Pointer<ffi.Void> pContext,
+              fts5_extension_function xFunction,
+              ffi.Pointer<
                       ffi.NativeFunction<
-                          ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>>
-      xCreateFunction;
+                          ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+                  xDestroy)>> xCreateFunction;
 }
 
 typedef fts5_extension_function = ffi.Pointer<
     ffi.NativeFunction<
         ffi.Void Function(
-            ffi.Pointer<Fts5ExtensionApi>,
-            ffi.Pointer<Fts5Context>,
-            ffi.Pointer<sqlite3_context>,
-            ffi.Int32,
-            ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>;
+            ffi.Pointer<Fts5ExtensionApi> pApi,
+            ffi.Pointer<Fts5Context> pFts,
+            ffi.Pointer<sqlite3_context> pCtx,
+            ffi.Int nVal,
+            ffi.Pointer<ffi.Pointer<sqlite3_value>> apVal)>>;
 
 const String SQLITE_VERSION = '3.32.3';
 
diff --git a/pkgs/ffigen/test/large_integration_tests/large_test.dart b/pkgs/ffigen/test/large_integration_tests/large_test.dart
index a3fadae..257ff26 100644
--- a/pkgs/ffigen/test/large_integration_tests/large_test.dart
+++ b/pkgs/ffigen/test/large_integration_tests/large_test.dart
@@ -2,13 +2,11 @@
 // 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 'package:ffigen/src/config_provider/config.dart';
 import 'package:ffigen/src/header_parser.dart';
 import 'package:ffigen/src/strings.dart' as strings;
 import 'package:logging/logging.dart';
 import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
-import 'package:yaml/yaml.dart';
 
 import '../test_utils.dart';
 
@@ -18,7 +16,7 @@
       logWarnings(Level.SEVERE);
     });
     test('Libclang test', () {
-      final config = Config.fromYaml(loadYaml('''
+      final config = testConfig('''
 ${strings.name}: LibClang
 ${strings.description}: Bindings to LibClang.
 ${strings.output}: unused
@@ -37,23 +35,30 @@
     - '**Documentation.h'
     - '**FataErrorHandler.h'
     - '**Index.h'
-${strings.typedefmap}:
-  'size_t': 'IntPtr'
-  'time_t': 'Int64'
+${strings.typeMap}:
+  ${strings.typeMapTypedefs}:
+    'time_t':
+      lib: 'ffi'
+      c-type: 'Int64'
+      dart-type: 'int'
 ${strings.preamble}: |
   // ignore_for_file: camel_case_types, non_constant_identifier_names
-      ''') as YamlMap);
+      ''');
       final library = parse(config);
 
       matchLibraryWithExpected(
         library,
-        ['test', 'debug_generated', 'large_test_libclang.dart'],
+        'large_test_libclang.dart',
         ['test', 'large_integration_tests', '_expected_libclang_bindings.dart'],
+        // Remove comments containing @ to hack around a mismatch in the
+        // documentation generated by different clang versions.
+        codeNormalizer: (code) =>
+            code.replaceAll(RegExp('[^\n]*///[^\n]*@[^\n]*\n'), ''),
       );
     });
 
     test('CJSON test', () {
-      final config = Config.fromYaml(loadYaml('''
+      final config = testConfig('''
 ${strings.name}: CJson
 ${strings.description}: Bindings to Cjson.
 ${strings.output}: unused
@@ -64,16 +69,14 @@
     - third_party/cjson_library/cJSON.h
   ${strings.includeDirectives}:
     - '**cJSON.h'
-${strings.typedefmap}:
-  'size_t': 'IntPtr'
 ${strings.preamble}: |
   // ignore_for_file: camel_case_types, non_constant_identifier_names
-      ''') as YamlMap);
+      ''');
       final library = parse(config);
 
       matchLibraryWithExpected(
         library,
-        ['test', 'debug_generated', 'large_test_cjson.dart'],
+        'large_test_cjson.dart',
         ['test', 'large_integration_tests', '_expected_cjson_bindings.dart'],
       );
     });
@@ -81,7 +84,7 @@
     test('SQLite test', () {
       // Excluding functions that use 'va_list' because it can either be a
       // Pointer<__va_list_tag> or int depending on the OS.
-      final config = Config.fromYaml(loadYaml('''
+      final config = testConfig('''
 ${strings.name}: SQLite
 ${strings.description}: Bindings to SQLite.
 ${strings.output}: unused
@@ -100,12 +103,12 @@
     - sqlite3_str_vappendf
 ${strings.preamble}: |
   // ignore_for_file: camel_case_types, non_constant_identifier_names
-      ''') as YamlMap);
+      ''');
       final library = parse(config);
 
       matchLibraryWithExpected(
         library,
-        ['test', 'debug_generated', 'large_test_sqlite.dart'],
+        'large_test_sqlite.dart',
         ['test', 'large_integration_tests', '_expected_sqlite_bindings.dart'],
       );
     });
diff --git a/pkgs/ffigen/test/native_objc_test/.gitignore b/pkgs/ffigen/test/native_objc_test/.gitignore
new file mode 100644
index 0000000..ad4daf6
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/.gitignore
@@ -0,0 +1,2 @@
+*_bindings.dart
+*-Swift.h
diff --git a/pkgs/ffigen/test/native_objc_test/automated_ref_count_config.yaml b/pkgs/ffigen/test/native_objc_test/automated_ref_count_config.yaml
new file mode 100644
index 0000000..600d33d
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/automated_ref_count_config.yaml
@@ -0,0 +1,18 @@
+name: AutomatedRefCountTestObjCLibrary
+description: 'Tests automatic reference counting of Objective-C objects'
+language: objc
+output: 'automated_ref_count_bindings.dart'
+exclude-all-by-default: true
+functions:
+  include:
+    - createAutoreleasePool
+    - destroyAutoreleasePool
+objc-interfaces:
+  include:
+    - ArcTestObject
+    - RefCounted
+headers:
+  entry-points:
+    - 'automated_ref_count_test.m'
+preamble: |
+  // ignore_for_file: camel_case_types, non_constant_identifier_names, unused_element, unused_field
diff --git a/pkgs/ffigen/test/native_objc_test/automated_ref_count_test.dart b/pkgs/ffigen/test/native_objc_test/automated_ref_count_test.dart
new file mode 100644
index 0000000..63ed706
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/automated_ref_count_test.dart
@@ -0,0 +1,317 @@
+// Copyright (c) 2022, 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.
+
+// Objective C support is only available on mac.
+@TestOn('mac-os')
+
+import 'dart:ffi';
+import 'dart:io';
+
+import 'package:test/test.dart';
+import 'package:ffi/ffi.dart';
+import '../test_utils.dart';
+import 'automated_ref_count_bindings.dart';
+import 'util.dart';
+
+void main() {
+  late AutomatedRefCountTestObjCLibrary lib;
+  late void Function(Pointer<Char>, Pointer<Void>) executeInternalCommand;
+
+  group('Automatic reference counting', () {
+    setUpAll(() {
+      logWarnings();
+      final dylib =
+          File('test/native_objc_test/automated_ref_count_test.dylib');
+      verifySetupFile(dylib);
+      lib = AutomatedRefCountTestObjCLibrary(
+          DynamicLibrary.open(dylib.absolute.path));
+
+      executeInternalCommand = DynamicLibrary.process().lookupFunction<
+          Void Function(Pointer<Char>, Pointer<Void>),
+          void Function(
+              Pointer<Char>, Pointer<Void>)>('Dart_ExecuteInternalCommand');
+
+      generateBindingsForCoverage('automated_ref_count');
+    });
+
+    doGC() {
+      final gcNow = "gc-now".toNativeUtf8();
+      executeInternalCommand(gcNow.cast(), nullptr);
+      calloc.free(gcNow);
+    }
+
+    newMethodsInner(Pointer<Int32> counter) {
+      final obj1 = ArcTestObject.new1(lib);
+      obj1.setCounter_(counter);
+      expect(counter.value, 1);
+      final obj2 = ArcTestObject.newWithCounter_(lib, counter);
+      expect(counter.value, 2);
+    }
+
+    test('new methods ref count correctly', () {
+      // To get the GC to work correctly, the references to the objects all have
+      // to be in a separate function.
+      final counter = calloc<Int32>();
+      counter.value = 0;
+      newMethodsInner(counter);
+      doGC();
+      expect(counter.value, 0);
+      calloc.free(counter);
+    });
+
+    allocMethodsInner(Pointer<Int32> counter) {
+      final obj1 = ArcTestObject.alloc(lib).initWithCounter_(counter);
+      expect(counter.value, 1);
+      final obj2 = ArcTestObject.castFrom(ArcTestObject.alloc(lib).init());
+      obj2.setCounter_(counter);
+      expect(counter.value, 2);
+      final obj3 = ArcTestObject.allocTheThing(lib).initWithCounter_(counter);
+      expect(counter.value, 3);
+    }
+
+    test('alloc and init methods ref count correctly', () {
+      final counter = calloc<Int32>();
+      counter.value = 0;
+      allocMethodsInner(counter);
+      doGC();
+      expect(counter.value, 0);
+      calloc.free(counter);
+    });
+
+    copyMethodsInner(Pointer<Int32> counter) {
+      final obj1 = ArcTestObject.newWithCounter_(lib, counter);
+      expect(counter.value, 1);
+      final obj2 = obj1.copyMe();
+      expect(counter.value, 2);
+      final obj3 = obj1.makeACopy();
+      expect(counter.value, 3);
+      final obj4 = obj1.copyWithZone_(nullptr);
+      expect(counter.value, 4);
+      final obj5 = obj1.copy();
+      expect(counter.value, 5);
+    }
+
+    test('copy methods ref count correctly', () {
+      final counter = calloc<Int32>();
+      counter.value = 0;
+      copyMethodsInner(counter);
+      doGC();
+      expect(counter.value, 0);
+      calloc.free(counter);
+    });
+
+    autoreleaseMethodsInner(Pointer<Int32> counter) {
+      final obj = ArcTestObject.makeAndAutorelease_(lib, counter);
+      expect(counter.value, 1);
+    }
+
+    test('autorelease methods ref count correctly', () {
+      final counter = calloc<Int32>();
+      counter.value = 0;
+
+      final pool1 = lib.createAutoreleasePool();
+      autoreleaseMethodsInner(counter);
+      doGC();
+      // The autorelease pool is still holding a reference to the object.
+      expect(counter.value, 1);
+      lib.destroyAutoreleasePool(pool1);
+      expect(counter.value, 0);
+
+      final pool2 = lib.createAutoreleasePool();
+      final obj = ArcTestObject.makeAndAutorelease_(lib, counter);
+      expect(counter.value, 1);
+      doGC();
+      expect(counter.value, 1);
+      lib.destroyAutoreleasePool(pool2);
+      // The obj variable still holds a reference to the object.
+      expect(counter.value, 1);
+      obj.release();
+      expect(counter.value, 0);
+
+      calloc.free(counter);
+    });
+
+    assignPropertiesInnerInner(Pointer<Int32> counter, ArcTestObject outerObj) {
+      final assignObj = ArcTestObject.newWithCounter_(lib, counter);
+      expect(counter.value, 2);
+      outerObj.assignedProperty = assignObj;
+      expect(counter.value, 2);
+      expect(assignObj, outerObj.assignedProperty);
+      // To test that outerObj isn't holding a reference to assignObj, we let
+      // assignObj go out of scope, but keep outerObj in scope. This is
+      // dangerous because outerObj now has a dangling reference, so don't
+      // access that reference.
+    }
+
+    assignPropertiesInner(Pointer<Int32> counter) {
+      final outerObj = ArcTestObject.newWithCounter_(lib, counter);
+      expect(counter.value, 1);
+      assignPropertiesInnerInner(counter, outerObj);
+      doGC();
+      // assignObj has been cleaned up.
+      expect(counter.value, 1);
+    }
+
+    test('assign properties ref count correctly', () {
+      final counter = calloc<Int32>();
+      counter.value = 0;
+      assignPropertiesInner(counter);
+      doGC();
+      expect(counter.value, 0);
+      calloc.free(counter);
+    });
+
+    retainPropertiesInnerInner(Pointer<Int32> counter, ArcTestObject outerObj) {
+      final retainObj = ArcTestObject.newWithCounter_(lib, counter);
+      expect(counter.value, 2);
+      outerObj.retainedProperty = retainObj;
+      expect(counter.value, 2);
+      expect(retainObj, outerObj.retainedProperty);
+    }
+
+    retainPropertiesInner(Pointer<Int32> counter) {
+      final outerObj = ArcTestObject.newWithCounter_(lib, counter);
+      expect(counter.value, 1);
+      retainPropertiesInnerInner(counter, outerObj);
+      doGC();
+      // retainObj is still around, because outerObj retains a reference to it.
+      expect(counter.value, 2);
+    }
+
+    test('retain properties ref count correctly', () {
+      final counter = calloc<Int32>();
+      counter.value = 0;
+      // The getters of retain properties retain+autorelease the value. So we
+      // need an autorelease pool.
+      final pool = lib.createAutoreleasePool();
+      retainPropertiesInner(counter);
+      doGC();
+      expect(counter.value, 1);
+      lib.destroyAutoreleasePool(pool);
+      expect(counter.value, 0);
+      calloc.free(counter);
+    });
+
+    copyPropertiesInner(Pointer<Int32> counter) {
+      final outerObj = ArcTestObject.newWithCounter_(lib, counter);
+      expect(counter.value, 1);
+
+      final copyObj = ArcTestObject.newWithCounter_(lib, counter);
+      expect(counter.value, 2);
+      outerObj.copiedProperty = copyObj;
+      // Copy properties make a copy of the object, so now we have 3 objects.
+      expect(counter.value, 3);
+      expect(copyObj, isNot(outerObj.copiedProperty));
+
+      final anotherCopy = outerObj.copiedProperty;
+      // The getter doesn't copy the object.
+      expect(counter.value, 3);
+      expect(anotherCopy, outerObj.copiedProperty);
+    }
+
+    test('copy properties ref count correctly', () {
+      final counter = calloc<Int32>();
+      counter.value = 0;
+      // The getters of copy properties retain+autorelease the value. So we need
+      // an autorelease pool.
+      final pool = lib.createAutoreleasePool();
+      copyPropertiesInner(counter);
+      doGC();
+      expect(counter.value, 1);
+      lib.destroyAutoreleasePool(pool);
+      expect(counter.value, 0);
+      calloc.free(counter);
+    });
+
+    castFromPointerInnerReleaseAndRetain(int address) {
+      final fromCast = RefCounted.castFromPointer(
+          lib, Pointer<ObjCObject>.fromAddress(address),
+          release: true, retain: true);
+      expect(fromCast.refCount, 2);
+    }
+
+    test('castFromPointer - release and retain', () {
+      final obj1 = RefCounted.new1(lib);
+      expect(obj1.refCount, 1);
+
+      castFromPointerInnerReleaseAndRetain(obj1.meAsInt());
+      doGC();
+      expect(obj1.refCount, 1);
+    });
+
+    castFromPointerInnerNoReleaseAndRetain(int address) {
+      final fromCast = RefCounted.castFromPointer(
+          lib, Pointer<ObjCObject>.fromAddress(address),
+          release: false, retain: false);
+      expect(fromCast.refCount, 1);
+    }
+
+    test('castFromPointer - no release and retain', () {
+      final obj1 = RefCounted.new1(lib);
+      expect(obj1.refCount, 1);
+
+      castFromPointerInnerNoReleaseAndRetain(obj1.meAsInt());
+      doGC();
+      expect(obj1.refCount, 1);
+    });
+
+    test('Manual release', () {
+      final counter = calloc<Int32>();
+      final obj1 = ArcTestObject.newWithCounter_(lib, counter);
+      expect(counter.value, 1);
+      final obj2 = ArcTestObject.newWithCounter_(lib, counter);
+      expect(counter.value, 2);
+      final obj3 = ArcTestObject.newWithCounter_(lib, counter);
+      expect(counter.value, 3);
+
+      obj1.release();
+      expect(counter.value, 2);
+      obj2.release();
+      expect(counter.value, 1);
+      obj3.release();
+      expect(counter.value, 0);
+
+      expect(() => obj1.release(), throwsStateError);
+      calloc.free(counter);
+    });
+
+    ArcTestObject unownedReferenceInner2(Pointer<Int32> counter) {
+      final obj1 = ArcTestObject.new1(lib);
+      obj1.setCounter_(counter);
+      expect(counter.value, 1);
+      final obj1b = obj1.unownedReference();
+      expect(counter.value, 1);
+
+      // Make a second object so that the counter check in unownedReferenceInner
+      // sees some sort of change. Otherwise this test could pass just by the GC
+      // not working correctly.
+      final obj2 = ArcTestObject.new1(lib);
+      obj2.setCounter_(counter);
+      expect(counter.value, 2);
+
+      return obj1b;
+    }
+
+    unownedReferenceInner(Pointer<Int32> counter) {
+      final obj1b = unownedReferenceInner2(counter);
+      doGC(); // Collect obj1 and obj2.
+      // The underlying object obj1 and obj1b points to still exists, because
+      // obj1b took a reference to it. So we still have 1 object.
+      expect(counter.value, 1);
+    }
+
+    test("Method that returns a reference we don't own", () {
+      // Most ObjC API methods return us a reference without incrementing the
+      // ref count (ie, returns us a reference we don't own). So the wrapper
+      // object has to take ownership by calling retain. This test verifies that
+      // is working correctly by holding a reference to an object returned by a
+      // method, after the original wrapper object is gone.
+      final counter = calloc<Int32>();
+      unownedReferenceInner(counter);
+      doGC();
+      expect(counter.value, 0);
+      calloc.free(counter);
+    });
+  });
+}
diff --git a/pkgs/ffigen/test/native_objc_test/automated_ref_count_test.m b/pkgs/ffigen/test/native_objc_test/automated_ref_count_test.m
new file mode 100644
index 0000000..d249389
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/automated_ref_count_test.m
@@ -0,0 +1,125 @@
+// Copyright (c) 2022, 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 <Foundation/NSObject.h>
+#import <Foundation/NSAutoreleasePool.h>
+
+@interface ArcTestObject : NSObject {
+  int32_t* counter;
+}
+
++ (instancetype)allocTheThing;
++ (instancetype)newWithCounter:(int32_t*) _counter;
+- (instancetype)initWithCounter:(int32_t*) _counter;
++ (ArcTestObject*)makeAndAutorelease:(int32_t*) _counter;
+- (void)setCounter:(int32_t*) _counter;
+- (void)dealloc;
+- (ArcTestObject*)unownedReference;
+- (ArcTestObject*)copyMe;
+- (ArcTestObject*)makeACopy;
+- (id)copyWithZone:(NSZone*) zone;
+- (ArcTestObject*)returnsRetained NS_RETURNS_RETAINED;
+
+@property (assign) ArcTestObject* assignedProperty;
+@property (retain) ArcTestObject* retainedProperty;
+@property (copy) ArcTestObject* copiedProperty;
+
+@end
+
+@interface RefCounted : NSObject
+
+@property(readonly) uint64_t refCount;
+
+- (int64_t) meAsInt;
+
+@end
+
+@implementation ArcTestObject
+
++ (instancetype)allocTheThing {
+  return [ArcTestObject alloc];
+}
+
++ (instancetype)newWithCounter:(int32_t*) _counter {
+  return [[ArcTestObject alloc] initWithCounter: _counter];
+}
+
+- (instancetype)initWithCounter:(int32_t*) _counter {
+  counter = _counter;
+  ++*counter;
+  return [super init];
+}
+
++ (instancetype)makeAndAutorelease:(int32_t*) _counter {
+  return [[[ArcTestObject alloc] initWithCounter: _counter] autorelease];
+}
+
+- (void)setCounter:(int32_t*) _counter {
+  counter = _counter;
+  ++*counter;
+}
+
+- (void)dealloc {
+  --*counter;
+  [_retainedProperty release];
+  [_copiedProperty release];
+  [super dealloc];
+}
+
+- (ArcTestObject*)unownedReference {
+  return self;
+}
+
+- (ArcTestObject*)copyMe {
+  return [[ArcTestObject alloc] initWithCounter: counter];
+}
+
+- (ArcTestObject*)makeACopy {
+  return [[ArcTestObject alloc] initWithCounter: counter];
+}
+
+- (id)copyWithZone:(NSZone*) zone {
+  return [[ArcTestObject alloc] initWithCounter: counter];
+}
+
+- (ArcTestObject*)returnsRetained NS_RETURNS_RETAINED {
+  return [self retain];
+}
+
+@end
+
+id createAutoreleasePool() {
+  return [NSAutoreleasePool new];
+}
+
+void destroyAutoreleasePool(id pool) {
+  [pool release];
+}
+
+@implementation RefCounted
+
+- (instancetype)init {
+    if (self = [super init]) {
+      self->_refCount = 1;
+    }
+    return self;
+}
+
+- (instancetype)retain {
+  ++self->_refCount;
+  return self;
+}
+
+- (oneway void)release {
+  --self->_refCount;
+  if (self->_refCount == 0) {
+    [self dealloc];
+  }
+}
+
+- (int64_t) meAsInt {
+  return (int64_t) self;
+}
+
+@end
diff --git a/pkgs/ffigen/test/native_objc_test/bad_method_config.yaml b/pkgs/ffigen/test/native_objc_test/bad_method_config.yaml
new file mode 100644
index 0000000..5ad9c1b
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/bad_method_config.yaml
@@ -0,0 +1,21 @@
+# Copyright (c) 2022, 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.
+
+# =================== GENERATING TEST BINDINGS ==================
+#    dart run ffigen --config test/bad_method_test/config.yaml
+# ===============================================================
+
+name: NativeObjCLibrary
+description: 'Native Objective C test'
+language: objc
+output: 'bad_method_test_bindings.dart'
+exclude-all-by-default: true
+objc-interfaces:
+  include:
+    - 'BadMethodTestObject'
+headers:
+  entry-points:
+    - 'bad_method_test.m'
+preamble: |
+  // ignore_for_file: camel_case_types, non_constant_identifier_names, unused_element, unused_field
diff --git a/pkgs/ffigen/test/native_objc_test/bad_method_test.dart b/pkgs/ffigen/test/native_objc_test/bad_method_test.dart
new file mode 100644
index 0000000..3b87c5b
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/bad_method_test.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2022, 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.
+
+// Objective C support is only available on mac.
+@TestOn('mac-os')
+
+import 'dart:ffi';
+import 'dart:io';
+
+import 'package:test/test.dart';
+import '../test_utils.dart';
+import 'bad_method_test_bindings.dart';
+import 'util.dart';
+
+void main() {
+  late NativeObjCLibrary lib;
+  group('bad_method_test', () {
+    setUpAll(() {
+      logWarnings();
+      final dylib = File('test/native_objc_test/bad_method_test.dylib');
+      verifySetupFile(dylib);
+      lib = NativeObjCLibrary(DynamicLibrary.open(dylib.absolute.path));
+      generateBindingsForCoverage('bad_method');
+    });
+
+    test("Test incomplete struct methods that weren't skipped", () {
+      final obj = BadMethodTestObject.new1(lib);
+      final structPtr = obj.incompletePointerReturn();
+      expect(structPtr.address, 1234);
+      expect(obj.incompletePointerParam_(structPtr), 1234);
+    });
+
+    test("Test bit field methods that weren't skipped", () {
+      final obj = BadMethodTestObject.new1(lib);
+      final bitFieldPtr = obj.bitFieldPointerReturn();
+      expect(bitFieldPtr.address, 5678);
+      expect(obj.bitFieldPointerParam_(bitFieldPtr), 5678);
+    });
+  });
+}
diff --git a/pkgs/ffigen/test/native_objc_test/bad_method_test.m b/pkgs/ffigen/test/native_objc_test/bad_method_test.m
new file mode 100644
index 0000000..bef4ede
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/bad_method_test.m
@@ -0,0 +1,49 @@
+// Copyright (c) 2022, 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 <Foundation/NSObject.h>
+
+struct IncompleteStruct;
+
+struct BitField {
+  int x:3;
+  int y:12;
+};
+
+@interface BadMethodTestObject : NSObject {
+}
+
+- (struct IncompleteStruct)incompleteReturn;  // Skipped.
+- (struct IncompleteStruct*)incompletePointerReturn;  // Not skipped.
+- (int64_t)incompleteParam:(struct IncompleteStruct)x;  // Skipped.
+- (int64_t)incompletePointerParam:(struct IncompleteStruct*)x;  // Not skipped.
+
+- (struct BitField)bitFieldReturn;  // Skipped.
+- (struct BitField*)bitFieldPointerReturn;  // Not skipped.
+- (int64_t)bitFieldParam:(struct BitField)x;  // Skipped.
+- (int64_t)bitFieldPointerParam:(struct BitField*)x;  // Not skipped.
+
+@property struct BitField bitFieldProperty;  // Skipped.
+
+@end
+
+@implementation BadMethodTestObject
+
+- (struct IncompleteStruct*)incompletePointerReturn {
+  return (struct IncompleteStruct*)1234;
+}
+
+- (int64_t)incompletePointerParam:(struct IncompleteStruct*)x {
+  return (int64_t)x;
+}
+
+- (struct BitField*)bitFieldPointerReturn {
+  return (struct BitField*)5678;
+}
+
+- (int64_t)bitFieldPointerParam:(struct BitField*)x {
+  return (int64_t)x;
+}
+
+@end
diff --git a/pkgs/ffigen/test/native_objc_test/block_config.yaml b/pkgs/ffigen/test/native_objc_test/block_config.yaml
new file mode 100644
index 0000000..e83c6b7
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/block_config.yaml
@@ -0,0 +1,13 @@
+name: BlockTestObjCLibrary
+description: 'Tests calling Objective-C blocks'
+language: objc
+output: 'block_bindings.dart'
+exclude-all-by-default: true
+objc-interfaces:
+  include:
+    - BlockTester
+headers:
+  entry-points:
+    - 'block_test.m'
+preamble: |
+  // ignore_for_file: camel_case_types, non_constant_identifier_names, unused_element, unused_field
diff --git a/pkgs/ffigen/test/native_objc_test/block_test.dart b/pkgs/ffigen/test/native_objc_test/block_test.dart
new file mode 100644
index 0000000..76f7a93
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/block_test.dart
@@ -0,0 +1,119 @@
+// Copyright (c) 2022, 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.
+
+// Objective C support is only available on mac.
+@TestOn('mac-os')
+
+import 'dart:ffi';
+import 'dart:io';
+
+import 'package:test/test.dart';
+import 'package:ffi/ffi.dart';
+import '../test_utils.dart';
+import 'block_bindings.dart';
+import 'util.dart';
+
+void main() {
+  late BlockTestObjCLibrary lib;
+  late void Function(Pointer<Char>, Pointer<Void>) executeInternalCommand;
+
+  group('Blocks', () {
+    setUpAll(() {
+      logWarnings();
+      final dylib = File('test/native_objc_test/block_test.dylib');
+      verifySetupFile(dylib);
+      lib = BlockTestObjCLibrary(DynamicLibrary.open(dylib.absolute.path));
+
+      executeInternalCommand = DynamicLibrary.process().lookupFunction<
+          Void Function(Pointer<Char>, Pointer<Void>),
+          void Function(
+              Pointer<Char>, Pointer<Void>)>('Dart_ExecuteInternalCommand');
+
+      generateBindingsForCoverage('block');
+    });
+
+    doGC() {
+      final gcNow = "gc-now".toNativeUtf8();
+      executeInternalCommand(gcNow.cast(), nullptr);
+      calloc.free(gcNow);
+    }
+
+    test('BlockTester is working', () {
+      // This doesn't test any Block functionality, just that the BlockTester
+      // itself is working correctly.
+      final blockTester = BlockTester.makeFromMultiplier_(lib, 10);
+      expect(blockTester.call_(123), 1230);
+      final intBlock = blockTester.getBlock();
+      final blockTester2 = BlockTester.makeFromBlock_(lib, intBlock);
+      blockTester2.pokeBlock();
+      expect(blockTester2.call_(456), 4560);
+    });
+
+    test('Block from function pointer', () {
+      final block = ObjCBlock.fromFunctionPointer(
+          lib, Pointer.fromFunction(_add100, 999));
+      final blockTester = BlockTester.makeFromBlock_(lib, block);
+      blockTester.pokeBlock();
+      expect(blockTester.call_(123), 223);
+      expect(block(123), 223);
+    });
+
+    int Function(int) makeAdder(int addTo) {
+      return (int x) => addTo + x;
+    }
+
+    test('Block from function', () {
+      final block = ObjCBlock.fromFunction(lib, makeAdder(4000));
+      final blockTester = BlockTester.makeFromBlock_(lib, block);
+      blockTester.pokeBlock();
+      expect(blockTester.call_(123), 4123);
+      expect(block(123), 4123);
+    });
+
+    Pointer<Void> funcPointerBlockRefCountTest() {
+      final block = ObjCBlock.fromFunctionPointer(
+          lib, Pointer.fromFunction(_add100, 999));
+      expect(BlockTester.getBlockRetainCount_(lib, block.pointer.cast()), 1);
+      return block.pointer.cast();
+    }
+
+    test('Function pointer block ref counting', () {
+      final rawBlock = funcPointerBlockRefCountTest();
+      doGC();
+      expect(BlockTester.getBlockRetainCount_(lib, rawBlock.cast()), 0);
+    });
+
+    Pointer<Void> funcBlockRefCountTest() {
+      final block = ObjCBlock.fromFunction(lib, makeAdder(4000));
+      expect(BlockTester.getBlockRetainCount_(lib, block.pointer.cast()), 1);
+      return block.pointer.cast();
+    }
+
+    test('Function pointer block ref counting', () {
+      final rawBlock = funcBlockRefCountTest();
+      doGC();
+      expect(BlockTester.getBlockRetainCount_(lib, rawBlock.cast()), 0);
+    });
+
+    test('Block fields have sensible values', () {
+      final block = ObjCBlock.fromFunction(lib, makeAdder(4000));
+      final blockPtr = block.pointer;
+      expect(blockPtr.ref.isa, isNot(0));
+      expect(blockPtr.ref.flags, isNot(0)); // Set by Block_copy.
+      expect(blockPtr.ref.reserved, 0);
+      expect(blockPtr.ref.invoke, isNot(0));
+      expect(blockPtr.ref.target, isNot(0));
+      final descPtr = blockPtr.ref.descriptor;
+      expect(descPtr.ref.reserved, 0);
+      expect(descPtr.ref.size, isNot(0));
+      expect(descPtr.ref.copy_helper, nullptr);
+      expect(descPtr.ref.dispose_helper, nullptr);
+      expect(descPtr.ref.signature, nullptr);
+    });
+  });
+}
+
+int _add100(int x) {
+  return x + 100;
+}
diff --git a/pkgs/ffigen/test/native_objc_test/block_test.m b/pkgs/ffigen/test/native_objc_test/block_test.m
new file mode 100644
index 0000000..bdd37a7
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/block_test.m
@@ -0,0 +1,76 @@
+// Copyright (c) 2022, 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 <Foundation/NSObject.h>
+
+typedef int32_t (^IntBlock)(int32_t);
+
+// Wrapper around a block, so that our Dart code can test creating and invoking
+// blocks in Objective C code.
+@interface BlockTester : NSObject {
+  IntBlock myBlock;
+}
++ (BlockTester*)makeFromBlock:(IntBlock)block;
++ (BlockTester*)makeFromMultiplier:(int32_t)mult;
++ (uint64_t)getBlockRetainCount:(void*)block;
+- (int32_t)call:(int32_t)x;
+- (IntBlock)getBlock;
+- (void)pokeBlock;
+@end
+
+@implementation BlockTester
++ (BlockTester*)makeFromBlock:(IntBlock)block {
+  BlockTester* bt = [BlockTester new];
+  bt->myBlock = block;
+  return bt;
+}
+
++ (BlockTester*)makeFromMultiplier:(int32_t)mult {
+  BlockTester* bt = [BlockTester new];
+  bt->myBlock = [^int32_t(int32_t x) {
+    return x * mult;
+  } copy];
+  return bt;
+}
+
+typedef struct {
+  void* isa;
+  int flags;
+  // There are other fields, but we just need the flags and isa.
+} BlockRefCountExtractor;
+
+void* valid_block_isa = NULL;
++ (uint64_t)getBlockRetainCount:(void*)block {
+  BlockRefCountExtractor* b = (BlockRefCountExtractor*)block;
+  // HACK: The only way I can find to reliably figure out that a block has been
+  // deleted is to check the isa field (the lower bits of the flags field seem
+  // to be randomized, not just set to 0). But we also don't know the value this
+  // field has when it's constructed (copying the block changes it from
+  // _NSConcreteGlobalBlock to an internal value). So we assume that the first
+  // time this function is called, we have a valid block, and on subsequent
+  // calls we check to see if the isa field changed.
+  if (valid_block_isa == NULL) {
+    valid_block_isa = b->isa;
+  }
+  if (b->isa != valid_block_isa) {
+    return 0;
+  }
+  // The ref count is stored in the lower bits of the flags field, but skips the
+  // 0x1 bit.
+  return (b->flags & 0xFFFF) >> 1;
+}
+
+- (int32_t)call:(int32_t)x {
+  return myBlock(x);
+}
+
+- (IntBlock)getBlock {
+  return myBlock;
+}
+
+- (void)pokeBlock {
+  // Used to repro https://github.com/dart-lang/ffigen/issues/376
+  [[myBlock retain] release];
+}
+@end
diff --git a/pkgs/ffigen/test/native_objc_test/cast_config.yaml b/pkgs/ffigen/test/native_objc_test/cast_config.yaml
new file mode 100644
index 0000000..af33941
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/cast_config.yaml
@@ -0,0 +1,13 @@
+name: CastTestObjCLibrary
+description: 'Tests casting objects'
+language: objc
+output: 'cast_bindings.dart'
+exclude-all-by-default: true
+objc-interfaces:
+  include:
+    - Castaway
+headers:
+  entry-points:
+    - 'cast_test.m'
+preamble: |
+  // ignore_for_file: camel_case_types, non_constant_identifier_names, unused_element, unused_field
diff --git a/pkgs/ffigen/test/native_objc_test/cast_test.dart b/pkgs/ffigen/test/native_objc_test/cast_test.dart
new file mode 100644
index 0000000..55b787b
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/cast_test.dart
@@ -0,0 +1,57 @@
+// Copyright (c) 2022, 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.
+
+// Objective C support is only available on mac.
+
+@TestOn('mac-os')
+
+import 'dart:ffi';
+import 'dart:io';
+
+import 'package:test/test.dart';
+import '../test_utils.dart';
+import 'cast_bindings.dart';
+import 'util.dart';
+
+void main() {
+  Castaway? testInstance;
+  late CastTestObjCLibrary lib;
+
+  group('cast', () {
+    setUpAll(() {
+      logWarnings();
+      final dylib = File('test/native_objc_test/cast_test.dylib');
+      verifySetupFile(dylib);
+      lib = CastTestObjCLibrary(DynamicLibrary.open(dylib.absolute.path));
+      testInstance = Castaway.new1(lib);
+      generateBindingsForCoverage('cast');
+    });
+
+    test('castFrom', () {
+      final fromCast = Castaway.castFrom(testInstance!.meAsNSObject());
+      expect(fromCast, testInstance!);
+    });
+
+    test('castFromPointer', () {
+      final meAsInt = testInstance!.meAsInt();
+      final fromCast = Castaway.castFromPointer(
+          lib, Pointer<ObjCObject>.fromAddress(meAsInt));
+      expect(fromCast, testInstance!);
+    });
+
+    test('equality equals', () {
+      final meAsInt = testInstance!.meAsInt();
+      final fromCast = Castaway.castFromPointer(
+          lib, Pointer<ObjCObject>.fromAddress(meAsInt));
+      expect(fromCast, testInstance!);
+    });
+
+    test('equality not equals', () {
+      final meAsInt = testInstance!.meAsInt();
+      final fromCast = Castaway.castFromPointer(
+          lib, Pointer<ObjCObject>.fromAddress(meAsInt));
+      expect(fromCast, isNot(equals(NSObject.new1(lib))));
+    });
+  });
+}
diff --git a/pkgs/ffigen/test/native_objc_test/cast_test.m b/pkgs/ffigen/test/native_objc_test/cast_test.m
new file mode 100644
index 0000000..363b3ad
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/cast_test.m
@@ -0,0 +1,25 @@
+// Copyright (c) 2022, 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 <Foundation/NSObject.h>
+
+@interface Castaway : NSObject {
+}
+
+- (NSObject *) meAsNSObject;
+- (int64_t) meAsInt;
+
+@end
+
+@implementation Castaway
+
+- (NSObject *) meAsNSObject {
+  return self;
+}
+
+- (int64_t) meAsInt {
+  return (int64_t) self;
+}
+
+@end
diff --git a/pkgs/ffigen/test/native_objc_test/category_config.yaml b/pkgs/ffigen/test/native_objc_test/category_config.yaml
new file mode 100644
index 0000000..5c74e1a
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/category_config.yaml
@@ -0,0 +1,15 @@
+name: CategoryTestObjCLibrary
+description: 'Tests handling Objective-C categories'
+language: objc
+output: 'category_bindings.dart'
+exclude-all-by-default: true
+objc-interfaces:
+  include:
+    - Thing
+headers:
+  entry-points:
+    - 'category_test.m'
+    # Include it twice, as a regression test for #353
+    - 'category_test.m'
+preamble: |
+  // ignore_for_file: camel_case_types, non_constant_identifier_names, unused_element, unused_field
diff --git a/pkgs/ffigen/test/native_objc_test/category_test.dart b/pkgs/ffigen/test/native_objc_test/category_test.dart
new file mode 100644
index 0000000..a424c46
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/category_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2022, 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.
+
+// Objective C support is only available on mac.
+@TestOn('mac-os')
+
+import 'dart:ffi';
+import 'dart:io';
+
+import 'package:test/test.dart';
+import '../test_utils.dart';
+import 'category_bindings.dart';
+import 'util.dart';
+
+void main() {
+  late Thing testInstance;
+  late CategoryTestObjCLibrary lib;
+
+  group('categories', () {
+    setUpAll(() {
+      logWarnings();
+      final dylib = File('test/native_objc_test/category_test.dylib');
+      verifySetupFile(dylib);
+      lib = CategoryTestObjCLibrary(DynamicLibrary.open(dylib.absolute.path));
+      testInstance = Thing.new1(lib);
+      generateBindingsForCoverage('category');
+    });
+
+    test('Category method', () {
+      expect(testInstance.add_Y_(1000, 234), 1234);
+      expect(testInstance.sub_Y_(1234, 1000), 234);
+      expect(testInstance.mul_Y_(1234, 1000), 1234000);
+      expect(testInstance.someProperty, 456);
+    });
+  });
+}
diff --git a/pkgs/ffigen/test/native_objc_test/category_test.m b/pkgs/ffigen/test/native_objc_test/category_test.m
new file mode 100644
index 0000000..63cd873
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/category_test.m
@@ -0,0 +1,37 @@
+#import <Foundation/NSObject.h>
+
+@interface Thing : NSObject {}
+-(int32_t)add:(int32_t)x Y:(int32_t) y;
+@end
+
+@implementation Thing
+-(int32_t)add:(int32_t)x Y:(int32_t) y {
+  return x + y;
+}
+@end
+
+@interface Thing (Sub)
+-(int32_t)sub:(int32_t)x Y:(int32_t) y;
+@end
+
+@implementation Thing (Sub)
+-(int32_t)sub:(int32_t)x Y:(int32_t) y {
+  return x - y;
+}
+@end
+
+@interface Thing (Mul)
+-(int32_t)mul:(int32_t)x Y:(int32_t) y;
+
+@property (readonly) int32_t someProperty;
+@end
+
+@implementation Thing (Mul)
+-(int32_t)mul:(int32_t)x Y:(int32_t) y {
+  return x * y;
+}
+
+-(int32_t)someProperty {
+  return 456;
+}
+@end
diff --git a/pkgs/ffigen/test/native_objc_test/failed_to_load_config.yaml b/pkgs/ffigen/test/native_objc_test/failed_to_load_config.yaml
new file mode 100644
index 0000000..c96702d
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/failed_to_load_config.yaml
@@ -0,0 +1,13 @@
+name: FailedToLoadTestObjCLibrary
+description: 'Tests failing to load an Objective-C library'
+language: objc
+output: 'failed_to_load_bindings.dart'
+exclude-all-by-default: true
+objc-interfaces:
+  include:
+    - ClassThatWillFailToLoad
+headers:
+  entry-points:
+    - 'failed_to_load_test.m'
+preamble: |
+  // ignore_for_file: camel_case_types, non_constant_identifier_names, unused_element, unused_field
diff --git a/pkgs/ffigen/test/native_objc_test/failed_to_load_test.dart b/pkgs/ffigen/test/native_objc_test/failed_to_load_test.dart
new file mode 100644
index 0000000..8d1bb70
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/failed_to_load_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2022, 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.
+
+// Objective C support is only available on mac.
+@TestOn('mac-os')
+
+import 'dart:ffi';
+import 'dart:io';
+
+import 'package:test/test.dart';
+import '../test_utils.dart';
+import 'failed_to_load_bindings.dart';
+import 'util.dart';
+
+void main() {
+  group('Failed to load', () {
+    setUpAll(() {
+      logWarnings();
+      generateBindingsForCoverage('failed_to_load');
+    });
+
+    test('Failed to load Objective-C class', () {
+      // Load from the host executable, which is missing all the classes for
+      // this test, but has the core ObjC functions, such as objc_getClass. The
+      // library should load ok, because the classes are lazy loaded.
+      final lib = FailedToLoadTestObjCLibrary(DynamicLibrary.executable());
+
+      // But when we try to instantiate one of the classes, we get an error.
+      expect(
+          () => ClassThatWillFailToLoad.new1(lib),
+          throwsA(predicate(
+              (e) => e.toString().contains('ClassThatWillFailToLoad'))));
+    });
+  });
+}
diff --git a/pkgs/ffigen/test/native_objc_test/failed_to_load_test.m b/pkgs/ffigen/test/native_objc_test/failed_to_load_test.m
new file mode 100644
index 0000000..b4d5e68
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/failed_to_load_test.m
@@ -0,0 +1,15 @@
+// Copyright (c) 2022, 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 <Foundation/NSObject.h>
+
+@interface ClassThatWillFailToLoad : NSObject {}
+-(int32_t)get123;
+@end
+
+@implementation ClassThatWillFailToLoad
+-(int32_t)get123 {
+  return 123;
+}
+@end
diff --git a/pkgs/ffigen/test/native_objc_test/forward_decl_config.yaml b/pkgs/ffigen/test/native_objc_test/forward_decl_config.yaml
new file mode 100644
index 0000000..7a5c815
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/forward_decl_config.yaml
@@ -0,0 +1,14 @@
+name: ForwardDeclTestObjCLibrary
+description: 'Test that forward declared ObjC classes are correctly filled'
+language: objc
+output: 'forward_decl_bindings.dart'
+exclude-all-by-default: true
+objc-interfaces:
+  include:
+    - ForwardDeclaredClass
+headers:
+  entry-points:
+    - 'forward_decl_test.h'
+    - 'forward_decl_test.m'
+preamble: |
+  // ignore_for_file: camel_case_types, non_constant_identifier_names, unused_element, unused_field
diff --git a/pkgs/ffigen/test/native_objc_test/forward_decl_test.dart b/pkgs/ffigen/test/native_objc_test/forward_decl_test.dart
new file mode 100644
index 0000000..4a06516
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/forward_decl_test.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2022, 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.
+
+// Objective C support is only available on mac.
+@TestOn('mac-os')
+
+import 'dart:ffi';
+import 'dart:io';
+
+import 'package:test/test.dart';
+import '../test_utils.dart';
+import 'forward_decl_bindings.dart';
+import 'util.dart';
+
+void main() {
+  late ForwardDeclTestObjCLibrary lib;
+
+  group('forward decl', () {
+    setUpAll(() {
+      logWarnings();
+      final dylib = File('test/native_objc_test/forward_decl_test.dylib');
+      verifySetupFile(dylib);
+      lib =
+          ForwardDeclTestObjCLibrary(DynamicLibrary.open(dylib.absolute.path));
+      generateBindingsForCoverage('forward_decl');
+    });
+
+    test('Forward declared class', () {
+      expect(ForwardDeclaredClass.get123(lib), 123);
+    });
+  });
+}
diff --git a/pkgs/ffigen/test/native_objc_test/forward_decl_test.h b/pkgs/ffigen/test/native_objc_test/forward_decl_test.h
new file mode 100644
index 0000000..4336b35
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/forward_decl_test.h
@@ -0,0 +1,11 @@
+// Copyright (c) 2022, 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 <Foundation/NSObject.h>
+
+@class ForwardDeclaredClass;
+
+@interface OtherClass : NSObject
++ (ForwardDeclaredClass*) getTheThing;
+@end
diff --git a/pkgs/ffigen/test/native_objc_test/forward_decl_test.m b/pkgs/ffigen/test/native_objc_test/forward_decl_test.m
new file mode 100644
index 0000000..69c8f66
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/forward_decl_test.m
@@ -0,0 +1,15 @@
+// Copyright (c) 2022, 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 <Foundation/NSObject.h>
+
+@interface ForwardDeclaredClass : NSObject
++ (int32_t)get123;
+@end
+
+@implementation ForwardDeclaredClass
++ (int32_t)get123 {
+  return 123;
+}
+@end
diff --git a/pkgs/ffigen/test/native_objc_test/is_instance_config.yaml b/pkgs/ffigen/test/native_objc_test/is_instance_config.yaml
new file mode 100644
index 0000000..2673c0b
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/is_instance_config.yaml
@@ -0,0 +1,14 @@
+name: IsInstanceTestObjCLibrary
+description: 'Tests isInstance'
+language: objc
+output: 'is_instance_bindings.dart'
+exclude-all-by-default: true
+objc-interfaces:
+  include:
+    - ChildClass
+    - UnrelatedClass
+headers:
+  entry-points:
+    - 'is_instance_test.m'
+preamble: |
+  // ignore_for_file: camel_case_types, non_constant_identifier_names, unused_element, unused_field
diff --git a/pkgs/ffigen/test/native_objc_test/is_instance_test.dart b/pkgs/ffigen/test/native_objc_test/is_instance_test.dart
new file mode 100644
index 0000000..bbbfee9
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/is_instance_test.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2022, 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.
+
+// Objective C support is only available on mac.
+
+@TestOn('mac-os')
+
+import 'dart:ffi';
+import 'dart:io';
+
+import 'package:test/test.dart';
+import '../test_utils.dart';
+import 'is_instance_bindings.dart';
+import 'util.dart';
+
+void main() {
+  late IsInstanceTestObjCLibrary lib;
+
+  group('isInstance', () {
+    setUpAll(() {
+      logWarnings();
+      final dylib = File('test/native_objc_test/is_instance_test.dylib');
+      verifySetupFile(dylib);
+      lib = IsInstanceTestObjCLibrary(DynamicLibrary.open(dylib.absolute.path));
+      generateBindingsForCoverage('is_instance');
+    });
+
+    test('Unrelated classes', () {
+      final base = NSObject.castFrom(BaseClass.new1(lib));
+      final unrelated = NSObject.castFrom(UnrelatedClass.new1(lib));
+      expect(BaseClass.isInstance(base), isTrue);
+      expect(BaseClass.isInstance(unrelated), isFalse);
+      expect(UnrelatedClass.isInstance(base), isFalse);
+      expect(UnrelatedClass.isInstance(unrelated), isTrue);
+    });
+
+    test('Base class vs child class', () {
+      final base = NSObject.castFrom(BaseClass.new1(lib));
+      final child = NSObject.castFrom(ChildClass.new1(lib));
+      expect(BaseClass.isInstance(base), isTrue);
+      expect(BaseClass.isInstance(child), isTrue);
+      expect(ChildClass.isInstance(base), isFalse);
+      expect(ChildClass.isInstance(child), isTrue);
+    });
+  });
+}
diff --git a/pkgs/ffigen/test/native_objc_test/is_instance_test.m b/pkgs/ffigen/test/native_objc_test/is_instance_test.m
new file mode 100644
index 0000000..96b2314
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/is_instance_test.m
@@ -0,0 +1,23 @@
+// Copyright (c) 2022, 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 <Foundation/NSObject.h>
+
+@interface BaseClass : NSObject {}
+@end
+
+@interface ChildClass : BaseClass {}
+@end
+
+@interface UnrelatedClass : NSObject {}
+@end
+
+@implementation BaseClass
+@end
+
+@implementation ChildClass
+@end
+
+@implementation UnrelatedClass
+@end
diff --git a/pkgs/ffigen/test/native_objc_test/method_config.yaml b/pkgs/ffigen/test/native_objc_test/method_config.yaml
new file mode 100644
index 0000000..969ab7c
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/method_config.yaml
@@ -0,0 +1,13 @@
+name: MethodTestObjCLibrary
+description: 'Tests calling Objective-C methods'
+language: objc
+output: 'method_bindings.dart'
+exclude-all-by-default: true
+objc-interfaces:
+  include:
+    - MethodInterface
+headers:
+  entry-points:
+    - 'method_test.m'
+preamble: |
+  // ignore_for_file: camel_case_types, non_constant_identifier_names, unused_element, unused_field
diff --git a/pkgs/ffigen/test/native_objc_test/method_test.dart b/pkgs/ffigen/test/native_objc_test/method_test.dart
new file mode 100644
index 0000000..ebb1fba
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/method_test.dart
@@ -0,0 +1,66 @@
+// Copyright (c) 2022, 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.
+
+// Objective C support is only available on mac.
+@TestOn('mac-os')
+
+import 'dart:ffi';
+import 'dart:io';
+
+import 'package:test/test.dart';
+import '../test_utils.dart';
+import 'method_bindings.dart';
+import 'util.dart';
+
+void main() {
+  MethodInterface? testInstance;
+  late MethodTestObjCLibrary lib;
+
+  group('method calls', () {
+    setUpAll(() {
+      logWarnings();
+      final dylib = File('test/native_objc_test/method_test.dylib');
+      verifySetupFile(dylib);
+      lib = MethodTestObjCLibrary(DynamicLibrary.open(dylib.absolute.path));
+      testInstance = MethodInterface.new1(lib);
+      generateBindingsForCoverage('method');
+    });
+
+    group('Instance methods', () {
+      test('No arguments', () {
+        expect(testInstance!.add(), 5);
+      });
+
+      test('One argument', () {
+        expect(testInstance!.add_(23), 23);
+      });
+
+      test('Two arguments', () {
+        expect(testInstance!.add_Y_(23, 17), 40);
+      });
+
+      test('Three arguments', () {
+        expect(testInstance!.add_Y_Z_(23, 17, 60), 100);
+      });
+    });
+
+    group('Class methods', () {
+      test('No arguments', () {
+        expect(MethodInterface.sub(lib), -5);
+      });
+
+      test('One argument', () {
+        expect(MethodInterface.sub_(lib, 7), -7);
+      });
+
+      test('Two arguments', () {
+        expect(MethodInterface.sub_Y_(lib, 7, 3), -10);
+      });
+
+      test('Three arguments', () {
+        expect(MethodInterface.sub_Y_Z_(lib, 10, 7, 3), -20);
+      });
+    });
+  });
+}
diff --git a/pkgs/ffigen/test/native_objc_test/method_test.m b/pkgs/ffigen/test/native_objc_test/method_test.m
new file mode 100644
index 0000000..86ea090
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/method_test.m
@@ -0,0 +1,53 @@
+#import <Foundation/NSObject.h>
+
+@interface MethodInterface : NSObject {
+}
+
+
+-(int32_t)add;
+-(int32_t)add:(int32_t)x;
+-(int32_t)add:(int32_t)x Y:(int32_t) y;
+-(int32_t)add:(int32_t)x Y:(int32_t) y Z:(int32_t) z;
+
++(int32_t)sub;
++(int32_t)sub:(int32_t)x;
++(int32_t)sub:(int32_t)x Y:(int32_t) y;
++(int32_t)sub:(int32_t)x Y:(int32_t) y Z:(int32_t) z;
+
+@end
+
+@implementation MethodInterface
+
+-(int32_t)add {
+  return 5;
+}
+
+-(int32_t)add:(int32_t)x {
+    return x;
+}
+
+-(int32_t)add:(int32_t)x Y:(int32_t) y {
+    return x + y;
+}
+
+-(int32_t)add:(int32_t)x Y:(int32_t) y Z:(int32_t) z {
+    return x + y + z;
+}
+
++(int32_t)sub {
+  return -5;
+}
+
++(int32_t)sub:(int32_t)x {
+    return -x;
+}
+
++(int32_t)sub:(int32_t)x Y:(int32_t) y {
+    return -x - y;
+}
+
++(int32_t)sub:(int32_t)x Y:(int32_t) y Z:(int32_t) z {
+    return - x - y - z;
+}
+
+@end
diff --git a/pkgs/ffigen/test/native_objc_test/native_objc_config.yaml b/pkgs/ffigen/test/native_objc_test/native_objc_config.yaml
new file mode 100644
index 0000000..58bcf50
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/native_objc_config.yaml
@@ -0,0 +1,21 @@
+# Copyright (c) 2022, 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.
+
+# =================== GENERATING TEST BINDINGS ==================
+#    dart run ffigen --config test/native_objc_test/config.yaml
+# ===============================================================
+
+name: NativeObjCLibrary
+description: 'Native Objective C test'
+language: objc
+output: 'native_objc_test_bindings.dart'
+exclude-all-by-default: true
+objc-interfaces:
+  include:
+    - Foo
+headers:
+  entry-points:
+    - 'native_objc_test.m'
+preamble: |
+  // ignore_for_file: camel_case_types, non_constant_identifier_names, unused_element, unused_field
diff --git a/pkgs/ffigen/test/native_objc_test/native_objc_test.dart b/pkgs/ffigen/test/native_objc_test/native_objc_test.dart
new file mode 100644
index 0000000..28c006a
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/native_objc_test.dart
@@ -0,0 +1,66 @@
+// Copyright (c) 2022, 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.
+
+// Objective C support is only available on mac.
+@TestOn('mac-os')
+
+import 'dart:ffi';
+import 'dart:io';
+
+import 'package:test/test.dart';
+import '../test_utils.dart';
+import 'native_objc_test_bindings.dart';
+import 'util.dart';
+
+void main() {
+  late NativeObjCLibrary lib;
+  group('native_objc_test', () {
+    setUpAll(() {
+      logWarnings();
+      final dylib = File('test/native_objc_test/native_objc_test.dylib');
+      verifySetupFile(dylib);
+      lib = NativeObjCLibrary(DynamicLibrary.open(dylib.absolute.path));
+      generateBindingsForCoverage('native_objc');
+    });
+
+    test('Basic types', () {
+      final foo = Foo.new1(lib);
+      final obj = NSObject.new1(lib);
+
+      foo.intVal = 123;
+      expect(foo.intVal, 123);
+
+      foo.boolVal = true;
+      expect(foo.boolVal, true);
+
+      foo.idVal = obj;
+      expect(foo.idVal, obj);
+
+      foo.selVal = Pointer<ObjCSel>.fromAddress(456);
+      expect(foo.selVal.address, 456);
+
+      foo.classVal = obj;
+      expect(foo.classVal, obj);
+    });
+
+    test('Interface basics, with Foo', () {
+      final foo1 = Foo.makeFoo_(lib, 3.14159);
+      final foo2 = Foo.makeFoo_(lib, 2.71828);
+
+      expect(foo1.intVal, 3);
+      expect(foo2.intVal, 2);
+
+      expect(foo1.multiply_withOtherFoo_(false, foo2), 8);
+      expect(foo1.multiply_withOtherFoo_(true, foo2), 6);
+
+      foo1.intVal = 100;
+      expect(foo1.multiply_withOtherFoo_(false, foo2), 8);
+      expect(foo1.multiply_withOtherFoo_(true, foo2), 200);
+
+      foo2.setDoubleVal_(1.61803);
+      expect(foo1.multiply_withOtherFoo_(false, foo2), 5);
+      expect(foo1.multiply_withOtherFoo_(true, foo2), 200);
+    });
+  });
+}
diff --git a/pkgs/ffigen/test/native_objc_test/native_objc_test.m b/pkgs/ffigen/test/native_objc_test/native_objc_test.m
new file mode 100644
index 0000000..e510df8
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/native_objc_test.m
@@ -0,0 +1,48 @@
+// Copyright (c) 2022, 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 <Foundation/NSObject.h>
+#import <Foundation/NSString.h>
+
+@interface Foo : NSObject {
+  double doubleVal;
+}
+
+@property int32_t intVal;
+@property BOOL boolVal;
+@property id idVal;
+@property SEL selVal;
+@property NSObject* objVal;
+@property Class classVal;
+
++ (Foo*)makeFoo:(double)x;
+
+- (int32_t)multiply:(BOOL)useIntVals withOtherFoo:(Foo*)other;
+
+- (void)setDoubleVal:(double)x;
+
+@end
+
+@implementation Foo
+
++ (Foo*)makeFoo:(double)x {
+  Foo* foo = [Foo new];
+  foo->doubleVal = x;
+  [foo setIntVal:((int32_t)x)];
+  return foo;
+}
+
+- (int32_t)multiply:(BOOL)useIntVals withOtherFoo:(Foo*)other {
+  if (useIntVals) {
+    return [self intVal] * [other intVal];
+  } else {
+    return (int32_t)(self->doubleVal * other->doubleVal);
+  }
+}
+
+- (void)setDoubleVal:(double)x {
+  self->doubleVal = x;
+}
+
+@end
diff --git a/pkgs/ffigen/test/native_objc_test/nullable_config.yaml b/pkgs/ffigen/test/native_objc_test/nullable_config.yaml
new file mode 100644
index 0000000..e46cf06
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/nullable_config.yaml
@@ -0,0 +1,13 @@
+name: NullableTestObjCLibrary
+description: 'Tests calling Objective-C methods'
+language: objc
+output: 'nullable_bindings.dart'
+exclude-all-by-default: true
+objc-interfaces:
+  include:
+    - NullableInterface
+headers:
+  entry-points:
+    - 'nullable_test.m'
+preamble: |
+  // ignore_for_file: camel_case_types, non_constant_identifier_names, unused_element, unused_field
diff --git a/pkgs/ffigen/test/native_objc_test/nullable_test.dart b/pkgs/ffigen/test/native_objc_test/nullable_test.dart
new file mode 100644
index 0000000..8814dc5
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/nullable_test.dart
@@ -0,0 +1,70 @@
+// Copyright (c) 2022, 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.
+
+// Objective C support is only available on mac.
+@TestOn('mac-os')
+
+import 'dart:ffi';
+import 'dart:io';
+
+import 'package:test/test.dart';
+import '../test_utils.dart';
+import 'nullable_bindings.dart';
+import 'util.dart';
+
+void main() {
+  late NullableTestObjCLibrary lib;
+  NullableInterface? nullableInterface;
+  NSObject? obj;
+  group('method calls', () {
+    setUpAll(() {
+      logWarnings();
+      final dylib = File('test/native_objc_test/nullable_test.dylib');
+      verifySetupFile(dylib);
+      lib = NullableTestObjCLibrary(DynamicLibrary.open(dylib.absolute.path));
+      nullableInterface = NullableInterface.new1(lib);
+      obj = NSObject.new1(lib);
+      generateBindingsForCoverage('nullable');
+    });
+
+    group('Nullable property', () {
+      test('Not null', () {
+        nullableInterface!.nullableObjectProperty = obj!;
+        expect(nullableInterface!.nullableObjectProperty, obj!);
+      });
+      test('Null', () {
+        nullableInterface!.nullableObjectProperty = null;
+        expect(nullableInterface!.nullableObjectProperty, null);
+      });
+    });
+
+    group('Nullable return', () {
+      test('Not null', () {
+        expect(NullableInterface.returnNil_(lib, false), isA<NSObject>());
+      });
+      test('Null', () {
+        expect(NullableInterface.returnNil_(lib, true), null);
+      });
+    }, skip: "TODO(#334): enable this test");
+
+    group('Nullable arguments', () {
+      test('Not null', () {
+        expect(
+            NullableInterface.isNullWithNullableNSObjectArg_(lib, obj!), false);
+      });
+      test('Null', () {
+        expect(
+            NullableInterface.isNullWithNullableNSObjectArg_(lib, null), true);
+      });
+    });
+
+    group('Not-nullable arguments', () {
+      test('Not null', () {
+        expect(
+            NullableInterface.isNullWithNotNullableNSObjectPtrArg_(lib, obj!),
+            false);
+      });
+    });
+  });
+}
diff --git a/pkgs/ffigen/test/native_objc_test/nullable_test.m b/pkgs/ffigen/test/native_objc_test/nullable_test.m
new file mode 100644
index 0000000..abf1b02
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/nullable_test.m
@@ -0,0 +1,32 @@
+#import <Foundation/NSObject.h>
+
+@interface NullableInterface  : NSObject {
+}
+
++(BOOL) isNullWithNullableNSObjectArg:(nullable NSObject *)x;
++(BOOL) isNullWithNotNullableNSObjectPtrArg:(NSObject *)x;
++(nullable NSObject *) returnNil:(BOOL)r;
+
+@property (nullable, retain) NSObject *nullableObjectProperty;
+
+@end
+
+@implementation NullableInterface
+
++(BOOL) isNullWithNullableNSObjectArg:(nullable NSObject *)x {
+  return x == NULL;
+}
+
++(BOOL) isNullWithNotNullableNSObjectPtrArg:(NSObject *)x {
+  return x == NULL;
+}
+
++(nullable NSObject *) returnNil:(BOOL)r {
+  if (r) {
+    return nil;
+  } else {
+    return [NSObject new];
+  }
+}
+
+@end
diff --git a/pkgs/ffigen/test/native_objc_test/property_config.yaml b/pkgs/ffigen/test/native_objc_test/property_config.yaml
new file mode 100644
index 0000000..220a83a
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/property_config.yaml
@@ -0,0 +1,13 @@
+name: PropertyTestObjCLibrary
+description: 'Tests calling Objective-C properties i.e. getters and setters'
+language: objc
+output: 'property_bindings.dart'
+exclude-all-by-default: true
+objc-interfaces:
+  include:
+    - PropertyInterface
+headers:
+  entry-points:
+    - 'property_test.m'
+preamble: |
+  // ignore_for_file: camel_case_types, non_constant_identifier_names, unused_element, unused_field
diff --git a/pkgs/ffigen/test/native_objc_test/property_test.dart b/pkgs/ffigen/test/native_objc_test/property_test.dart
new file mode 100644
index 0000000..72c11e0
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/property_test.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2022, 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.
+
+// Objective C support is only available on mac.
+@TestOn('mac-os')
+
+import 'dart:ffi';
+import 'dart:io';
+
+import 'package:test/test.dart';
+import '../test_utils.dart';
+import 'property_bindings.dart';
+import 'util.dart';
+
+void main() {
+  PropertyInterface? testInstance;
+  late PropertyTestObjCLibrary lib;
+
+  group('properties', () {
+    setUpAll(() {
+      logWarnings();
+      final dylib = File('test/native_objc_test/property_test.dylib');
+      verifySetupFile(dylib);
+      lib = PropertyTestObjCLibrary(DynamicLibrary.open(dylib.absolute.path));
+      testInstance = PropertyInterface.new1(lib);
+      generateBindingsForCoverage('property');
+    });
+
+    group('instance properties', () {
+      test('read-only property', () {
+        expect(testInstance!.readOnlyProperty, 7);
+      });
+
+      test('read-write property', () {
+        testInstance!.readWriteProperty = 23;
+        expect(testInstance!.readWriteProperty, 23);
+      });
+    });
+
+    group('class properties', () {
+      test('read-only property', () {
+        expect(PropertyInterface.getClassReadOnlyProperty(lib), 42);
+      });
+
+      test('read-write property', () {
+        PropertyInterface.setClassReadWriteProperty(lib, 101);
+        expect(PropertyInterface.getClassReadWriteProperty(lib), 101);
+      });
+    });
+  });
+}
diff --git a/pkgs/ffigen/test/native_objc_test/property_test.m b/pkgs/ffigen/test/native_objc_test/property_test.m
new file mode 100644
index 0000000..117c6d5
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/property_test.m
@@ -0,0 +1,36 @@
+#import <Foundation/NSObject.h>
+
+@class UndefinedTemplate<ObjectType>;
+
+@interface PropertyInterface : NSObject {
+}
+
+@property (readonly) int32_t readOnlyProperty;
+@property int32_t readWriteProperty;
+@property (class, readonly, copy) UndefinedTemplate<NSString *> *regressGH436;
+@property (class, readonly) int32_t classReadOnlyProperty;
+@property (class) int32_t classReadWriteProperty;
+
+@end
+
+@implementation PropertyInterface
+
+static int32_t _classReadWriteProperty = 0;
+
+- (int32_t)readOnlyProperty {
+  return 7;
+}
+
++ (int32_t)classReadOnlyProperty {
+  return 42;
+}
+
++ (int32_t)classReadWriteProperty {
+  return _classReadWriteProperty;
+}
+
++ (void)setClassReadWriteProperty:(int32_t)x {
+  _classReadWriteProperty = x;
+}
+
+@end
\ No newline at end of file
diff --git a/pkgs/ffigen/test/native_objc_test/rename_config.yaml b/pkgs/ffigen/test/native_objc_test/rename_config.yaml
new file mode 100644
index 0000000..8dbae03
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/rename_config.yaml
@@ -0,0 +1,23 @@
+# Copyright (c) 2022, 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.
+
+# =================== GENERATING TEST BINDINGS ==================
+#    dart run ffigen --config test/rename_test/config.yaml
+# ===============================================================
+
+name: RenameLibrary
+description: 'Rename test'
+language: objc
+output: 'rename_test_bindings.dart'
+exclude-all-by-default: true
+objc-interfaces:
+  include:
+    - _Renamed
+  rename:
+    '_(.*)': '$1'
+headers:
+  entry-points:
+    - 'rename_test.m'
+preamble: |
+  // ignore_for_file: camel_case_types, non_constant_identifier_names, unused_element, unused_field
diff --git a/pkgs/ffigen/test/native_objc_test/rename_test.dart b/pkgs/ffigen/test/native_objc_test/rename_test.dart
new file mode 100644
index 0000000..aa8a23f
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/rename_test.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2022, 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.
+
+// Objective C support is only available on mac.
+@TestOn('mac-os')
+
+import 'dart:ffi';
+import 'dart:io';
+
+import 'package:test/test.dart';
+import '../test_utils.dart';
+import 'rename_test_bindings.dart';
+import 'util.dart';
+
+void main() {
+  late RenameLibrary lib;
+  group('rename_test', () {
+    setUpAll(() {
+      logWarnings();
+      final dylib = File('test/native_objc_test/rename_test.dylib');
+      verifySetupFile(dylib);
+      lib = RenameLibrary(DynamicLibrary.open(dylib.absolute.path));
+      generateBindingsForCoverage('rename');
+    });
+
+    test('Renamed class', () {
+      final renamed = Renamed.new1(lib);
+      renamed.property = 123;
+      expect(renamed.property, 123);
+    });
+  });
+}
diff --git a/pkgs/ffigen/test/native_objc_test/rename_test.m b/pkgs/ffigen/test/native_objc_test/rename_test.m
new file mode 100644
index 0000000..6187bd8
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/rename_test.m
@@ -0,0 +1,12 @@
+// Copyright (c) 2022, 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 <Foundation/NSObject.h>
+
+@interface _Renamed : NSObject
+@property int32_t property;
+@end
+
+@implementation _Renamed
+@end
diff --git a/pkgs/ffigen/test/native_objc_test/setup.dart b/pkgs/ffigen/test/native_objc_test/setup.dart
new file mode 100644
index 0000000..5eff12c
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/setup.dart
@@ -0,0 +1,131 @@
+// Copyright (c) 2022, 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:async';
+import 'dart:io';
+
+Future<void> _buildLib(String input, String output) async {
+  final args = [
+    '-shared',
+    '-fpic',
+    '-x',
+    'objective-c',
+    input,
+    '-framework',
+    'Foundation',
+    '-o',
+    output,
+  ];
+  final process = await Process.start('clang', args);
+  unawaited(stdout.addStream(process.stdout));
+  unawaited(stderr.addStream(process.stderr));
+  final result = await process.exitCode;
+  if (result != 0) {
+    throw ProcessException('clang', args, 'Build failed', result);
+  }
+  print('Generated file: $output');
+}
+
+Future<void> _buildSwift(
+    String input, String outputHeader, String outputLib) async {
+  final args = [
+    '-c',
+    input,
+    '-emit-objc-header-path',
+    outputHeader,
+    '-emit-library',
+    '-o',
+    outputLib,
+  ];
+  final process = await Process.start('swiftc', args);
+  unawaited(stdout.addStream(process.stdout));
+  unawaited(stderr.addStream(process.stderr));
+  final result = await process.exitCode;
+  if (result != 0) {
+    throw ProcessException('swiftc', args, 'Build failed', result);
+  }
+  print('Generated files: $outputHeader and $outputLib');
+}
+
+Future<void> _generateBindings(String config) async {
+  final args = [
+    'run',
+    'ffigen',
+    '--config',
+    'test/native_objc_test/$config',
+  ];
+  final process =
+      await Process.start(Platform.executable, args, workingDirectory: '../..');
+  unawaited(stdout.addStream(process.stdout));
+  unawaited(stderr.addStream(process.stderr));
+  final result = await process.exitCode;
+  if (result != 0) {
+    throw ProcessException('dart', args, 'Generating bindings', result);
+  }
+  print('Generated bindings for: $config');
+}
+
+List<String> _getTestNames() {
+  const configSuffix = '_config.yaml';
+  final names = <String>[];
+  for (final entity in Directory.current.listSync()) {
+    final filename = entity.uri.pathSegments.last;
+    if (filename.endsWith(configSuffix)) {
+      names.add(filename.substring(0, filename.length - configSuffix.length));
+    }
+  }
+  return names;
+}
+
+Future<void> build(List<String> testNames) async {
+  print('Building Dynamic Library for Objective C Native Tests...');
+  for (final name in testNames) {
+    final mFile = '${name}_test.m';
+    if (await File(mFile).exists()) {
+      await _buildLib(mFile, '${name}_test.dylib');
+    }
+  }
+
+  print('Building Dynamic Library and Header for Swift Tests...');
+  for (final name in testNames) {
+    final swiftFile = '${name}_test.swift';
+    if (await File(swiftFile).exists()) {
+      await _buildSwift(
+          swiftFile, '${name}_test-Swift.h', '${name}_test.dylib');
+    }
+  }
+
+  print('Generating Bindings for Objective C Native Tests...');
+  for (final name in testNames) {
+    await _generateBindings('${name}_config.yaml');
+  }
+}
+
+Future<void> clean(List<String> testNames) async {
+  print('Deleting generated and built files...');
+  final filenames = [
+    for (final name in testNames) ...[
+      '${name}_bindings.dart',
+      '${name}_test_bindings.dart',
+      '${name}_test.dylib'
+    ],
+  ];
+  Future.wait(filenames.map((fileName) async {
+    final file = File(fileName);
+    final exists = await file.exists();
+    if (exists) await file.delete();
+  }));
+}
+
+Future<void> main(List<String> arguments) async {
+  if (!Platform.isMacOS) {
+    throw OSError('Objective C tests are only supported on MacOS');
+  }
+
+  if (arguments.isNotEmpty && arguments[0] == 'clean') {
+    return await clean(_getTestNames());
+  }
+
+  return await build(arguments.isNotEmpty ? arguments : _getTestNames());
+}
diff --git a/pkgs/ffigen/test/native_objc_test/string_config.yaml b/pkgs/ffigen/test/native_objc_test/string_config.yaml
new file mode 100644
index 0000000..016b2bd
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/string_config.yaml
@@ -0,0 +1,13 @@
+name: StringTestObjCLibrary
+description: 'Tests calling Objective-C string methods'
+language: objc
+output: 'string_bindings.dart'
+exclude-all-by-default: true
+objc-interfaces:
+  include:
+    - StringUtil
+headers:
+  entry-points:
+    - 'string_test.m'
+preamble: |
+  // ignore_for_file: camel_case_types, non_constant_identifier_names, unused_element, unused_field
diff --git a/pkgs/ffigen/test/native_objc_test/string_test.dart b/pkgs/ffigen/test/native_objc_test/string_test.dart
new file mode 100644
index 0000000..068e5ed
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/string_test.dart
@@ -0,0 +1,51 @@
+// Copyright (c) 2022, 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.
+
+// Objective C support is only available on mac.
+@TestOn('mac-os')
+
+import 'dart:ffi';
+import 'dart:io';
+
+import 'package:test/test.dart';
+import '../test_utils.dart';
+import 'string_bindings.dart';
+import 'util.dart';
+
+void main() {
+  late StringTestObjCLibrary lib;
+
+  group('string', () {
+    setUpAll(() {
+      logWarnings();
+      final dylib = File('test/native_objc_test/string_test.dylib');
+      verifySetupFile(dylib);
+      lib = StringTestObjCLibrary(DynamicLibrary.open(dylib.absolute.path));
+      generateBindingsForCoverage('string');
+    });
+
+    for (final s in ['Hello', '🇵🇬', 'Embedded\u0000Null']) {
+      test('NSString to/from Dart string [$s]', () {
+        final ns1 = NSString(lib, s);
+        expect(ns1.length, s.length);
+        expect(ns1.toString().length, s.length);
+        expect(ns1.toString(), s);
+
+        final ns2 = s.toNSString(lib);
+        expect(ns2.length, s.length);
+        expect(ns2.toString().length, s.length);
+        expect(ns2.toString(), s);
+      });
+    }
+
+    test('strings usable', () {
+      final str1 = 'Hello'.toNSString(lib);
+      final str2 = 'World!'.toNSString(lib);
+
+      final str3 = StringUtil.strConcat_with_(lib, str1, str2);
+      expect(str3.length, 11);
+      expect(str3.toString(), "HelloWorld!");
+    });
+  });
+}
diff --git a/pkgs/ffigen/test/native_objc_test/string_test.m b/pkgs/ffigen/test/native_objc_test/string_test.m
new file mode 100644
index 0000000..5add18c
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/string_test.m
@@ -0,0 +1,13 @@
+#import <Foundation/NSObject.h>
+#import <Foundation/NSString.h>
+
+// TODO(#309): strConcat should just be a static function.
+@interface StringUtil : NSObject {}
++ (NSString*)strConcat:(NSString*)a with:(NSString*)b;
+@end
+
+@implementation StringUtil
++ (NSString*)strConcat:(NSString*)a with:(NSString*)b {
+  return [a stringByAppendingString:b];
+}
+@end
diff --git a/pkgs/ffigen/test/native_objc_test/swift_class_config.yaml b/pkgs/ffigen/test/native_objc_test/swift_class_config.yaml
new file mode 100644
index 0000000..20bd288
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/swift_class_config.yaml
@@ -0,0 +1,15 @@
+name: SwiftClassTestLibrary
+description: 'Tests Swift classes'
+language: objc
+output: 'swift_class_bindings.dart'
+exclude-all-by-default: true
+objc-interfaces:
+  include:
+    - MySwiftClass
+  module:
+    'MySwiftClass': 'swift_class_test'
+headers:
+  entry-points:
+    - 'swift_class_test-Swift.h'
+preamble: |
+  // ignore_for_file: camel_case_types, non_constant_identifier_names, unused_element, unused_field
diff --git a/pkgs/ffigen/test/native_objc_test/swift_class_test.dart b/pkgs/ffigen/test/native_objc_test/swift_class_test.dart
new file mode 100644
index 0000000..09a2714
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/swift_class_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2022, 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.
+
+// Objective C support is only available on mac.
+@TestOn('mac-os')
+
+import 'dart:ffi';
+import 'dart:io';
+
+import 'package:test/test.dart';
+import '../test_utils.dart';
+import 'swift_class_bindings.dart';
+import 'util.dart';
+
+void main() {
+  late SwiftClassTestLibrary lib;
+  group('swift_class_test', () {
+    setUpAll(() {
+      logWarnings();
+      final dylib = File('test/native_objc_test/swift_class_test.dylib');
+      verifySetupFile(dylib);
+      lib = SwiftClassTestLibrary(DynamicLibrary.open(dylib.absolute.path));
+      generateBindingsForCoverage('swift_class');
+    });
+
+    test('Renamed class', () {
+      final swiftObject = MySwiftClass.new1(lib);
+      expect(swiftObject.getValue(), 123);
+      swiftObject.setValueWithX_(456);
+      expect(swiftObject.getValue(), 456);
+    });
+  });
+}
diff --git a/pkgs/ffigen/test/native_objc_test/swift_class_test.swift b/pkgs/ffigen/test/native_objc_test/swift_class_test.swift
new file mode 100644
index 0000000..26ae016
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/swift_class_test.swift
@@ -0,0 +1,11 @@
+import Foundation
+
+@objc public class MySwiftClass: NSObject {
+  var val = 123;
+  @objc public func getValue() -> Int {
+    return val;
+  }
+  @objc public func setValue(x: Int) {
+    val = x;
+  }
+}
diff --git a/pkgs/ffigen/test/native_objc_test/util.dart b/pkgs/ffigen/test/native_objc_test/util.dart
new file mode 100644
index 0000000..7ef14bf
--- /dev/null
+++ b/pkgs/ffigen/test/native_objc_test/util.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2022, 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:ffigen/ffigen.dart';
+import 'package:path/path.dart' as path;
+import 'package:test/test.dart';
+
+import '../test_utils.dart';
+
+void generateBindingsForCoverage(String testName) {
+  // The ObjC test bindings are generated in setup.dart (see #362), which means
+  // that the ObjC related bits of ffigen are missed by test coverage. So this
+  // function just regenerates those bindings. It doesn't test anything except
+  // that the generation succeeded, by asserting the file exists.
+  final config = testConfig(
+      File(path.join('test', 'native_objc_test', '${testName}_config.yaml'))
+          .readAsStringSync());
+  final library = parse(config);
+  final file = File(
+    path.join('test', 'debug_generated', '${testName}_test.dart'),
+  );
+  library.generateFile(file);
+  assert(file.existsSync());
+  file.delete();
+}
diff --git a/pkgs/ffigen/test/native_test/config.yaml b/pkgs/ffigen/test/native_test/config.yaml
index 6d8e475..901e559 100644
--- a/pkgs/ffigen/test/native_test/config.yaml
+++ b/pkgs/ffigen/test/native_test/config.yaml
@@ -8,10 +8,10 @@
 
 name: NativeLibrary
 description: 'Native tests.'
-output: 'test/native_test/native_test_bindings.dart'
+output: 'native_test_bindings.dart'
 headers:
   entry-points:
-    - 'test/native_test/native_test.c'
+    - 'native_test.c'
   include-directives:
     - '**native_test.c'
 
diff --git a/pkgs/ffigen/test/native_test/native_test.c b/pkgs/ffigen/test/native_test/native_test.c
index 037a73b..f971ac6 100644
--- a/pkgs/ffigen/test/native_test/native_test.c
+++ b/pkgs/ffigen/test/native_test/native_test.c
@@ -27,6 +27,8 @@
 
 intptr_t Function1IntPtr(intptr_t x) { return x + 42; }
 
+uintptr_t Function1UintPtr(uintptr_t x) { return x + 42; }
+
 float Function1Float(float x) { return x + 42.0f; }
 
 double Function1Double(double x) { return x + 42.0; }
diff --git a/pkgs/ffigen/test/native_test/native_test.dart b/pkgs/ffigen/test/native_test/native_test.dart
index 08e1475..7a19c2a 100644
--- a/pkgs/ffigen/test/native_test/native_test.dart
+++ b/pkgs/ffigen/test/native_test/native_test.dart
@@ -9,7 +9,6 @@
 import 'package:ffigen/ffigen.dart';
 import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
-import 'package:yaml/yaml.dart';
 import '../test_utils.dart';
 import 'native_test_bindings.dart';
 
@@ -24,29 +23,37 @@
       } else if (Platform.isWindows) {
         dylibName = r'test\native_test\native_test.dll';
       }
-      bindings =
-          NativeLibrary(DynamicLibrary.open(File(dylibName).absolute.path));
+      final dylib = File(dylibName);
+      verifySetupFile(dylib);
+      bindings = NativeLibrary(DynamicLibrary.open(dylib.absolute.path));
     });
 
     test('generate_bindings', () {
-      final config = Config.fromYaml(loadYaml(
-          File(path.join('test', 'native_test', 'config.yaml'))
-              .readAsStringSync()) as YamlMap);
-      final library = parse(config);
-      final file = File(
+      final configFile =
+          File(path.join('test', 'native_test', 'config.yaml')).absolute;
+      final outFile = File(
         path.join('test', 'debug_generated', 'native_test_bindings.dart'),
-      );
-      library.generateFile(file);
+      ).absolute;
+
+      late Config config;
+      withChDir(configFile.path, () {
+        config = testConfigFromPath(configFile.path);
+      });
+      final library = parse(config);
+
+      library.generateFile(outFile);
 
       try {
-        final actual = file.readAsStringSync();
-        final expected = File(path.join(config.output)).readAsStringSync();
+        final actual = outFile.readAsStringSync().replaceAll('\r', '');
+        final expected = File(path.join(config.output))
+            .readAsStringSync()
+            .replaceAll('\r', '');
         expect(actual, expected);
-        if (file.existsSync()) {
-          file.delete();
+        if (outFile.existsSync()) {
+          outFile.delete();
         }
       } catch (e) {
-        print('Failed test: Debug generated file: ${file.absolute.path}');
+        print('Failed test: Debug generated file: ${outFile.absolute.path}');
         rethrow;
       }
     });
diff --git a/pkgs/ffigen/test/native_test/native_test_bindings.dart b/pkgs/ffigen/test/native_test/native_test_bindings.dart
index 8c4d0ea..d4a25d6 100644
--- a/pkgs/ffigen/test/native_test/native_test_bindings.dart
+++ b/pkgs/ffigen/test/native_test/native_test_bindings.dart
@@ -3,6 +3,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 //
 // Generated by `package:ffigen`.
+// ignore_for_file: type=lint
 import 'dart:ffi' as ffi;
 
 /// Native tests.
@@ -25,15 +26,14 @@
     bool x,
   ) {
     return _Function1Bool(
-          x ? 1 : 0,
-        ) !=
-        0;
+      x,
+    );
   }
 
   late final _Function1BoolPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint8 Function(ffi.Uint8)>>(
-          'Function1Bool');
-  late final _Function1Bool = _Function1BoolPtr.asFunction<int Function(int)>();
+      _lookup<ffi.NativeFunction<ffi.Bool Function(ffi.Bool)>>('Function1Bool');
+  late final _Function1Bool =
+      _Function1BoolPtr.asFunction<bool Function(bool)>();
 
   int Function1Uint8(
     int x,
@@ -159,6 +159,20 @@
   late final _Function1IntPtr =
       _Function1IntPtrPtr.asFunction<int Function(int)>();
 
+  int Function1UintPtr(
+    int x,
+  ) {
+    return _Function1UintPtr(
+      x,
+    );
+  }
+
+  late final _Function1UintPtrPtr =
+      _lookup<ffi.NativeFunction<ffi.UintPtr Function(ffi.UintPtr)>>(
+          'Function1UintPtr');
+  late final _Function1UintPtr =
+      _Function1UintPtrPtr.asFunction<int Function(int)>();
+
   double Function1Float(
     double x,
   ) {
@@ -209,10 +223,9 @@
     );
   }
 
-  late final _Function1StructReturnByValuePtr = _lookup<
-      ffi.NativeFunction<
-          Struct3 Function(ffi.Int32, ffi.Int32,
-              ffi.Int32)>>('Function1StructReturnByValue');
+  late final _Function1StructReturnByValuePtr =
+      _lookup<ffi.NativeFunction<Struct3 Function(ffi.Int, ffi.Int, ffi.Int)>>(
+          'Function1StructReturnByValue');
   late final _Function1StructReturnByValue = _Function1StructReturnByValuePtr
       .asFunction<Struct3 Function(int, int, int)>();
 
@@ -225,7 +238,7 @@
   }
 
   late final _Function1StructPassByValuePtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(Struct3)>>(
+      _lookup<ffi.NativeFunction<ffi.Int Function(Struct3)>>(
           'Function1StructPassByValue');
   late final _Function1StructPassByValue =
       _Function1StructPassByValuePtr.asFunction<int Function(Struct3)>();
@@ -240,12 +253,12 @@
 }
 
 class Struct3 extends ffi.Struct {
-  @ffi.Int32()
+  @ffi.Int()
   external int a;
 
-  @ffi.Int32()
+  @ffi.Int()
   external int b;
 
-  @ffi.Int32()
+  @ffi.Int()
   external int c;
 }
diff --git a/pkgs/ffigen/test/regen.dart b/pkgs/ffigen/test/regen.dart
new file mode 100644
index 0000000..1ee0df3
--- /dev/null
+++ b/pkgs/ffigen/test/regen.dart
@@ -0,0 +1,74 @@
+// Copyright (c) 2022, 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:async';
+import 'dart:io';
+
+import 'package:args/args.dart';
+import 'package:ffigen/ffigen.dart';
+import 'package:logging/logging.dart';
+import './test_utils.dart';
+
+const usage = r'''Regenerates the Dart FFI bindings used in tests and examples.
+
+Use this command when developing features that change the generated bindings
+e.g. with this command:
+
+$ dart run test/setup.dart && dart run test/regen.dart && dart test
+''';
+
+Future<void> _regenConfig(File yamlConfig, File bindingOutput) async {
+  yamlConfig = yamlConfig.absolute;
+  bindingOutput = bindingOutput.absolute;
+  final config = testConfigFromPath(yamlConfig.path);
+  final library = parse(config);
+  library.generateFile(bindingOutput);
+}
+
+Future<void> main(List<String> args) async {
+  final parser = ArgParser();
+  parser.addSeparator(usage);
+  parser.addFlag(
+    'help',
+    abbr: 'h',
+    help: 'Prints this usage',
+    negatable: false,
+  );
+
+  final parseArgs = parser.parse(args);
+  if (parseArgs.wasParsed('help')) {
+    print(parser.usage);
+    exit(0);
+  } else if (parseArgs.rest.isNotEmpty) {
+    print(parser.usage);
+    exit(1);
+  }
+
+  Logger.root.level = Level.WARNING;
+  Logger.root.onRecord.listen((record) {
+    print('${record.level.name}: ${record.time}: ${record.message}');
+  });
+
+  final nativeTestConfig = File('test/native_test/config.yaml').absolute;
+  final nativeTestOut =
+      File('test/native_test/native_test_bindings.dart').absolute;
+  await withChDir(nativeTestConfig.path,
+      () => _regenConfig(nativeTestConfig, nativeTestOut));
+
+  final libclangConfig = File('example/libclang-example/config.yaml').absolute;
+  final libclangOut =
+      File('example/libclang-example/generated_bindings.dart').absolute;
+  await withChDir(
+      libclangConfig.path, () => _regenConfig(libclangConfig, libclangOut));
+
+  final simpleConfig = File('example/simple/config.yaml').absolute;
+  final simpleOut = File('example/simple/generated_bindings.dart').absolute;
+  await withChDir(
+      simpleConfig.path, () => _regenConfig(simpleConfig, simpleOut));
+
+  final cJsonConfig = File('example/c_json/config.yaml').absolute;
+  final cJsonOut =
+      File('example/c_json/cjson_generated_bindings.dart').absolute;
+  await withChDir(cJsonConfig.path, () => _regenConfig(cJsonConfig, cJsonOut));
+}
diff --git a/pkgs/ffigen/test/rename_tests/rename_test.dart b/pkgs/ffigen/test/rename_tests/rename_test.dart
index f362a11..24a136a 100644
--- a/pkgs/ffigen/test/rename_tests/rename_test.dart
+++ b/pkgs/ffigen/test/rename_tests/rename_test.dart
@@ -3,11 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:ffigen/src/code_generator.dart';
-import 'package:ffigen/src/config_provider.dart';
 import 'package:ffigen/src/header_parser.dart' as parser;
 import 'package:ffigen/src/strings.dart' as strings;
 import 'package:test/test.dart';
-import 'package:yaml/yaml.dart' as yaml;
 
 import '../test_utils.dart';
 
@@ -22,7 +20,7 @@
     setUpAll(() {
       logWarnings();
       expected = expectedLibrary();
-      actual = parser.parse(Config.fromYaml(yaml.loadYaml('''
+      actual = parser.parse(testConfig('''
 ${strings.name}: 'NativeLibrary'
 ${strings.description}: 'Rename Test'
 ${strings.output}: 'unused'
@@ -78,7 +76,7 @@
 ${strings.typedefs}:
   ${strings.rename}:
     'Struct5_Alias': 'Struct5_Alias_Renamed'
-    ''') as yaml.YamlMap));
+    '''));
     });
 
     test('Function addPrefix', () {
@@ -161,109 +159,109 @@
 }
 
 Library expectedLibrary() {
-  final struc1 = Struc(name: '${structPrefix}Struct1');
-  final struc2 = Struc(name: 'Struct2');
-  final struc3 = Struc(name: 'Struct3');
+  final struct1 = Struct(name: '${structPrefix}Struct1');
+  final struct2 = Struct(name: 'Struct2');
+  final struct3 = Struct(name: 'Struct3');
   return Library(
     name: 'Bindings',
     bindings: [
       Func(
         name: '${functionPrefix}func1',
         originalName: 'func1',
-        returnType: Type.nativeType(
+        returnType: NativeType(
           SupportedNativeType.Void,
         ),
         parameters: [
           Parameter(
             name: 's',
-            type: Type.pointer(Type.struct(struc1)),
+            type: PointerType(struct1),
           ),
         ],
       ),
       Func(
         name: 'func2',
         originalName: 'test_func2',
-        returnType: Type.nativeType(
+        returnType: NativeType(
           SupportedNativeType.Void,
         ),
         parameters: [
           Parameter(
             name: 's',
-            type: Type.pointer(Type.struct(struc2)),
+            type: PointerType(struct2),
           ),
         ],
       ),
       Func(
         name: 'func3',
         originalName: 'fullMatch_func3',
-        returnType: Type.nativeType(
+        returnType: NativeType(
           SupportedNativeType.Void,
         ),
         parameters: [
           Parameter(
             name: 's',
-            type: Type.pointer(Type.struct(struc3)),
+            type: PointerType(struct3),
           ),
         ],
       ),
       Func(
         name: '${functionPrefix}memberRename_func4',
         originalName: 'memberRename_func4',
-        returnType: Type.nativeType(
+        returnType: NativeType(
           SupportedNativeType.Void,
         ),
         parameters: [
           Parameter(
             name: 'underscore',
-            type: Type.nativeType(SupportedNativeType.Int32),
+            type: intType,
           ),
           Parameter(
             name: 'fullMatchSuccess',
-            type: Type.nativeType(SupportedNativeType.Float),
+            type: floatType,
           ),
           Parameter(
             name: 'unnamed',
-            type: Type.nativeType(SupportedNativeType.Int32),
+            type: intType,
           ),
         ],
       ),
       Func(
         name: '${functionPrefix}typedefRenameFunc',
         originalName: 'typedefRenameFunc',
-        returnType: Type.nativeType(
+        returnType: NativeType(
           SupportedNativeType.Void,
         ),
         parameters: [
           Parameter(
             name: 's',
-            type: Type.typealias(Typealias(
+            type: Typealias(
                 name: 'Struct5_Alias_Renamed',
-                type: Type.struct(Struc(name: '${structPrefix}Struct5')))),
+                type: Struct(name: '${structPrefix}Struct5')),
           ),
         ],
       ),
-      struc1,
-      struc2,
-      struc3,
-      Struc(
+      struct1,
+      struct2,
+      struct3,
+      Struct(
         name: '${structPrefix}MemberRenameStruct4',
         members: [
           Member(
             name: 'underscore',
-            type: Type.nativeType(SupportedNativeType.Int32),
+            type: intType,
           ),
           Member(
             name: 'fullMatchSuccess',
-            type: Type.nativeType(SupportedNativeType.Float),
+            type: floatType,
           ),
         ],
       ),
-      Struc(
+      Struct(
         name: '${structPrefix}AnyMatchStruct5',
         members: [
           Member(
             name: 'underscore',
-            type: Type.nativeType(SupportedNativeType.Int32),
+            type: intType,
           ),
         ],
       ),
diff --git a/pkgs/ffigen/test/setup.dart b/pkgs/ffigen/test/setup.dart
new file mode 100644
index 0000000..3439901
--- /dev/null
+++ b/pkgs/ffigen/test/setup.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2022, 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.
+
+// Runs all the test setup scripts. Usage:
+// dart run test/setup.dart
+
+import 'dart:async';
+import 'dart:io';
+
+Future<void> _run(String subdir, String script) async {
+  final dir = Platform.script.resolve('$subdir/');
+  print('\nRunning $script in ${dir.toFilePath()}');
+  final args = ['run', dir.resolve(script).toFilePath()];
+  final process = await Process.start(
+    Platform.executable,
+    args,
+    workingDirectory: dir.toFilePath(),
+  );
+  unawaited(stdout.addStream(process.stdout));
+  unawaited(stderr.addStream(process.stderr));
+  final result = await process.exitCode;
+  if (result != 0) {
+    throw ProcessException(Platform.executable, args, '$script failed', result);
+  }
+}
+
+Future<void> main() async {
+  await _run('native_test', 'build_test_dylib.dart');
+  if (Platform.isMacOS) {
+    await _run('native_objc_test', 'setup.dart');
+  }
+  print('\nSuccess :)\n');
+}
diff --git a/pkgs/ffigen/test/test_coverage.dart b/pkgs/ffigen/test/test_coverage.dart
deleted file mode 100644
index 88623ba..0000000
--- a/pkgs/ffigen/test/test_coverage.dart
+++ /dev/null
@@ -1,70 +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 'code_generator_tests/code_generator_test.dart' as code_generator_test;
-import 'collision_tests/decl_decl_collision_test.dart'
-    as collision_tests_decl_decl_collision_test;
-import 'collision_tests/reserved_keyword_collision_test.dart'
-    as collision_tests_reserved_keyword_collision_test;
-import 'config_tests/compiler_opts_test.dart'
-    as config_tests_compiler_opts_test;
-import 'example_tests/cjson_example_test.dart'
-    as example_tests_cjson_example_test;
-import 'example_tests/libclang_example_test.dart'
-    as example_tests_libclang_example_test;
-import 'example_tests/simple_example_test.dart'
-    as example_tests_simple_example_test;
-import 'header_parser_tests/comment_markup_test.dart'
-    as header_parser_tests_comment_markup_test;
-import 'header_parser_tests/dart_handle_test.dart'
-    as header_parser_tests_dart_handle_test;
-import 'header_parser_tests/forward_decl_test.dart'
-    as header_parser_tests_forward_decl_test;
-import 'header_parser_tests/function_n_struct_test.dart'
-    as header_parser_tests_function_n_struct_test;
-import 'header_parser_tests/functions_test.dart'
-    as header_parser_tests_functions_test;
-import 'header_parser_tests/globals_test.dart'
-    as header_parser_tests_globals_test;
-import 'header_parser_tests/macros_test.dart'
-    as header_parser_tests_macros_test;
-import 'header_parser_tests/native_func_typedef_test.dart'
-    as header_parser_tests_native_func_typedef_test;
-import 'header_parser_tests/nested_parsing_test.dart'
-    as header_parser_tests_nested_parsing_test;
-import 'header_parser_tests/opaque_dependencies_test.dart'
-    as header_parser_tests_opaque_dependencies_test;
-import 'header_parser_tests/typedef_test.dart'
-    as header_parser_tests_typedef_test;
-import 'header_parser_tests/unnamed_enums_test.dart'
-    as header_parser_tests_unnamed_enums_test;
-import 'large_integration_tests/large_test.dart'
-    as large_integration_tests_large_test;
-import 'native_test/native_test.dart' as native_test_native_test;
-import 'rename_tests/rename_test.dart' as rename_tests_rename_test;
-
-void main() {
-  large_integration_tests_large_test.main();
-  example_tests_cjson_example_test.main();
-  example_tests_simple_example_test.main();
-  example_tests_libclang_example_test.main();
-  collision_tests_decl_decl_collision_test.main();
-  collision_tests_reserved_keyword_collision_test.main();
-  config_tests_compiler_opts_test.main();
-  header_parser_tests_comment_markup_test.main();
-  header_parser_tests_dart_handle_test.main();
-  header_parser_tests_forward_decl_test.main();
-  header_parser_tests_functions_test.main();
-  header_parser_tests_globals_test.main();
-  header_parser_tests_macros_test.main();
-  header_parser_tests_function_n_struct_test.main();
-  header_parser_tests_native_func_typedef_test.main();
-  header_parser_tests_nested_parsing_test.main();
-  header_parser_tests_opaque_dependencies_test.main();
-  header_parser_tests_typedef_test.main();
-  header_parser_tests_unnamed_enums_test.main();
-  native_test_native_test.main();
-  rename_tests_rename_test.main();
-  code_generator_test.main();
-}
diff --git a/pkgs/ffigen/test/test_utils.dart b/pkgs/ffigen/test/test_utils.dart
index a967f66..50cb30e 100644
--- a/pkgs/ffigen/test/test_utils.dart
+++ b/pkgs/ffigen/test/test_utils.dart
@@ -5,9 +5,13 @@
 import 'dart:io';
 
 import 'package:ffigen/src/code_generator.dart';
+import 'package:ffigen/src/config_provider/config.dart';
+import 'package:ffigen/src/strings.dart' as strings;
 import 'package:logging/logging.dart';
+import 'package:package_config/package_config_types.dart';
 import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
+import 'package:yaml/yaml.dart' as yaml;
 
 extension LibraryTestExt on Library {
   /// Get a [Binding]'s generated string with a given name.
@@ -31,19 +35,74 @@
   }
 }
 
-/// Generates actual file using library and tests using [expect] with expected
+/// Check whether a file generated by test/setup.dart exists and throw a helpful
+/// exception if it does not.
+void verifySetupFile(File file) {
+  if (!file.existsSync()) {
+    throw NotFoundException("The file ${file.path} does not exist.\n\n"
+        "You may need to run: dart run test/setup.dart\n");
+  }
+}
+
+// Remove '\r' for Windows compatibility, then apply user's normalizer.
+String _normalizeGeneratedCode(
+    String generated, String Function(String)? codeNormalizer) {
+  final noCR = generated.replaceAll('\r', '').replaceAll(RegExp(r'\n+'), '\n');
+  if (codeNormalizer == null) return noCR;
+  return codeNormalizer(noCR);
+}
+
+/// Generates actual file using library and tests using [expect] with expected.
 ///
 /// This will not delete the actual debug file incase [expect] throws an error.
 void matchLibraryWithExpected(
-    Library library, List<String> pathForActual, List<String> pathToExpected) {
-  final file = File(
-    path.joinAll(pathForActual),
+    Library library, String pathForActual, List<String> pathToExpected,
+    {String Function(String)? codeNormalizer}) {
+  _matchFileWithExpected(
+    library: library,
+    pathForActual: pathForActual,
+    pathToExpected: pathToExpected,
+    fileWriter: ({required Library library, required File file}) =>
+        library.generateFile(file),
+    codeNormalizer: codeNormalizer,
   );
-  library.generateFile(file);
+}
 
+/// Generates actual file using library and tests using [expect] with expected.
+///
+/// This will not delete the actual debug file incase [expect] throws an error.
+void matchLibrarySymbolFileWithExpected(Library library, String pathForActual,
+    List<String> pathToExpected, String importPath) {
+  _matchFileWithExpected(
+      library: library,
+      pathForActual: pathForActual,
+      pathToExpected: pathToExpected,
+      fileWriter: ({required Library library, required File file}) {
+        if (!library.writer.canGenerateSymbolOutput) library.generate();
+        library.generateSymbolOutputFile(file, importPath);
+      });
+}
+
+/// Generates actual file using library and tests using [expect] with expected.
+///
+/// This will not delete the actual debug file incase [expect] throws an error.
+void _matchFileWithExpected({
+  required Library library,
+  required String pathForActual,
+  required List<String> pathToExpected,
+  required void Function({required Library library, required File file})
+      fileWriter,
+  String Function(String)? codeNormalizer,
+}) {
+  final file = File(
+    path.join(strings.tmpDir, pathForActual),
+  );
+  fileWriter(library: library, file: file);
   try {
-    final actual = file.readAsStringSync();
-    final expected = File(path.joinAll(pathToExpected)).readAsStringSync();
+    final actual =
+        _normalizeGeneratedCode(file.readAsStringSync(), codeNormalizer);
+    final expected = _normalizeGeneratedCode(
+        File(path.joinAll(pathToExpected)).readAsStringSync(), codeNormalizer);
     expect(actual, expected);
     if (file.existsSync()) {
       file.delete();
@@ -70,3 +129,44 @@
     print('${record.level.name.padRight(8)}: ${record.message}');
   });
 }
+
+void logWarningsToArray(List<String> logArr, [Level level = Level.WARNING]) {
+  Logger.root.level = level;
+  Logger.root.onRecord.listen((record) {
+    logArr.add('${record.level.name.padRight(8)}: ${record.message}');
+  });
+}
+
+Config testConfig(String yamlBody, {String? filename}) {
+  return Config.fromYaml(
+    yaml.loadYaml(yamlBody) as yaml.YamlMap,
+    filename: filename,
+    packageConfig: PackageConfig([
+      Package(
+        'shared_bindings',
+        Uri.file(path.join(path.current, 'example', 'shared_bindings', 'lib/')),
+      ),
+    ]),
+  );
+}
+
+Config testConfigFromPath(String path) {
+  final file = File(path);
+  final yamlBody = file.readAsStringSync();
+  return testConfig(yamlBody, filename: path);
+}
+
+T withChDir<T>(String path, T Function() inner) {
+  final oldDir = Directory.current;
+  Directory.current = File(path).parent;
+
+  late T result;
+
+  try {
+    result = inner();
+  } finally {
+    Directory.current = oldDir;
+  }
+
+  return result;
+}
diff --git a/pkgs/ffigen/test_flutter/flutter_template_tests/flutter_plugin_ffi_test.dart b/pkgs/ffigen/test_flutter/flutter_template_tests/flutter_plugin_ffi_test.dart
new file mode 100644
index 0000000..06b9df7
--- /dev/null
+++ b/pkgs/ffigen/test_flutter/flutter_template_tests/flutter_plugin_ffi_test.dart
@@ -0,0 +1,166 @@
+// Copyright (c) 2022, 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.
+
+@Timeout(Duration(seconds: 120))
+
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:test/test.dart';
+
+void main() {
+  Uri? tempDirUri;
+  final projectName = 'test_project';
+
+  setUp(() async {
+    tempDirUri = (await Directory.current.createTemp('.temp_test_')).uri;
+  });
+
+  tearDown(() async {
+    final dir = Directory(tempDirUri!.toFilePath());
+    if (await dir.exists()) {
+      await dir.delete(recursive: true);
+    }
+  });
+
+  test('Run Flutter', () async {
+    final projectDirUri = tempDirUri!.resolve('$projectName/');
+    final libDirUri = projectDirUri.resolve('lib/');
+    final bindingsGeneratedUri =
+        libDirUri.resolve('${projectName}_bindings_generated.dart');
+    final bindingsGeneratedCopyUri =
+        libDirUri.resolve('${projectName}_bindings_generated_copy.dart');
+
+    await Task.serial([
+      RunProcess(
+        executable: 'flutter',
+        arguments: [
+          'create',
+          '--template=plugin_ffi',
+          projectName,
+        ],
+        workingDirectory: tempDirUri,
+      ),
+      Copy(
+        source: bindingsGeneratedUri,
+        target: bindingsGeneratedCopyUri,
+      ),
+      RunProcess(
+        executable: 'flutter',
+        arguments: [
+          'pub',
+          'run',
+          'ffigen',
+          '--config',
+          'ffigen.yaml',
+        ],
+        workingDirectory: projectDirUri,
+      ),
+    ]).run();
+
+    final originalBindings = await readFileAsString(bindingsGeneratedCopyUri);
+    final regeneratedBindings = await readFileAsString(bindingsGeneratedUri);
+
+    expect(originalBindings, regeneratedBindings);
+  });
+}
+
+Future<String> readFileAsString(Uri uri) async {
+  final contents = await File(uri.toFilePath()).readAsString();
+  return contents.replaceAll('\r', '');
+}
+
+abstract class Task {
+  Future<void> run();
+
+  factory Task.serial(Iterable<Task> tasks) => _SerialTask(tasks);
+}
+
+class _SerialTask implements Task {
+  final Iterable<Task> tasks;
+
+  _SerialTask(this.tasks);
+
+  @override
+  Future<void> run() async {
+    for (final task in tasks) {
+      await task.run();
+    }
+  }
+}
+
+class RunProcess implements Task {
+  final List<String> arguments;
+  final String executable;
+  final Uri? workingDirectory;
+  Map<String, String>? environment;
+  final bool throwOnFailure;
+
+  RunProcess({
+    required this.arguments,
+    required this.executable,
+    this.workingDirectory,
+    this.environment,
+    this.throwOnFailure = true,
+  });
+
+  /// Excluding [workingDirectory].
+  String get commandString => [
+        if (workingDirectory != null) '(cd ${workingDirectory!.path};',
+        ...?environment?.entries.map((entry) => '${entry.key}=${entry.value}'),
+        executable,
+        ...arguments.map((a) => a.contains(' ') ? "'$a'" : a),
+        if (workingDirectory != null) ')',
+      ].join(' ');
+
+  @override
+  Future<void> run() async {
+    final workingDirectoryString = workingDirectory?.toFilePath();
+
+    print('Running `$commandString`.');
+    final process = await Process.start(executable, arguments,
+            runInShell: true,
+            includeParentEnvironment: true,
+            workingDirectory: workingDirectoryString,
+            environment: environment)
+        .then((process) {
+      process.stdout.transform(utf8.decoder).forEach((s) => print('  $s'));
+      process.stderr.transform(utf8.decoder).forEach((s) => print('  $s'));
+      return process;
+    });
+    final exitCode = await process.exitCode;
+    if (exitCode != 0) {
+      final message =
+          'Command `$commandString` failed with exit code $exitCode.';
+      print(message);
+      if (throwOnFailure) {
+        throw Exception(message);
+      }
+    }
+    print('Command `$commandString` done.');
+  }
+}
+
+class Copy implements Task {
+  final Uri source;
+  final Uri target;
+
+  Copy({
+    required this.source,
+    required this.target,
+  });
+
+  @override
+  Future<void> run() async {
+    final file = File.fromUri(source);
+    if (!await file.exists()) {
+      final message =
+          "File not in expected location: '${source.toFilePath()}'.";
+      print(message);
+      throw Exception(message);
+    }
+    print('Copying ${source.toFilePath()} to ${target.toFilePath()}.');
+    await file.copy(target.toFilePath());
+  }
+}
diff --git a/pkgs/ffigen/tool/coverage.sh b/pkgs/ffigen/tool/coverage.sh
index 7cecbfe..02c8e2f 100755
--- a/pkgs/ffigen/tool/coverage.sh
+++ b/pkgs/ffigen/tool/coverage.sh
@@ -8,12 +8,8 @@
 set -e
 
 # Gather coverage.
-dart pub global activate remove_from_coverage
 dart pub global activate coverage
 # Generate coverage report.
-dart --pause-isolates-on-exit --disable-service-auth-codes --enable-vm-service=3000 test/test_coverage.dart &
-dart pub global run coverage:collect_coverage --wait-paused --uri=http://127.0.0.1:3000/ -o coverage.json --resume-isolates
-dart pub global run coverage:format_coverage --lcov -i coverage.json -o lcov.info
-
-# Remove extra files from coverage report.
-dart pub global run remove_from_coverage -f lcov.info -r ".pub-cache"
+dart run --pause-isolates-on-exit --disable-service-auth-codes --enable-vm-service=3000 test &
+dart pub global run coverage:collect_coverage --wait-paused --uri=http://127.0.0.1:3000/ -o coverage.json --resume-isolates --scope-output=ffigen
+dart pub global run coverage:format_coverage --packages=.dart_tool/package_config.json --lcov -i coverage.json -o lcov.info
diff --git a/pkgs/ffigen/tool/libclang_config.yaml b/pkgs/ffigen/tool/libclang_config.yaml
index c6940ac..339c52c 100644
--- a/pkgs/ffigen/tool/libclang_config.yaml
+++ b/pkgs/ffigen/tool/libclang_config.yaml
@@ -11,13 +11,13 @@
 
 name: Clang
 description: Holds bindings to LibClang.
-output: 'lib/src/header_parser/clang_bindings/clang_bindings.dart'
+output: '../lib/src/header_parser/clang_bindings/clang_bindings.dart'
 compiler-opts:
   - '-Ithird_party/libclang/include'
   - '-Wno-nullability-completeness'
 headers:
   entry-points:
-    - 'third_party/libclang/include/clang-c/Index.h'
+    - '../third_party/libclang/include/clang-c/Index.h'
   include-directives:
     - '**wrapper.c'
     - '**Index.h'
@@ -39,6 +39,9 @@
     - CXDiagnosticDisplayOptions
     - CXTranslationUnit_Flags
     - CXEvalResultKind
+    - CXObjCPropertyAttrKind
+    - CXTypeNullabilityKind
+    - CXTypeLayoutError
 
 structs:
   include:
@@ -88,6 +91,7 @@
     - clang_Cursor_getArgument
     - clang_getNumArgTypes
     - clang_getArgType
+    - clang_getCursorResultType
     - clang_getEnumConstantDeclValue
     - clang_equalRanges
     - clang_Cursor_getCommentRange
@@ -109,3 +113,10 @@
     - clang_getCursorDefinition
     - clang_Cursor_isNull
     - clang_Cursor_hasAttrs
+    - clang_Type_getObjCObjectBaseType
+    - clang_Cursor_getObjCPropertyAttributes
+    - clang_Cursor_getObjCPropertyGetterName
+    - clang_Cursor_getObjCPropertySetterName
+    - clang_Type_getNullability
+    - clang_Location_isInSystemHeader
+    - clang_getClangVersion
