[
  {
    "path": ".github/workflows/ci.yml",
    "content": "name: ci\non:\n  push:\n    branches: \n      - main\n      - dev\n    paths-ignore:\n      - README.md\n      - README_CN.md\n      - LICENSE\n  pull_request:\n    paths-ignore:\n      - README.md\n      - README_CN.md\n      - LICENSE\n\njobs:\n  build-windows:\n    runs-on: windows-2022\n    steps:\n      - name: Clone repository\n        uses: actions/checkout@v4\n      - name: Set up Flutter\n        uses: subosito/flutter-action@v2\n        with:\n          channel: stable\n      - name: Generate code\n        run: flutter pub get && flutter pub run build_runner build --delete-conflicting-outputs\n      - name: Build Flutter application for Windows\n        run: flutter build windows\n      - name: Create ZIP archive\n        run: |\n          # Create a directory to hold the files\n          mkdir IRIS\n          # Copy the build output to the IRIS directory\n          Copy-Item -Path \"build\\windows\\x64\\runner\\Release\\*\" -Destination \"IRIS\" -Recurse -Force\n          # Create a ZIP file\n          Compress-Archive -Path \"IRIS\" -DestinationPath \"IRIS-windows.zip\"\n      - name: Upload artifact\n        uses: actions/upload-artifact@v4\n        with:\n          name: IRIS-windows.zip\n          path: IRIS-windows.zip\n      - name: Remove updater\n        run: Remove-Item -Path build\\windows\\x64\\runner\\Release\\iris-updater.bat -Force\n      - name: Create installer\n        run: iscc inno.iss\n      - name: Upload installer\n        uses: actions/upload-artifact@v4\n        with:\n          name: IRIS-windows-installer.exe\n          path: build\\windows\\x64\\runner\\Release\\IRIS-windows-installer.exe\n      - name: Clean up\n        run: Remove-Item -Path build\\windows\\x64\\runner\\Release\\ -Recurse -Force\n      - name: Build store msix\n        run: dart run msix:build --store true\n      - name: Remove updater\n        run: Remove-Item -Path build\\windows\\x64\\runner\\Release\\iris-updater.bat -Force\n      - name: Pack store msix\n        run: dart run msix:pack --store true --output-name IRIS-windows-store\n      - name: Upload msix\n        uses: actions/upload-artifact@v4\n        with:\n          name: IRIS-windows-store.msix\n          path: build\\windows\\x64\\runner\\Release\\IRIS-windows-store.msix\n\n  build-android:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Clone repository\n        uses: actions/checkout@v4\n      - name: Set up Flutter\n        uses: subosito/flutter-action@v2\n        with:\n          channel: stable\n      - name: Generate code\n        run: flutter pub get && flutter pub run build_runner build --delete-conflicting-outputs\n      - name: Set up Java\n        uses: actions/setup-java@v4\n        with:\n          distribution: zulu\n          java-version: 21\n      - name: Decode and save keystore\n        run: |\n          echo \"${{ secrets.KEYSTORE }}\" | base64 --decode > android/app/keystore.jks\n      - name: Save key.properties\n        run: |\n          echo \"storePassword=${{ secrets.STORE_PASSWORD }}\" >> android/key.properties\n          echo \"keyPassword=${{ secrets.KEY_PASSWORD }}\" >> android/key.properties\n          echo \"keyAlias=${{ secrets.KEY_ALIAS }}\" >> android/key.properties\n          echo \"storeFile=keystore.jks\" >> android/key.properties\n      - name: Build Flutter application for Android\n        run: flutter build apk --split-per-abi\n      - name: Rename armeabi-v7a APK\n        run: mv build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk IRIS-android-armeabi-v7a.apk\n      - name: Rename arm64-v8a APK\n        run: mv build/app/outputs/flutter-apk/app-arm64-v8a-release.apk IRIS-android-arm64-v8a.apk\n      - name: Rename x86_64 APK\n        run: mv build/app/outputs/flutter-apk/app-x86_64-release.apk IRIS-android-x86_64.apk\n      - name: Upload armeabi-v7a APK\n        uses: actions/upload-artifact@v4\n        with:\n          name: IRIS-android-armeabi-v7a.apk\n          path: IRIS-android-armeabi-v7a.apk\n      - name: Upload arm64-v8a APK\n        uses: actions/upload-artifact@v4\n        with:\n          name: IRIS-android-arm64-v8a.apk\n          path: IRIS-android-arm64-v8a.apk\n      - name: Upload x86_64 APK\n        uses: actions/upload-artifact@v4\n        with:\n          name: IRIS-android-x86_64.apk\n          path: IRIS-android-x86_64.apk\n\n  release:\n    if: github.event_name == 'push' && github.ref == 'refs/heads/main'\n    runs-on: ubuntu-latest\n    needs:\n      - build-windows\n      - build-android\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n      - name: Get version\n        id: yq\n        uses: mikefarah/yq@master\n        with:\n          cmd: yq '.version' 'pubspec.yaml'\n      - name: Print version\n        run: echo ${{ steps.yq.outputs.result }}\n      - name: Prepare tag name\n        id: tag_name\n        run: |\n          VERSION=\"${{ steps.yq.outputs.result }}\"\n          TAG_NAME=\"v${VERSION%%+*}\"\n          echo \"TAG_NAME=$TAG_NAME\" >> \"$GITHUB_OUTPUT\"\n      - name: Check tag\n        uses: mukunku/tag-exists-action@v1.6.0\n        id: check-tag\n        with:\n          tag: ${{ steps.tag_name.outputs.TAG_NAME }}\n      - name: Eextract log\n        if: steps.check-tag.outputs.exists == 'false'\n        run: python extract_log.py ${{ steps.tag_name.outputs.TAG_NAME }}\n      - name: Download artifact\n        if: steps.check-tag.outputs.exists == 'false'\n        uses: actions/download-artifact@v4\n        with:\n          path: artifacts\n          merge-multiple: true\n      - name: Release\n        if: steps.check-tag.outputs.exists == 'false'\n        uses: softprops/action-gh-release@v2\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n        with:\n          tag_name: ${{ steps.tag_name.outputs.TAG_NAME }}\n          body_path: CHANGELOG_${{ steps.tag_name.outputs.TAG_NAME }}.md\n          draft: false\n          prerelease: false\n          files: |\n            artifacts/IRIS-windows.zip\n            artifacts/IRIS-windows-installer.exe\n            artifacts/IRIS-android-armeabi-v7a.apk\n            artifacts/IRIS-android-arm64-v8a.apk\n            artifacts/IRIS-android-x86_64.apk\n"
  },
  {
    "path": ".gitignore",
    "content": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\nmigrate_working_dir/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.iws\n.idea/\n\n# The .vscode folder contains launch configuration and tasks you configure in\n# VS Code which you may wish to be included in version control, so this line\n# is commented out by default.\n#.vscode/\n\n# Flutter/Dart/Pub related\n**/doc/api/\n**/ios/Flutter/.last_build_id\n.dart_tool/\n.flutter-plugins\n.flutter-plugins-dependencies\n.pub-cache/\n.pub/\n/build/\n\n# Symbolication related\napp.*.symbols\n\n# Obfuscation related\napp.*.map.json\n\n# Android Studio will place build artifacts here\n/android/app/debug\n/android/app/profile\n/android/app/release\n\n# freezed & json_serializable generated files\n**/*.freezed.dart\n**/*.g.dart\n\n# l10n\nlib/l10n/app_localizations*.dart\n"
  },
  {
    "path": ".metadata",
    "content": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrades etc.\n#\n# This file should be version controlled and should not be manually edited.\n\nversion:\n  revision: \"dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668\"\n  channel: \"stable\"\n\nproject_type: app\n\n# Tracks metadata for the flutter migrate command\nmigration:\n  platforms:\n    - platform: root\n      create_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668\n      base_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668\n    - platform: android\n      create_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668\n      base_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668\n    - platform: ios\n      create_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668\n      base_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668\n    - platform: linux\n      create_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668\n      base_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668\n    - platform: macos\n      create_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668\n      base_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668\n    - platform: web\n      create_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668\n      base_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668\n    - platform: windows\n      create_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668\n      base_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668\n\n  # User provided section\n\n  # List of Local paths (relative to this file) that should be\n  # ignored by the migrate tool.\n  #\n  # Files that are not part of the templates will be ignored by default.\n  unmanaged_files:\n    - 'lib/main.dart'\n    - 'ios/Runner.xcodeproj/project.pbxproj'\n"
  },
  {
    "path": ".vscode/launch.json",
    "content": "{\n  // 使用 IntelliSense 了解相关属性。 \n  // 悬停以查看现有属性的描述。\n  // 欲了解更多信息，请访问: https://go.microsoft.com/fwlink/?linkid=830387\n  \"version\": \"0.2.0\",\n  \"configurations\": [\n    \n    {\n      \"name\": \"iris\",\n      \"request\": \"launch\",\n      \"type\": \"dart\"\n    },\n    {\n      \"name\": \"iris (profile mode)\",\n      \"request\": \"launch\",\n      \"type\": \"dart\",\n      \"flutterMode\": \"profile\"\n    },\n    {\n      \"name\": \"iris (release mode)\",\n      \"request\": \"launch\",\n      \"type\": \"dart\",\n      \"flutterMode\": \"release\"\n    }\n  ]\n}"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n  \"arb-editor.suppressedWarnings\": [\n    \"missing_metadata_for_key\"\n  ],\n}"
  },
  {
    "path": "CHANGELOG.md",
    "content": "## v1.5.2\n\n### Changelog\n\n* Migrate to MPL-2.0 license\n* Add more media type support\n* Fix key open subtitle and audio track issue\n* Fix popup layer cannot be closed with `Esc` key issue\n\n### 更新日志\n\n* 迁移到 MPL-2.0 许可证\n* 添加更多媒体类型支持\n* 修复按键打开字幕和音频轨道的问题\n* 修复弹出层无法使用 `Esc` 键关闭的问题\n\n## v1.5.1\n\n### Changelog\n\n* Adjusted the playback control bar style in compact layout\n* Clicking “Check update” in the Microsoft Store version redirects to the Store page\n* Fixed forward and backward issues\n\n### 更新日志\n\n* 调整了紧凑布局下的播放控制栏样式\n* 微软商店版本中点击检查更新将跳转至商店页面\n* 修复了快退快进的问题\n\n## v1.5.0\n\n### Changelog\n\n* Updated app icon\n* Added a stop and an exit button\n* Added a playback-speed selector that activates with a touch-and-hold gesture\n* Fixed URI handling\n* Improved stability and performance\n\n### 更新日志\n\n* 更换应用图标\n* 添加停止按钮和退出按钮\n* 添加触控长按激活的播放速度选择器\n* 修复 uri 处理\n* 优化了稳定性和性能\n\n## v1.4.2\n\n### Changelog\n\n* Fix audio cover issue\n* Improve uri handling\n\n### 更新日志\n\n* 修复音频封面问题\n* 改进 uri 处理\n\n## v1.4.1\n\n### Changelog\n\n* Dynamic FTP streaming url\n\n### 更新日志\n\n* FTP 串流使用动态 url\n\n## v1.4.0\n\n### Changelog\n\n* Supports FTP storage\n* Supports adding local folders to the storage list\n* Storage list support remote disk and network shortcuts on Windows\n* Add Windows installer\n\n### 更新日志\n\n* 支持 FTP 存储\n* 支持添加本地文件夹到存储列表\n* Windows 版本存储列表支持远程磁盘和网络快捷方式\n* 添加 Windows 版本安装器\n\n## v1.3.4\n\n### Changelog\n\n* The Android version allows you to set the screen orientation.\n* Add playback speed button.\n* Add hotkeys: Step forward `+`, Step backward `-`.\n\n### 更新日志\n\n* 安卓版本可以设置屏幕方向。\n* 添加播放速度按钮。\n* 添加快捷键：帧进 `+`，帧退 `-`。\n\n## v1.3.3\n\n### Changelog\n\n* Fix issue of not being able to continue playback after startup\n\n### 更新日志\n\n* 修复启动后无法继续播放的问题\n\n## v1.3.2\n\n### Changelog\n\n* Support for custom https ports when adding WebDAV storage\n\n### 更新日志\n\n* 添加 WebDAV 存储时支持自定义 https 端口\n\n## v1.3.1\n\n### Changelog\n\n* The data save location for the Windows version has been changed to `C:\\Users\\<user>\\AppData\\Roaming\\nini22P\\iris`\n* Updated upstream dependencies and fixed the issue with switching subtitles in the FVP player backend\n\n### 更新日志\n\n* Windows 版本数据保存位置已修改为 `C:\\Users\\<user>\\AppData\\Roaming\\nini22P\\iris`\n* 更新上游依赖，修复 FVP 播放器后端切换字幕的问题\n\n## v1.3.0\n\n### Changelog\n\n* Add [FVP](https://github.com/wang-bin/fvp) player backend (Experimental, with unknown bugs)\n* Adding volume adjust\n* Add file sort\n* Add hotkeys: Volume up ( `Arrow Up` ), Volume down ( `Arrow Down` ), Volume mute ( `Ctrl + M` ), Toggle always on top ( `F10` ), Close currently media file ( `Ctrl + C` ), Exit application ( `Alt + X` )\n* Improved some visual effects\n\n### 更新日志\n\n* 添加 [FVP](https://github.com/wang-bin/fvp) 播放器后端（实验性，有未知bug）\n* 添加音量调整\n* 添加文件排序\n* 添加快捷键：提升音量（ `Arrow Up` ）、降低音量（ `Arrow Down` ）、静音（`Ctrl + M`）、切换窗口置顶（ `F10` ）、关闭当前媒体文件（ `Ctrl + C` ）、退出应用（ `Alt + X` ）\n* 改进了部分视觉效果\n\n## v1.2.1\n\n### Changelog\n\n* Split APKs by architecture to reduce installation size.\n\n### 更新日志\n\n* 拆分不同架构的 APK 以减小安装包大小\n\n## v1.2.0\n\n### Changelog\n\n* Support jumping to video playback from external clicks (Windows version can play by command line or dragging files to the window)\n* Support adjusting brightness and volume gestures (Brightness gestures are not available on Windows version)\n* Support playing online links\n* Add an option to always start playback from the beginning\n* On Android 11 and above, file reading is changed to using the \"Manage All Files\" permission\n* Improved WebDAV connection test function\n* Improved some visual effects\n\n### 更新日志\n\n* 支持从外部点击视频跳转播放（Windows 版本可以通过命令行或者拖拽文件到窗口播放）\n* 支持调整亮度和音量手势（Windows 版本调整亮度手势不可用）\n* 支持播放在线链接\n* 添加总是从头开始播放的选项\n* Android 11 以上读取文件时改为使用 `管理所有文件` 权限\n* 改进 WebDAV 测试连接功能\n* 改进了部分视觉效果\n\n## v1.1.1\n\n### Changelog\n\n* Restore old update method for windows version (Double-click the `iris-updater.bat` in the same directory as the executable file to upgrade if you have problems updating.)\n\n### 更新日志\n\n* windows 版本恢复为旧的更新方式（更新出问题的可双击打开可执行文件同级目录下的 `iris-updater.bat` 升级）\n\n## v1.1.0\n\n### Breaking Changes\n\n* All configurations will be cleared. Please reconfigure\n\n### Changlog\n\n* Display all local storage\n* Support playback history\n* Support random playback\n* Support loop playback\n* Support video zoom\n\n### 重大变更\n\n* 所有配置将被清空，请重新配置\n\n### 更新日志\n\n* 显示所有本地存储\n* 支持播放历史\n* 支持随机播放\n* 支持循环播放\n* 支持视频缩放\n\n## v1.0.3\n\n### Changelog\n\n* Improve Windows version installation updates\n* Fixes an issue where subtitles may not be found\n\n### 更新日志\n\n* 改进 Windows 版本安装更新\n* 修复可能无法找到字幕的问题\n\n## v1.0.2\n\n### Changelog\n\n* Support for switching built-in audio tracks\n* Reduce package size for Windows version\n\n### 更新日志\n\n* 支持切换内置音轨\n* 减小 Windows 版本包体大小\n\n## v1.0.1\n\n### Changelog\n\n* Windows version support auto update\n\n### 更新日志\n\n* Windows 版本支持自动更新\n\n## v1.0.0\n\n### Changelog\n\n* Supports WebDAV and local storage video playback\n\n### 更新日志\n\n* 支持 WebDAV 和本地存储视频播放\n"
  },
  {
    "path": "LICENSE",
    "content": "Mozilla Public License Version 2.0\n==================================\n\n1. Definitions\n\n--------------\n\n1.1. \"Contributor\"\n    means each individual or legal entity that creates, contributes to\n    the creation of, or owns Covered Software.\n\n1.2. \"Contributor Version\"\n    means the combination of the Contributions of others (if any) used\n    by a Contributor and that particular Contributor's Contribution.\n\n1.3. \"Contribution\"\n    means Covered Software of a particular Contributor.\n\n1.4. \"Covered Software\"\n    means Source Code Form to which the initial Contributor has attached\n    the notice in Exhibit A, the Executable Form of such Source Code\n    Form, and Modifications of such Source Code Form, in each case\n    including portions thereof.\n\n1.5. \"Incompatible With Secondary Licenses\"\n    means\n\n    (a) that the initial Contributor has attached the notice described\n        in Exhibit B to the Covered Software; or\n\n    (b) that the Covered Software was made available under the terms of\n        version 1.1 or earlier of the License, but not also under the\n        terms of a Secondary License.\n\n1.6. \"Executable Form\"\n    means any form of the work other than Source Code Form.\n\n1.7. \"Larger Work\"\n    means a work that combines Covered Software with other material, in\n    a separate file or files, that is not Covered Software.\n\n1.8. \"License\"\n    means this document.\n\n1.9. \"Licensable\"\n    means having the right to grant, to the maximum extent possible,\n    whether at the time of the initial grant or subsequently, any and\n    all of the rights conveyed by this License.\n\n1.10. \"Modifications\"\n    means any of the following:\n\n    (a) any file in Source Code Form that results from an addition to,\n        deletion from, or modification of the contents of Covered\n        Software; or\n\n    (b) any new file in Source Code Form that contains any Covered\n        Software.\n\n1.11. \"Patent Claims\" of a Contributor\n    means any patent claim(s), including without limitation, method,\n    process, and apparatus claims, in any patent Licensable by such\n    Contributor that would be infringed, but for the grant of the\n    License, by the making, using, selling, offering for sale, having\n    made, import, or transfer of either its Contributions or its\n    Contributor Version.\n\n1.12. \"Secondary License\"\n    means either the GNU General Public License, Version 2.0, the GNU\n    Lesser General Public License, Version 2.1, the GNU Affero General\n    Public License, Version 3.0, or any later versions of those\n    licenses.\n\n1.13. \"Source Code Form\"\n    means the form of the work preferred for making modifications.\n\n1.14. \"You\" (or \"Your\")\n    means an individual or a legal entity exercising rights under this\n    License. For legal entities, \"You\" includes any entity that\n    controls, is controlled by, or is under common control with You. For\n    purposes of this definition, \"control\" means (a) the power, direct\n    or indirect, to cause the direction or management of such entity,\n    whether by contract or otherwise, or (b) ownership of more than\n    fifty percent (50%) of the outstanding shares or beneficial\n    ownership of such entity.\n\n2. License Grants and Conditions\n\n--------------------------------\n\n2.1. Grants\n\nEach Contributor hereby grants You a world-wide, royalty-free,\nnon-exclusive license:\n\n(a) under intellectual property rights (other than patent or trademark)\n    Licensable by such Contributor to use, reproduce, make available,\n    modify, display, perform, distribute, and otherwise exploit its\n    Contributions, either on an unmodified basis, with Modifications, or\n    as part of a Larger Work; and\n\n(b) under Patent Claims of such Contributor to make, use, sell, offer\n    for sale, have made, import, and otherwise transfer either its\n    Contributions or its Contributor Version.\n\n2.2. Effective Date\n\nThe licenses granted in Section 2.1 with respect to any Contribution\nbecome effective for each Contribution on the date the Contributor first\ndistributes such Contribution.\n\n2.3. Limitations on Grant Scope\n\nThe licenses granted in this Section 2 are the only rights granted under\nthis License. No additional rights or licenses will be implied from the\ndistribution or licensing of Covered Software under this License.\nNotwithstanding Section 2.1(b) above, no patent license is granted by a\nContributor:\n\n(a) for any code that a Contributor has removed from Covered Software;\n    or\n\n(b) for infringements caused by: (i) Your and any other third party's\n    modifications of Covered Software, or (ii) the combination of its\n    Contributions with other software (except as part of its Contributor\n    Version); or\n\n(c) under Patent Claims infringed by Covered Software in the absence of\n    its Contributions.\n\nThis License does not grant any rights in the trademarks, service marks,\nor logos of any Contributor (except as may be necessary to comply with\nthe notice requirements in Section 3.4).\n\n2.4. Subsequent Licenses\n\nNo Contributor makes additional grants as a result of Your choice to\ndistribute the Covered Software under a subsequent version of this\nLicense (see Section 10.2) or under the terms of a Secondary License (if\npermitted under the terms of Section 3.3).\n\n2.5. Representation\n\nEach Contributor represents that the Contributor believes its\nContributions are its original creation(s) or it has sufficient rights\nto grant the rights to its Contributions conveyed by this License.\n\n2.6. Fair Use\n\nThis License is not intended to limit any rights You have under\napplicable copyright doctrines of fair use, fair dealing, or other\nequivalents.\n\n2.7. Conditions\n\nSections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted\nin Section 2.1.\n\n3. Responsibilities\n\n-------------------\n\n3.1. Distribution of Source Form\n\nAll distribution of Covered Software in Source Code Form, including any\nModifications that You create or to which You contribute, must be under\nthe terms of this License. You must inform recipients that the Source\nCode Form of the Covered Software is governed by the terms of this\nLicense, and how they can obtain a copy of this License. You may not\nattempt to alter or restrict the recipients' rights in the Source Code\nForm.\n\n3.2. Distribution of Executable Form\n\nIf You distribute Covered Software in Executable Form then:\n\n(a) such Covered Software must also be made available in Source Code\n    Form, as described in Section 3.1, and You must inform recipients of\n    the Executable Form how they can obtain a copy of such Source Code\n    Form by reasonable means in a timely manner, at a charge no more\n    than the cost of distribution to the recipient; and\n\n(b) You may distribute such Executable Form under the terms of this\n    License, or sublicense it under different terms, provided that the\n    license for the Executable Form does not attempt to limit or alter\n    the recipients' rights in the Source Code Form under this License.\n\n3.3. Distribution of a Larger Work\n\nYou may create and distribute a Larger Work under terms of Your choice,\nprovided that You also comply with the requirements of this License for\nthe Covered Software. If the Larger Work is a combination of Covered\nSoftware with a work governed by one or more Secondary Licenses, and the\nCovered Software is not Incompatible With Secondary Licenses, this\nLicense permits You to additionally distribute such Covered Software\nunder the terms of such Secondary License(s), so that the recipient of\nthe Larger Work may, at their option, further distribute the Covered\nSoftware under the terms of either this License or such Secondary\nLicense(s).\n\n3.4. Notices\n\nYou may not remove or alter the substance of any license notices\n(including copyright notices, patent notices, disclaimers of warranty,\nor limitations of liability) contained within the Source Code Form of\nthe Covered Software, except that You may alter any license notices to\nthe extent required to remedy known factual inaccuracies.\n\n3.5. Application of Additional Terms\n\nYou may choose to offer, and to charge a fee for, warranty, support,\nindemnity or liability obligations to one or more recipients of Covered\nSoftware. However, You may do so only on Your own behalf, and not on\nbehalf of any Contributor. You must make it absolutely clear that any\nsuch warranty, support, indemnity, or liability obligation is offered by\nYou alone, and You hereby agree to indemnify every Contributor for any\nliability incurred by such Contributor as a result of warranty, support,\nindemnity or liability terms You offer. You may include additional\ndisclaimers of warranty and limitations of liability specific to any\njurisdiction.\n\n4. Inability to Comply Due to Statute or Regulation\n\n---------------------------------------------------\n\nIf it is impossible for You to comply with any of the terms of this\nLicense with respect to some or all of the Covered Software due to\nstatute, judicial order, or regulation then You must: (a) comply with\nthe terms of this License to the maximum extent possible; and (b)\ndescribe the limitations and the code they affect. Such description must\nbe placed in a text file included with all distributions of the Covered\nSoftware under this License. Except to the extent prohibited by statute\nor regulation, such description must be sufficiently detailed for a\nrecipient of ordinary skill to be able to understand it.\n\n5. Termination\n\n--------------\n\n5.1. The rights granted under this License will terminate automatically\nif You fail to comply with any of its terms. However, if You become\ncompliant, then the rights granted under this License from a particular\nContributor are reinstated (a) provisionally, unless and until such\nContributor explicitly and finally terminates Your grants, and (b) on an\nongoing basis, if such Contributor fails to notify You of the\nnon-compliance by some reasonable means prior to 60 days after You have\ncome back into compliance. Moreover, Your grants from a particular\nContributor are reinstated on an ongoing basis if such Contributor\nnotifies You of the non-compliance by some reasonable means, this is the\nfirst time You have received notice of non-compliance with this License\nfrom such Contributor, and You become compliant prior to 30 days after\nYour receipt of the notice.\n\n5.2. If You initiate litigation against any entity by asserting a patent\ninfringement claim (excluding declaratory judgment actions,\ncounter-claims, and cross-claims) alleging that a Contributor Version\ndirectly or indirectly infringes any patent, then the rights granted to\nYou by any and all Contributors for the Covered Software under Section\n2.1 of this License shall terminate.\n\n5.3. In the event of termination under Sections 5.1 or 5.2 above, all\nend user license agreements (excluding distributors and resellers) which\nhave been validly granted by You or Your distributors under this License\nprior to termination shall survive termination.\n\n************************************************************************\n\n*                                                                      *\n* 6. Disclaimer of Warranty                                           *\n* -------------------------                                           *\n*                                                                      *\n* Covered Software is provided under this License on an \"as is\"       *\n* basis, without warranty of any kind, either expressed, implied, or  *\n* statutory, including, without limitation, warranties that the       *\n* Covered Software is free of defects, merchantable, fit for a        *\n* particular purpose or non-infringing. The entire risk as to the     *\n* quality and performance of the Covered Software is with You.        *\n* Should any Covered Software prove defective in any respect, You     *\n* (not any Contributor) assume the cost of any necessary servicing,   *\n* repair, or correction. This disclaimer of warranty constitutes an   *\n* essential part of this License. No use of any Covered Software is   *\n* authorized under this License except under this disclaimer.         *\n*                                                                      *\n\n************************************************************************\n\n************************************************************************\n\n*                                                                      *\n* 7. Limitation of Liability                                          *\n* --------------------------                                          *\n*                                                                      *\n* Under no circumstances and under no legal theory, whether tort      *\n* (including negligence), contract, or otherwise, shall any           *\n* Contributor, or anyone who distributes Covered Software as          *\n* permitted above, be liable to You for any direct, indirect,         *\n* special, incidental, or consequential damages of any character      *\n* including, without limitation, damages for lost profits, loss of    *\n* goodwill, work stoppage, computer failure or malfunction, or any    *\n* and all other commercial damages or losses, even if such party      *\n* shall have been informed of the possibility of such damages. This   *\n* limitation of liability shall not apply to liability for death or   *\n* personal injury resulting from such party's negligence to the       *\n* extent applicable law prohibits such limitation. Some               *\n* jurisdictions do not allow the exclusion or limitation of           *\n* incidental or consequential damages, so this exclusion and          *\n* limitation may not apply to You.                                    *\n*                                                                      *\n\n************************************************************************\n\n8. Litigation\n\n-------------\n\nAny litigation relating to this License may be brought only in the\ncourts of a jurisdiction where the defendant maintains its principal\nplace of business and such litigation shall be governed by laws of that\njurisdiction, without reference to its conflict-of-law provisions.\nNothing in this Section shall prevent a party's ability to bring\ncross-claims or counter-claims.\n\n9. Miscellaneous\n\n----------------\n\nThis License represents the complete agreement concerning the subject\nmatter hereof. If any provision of this License is held to be\nunenforceable, such provision shall be reformed only to the extent\nnecessary to make it enforceable. Any law or regulation which provides\nthat the language of a contract shall be construed against the drafter\nshall not be used to construe this License against a Contributor.\n\n10. Versions of the License\n\n---------------------------\n\n10.1. New Versions\n\nMozilla Foundation is the license steward. Except as provided in Section\n10.3, no one other than the license steward has the right to modify or\npublish new versions of this License. Each version will be given a\ndistinguishing version number.\n\n10.2. Effect of New Versions\n\nYou may distribute the Covered Software under the terms of the version\nof the License under which You originally received the Covered Software,\nor under the terms of any subsequent version published by the license\nsteward.\n\n10.3. Modified Versions\n\nIf you create software not governed by this License, and you want to\ncreate a new license for such software, you may create and use a\nmodified version of this License if you rename the license and remove\nany references to the name of the license steward (except to note that\nsuch modified license differs from this License).\n\n10.4. Distributing Source Code Form that is Incompatible With Secondary\nLicenses\n\nIf You choose to distribute Source Code Form that is Incompatible With\nSecondary Licenses under the terms of this version of the License, the\nnotice described in Exhibit B of this License must be attached.\n\nExhibit A - Source Code Form License Notice\n-------------------------------------------\n\n  This Source Code Form is subject to the terms of the Mozilla Public\n  License, v. 2.0. If a copy of the MPL was not distributed with this\n  file, You can obtain one at <https://mozilla.org/MPL/2.0/>.\n\nIf it is not possible or desirable to put the notice in a particular\nfile, then You may include the notice in a location (such as a LICENSE\nfile in a relevant directory) where a recipient would be likely to look\nfor such a notice.\n\nYou may add additional accurate notices of copyright ownership.\n\nExhibit B - \"Incompatible With Secondary Licenses\" Notice\n---------------------------------------------------------\n\n  This Source Code Form is \"Incompatible With Secondary Licenses\", as\n  defined by the Mozilla Public License, v. 2.0.\n"
  },
  {
    "path": "PRIVACY.md",
    "content": "# IRIS Privacy Policy\n\n**Last Updated:** June 7, 2025\n\nThank you for using IRIS (\"the Application\"). We are committed to protecting your privacy. This Privacy Policy explains how we handle information in connection with your use of the Application.\n\nPlease read this Privacy Policy carefully before using the Application. By using the Application, you agree to the terms of this policy.\n\n### Information We Collect\n\nTo provide and improve our services, the Application collects the following types of information:\n\n1. **Information You Provide**\n\n   * **Network Storage Credentials**: When you configure access to your network storage (like WebDAV), you will be asked to provide connection details such as server address, username, and password.\n   * **Online Video Links**: When you use the \"Open Link\" feature, you provide the URL for the video.\n2. **Information We Collect Automatically**\n\n   * **Playback History and Preferences**: To enhance your experience, the Application locally stores your playback history (including playback progress) and personal preferences (such as playback speed, volume, and theme mode) on your device.\n\n### How We Use Your Information\n\nWe strictly adhere to the principles of lawfulness, legitimacy, and necessity in collecting and using your information. This information is used solely to implement product features, specifically to:\n\n* Access and play media files from your local device or your configured network storage (like WebDAV).\n* Stream and play videos from online URLs you provide.\n* Remember your playback progress to allow you to resume watching.\n* Save your settings and preferences for a personalized experience.\n* Check for application updates to provide you with the latest features and bug fixes.\n\n### Information Storage and Security\n\nWe place great importance on the security of your information.\n\n* **Storage Location**: All your personal data, including WebDAV credentials, playback history, and application settings, is **stored only locally on your device**. We do not upload this information to any external servers.\n* **Security Measures**: We use industry-standard security technologies to protect sensitive information stored on your device from unauthorized access, use, or disclosure.\n\n### Information Sharing and Disclosure\n\nWe do not sell, trade, or otherwise transfer your personally identifiable information to outside parties. All data is stored locally on your device.\n\n### Children's Privacy\n\nThe Application is not intended for use by children under the age of 13. We do not knowingly collect personally identifiable information from children under 13.\n\n### Changes to This Privacy Policy\n\nWe may update our Privacy Policy from time to time. Any changes will be posted on this page, and we encourage you to review this policy periodically for any updates. Your continued use of the Application after we post any modifications will constitute your acknowledgment of the changes and your consent to abide and be bound by the modified Privacy Policy.\n\n### Contact Us\n\nIf you have any questions or suggestions about this Privacy Policy, please feel free to contact us by creating an issue on our GitHub page:\n\n* [https://github.com/nini22P/iris/issues](https://github.com/nini22P/iris/issues)\n"
  },
  {
    "path": "README.md",
    "content": "<img height=\"100px\" width=\"100px\" alt=\"logo\" src=\"./assets/images/logo.png\"/>\n\n# IRIS - A lightweight video player\n\n[![Build Status](https://github.com/nini22P/iris/actions/workflows/ci.yml/badge.svg)](https://github.com/nini22P/iris/actions/workflows/ci.yml)\n<a href=\"https://apps.microsoft.com/detail/9NML7WNHNRTJ?referrer=appbadge&mode=direct\"><img src=\"https://get.microsoft.com/images/en-us%20dark.svg\" height=\"30\"/></a>\n<a href=\"https://afdian.com/a/nini22P\"><img alt=\"Afdian\" style=\"height: 30px;\" src=\"https://pic1.afdiancdn.com/static/img/welcome/button-sponsorme.png\"></a>\n[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/nini22p)\n\nEnglish | [中文](./README_CN.md)\n\n## Features\n\n- [X] Base on [Media Kit](https://github.com/media-kit/media-kit) | [FVP](https://github.com/wang-bin/fvp), supports multiple video formats\n- [X] Local storage, WebDAV and FTP support\n- [X] Switchable subtitle and audio track\n- [X] Playback queue support for random and repeat\n- [X] Comprehensive gesture support\n\n## Download\n\n| Platform | Arch/Channel      | Download Link                                                                                                      | Notes                  |\n| :------- | :---------------- | :----------------------------------------------------------------------------------------------------------------- | :--------------------- |\n| Windows  | **Microsoft Store** | [Microsoft Store](https://apps.microsoft.com/detail/9NML7WNHNRTJ)                                                  | **Recommended**, auto-updates |\n|          | Installer         | [IRIS-windows-installer.exe](https://github.com/nini22P/iris/releases/latest/download/IRIS-windows-installer.exe)     |                        |\n|          | Portable          | [IRIS-windows.zip](https://github.com/nini22P/iris/releases/latest/download/IRIS-windows.zip)                       | Unzip and run          |\n| Android  | arm64-v8a         | [IRIS-android-arm64-v8a.apk](https://github.com/nini22P/iris/releases/latest/download/IRIS-android-arm64-v8a.apk)     | For 64-bit devices     |\n|          | armeabi-v7a       | [IRIS-android-armeabi-v7a.apk](https://github.com/nini22P/iris/releases/latest/download/IRIS-android-armeabi-v7a.apk) | For 32-bit devices     |\n|          | x86_64            | [IRIS-android-x86_64.apk](https://github.com/nini22P/iris/releases/latest/download/IRIS-android-x86_64.apk)           | For emulators/x86 devices |\n\n## Keyboard and Gesture Controls\n\n### Keyboard Controls\n\n| Key                    | Description                                        |\n| ---------------------- | -------------------------------------------------- |\n| `Space`              | Play / Pause / Select file                         |\n| `Arrow Left`         | Fast backward                    |\n| `Arrow Right`        | Fast forward                    |\n| `Arrow Up`           | Volume up                                          |\n| `Arrow Down`         | Volume down                                        |\n| `Ctrl + Arrow Left`  | Previous                                           |\n| `Ctrl + Arrow Right` | Next                                               |\n| `Ctrl + X`           | Shuffle                                            |\n| `Ctrl + R`           | Repeat                                             |\n| `Ctrl + V`           | Video zoom                                         |\n| `Ctrl + M`           | Volume mute                                        |\n| `S`                  | Subtitles and audio tracks                         |\n| `P`                  | Play queue                                         |\n| `F`                  | Storages                                           |\n| `Ctrl + O`           | Open file                                          |\n| `Ctrl + L`           | Open link                                          |\n| `Ctrl + C`           | Close currently media file                         |\n| `Ctrl + H`           | Play history                                       |\n| `Ctrl + P`           | Settings                                           |\n| `+`                  | Step forward                                       |\n| `-`                  | Step backward                                      |\n| `Enter`              | Enter full screen / Exit full screen / Select file |\n| `F11`                | Enter full screen / Exit full screen               |\n| `Esc`                | Exit current Menu / Go back / Exit full screen     |\n| `F10`                | Toggle always on top                               |\n| `Alt + X`            | Exit application                                   |\n\n### Gesture Controls\n\n| Gesture                           | Description                   |\n| --------------------------------- | ----------------------------- |\n| Tap                               | Select an item or open a menu |\n| Double tap center                 | Play / Pause                  |\n| Double tap left side              | Fast backward                |\n| Double tap right side             | Fast forward                  |\n| Swipe left / right                | Adjust playback progress      |\n| Swipe up / down on left side      | Adjust screen brightness      |\n| Swipe up / down on right side     | Adjust device volume          |\n| Long press                        | Display Playback Speed Selector |\n| Long press and swipe left / right | Adjust speed playback speed   |\n\n## Contribution\n\nContributions of any kind are welcome! If you have suggestions, bug reports, or want to add new features, please submit an [issue](https://github.com/nini22P/iris/issues) or directly submit a Pull Request.\n\n## Sponsorship\n\nIf you like this project and want to support me, you can sponsor me through the following platforms:\n\n- [Afdian](https://afdian.com/a/nini22P)\n- [Ko-fi](https://ko-fi.com/nini22p)\n\nThank you for your support!\n\n## License\n\nThis project is licensed under the MPL-2.0 license. For more details, please see the [LICENSE](./LICENSE) file.\n"
  },
  {
    "path": "README_CN.md",
    "content": "<img height=\"100px\" width=\"100px\" alt=\"logo\" src=\"./assets/images/logo.png\"/>\n\n# IRIS - 轻量级视频播放器\n\n[![Build Status](https://github.com/nini22P/iris/actions/workflows/ci.yml/badge.svg)](https://github.com/nini22P/iris/actions/workflows/ci.yml)\n<a href=\"https://apps.microsoft.com/detail/9NML7WNHNRTJ?referrer=appbadge&mode=direct\"><img src=\"https://get.microsoft.com/images/zh-cn%20dark.svg\" height=\"30\"/></a>\n<a href=\"https://afdian.com/a/nini22P\"><img alt=\"爱发电\" style=\"height: 30px;\" src=\"https://pic1.afdiancdn.com/static/img/welcome/button-sponsorme.png\"></a>\n[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/nini22p)\n\n[English](./README.md) | 中文\n\n## 特性\n\n- [X] 基于 [Media Kit](https://github.com/media-kit/media-kit) | [FVP](https://github.com/wang-bin/fvp)，可播放多种视频格式\n- [X] 支持本地存储、WebDAV 和 FTP\n- [X] 可切换字幕和音轨\n- [X] 播放队列支持随机和重复\n- [X] 完善的手势支持\n\n## 下载\n\n| 平台    | 架构/渠道     | 下载链接                                                                                                           | 备注             |\n| :------ | :------------ | :----------------------------------------------------------------------------------------------------------------- | :--------------- |\n| Windows | **微软商店**  | [Microsoft Store](https://apps.microsoft.com/detail/9NML7WNHNRTJ)                                                  | **推荐**，自动更新 |\n|         | 安装包        | [IRIS-windows-installer.exe](https://github.com/nini22P/iris/releases/latest/download/IRIS-windows-installer.exe)     |                  |\n|         | 便携版        | [IRIS-windows.zip](https://github.com/nini22P/iris/releases/latest/download/IRIS-windows.zip)                       | 解压即用         |\n| Android | arm64-v8a     | [IRIS-android-arm64-v8a.apk](https://github.com/nini22P/iris/releases/latest/download/IRIS-android-arm64-v8a.apk)     | 64位设备         |\n|         | armeabi-v7a   | [IRIS-android-armeabi-v7a.apk](https://github.com/nini22P/iris/releases/latest/download/IRIS-android-armeabi-v7a.apk) | 32位设备         |\n|         | x86_64        | [IRIS-android-x86_64.apk](https://github.com/nini22P/iris/releases/latest/download/IRIS-android-x86_64.apk)           | 模拟器/x86设备   |\n\n## 键位和手势\n\n### 键位操作\n\n| 键位                   | 描述                                 |\n| ---------------------- | ------------------------------------ |\n| `Space`              | 播放 / 暂停 / 选择文件               |\n| `Arrow Left`         | 快退                                 |\n| `Arrow Right`        | 快进                                 |\n| `Arrow Up`           | 提升音量                             |\n| `Arrow Down`         | 降低音量                             |\n| `Ctrl + Arrow Left`  | 上一个                               |\n| `Ctrl + Arrow Right` | 下一个                               |\n| `Ctrl + X`           | 随机                                 |\n| `Ctrl + R`           | 重复                                 |\n| `Ctrl + V`           | 视频缩放                             |\n| `Ctrl + M`           | 静音                                 |\n| `S`                  | 字幕和音轨                           |\n| `P`                  | 播放队列                             |\n| `F`                  | 存储                                 |\n| `Ctrl + O`           | 打开文件                             |\n| `Ctrl + L`           | 打开链接                             |\n| `Ctrl + C`           | 关闭当前媒体文件                     |\n| `Ctrl + H`           | 播放历史                             |\n| `Ctrl + P`           | 设置                                 |\n| `+`                  | 帧进                                 |\n| `-`                  | 帧退                                 |\n| `Enter`              | 进入全屏 / 退出全屏 / 选择文件       |\n| `F11`                | 进入全屏 / 退出全屏                  |\n| `Esc`                | 退出当前菜单 / 返回上一级 / 关闭全屏 |\n| `F10`                | 切换窗口置顶                         |\n| `Alt + X`            | 退出应用                             |\n\n### 手势操作\n\n| 手势             | 描述               |\n| ---------------- | ------------------ |\n| 单击             | 选择项目或打开菜单 |\n| 双击屏幕中心     | 播放 / 暂停        |\n| 双击屏幕左侧     | 快退                |\n| 双击屏幕右侧     | 快进                |\n| 左右滑动         | 调整播放进度       |\n| 屏幕左侧上下滑动 | 调整屏幕亮度       |\n| 屏幕右侧上下滑动 | 调整设备音量       |\n| 长按             | 显示播放速度选择器 |\n| 长按后左右滑动   | 调整播放速度       |\n\n## 贡献\n\n欢迎任何形式的贡献！如果您有建议、bug 报告或想要添加新功能，请提交 [issue](https://github.com/nini22P/iris/issues) 或者直接提交 Pull Request。\n\n## 赞助\n\n如果您喜欢这个项目并希望支持我，可以通过以下方式赞助我：\n\n- [爱发电](https://afdian.com/a/nini22P)\n- [Ko-fi](https://ko-fi.com/nini22p)\n\n感谢您的支持！\n\n## 许可证\n\n本项目采用 MPL-2.0 许可证，详细信息请查看 [LICENSE](./LICENSE) 文件。\n"
  },
  {
    "path": "analysis_options.yaml",
    "content": "# This file configures the analyzer, which statically analyzes Dart code to\n# check for errors, warnings, and lints.\n#\n# The issues identified by the analyzer are surfaced in the UI of Dart-enabled\n# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be\n# invoked from the command line by running `flutter analyze`.\n\n# The following line activates a set of recommended lints for Flutter apps,\n# packages, and plugins designed to encourage good coding practices.\ninclude: package:flutter_lints/flutter.yaml\n\nlinter:\n  # The lint rules applied to this project can be customized in the\n  # section below to disable rules from the `package:flutter_lints/flutter.yaml`\n  # included above or to enable additional rules. A list of all available lints\n  # and their documentation is published at https://dart.dev/lints.\n  #\n  # Instead of disabling a lint rule for the entire project in the\n  # section below, it can also be suppressed for a single line of code\n  # or a specific dart file by using the `// ignore: name_of_lint` and\n  # `// ignore_for_file: name_of_lint` syntax on the line or in the file\n  # producing the lint.\n  rules:\n    # avoid_print: false  # Uncomment to disable the `avoid_print` rule\n    # prefer_single_quotes: true  # Uncomment to enable the `prefer_single_quotes` rule\n\n# Additional information about this file can be found at\n# https://dart.dev/guides/language/analysis-options\nanalyzer:\n  plugins:\n    # - custom_lint\n  errors:\n    invalid_annotation_target: ignore"
  },
  {
    "path": "android/.gitignore",
    "content": "gradle-wrapper.jar\n/.gradle\n/captures/\n/gradlew\n/gradlew.bat\n/local.properties\nGeneratedPluginRegistrant.java\n\n.cxx\n\n# Remember to never publicly share your keystore.\n# See https://flutter.dev/to/reference-keystore\nkey.properties\n**/*.keystore\n**/*.jks\n\n/app/src/main/assets/flutter_assets\n\n.kotlin\nbuild"
  },
  {
    "path": "android/app/build.gradle",
    "content": "import java.nio.file.Files\nimport java.security.MessageDigest\n\nplugins {\n    id \"com.android.application\"\n    id \"kotlin-android\"\n    // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.\n    id \"dev.flutter.flutter-gradle-plugin\"\n}\n\ndef keystoreProperties = new Properties()\ndef keystorePropertiesFile = rootProject.file('key.properties')\nif (keystorePropertiesFile.exists()) {\n    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))\n}\n\nandroid {\n    namespace = \"nini22p.iris\"\n    compileSdk = flutter.compileSdkVersion\n    ndkVersion = \"27.0.12077973\"\n\n    compileOptions {\n        sourceCompatibility = JavaVersion.VERSION_17\n        targetCompatibility = JavaVersion.VERSION_17\n    }\n\n    kotlinOptions {\n        jvmTarget = JavaVersion.VERSION_17\n    }\n\n    defaultConfig {\n        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).\n        applicationId = \"nini22p.iris\"\n        // You can update the following values to match your application needs.\n        // For more information, see: https://flutter.dev/to/review-gradle-config.\n        minSdk = flutter.minSdkVersion\n        targetSdk = flutter.targetSdkVersion\n        versionCode = flutter.versionCode\n        versionName = flutter.versionName\n    }\n\n    signingConfigs {\n        release {\n            keyAlias = keystoreProperties['keyAlias']\n            keyPassword = keystoreProperties['keyPassword']\n            storeFile = keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null\n            storePassword = keystoreProperties['storePassword']\n        }\n    }\n\n    buildTypes {\n        release {\n            // TODO: Add your own signing config for the release build.\n            // Signing with the debug keys for now, so `flutter run --release` works.\n            signingConfig = signingConfigs.release\n        }\n    }\n}\n\nflutter {\n    source = \"../..\"\n}\n\n\ntask downloadFiles(type: Exec) {\n    def filesToDownload = [\n        [\n            \"url\": \"https://github.com/notofonts/noto-cjk/raw/refs/heads/main/Sans/OTF/SimplifiedChinese/NotoSansCJKsc-Medium.otf\",\n            \"md5\": \"58c83279d990b2cf88d40a0a34832e31\",\n            \"destination\": file(\"./src/main/assets/flutter_assets/assets/fonts/NotoSansCJKsc-Medium.otf\")\n        ]\n    ]\n\n    filesToDownload.each { fileInfo ->\n        def destFile = fileInfo.destination\n\n        if (destFile.exists()) {\n           def calculatedMD5 = MessageDigest.getInstance(\"MD5\").digest(Files.readAllBytes(destFile.toPath())).encodeHex().toString()\n\n            if (calculatedMD5 != fileInfo.md5) {\n                destFile.delete()\n                println \"MD5 mismatch. File deleted: ${destFile}\"\n            }\n        }\n\n        if (!destFile.exists()) {\n             destFile.parentFile.mkdirs()\n            println \"Downloading file from: ${fileInfo.url}\"\n            destFile.withOutputStream { os ->\n                os << new URL(fileInfo.url).openStream()\n            }\n\n             def calculatedMD5 = MessageDigest.getInstance(\"MD5\").digest(Files.readAllBytes(destFile.toPath())).encodeHex().toString()\n            if (calculatedMD5 != fileInfo.md5) {\n                throw new GradleException(\"MD5 verification failed for ${destFile}\")\n            }\n        }\n    }\n}\n\nassemble.dependsOn(downloadFiles)"
  },
  {
    "path": "android/app/proguard-rules.pro",
    "content": "-dontwarn com.google.errorprone.annotations.CanIgnoreReturnValue\n-dontwarn com.google.errorprone.annotations.CheckReturnValue\n-dontwarn com.google.errorprone.annotations.Immutable\n-dontwarn com.google.errorprone.annotations.RestrictedApi\n-dontwarn javax.annotation.Nullable\n-dontwarn javax.annotation.concurrent.GuardedBy"
  },
  {
    "path": "android/app/src/debug/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <!-- The INTERNET permission is required for development. Specifically,\n         the Flutter tool needs it to communicate with the running application\n         to allow setting breakpoints, to provide hot reload, etc.\n    -->\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n</manifest>\n"
  },
  {
    "path": "android/app/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n    <uses-permission android:name=\"android.permission.WAKE_LOCK\" />\n    <uses-permission android:name=\"android.permission.WRITE_SETTINGS\" />\n    <uses-permission android:name=\"android.permission.READ_MEDIA_AUDIO\" />\n    <uses-permission android:name=\"android.permission.READ_MEDIA_VIDEO\" />\n    <uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>\n    <uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>\n    <uses-permission android:name=\"android.permission.MANAGE_EXTERNAL_STORAGE\"/>\n    <application\n        android:label=\"IRIS\"\n        android:name=\"${applicationName}\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:allowBackup=\"false\"\n        android:fullBackupContent=\"false\"\n        android:enableOnBackInvokedCallback=\"true\"\n    >\n        <activity android:name=\".MainActivity\" android:exported=\"true\" android:launchMode=\"singleInstance\" android:taskAffinity=\"\" android:theme=\"@style/LaunchTheme\" android:configChanges=\"orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode\" android:hardwareAccelerated=\"true\" android:windowSoftInputMode=\"adjustResize\">\n            <!-- Specifies an Android theme to apply to this Activity as soon as\n                 the Android process has started. This theme is visible to the user\n                 while the Flutter UI initializes. After that, this theme continues\n                 to determine the Window background behind the Flutter UI. -->\n            <meta-data android:name=\"io.flutter.embedding.android.NormalTheme\" android:resource=\"@style/NormalTheme\"/>\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\"/>\n                <category android:name=\"android.intent.category.LAUNCHER\"/>\n            </intent-filter>\n            <intent-filter>\n                <action android:name=\"android.intent.action.VIEW\" />\n                <category android:name=\"android.intent.category.DEFAULT\" />\n                <category android:name=\"android.intent.category.BROWSABLE\" />\n                <data android:mimeType=\"video/*\" />\n            </intent-filter>\n        </activity>\n        <!-- Don't delete the meta-data below.\n             This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->\n        <meta-data android:name=\"flutterEmbedding\" android:value=\"2\"/>\n    </application>\n    <!-- Required to query activities that can process text, see:\n         https://developer.android.com/training/package-visibility and\n         https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.\n\n         In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->\n    <queries>\n        <intent>\n            <action android:name=\"android.intent.action.PROCESS_TEXT\"/>\n            <data android:mimeType=\"text/plain\"/>\n        </intent>\n    </queries>\n</manifest>\n"
  },
  {
    "path": "android/app/src/main/kotlin/nini22p/iris/MainActivity.kt",
    "content": "package nini22p.iris\n\nimport io.flutter.embedding.android.FlutterActivity\n\nclass MainActivity: FlutterActivity()\n"
  },
  {
    "path": "android/app/src/main/res/drawable/launch_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Modify this file to customize your launch splash screen -->\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@android:color/white\" />\n\n    <!-- You can insert your own image assets here -->\n    <!-- <item>\n        <bitmap\n            android:gravity=\"center\"\n            android:src=\"@mipmap/launch_image\" />\n    </item> -->\n</layer-list>\n"
  },
  {
    "path": "android/app/src/main/res/drawable-v21/launch_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Modify this file to customize your launch splash screen -->\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"?android:colorBackground\" />\n\n    <!-- You can insert your own image assets here -->\n    <!-- <item>\n        <bitmap\n            android:gravity=\"center\"\n            android:src=\"@mipmap/launch_image\" />\n    </item> -->\n</layer-list>\n"
  },
  {
    "path": "android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@color/ic_launcher_background\"/>\n    <foreground android:drawable=\"@mipmap/ic_launcher_foreground\"/>\n</adaptive-icon>"
  },
  {
    "path": "android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@color/ic_launcher_background\"/>\n    <foreground android:drawable=\"@mipmap/ic_launcher_foreground\"/>\n</adaptive-icon>"
  },
  {
    "path": "android/app/src/main/res/values/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"ic_launcher_background\">#2F2F2F</color>\n</resources>"
  },
  {
    "path": "android/app/src/main/res/values/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->\n    <style name=\"LaunchTheme\" parent=\"@android:style/Theme.Light.NoTitleBar\">\n        <!-- Show a splash screen on the activity. Automatically removed when\n             the Flutter engine draws its first frame -->\n        <item name=\"android:windowBackground\">@drawable/launch_background</item>\n    </style>\n    <!-- Theme applied to the Android Window as soon as the process has started.\n         This theme determines the color of the Android Window while your\n         Flutter UI initializes, as well as behind your Flutter UI while its\n         running.\n\n         This Theme is only used starting with V2 of Flutter's Android embedding. -->\n    <style name=\"NormalTheme\" parent=\"@android:style/Theme.Light.NoTitleBar\">\n        <item name=\"android:windowLayoutInDisplayCutoutMode\">shortEdges</item>\n        <item name=\"android:windowBackground\">?android:colorBackground</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "android/app/src/main/res/values-night/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->\n    <style name=\"LaunchTheme\" parent=\"@android:style/Theme.Black.NoTitleBar\">\n        <!-- Show a splash screen on the activity. Automatically removed when\n             the Flutter engine draws its first frame -->\n        <item name=\"android:windowBackground\">@drawable/launch_background</item>\n    </style>\n    <!-- Theme applied to the Android Window as soon as the process has started.\n         This theme determines the color of the Android Window while your\n         Flutter UI initializes, as well as behind your Flutter UI while its\n         running.\n\n         This Theme is only used starting with V2 of Flutter's Android embedding. -->\n    <style name=\"NormalTheme\" parent=\"@android:style/Theme.Black.NoTitleBar\">\n        <item name=\"android:windowBackground\">?android:colorBackground</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "android/app/src/profile/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <!-- The INTERNET permission is required for development. Specifically,\n         the Flutter tool needs it to communicate with the running application\n         to allow setting breakpoints, to provide hot reload, etc.\n    -->\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n</manifest>\n"
  },
  {
    "path": "android/build.gradle",
    "content": "allprojects {\n    repositories {\n        google()\n        mavenCentral()\n    }\n}\n\nrootProject.buildDir = \"../build\"\nsubprojects {\n    project.buildDir = \"${rootProject.buildDir}/${project.name}\"\n}\nsubprojects {\n    project.evaluationDependsOn(\":app\")\n}\n\ntasks.register(\"clean\", Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "android/gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-8.13-all.zip\n"
  },
  {
    "path": "android/gradle.properties",
    "content": "org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError\nandroid.useAndroidX=true\nandroid.enableJetifier=true\n"
  },
  {
    "path": "android/settings.gradle",
    "content": "pluginManagement {\n    def flutterSdkPath = {\n        def properties = new Properties()\n        file(\"local.properties\").withInputStream { properties.load(it) }\n        def flutterSdkPath = properties.getProperty(\"flutter.sdk\")\n        assert flutterSdkPath != null, \"flutter.sdk not set in local.properties\"\n        return flutterSdkPath\n    }()\n\n    includeBuild(\"$flutterSdkPath/packages/flutter_tools/gradle\")\n\n    repositories {\n        google()\n        mavenCentral()\n        gradlePluginPortal()\n    }\n}\n\nplugins {\n    id \"dev.flutter.flutter-plugin-loader\" version \"1.0.0\"\n    id \"com.android.application\" version \"8.12.0\" apply false\n    id \"org.jetbrains.kotlin.android\" version \"2.2.20\" apply false\n}\n\ninclude \":app\"\n"
  },
  {
    "path": "devtools_options.yaml",
    "content": "description: This file stores settings for Dart & Flutter DevTools.\ndocumentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states\nextensions:\n"
  },
  {
    "path": "extract_log.py",
    "content": "import sys\n\ndef extract_log(version):\n    try:\n        with open(\"CHANGELOG.md\", \"r\", encoding=\"utf-8\") as file:\n            lines = file.readlines()\n    except FileNotFoundError:\n        print(\"Error: not found CHANGELOG.md\")\n        return\n\n    found = False\n    changelog_lines = []\n\n    for line in lines:\n        if line.startswith(f\"## {version}\"):\n            found = True\n            continue\n        elif line.startswith(\"## \") and found:\n            break\n        if found:\n            changelog_lines.append(line)\n\n    while changelog_lines and not changelog_lines[-1].strip():\n        changelog_lines.pop()\n\n    output = \"\".join(changelog_lines).strip()\n\n    output_file = f\"CHANGELOG_{version}.md\"\n    with open(output_file, \"w\", encoding=\"utf-8\") as file:\n        file.write(output)\n\n    print(f\"Changelog for {version} saved to {output_file}\")\n\nif __name__ == \"__main__\":\n    if len(sys.argv) != 2:\n        print(\"Usage: python extract_log.py <version>\")\n        sys.exit(1)\n\n    version = sys.argv[1]\n    extract_log(version)"
  },
  {
    "path": "inno.iss",
    "content": "; Script generated by the Inno Setup Script Wizard.\n; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!\n\n#define MyAppName \"IRIS\"\n#define MyAppVersion \"1.5.2\"\n#define MyAppPublisher \"nini22P\"\n#define MyAppURL \"https://github.com/nini22P/iris\"\n#define MyAppExeName \"iris.exe\"\n#define MyAppAssocName MyAppPublisher + \".\" + MyAppName + \".AssocFile\"\n#define MyAppDesc \"IRIS player\"\n#define MySetupMutex \"iris_player\"\n#define MyProcessName \"iris\"\n\n[Setup]\n; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications.\n; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)\nAppId={{E6C83B69-C1A7-4C23-9D74-799BC7A053DB}\nAppName={#MyAppName}\nAppVersion={#MyAppVersion}\n;AppVerName={#MyAppName} {#MyAppVersion}\nAppPublisher={#MyAppPublisher}\nAppPublisherURL={#MyAppURL}\nAppSupportURL={#MyAppURL}\nAppUpdatesURL={#MyAppURL}\nDefaultDirName={autopf}\\{#MyAppName}\nUninstallDisplayIcon={app}\\{#MyAppExeName}\n; \"ArchitecturesAllowed=x64compatible\" specifies that Setup cannot run\n; on anything but x64 and Windows 11 on Arm.\nArchitecturesAllowed=x64compatible\n; \"ArchitecturesInstallIn64BitMode=x64compatible\" requests that the\n; install be done in \"64-bit mode\" on x64 or Windows 11 on Arm,\n; meaning it should use the native 64-bit Program Files directory and\n; the 64-bit view of the registry.\nArchitecturesInstallIn64BitMode=x64compatible\nDisableProgramGroupPage=yes\n; Uncomment the following line to run in non administrative install mode (install for current user only).\n;PrivilegesRequired=lowest\nOutputDir=build\\windows\\x64\\runner\\Release\nOutputBaseFilename=IRIS-windows-installer\nSolidCompression=yes\nWizardStyle=modern\nCloseApplications=force\nSetupMutex={#MySetupMutex}\n\n[Languages]\nName: \"english\"; MessagesFile: \"windows\\inno-languages\\English.isl\"; LicenseFile: \"LICENSE\"\nName: \"chinesesimplified\"; MessagesFile: \"windows\\inno-languages\\ChineseSimplified.isl\"; LicenseFile: \"LICENSE\"\n\n[Tasks]\nName: \"desktopicon\"; Description: \"{cm:CreateDesktopIcon}\"; GroupDescription: \"{cm:AdditionalIcons}\"; Flags: unchecked\n\n[Files]\nSource: \"build\\windows\\x64\\runner\\Release\\{#MyAppExeName}\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"build\\windows\\x64\\runner\\Release\\*.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"build\\windows\\x64\\runner\\Release\\data\\*\"; DestDir: \"{app}\\data\"; Flags: ignoreversion recursesubdirs createallsubdirs\n; NOTE: Don't use \"Flags: ignoreversion\" on any shared system files\n\n[Registry]\nRoot: HKA; Subkey: \"Software\\Classes\\Applications\\{#MyAppExeName}\"; Flags: uninsdeletekey\nRoot: HKA; Subkey: \"Software\\Classes\\Applications\\{#MyAppExeName}\"; ValueType: string; ValueName: \"FriendlyAppName\"; ValueData: \"IRIS\"\n\n; --- 定义核心的 Programmatic Identifier (ProgID) ---\nRoot: HKA; Subkey: \"Software\\Classes\\{#MyAppAssocName}\"; ValueType: string; ValueName: \"\"; ValueData: \"IRIS Media File\"; Flags: uninsdeletekey\nRoot: HKA; Subkey: \"Software\\Classes\\{#MyAppAssocName}\\DefaultIcon\"; ValueType: string; ValueName: \"\"; ValueData: \"{app}\\{#MyAppExeName},0\"\nRoot: HKA; Subkey: \"Software\\Classes\\{#MyAppAssocName}\\shell\\open\\command\"; ValueType: string; ValueName: \"\"; ValueData: \"\"\"{app}\\{#MyAppExeName}\"\" \"\"%1\"\"\"\n\n; --- ProgID 添加到各文件类型的 \"Open With\" 列表 ---\n; Audio Files\nRoot: HKA; Subkey: \"Software\\Classes\\.aac\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.aiff\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.alac\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.amr\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.ape\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.caf\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.cda\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.dsd\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.dts\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.flac\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.m4a\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.midi\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.mp3\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.mpc\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.oga\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.ogg\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.opus\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.raw\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.spx\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.tak\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.tta\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.wav\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.wma\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.wv\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\n; Video Files\nRoot: HKA; Subkey: \"Software\\Classes\\.3gp\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.amv\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.asf\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.avi\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.divx\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.dpx\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.drc\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.dv\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.f4v\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.flv\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.h264\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.h265\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.hevc\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.m2ts\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.m4p\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.m4v\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.mkv\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.mng\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.mov\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.mp2\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.mp4\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.mpe\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.mpeg\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.mpg\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.mpv\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.mts\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.mxf\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.nsv\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.ogv\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.qt\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.rm\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.rmvb\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.ts\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.vob\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.webm\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.wmv\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\nRoot: HKA; Subkey: \"Software\\Classes\\.yuv\\OpenWithProgids\"; ValueType: string; ValueName: \"{#MyAppAssocName}\"; ValueData: \"\"; Flags: uninsdeletevalue\n\n; --- 注册应用程序的 Capabilities ---\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\"; Flags: uninsdeletekey\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\"; ValueType: string; ValueName: \"ApplicationName\"; ValueData: \"{#MyAppName}\"; Flags: uninsdeletekey\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\"; ValueType: string; ValueName: \"ApplicationDescription\"; ValueData: \"{#MyAppDesc}\"\n; Audio Files\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\\FileAssociations\"; ValueType: string; ValueName: \".aac\"; ValueData: \"{#MyAppAssocName}\"\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\\FileAssociations\"; ValueType: string; ValueName: \".aiff\"; ValueData: \"{#MyAppAssocName}\"\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\\FileAssociations\"; ValueType: string; ValueName: \".alac\"; ValueData: \"{#MyAppAssocName}\"\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\\FileAssociations\"; ValueType: string; ValueName: \".cda\"; ValueData: \"{#MyAppAssocName}\"\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\\FileAssociations\"; ValueType: string; ValueName: \".dsd\"; ValueData: \"{#MyAppAssocName}\"\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\\FileAssociations\"; ValueType: string; ValueName: \".flac\"; ValueData: \"{#MyAppAssocName}\"\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\\FileAssociations\"; ValueType: string; ValueName: \".m4a\"; ValueData: \"{#MyAppAssocName}\"\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\\FileAssociations\"; ValueType: string; ValueName: \".midi\"; ValueData: \"{#MyAppAssocName}\"\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\\FileAssociations\"; ValueType: string; ValueName: \".mp3\"; ValueData: \"{#MyAppAssocName}\"\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\\FileAssociations\"; ValueType: string; ValueName: \".ogg\"; ValueData: \"{#MyAppAssocName}\"\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\\FileAssociations\"; ValueType: string; ValueName: \".opus\"; ValueData: \"{#MyAppAssocName}\"\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\\FileAssociations\"; ValueType: string; ValueName: \".raw\"; ValueData: \"{#MyAppAssocName}\"\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\\FileAssociations\"; ValueType: string; ValueName: \".wav\"; ValueData: \"{#MyAppAssocName}\"\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\\FileAssociations\"; ValueType: string; ValueName: \".wma\"; ValueData: \"{#MyAppAssocName}\"\n; Video Files\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\\FileAssociations\"; ValueType: string; ValueName: \".3gp\"; ValueData: \"{#MyAppAssocName}\"\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\\FileAssociations\"; ValueType: string; ValueName: \".avi\"; ValueData: \"{#MyAppAssocName}\"\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\\FileAssociations\"; ValueType: string; ValueName: \".dpx\"; ValueData: \"{#MyAppAssocName}\"\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\\FileAssociations\"; ValueType: string; ValueName: \".dv\"; ValueData: \"{#MyAppAssocName}\"\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\\FileAssociations\"; ValueType: string; ValueName: \".f4v\"; ValueData: \"{#MyAppAssocName}\"\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\\FileAssociations\"; ValueType: string; ValueName: \".flv\"; ValueData: \"{#MyAppAssocName}\"\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\\FileAssociations\"; ValueType: string; ValueName: \".he264\"; ValueData: \"{#MyAppAssocName}\"\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\\FileAssociations\"; ValueType: string; ValueName: \".hevc\"; ValueData: \"{#MyAppAssocName}\"\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\\FileAssociations\"; ValueType: string; ValueName: \".h265\"; ValueData: \"{#MyAppAssocName}\"\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\\FileAssociations\"; ValueType: string; ValueName: \".mkv\"; ValueData: \"{#MyAppAssocName}\"\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\\FileAssociations\"; ValueType: string; ValueName: \".mp4\"; ValueData: \"{#MyAppAssocName}\"\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\\FileAssociations\"; ValueType: string; ValueName: \".mpeg\"; ValueData: \"{#MyAppAssocName}\"\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\\FileAssociations\"; ValueType: string; ValueName: \".mpg\"; ValueData: \"{#MyAppAssocName}\"\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\\FileAssociations\"; ValueType: string; ValueName: \".mov\"; ValueData: \"{#MyAppAssocName}\"\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\\FileAssociations\"; ValueType: string; ValueName: \".nsv\"; ValueData: \"{#MyAppAssocName}\"\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\\FileAssociations\"; ValueType: string; ValueName: \".rm\"; ValueData: \"{#MyAppAssocName}\"\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\\FileAssociations\"; ValueType: string; ValueName: \".rmvb\"; ValueData: \"{#MyAppAssocName}\"\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\\FileAssociations\"; ValueType: string; ValueName: \".ts\"; ValueData: \"{#MyAppAssocName}\"\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\\FileAssociations\"; ValueType: string; ValueName: \".vob\"; ValueData: \"{#MyAppAssocName}\"\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\\FileAssociations\"; ValueType: string; ValueName: \".webm\"; ValueData: \"{#MyAppAssocName}\"\nRoot: HKA; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\\FileAssociations\"; ValueType: string; ValueName: \".wmv\"; ValueData: \"{#MyAppAssocName}\"\n\n; --- 在 HKLM 中注册应用以支持 Capabilities ---\nRoot: HKLM; Subkey: \"Software\\RegisteredApplications\"; ValueType: string; ValueName: \"{#MyAppName}\"; ValueData: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\"; Flags: uninsdeletevalue\nRoot: HKLM; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\"; ValueType: string; ValueName: \"ApplicationName\"; ValueData: \"{#MyAppName}\"; Flags: uninsdeletekey\nRoot: HKLM; Subkey: \"Software\\{#MyAppPublisher}\\{#MyAppName}\\Capabilities\"; ValueType: string; ValueName: \"ApplicationDescription\"; ValueData: \"{#MyAppDesc}\"\n\n; --- 注册应用程序路径 ---\nRoot: HKLM; Subkey: \"Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\{#MyAppExeName}\"; ValueType: string; ValueName: \"\"; ValueData: \"{app}\\{#MyAppExeName}\"; Flags: uninsdeletekey\nRoot: HKLM; Subkey: \"Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\{#MyAppExeName}\"; ValueType: string; ValueName: \"Path\"; ValueData: \"{app}\"\n\n[Icons]\nName: \"{autoprograms}\\{#MyAppName}\"; Filename: \"{app}\\{#MyAppExeName}\"\nName: \"{autodesktop}\\{#MyAppName}\"; Filename: \"{app}\\{#MyAppExeName}\"; Tasks: desktopicon\n\n[Run]\nFilename: \"{app}\\{#MyAppExeName}\"; Description: \"{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}\"; Flags: nowait postinstall skipifsilent\n\n[Code]\nfunction ReadFileContent(const FileName: String): String;\nvar\n  StringList: TStringList;\nbegin\n  Result := '';\n  StringList := TStringList.Create;\n  try\n    StringList.LoadFromFile(FileName);\n    Result := StringList.Text;\n  finally\n    StringList.Free;\n  end;\nend;\n\nfunction GetProcessPIDs(const ProcessName: string): String;\nvar\n  ResultCode: Integer;\n  Cmd: String;\n  OutputFile: String;\nbegin\n  OutputFile := ExpandConstant('{tmp}\\..\\pid_output.txt');\n  Cmd := '-Command \"Get-Process -Name ''' + ProcessName + ''' | ForEach-Object { if ($_.Path -and  (Test-Path (Join-Path (Split-Path $_.Path) ''libass.dll''))) { $_.Id } } > ''' + OutputFile + '''\"';\n  if Exec('powershell.exe', Cmd, '', SW_HIDE, ewWaitUntilTerminated, ResultCode) then\n  begin\n    Result := ReadFileContent(OutputFile);\n  end\n  else\n  begin\n    Result := '';\n  end;\n  if FileExists(OutputFile) then\n      DeleteFile(OutputFile);\nend;\n\nfunction InitializeUninstall(): Boolean;\nvar\n  ErrorCode: Integer;\n  UserResponse: Integer;\n  PIDs: String;\n  PIDList: TStringList;\n  i: Integer;\nbegin\n  PIDs := GetProcessPIDs('{#MyProcessName}');\n\n  if PIDs <> '' then\n  begin\n    UserResponse := MsgBox(FmtMessage(CustomMessage('CloseRunningAppToContinueUninstall'), ['{#MyAppName}']), mbConfirmation, MB_YESNO);\n\n    if UserResponse = IDNO then\n    begin\n      Result := False;\n      Exit;\n    end\n    else\n    begin\n      PIDList := TStringList.Create;\n      try\n        PIDList.CommaText := PIDs;\n        for i := 0 to PIDList.Count - 1 do\n        begin\n          ShellExec('open', 'taskkill.exe', '/f /pid ' + PIDList[i], '', SW_HIDE, ewNoWait, ErrorCode);\n        end;\n      finally\n        PIDList.Free;\n      end;\n    end;\n  end;\n\n  Result := True;\nend;\n"
  },
  {
    "path": "ios/.gitignore",
    "content": "**/dgph\n*.mode1v3\n*.mode2v3\n*.moved-aside\n*.pbxuser\n*.perspectivev3\n**/*sync/\n.sconsign.dblite\n.tags*\n**/.vagrant/\n**/DerivedData/\nIcon?\n**/Pods/\n**/.symlinks/\nprofile\nxcuserdata\n**/.generated/\nFlutter/App.framework\nFlutter/Flutter.framework\nFlutter/Flutter.podspec\nFlutter/Generated.xcconfig\nFlutter/ephemeral/\nFlutter/app.flx\nFlutter/app.zip\nFlutter/flutter_assets/\nFlutter/flutter_export_environment.sh\nServiceDefinitions.json\nRunner/GeneratedPluginRegistrant.*\n\n# Exceptions to above rules.\n!default.mode1v3\n!default.mode2v3\n!default.pbxuser\n!default.perspectivev3\n"
  },
  {
    "path": "ios/Flutter/AppFrameworkInfo.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>App</string>\n  <key>CFBundleIdentifier</key>\n  <string>io.flutter.flutter.app</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>App</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>1.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>1.0</string>\n  <key>MinimumOSVersion</key>\n  <string>12.0</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "ios/Flutter/Debug.xcconfig",
    "content": "#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "ios/Flutter/Release.xcconfig",
    "content": "#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "ios/Runner/AppDelegate.swift",
    "content": "import Flutter\nimport UIKit\n\n@main\n@objc class AppDelegate: FlutterAppDelegate {\n  override func application(\n    _ application: UIApplication,\n    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?\n  ) -> Bool {\n    GeneratedPluginRegistrant.register(with: self)\n    return super.application(application, didFinishLaunchingWithOptions: launchOptions)\n  }\n}\n"
  },
  {
    "path": "ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-20x20@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-20x20@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-29x29@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-29x29@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-29x29@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-40x40@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-40x40@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-60x60@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-60x60@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-20x20@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-20x20@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-29x29@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-29x29@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-40x40@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-40x40@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"76x76\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-76x76@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"76x76\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-76x76@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"83.5x83.5\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-83.5x83.5@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"1024x1024\",\n      \"idiom\" : \"ios-marketing\",\n      \"filename\" : \"Icon-App-1024x1024@1x.png\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchImage.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchImage@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchImage@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md",
    "content": "# Launch Screen Assets\n\nYou can customize the launch screen with your own desired assets by replacing the image files in this directory.\n\nYou can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images."
  },
  {
    "path": "ios/Runner/Base.lproj/LaunchScreen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"12121\" systemVersion=\"16G29\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" colorMatched=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"12089\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"EHf-IW-A2E\">\n            <objects>\n                <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"Ydg-fD-yQy\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"xbc-2k-c8Z\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <imageView opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" image=\"LaunchImage\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"YRO-k0-Ey4\">\n                            </imageView>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstItem=\"YRO-k0-Ey4\" firstAttribute=\"centerX\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerX\" id=\"1a2-6s-vTC\"/>\n                            <constraint firstItem=\"YRO-k0-Ey4\" firstAttribute=\"centerY\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerY\" id=\"4X2-HB-R7a\"/>\n                        </constraints>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"53\" y=\"375\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <image name=\"LaunchImage\" width=\"168\" height=\"185\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "ios/Runner/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"10117\" systemVersion=\"15F34\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" initialViewController=\"BYZ-38-t0r\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"10085\"/>\n    </dependencies>\n    <scenes>\n        <!--Flutter View Controller-->\n        <scene sceneID=\"tne-QT-ifu\">\n            <objects>\n                <viewController id=\"BYZ-38-t0r\" customClass=\"FlutterViewController\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"y3c-jy-aDJ\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"wfy-db-euE\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"8bC-Xf-vdC\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"dkx-z0-nzr\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "ios/Runner/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n  <dict>\n    <key>CFBundleDevelopmentRegion</key>\n    <string>$(DEVELOPMENT_LANGUAGE)</string>\n    <key>CFBundleDisplayName</key>\n    <string>IRIS</string>\n    <key>CFBundleExecutable</key>\n    <string>$(EXECUTABLE_NAME)</string>\n    <key>CFBundleIdentifier</key>\n    <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n    <key>CFBundleInfoDictionaryVersion</key>\n    <string>6.0</string>\n    <key>CFBundleName</key>\n    <string>iris</string>\n    <key>CFBundlePackageType</key>\n    <string>APPL</string>\n    <key>CFBundleShortVersionString</key>\n    <string>$(FLUTTER_BUILD_NAME)</string>\n    <key>CFBundleSignature</key>\n    <string>????</string>\n    <key>CFBundleVersion</key>\n    <string>$(FLUTTER_BUILD_NUMBER)</string>\n    <key>LSRequiresIPhoneOS</key>\n    <true/>\n    <key>UILaunchStoryboardName</key>\n    <string>LaunchScreen</string>\n    <key>UIMainStoryboardFile</key>\n    <string>Main</string>\n    <key>UISupportedInterfaceOrientations</key>\n    <array>\n      <string>UIInterfaceOrientationPortrait</string>\n      <string>UIInterfaceOrientationLandscapeLeft</string>\n      <string>UIInterfaceOrientationLandscapeRight</string>\n    </array>\n    <key>UISupportedInterfaceOrientations~ipad</key>\n    <array>\n      <string>UIInterfaceOrientationPortrait</string>\n      <string>UIInterfaceOrientationPortraitUpsideDown</string>\n      <string>UIInterfaceOrientationLandscapeLeft</string>\n      <string>UIInterfaceOrientationLandscapeRight</string>\n    </array>\n    <key>CADisableMinimumFrameDurationOnPhone</key>\n    <true/>\n    <key>UIApplicationSupportsIndirectInputEvents</key>\n    <true/>\n  </dict>\n</plist>"
  },
  {
    "path": "ios/Runner/Runner-Bridging-Header.h",
    "content": "#import \"GeneratedPluginRegistrant.h\"\n"
  },
  {
    "path": "ios/Runner.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };\n\t\t331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };\n\t\t3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };\n\t\t74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };\n\t\t97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };\n\t\t97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };\n\t\t97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 97C146E61CF9000F007C117D /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 97C146ED1CF9000F007C117D;\n\t\t\tremoteInfo = Runner;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t9705A1C41CF9048500538489 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = \"<group>\"; };\n\t\t1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = \"<group>\"; };\n\t\t331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = \"<group>\"; };\n\t\t331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = \"<group>\"; };\n\t\t74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"Runner-Bridging-Header.h\"; sourceTree = \"<group>\"; };\n\t\t74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = \"<group>\"; };\n\t\t9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = \"<group>\"; };\n\t\t9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = \"<group>\"; };\n\t\t97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = \"<group>\"; };\n\t\t97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t97C146EB1CF9000F007C117D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t331C8082294A63A400263BE5 /* RunnerTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t331C807B294A618700263BE5 /* RunnerTests.swift */,\n\t\t\t);\n\t\t\tpath = RunnerTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9740EEB11CF90186004384FC /* Flutter */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,\n\t\t\t\t9740EEB21CF90195004384FC /* Debug.xcconfig */,\n\t\t\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */,\n\t\t\t\t9740EEB31CF90195004384FC /* Generated.xcconfig */,\n\t\t\t);\n\t\t\tname = Flutter;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146E51CF9000F007C117D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9740EEB11CF90186004384FC /* Flutter */,\n\t\t\t\t97C146F01CF9000F007C117D /* Runner */,\n\t\t\t\t97C146EF1CF9000F007C117D /* Products */,\n\t\t\t\t331C8082294A63A400263BE5 /* RunnerTests */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146EF1CF9000F007C117D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146EE1CF9000F007C117D /* Runner.app */,\n\t\t\t\t331C8081294A63A400263BE5 /* RunnerTests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146F01CF9000F007C117D /* Runner */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146FA1CF9000F007C117D /* Main.storyboard */,\n\t\t\t\t97C146FD1CF9000F007C117D /* Assets.xcassets */,\n\t\t\t\t97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,\n\t\t\t\t97C147021CF9000F007C117D /* Info.plist */,\n\t\t\t\t1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,\n\t\t\t\t1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,\n\t\t\t\t74858FAE1ED2DC5600515810 /* AppDelegate.swift */,\n\t\t\t\t74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,\n\t\t\t);\n\t\t\tpath = Runner;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t331C8080294A63A400263BE5 /* RunnerTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget \"RunnerTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t331C807D294A63A400263BE5 /* Sources */,\n\t\t\t\t331C807F294A63A400263BE5 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t331C8086294A63A400263BE5 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = RunnerTests;\n\t\t\tproductName = RunnerTests;\n\t\t\tproductReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n\t\t97C146ED1CF9000F007C117D /* Runner */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget \"Runner\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t9740EEB61CF901F6004384FC /* Run Script */,\n\t\t\t\t97C146EA1CF9000F007C117D /* Sources */,\n\t\t\t\t97C146EB1CF9000F007C117D /* Frameworks */,\n\t\t\t\t97C146EC1CF9000F007C117D /* Resources */,\n\t\t\t\t9705A1C41CF9048500538489 /* Embed Frameworks */,\n\t\t\t\t3B06AD1E1E4923F5004D2608 /* Thin Binary */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Runner;\n\t\t\tproductName = Runner;\n\t\t\tproductReference = 97C146EE1CF9000F007C117D /* Runner.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t97C146E61CF9000F007C117D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tBuildIndependentTargetsInParallel = YES;\n\t\t\t\tLastUpgradeCheck = 1510;\n\t\t\t\tORGANIZATIONNAME = \"\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t331C8080294A63A400263BE5 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 14.0;\n\t\t\t\t\t\tTestTargetID = 97C146ED1CF9000F007C117D;\n\t\t\t\t\t};\n\t\t\t\t\t97C146ED1CF9000F007C117D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.3.1;\n\t\t\t\t\t\tLastSwiftMigration = 1100;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject \"Runner\" */;\n\t\t\tcompatibilityVersion = \"Xcode 9.3\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 97C146E51CF9000F007C117D;\n\t\t\tproductRefGroup = 97C146EF1CF9000F007C117D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t97C146ED1CF9000F007C117D /* Runner */,\n\t\t\t\t331C8080294A63A400263BE5 /* RunnerTests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t331C807F294A63A400263BE5 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t97C146EC1CF9000F007C117D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,\n\t\t\t\t3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,\n\t\t\t\t97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,\n\t\t\t\t97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\talwaysOutOfDate = 1;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}\",\n\t\t\t);\n\t\t\tname = \"Thin Binary\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"/bin/sh \\\"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\\\" embed_and_thin\";\n\t\t};\n\t\t9740EEB61CF901F6004384FC /* Run Script */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\talwaysOutOfDate = 1;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Run Script\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"/bin/sh \\\"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\\\" build\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t331C807D294A63A400263BE5 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t97C146EA1CF9000F007C117D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,\n\t\t\t\t1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t331C8086294A63A400263BE5 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 97C146ED1CF9000F007C117D /* Runner */;\n\t\t\ttargetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t97C146FA1CF9000F007C117D /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146FB1CF9000F007C117D /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t97C147001CF9000F007C117D /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t249021D3217E4FDB00AE95B9 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 12.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSUPPORTED_PLATFORMS = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t249021D4217E4FDB00AE95B9 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = nini22p.iris;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Runner/Runner-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t331C8088294A63A400263BE5 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = nini22p.iris.RunnerTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t331C8089294A63A400263BE5 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = nini22p.iris.RunnerTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t331C808A294A63A400263BE5 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = nini22p.iris.RunnerTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner\";\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t97C147031CF9000F007C117D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 12.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t97C147041CF9000F007C117D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 12.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSUPPORTED_PLATFORMS = iphoneos;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t97C147061CF9000F007C117D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = nini22p.iris;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Runner/Runner-Bridging-Header.h\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t97C147071CF9000F007C117D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = nini22p.iris;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Runner/Runner-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget \"RunnerTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t331C8088294A63A400263BE5 /* Debug */,\n\t\t\t\t331C8089294A63A400263BE5 /* Release */,\n\t\t\t\t331C808A294A63A400263BE5 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t97C146E91CF9000F007C117D /* Build configuration list for PBXProject \"Runner\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t97C147031CF9000F007C117D /* Debug */,\n\t\t\t\t97C147041CF9000F007C117D /* Release */,\n\t\t\t\t249021D3217E4FDB00AE95B9 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget \"Runner\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t97C147061CF9000F007C117D /* Debug */,\n\t\t\t\t97C147071CF9000F007C117D /* Release */,\n\t\t\t\t249021D4217E4FDB00AE95B9 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 97C146E61CF9000F007C117D /* Project object */;\n}\n"
  },
  {
    "path": "ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PreviewsEnabled</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1510\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n               BuildableName = \"Runner.app\"\n               BlueprintName = \"Runner\"\n               ReferencedContainer = \"container:Runner.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <Testables>\n         <TestableReference\n            skipped = \"NO\"\n            parallelizable = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"331C8080294A63A400263BE5\"\n               BuildableName = \"RunnerTests.xctest\"\n               BlueprintName = \"RunnerTests\"\n               ReferencedContainer = \"container:Runner.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Profile\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "ios/Runner.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Runner.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PreviewsEnabled</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "ios/RunnerTests/RunnerTests.swift",
    "content": "import Flutter\nimport UIKit\nimport XCTest\n\nclass RunnerTests: XCTestCase {\n\n  func testExample() {\n    // If you add code to the Runner application, consider adding tests here.\n    // See https://developer.apple.com/documentation/xctest for more information about using XCTest.\n  }\n\n}\n"
  },
  {
    "path": "l10n.yaml",
    "content": "arb-dir: lib/l10n\ntemplate-arb-file: app_en.arb\noutput-localization-file: app_localizations.dart\nsynthetic-package: false"
  },
  {
    "path": "lib/globals.dart",
    "content": "// ignore: unnecessary_library_name\nlibrary my_app.globals;\n\nimport 'package:flutter/material.dart';\nimport 'package:permission_handler/permission_handler.dart';\n\nList<String> arguments = [];\nString? initUri;\nPermissionStatus? storagePermissionStatus;\nfinal moreMenuKey = GlobalKey<PopupMenuButtonState>();\nfinal rateMenuKey = GlobalKey<PopupMenuButtonState>();\nconst double speedSelectorItemWidth = 64.0;\nconst List<double> speedStops = [\n  0.25,\n  0.5,\n  0.75,\n  1.0,\n  1.25,\n  1.5,\n  1.75,\n  2.0,\n  3.0,\n  4.0,\n  5.0,\n  6.0,\n  7.0,\n  8.0,\n  9.0,\n  10.0,\n];\n"
  },
  {
    "path": "lib/hooks/player/use_fvp_player.dart",
    "content": "import 'dart:io';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:flutter_zustand/flutter_zustand.dart';\nimport 'package:fvp/fvp.dart';\nimport 'package:iris/globals.dart' as globals;\nimport 'package:iris/models/file.dart';\nimport 'package:iris/models/player.dart';\nimport 'package:iris/models/progress.dart';\nimport 'package:iris/models/storages/storage.dart';\nimport 'package:iris/models/store/app_state.dart';\nimport 'package:iris/store/use_app_store.dart';\nimport 'package:iris/store/use_history_store.dart';\nimport 'package:iris/store/use_play_queue_store.dart';\nimport 'package:iris/store/use_player_ui_store.dart';\nimport 'package:iris/store/use_storage_store.dart';\nimport 'package:iris/utils/check_data_source_type.dart';\nimport 'package:iris/utils/logger.dart';\nimport 'package:iris/utils/platform.dart';\nimport 'package:media_stream/media_stream.dart';\nimport 'package:saf_util/saf_util.dart';\nimport 'package:video_player/video_player.dart';\nimport 'package:wakelock_plus/wakelock_plus.dart';\n\nFvpPlayer useFvpPlayer(BuildContext context) {\n  final autoPlay = useAppStore().select(context, (state) => state.autoPlay);\n  final rate = useAppStore().select(context, (state) => state.rate);\n  final volume = useAppStore().select(context, (state) => state.volume);\n  final isMuted = useAppStore().select(context, (state) => state.isMuted);\n  final repeat = useAppStore().select(context, (state) => state.repeat);\n  final playQueue =\n      usePlayQueueStore().select(context, (state) => state.playQueue);\n  final currentIndex =\n      usePlayQueueStore().select(context, (state) => state.currentIndex);\n  final bool alwaysPlayFromBeginning =\n      useAppStore().select(context, (state) => state.alwaysPlayFromBeginning);\n\n  final history = useHistoryStore().select(context, (state) => state.history);\n\n  final looping =\n      useMemoized(() => repeat == Repeat.one ? true : false, [repeat]);\n\n  final int currentPlayIndex = useMemoized(\n      () => playQueue.indexWhere((element) => element.index == currentIndex),\n      [playQueue, currentIndex]);\n\n  final FileItem? file = useMemoized(\n      () => playQueue.isEmpty || currentPlayIndex < 0\n          ? null\n          : playQueue[currentPlayIndex].file,\n      [playQueue, currentPlayIndex]);\n\n  final externalSubtitle = useState<int?>(null);\n\n  final List<Subtitle> externalSubtitles =\n      useMemoized(() => file?.subtitles ?? [], [file?.subtitles]);\n\n  final isInitializing = useState(false);\n\n  MediaStream mediaStream = useMemoized(() => MediaStream());\n  final streamUrl = useMemoized(() => mediaStream.url);\n\n  final controller = useState(VideoPlayerController.networkUrl(Uri.parse('')));\n\n  final isPlaying = useListenableSelector(\n      controller.value, () => controller.value.value.isPlaying);\n  final position = useListenableSelector(\n      controller.value, () => controller.value.value.position);\n  final duration = useListenableSelector(\n      controller.value, () => controller.value.value.duration);\n  final buffered = useListenableSelector(\n      controller.value, () => controller.value.value.buffered);\n  final width = useListenableSelector(\n      controller.value, () => controller.value.value.size.width);\n  final height = useListenableSelector(\n      controller.value, () => controller.value.value.size.height);\n\n  useEffect(() {\n    if (file?.type != ContentType.video) {\n      usePlayerUiStore().updateAspectRatio(0);\n      return;\n    }\n\n    if (width != 0 && height != 0) {\n      usePlayerUiStore().updateAspectRatio(width / height);\n    } else {\n      usePlayerUiStore().updateAspectRatio(0);\n    }\n    return;\n  }, [file?.type, width, height]);\n\n  Future<void> init(FileItem? file) async {\n    isInitializing.value = true;\n\n    try {\n      if (controller.value.value.isInitialized) {\n        logger('Dispose player');\n        controller.value.dispose();\n      }\n\n      if (file == null || file.uri.isEmpty) {\n        controller.value = VideoPlayerController.networkUrl(Uri.parse(''));\n      } else {\n        final storage = useStorageStore().findById(file.storageId);\n        final auth = storage?.getAuth();\n\n        logger('Open file: $file');\n\n        switch (checkDataSourceType(file)) {\n          case DataSourceType.file:\n            controller.value = VideoPlayerController.file(\n              File(file.uri),\n              httpHeaders: auth != null ? {'authorization': auth} : {},\n            );\n          case DataSourceType.contentUri:\n            final isExists = await SafUtil().exists(file.uri, false);\n            controller.value = VideoPlayerController.contentUri(\n              isExists ? Uri.parse(file.uri) : Uri.parse(''),\n            );\n          default:\n            controller.value = VideoPlayerController.networkUrl(\n              Uri.parse(file.storageType == StorageType.ftp\n                  ? '$streamUrl/${file.uri}'\n                  : file.uri),\n              httpHeaders: auth != null ? {'authorization': auth} : {},\n            );\n        }\n      }\n      await controller.value.initialize();\n      await controller.value.setLooping(repeat == Repeat.one ? true : false);\n      await controller.value.setPlaybackSpeed(rate);\n      await controller.value.setVolume(isMuted ? 0 : volume / 100);\n    } catch (e) {\n      logger('Error initializing player: $e');\n    } finally {\n      isInitializing.value = false;\n    }\n  }\n\n  useEffect(() {\n    init(file);\n    return;\n  }, [file?.uri]);\n\n  useEffect(() {\n    return () {\n      if (controller.value.value.isInitialized) {\n        controller.value.dispose();\n      }\n    };\n  }, []);\n\n  useEffect(() {\n    () async {\n      final currentExternalSubtitle = externalSubtitle.value;\n      if (currentExternalSubtitle == null || externalSubtitles.isEmpty) {\n        controller.value.setExternalSubtitle('');\n      } else if (externalSubtitle.value! < externalSubtitles.length) {\n        bool isExists = true;\n\n        final uri = file?.storageType == StorageType.ftp\n            ? '$streamUrl/${externalSubtitles[currentExternalSubtitle].uri}'\n            : externalSubtitles[currentExternalSubtitle].uri;\n\n        logger('External subtitle uri: $uri');\n\n        if (Platform.isAndroid &&\n            externalSubtitles[currentExternalSubtitle]\n                .uri\n                .startsWith('content://')) {\n          isExists = await SafUtil().exists(uri, false);\n        }\n\n        if (isExists) {\n          controller.value.setExternalSubtitle(uri);\n        } else {\n          externalSubtitle.value = null;\n        }\n      }\n    }();\n\n    return;\n  }, [externalSubtitles, externalSubtitle.value]);\n\n  useEffect(() {\n    () async {\n      if (file != null &&\n          controller.value.value.isCompleted &&\n          controller.value.value.position != Duration.zero &&\n          controller.value.value.duration != Duration.zero) {\n        logger('Completed: ${file.name}');\n        if (repeat == Repeat.one) return;\n        if (currentPlayIndex == playQueue.length - 1) {\n          if (repeat == Repeat.all) {\n            await usePlayQueueStore().updateCurrentIndex(playQueue[0].index);\n          }\n        } else {\n          await usePlayQueueStore()\n              .updateCurrentIndex(playQueue[currentPlayIndex + 1].index);\n        }\n      }\n    }();\n    return;\n  }, [controller.value.value.isCompleted]);\n\n  useEffect(() {\n    if (controller.value.value.isInitialized) {\n      controller.value.setPlaybackSpeed(rate);\n    }\n    return;\n  }, [rate]);\n\n  useEffect(() {\n    if (controller.value.value.isInitialized) {\n      controller.value.setVolume(isMuted ? 0 : volume / 100);\n    }\n    return;\n  }, [volume, isMuted]);\n\n  useEffect(() {\n    if (controller.value.value.isInitialized) {\n      logger('Set looping: $looping');\n      controller.value.setLooping(repeat == Repeat.one ? true : false);\n    }\n    return;\n  }, [looping]);\n\n  useEffect(() {\n    () async {\n      if (controller.value.value.duration != Duration.zero &&\n          file != null &&\n          file.type == ContentType.video) {\n        Progress? progress = history[file.getID()];\n        if (progress != null) {\n          if (!alwaysPlayFromBeginning &&\n              (progress.duration.inMilliseconds -\n                      progress.position.inMilliseconds) >\n                  5000) {\n            logger(\n                'Resume progress: ${file.name} position: ${progress.position} duration: ${progress.duration}');\n            await controller.value.seekTo(progress.position);\n          }\n        }\n      }\n\n      if (autoPlay) {\n        controller.value.play();\n      }\n\n      if (externalSubtitles.isNotEmpty) {\n        externalSubtitle.value = 0;\n      }\n    }();\n    return;\n  }, [controller.value.value.duration]);\n\n  useEffect(() {\n    return () {\n      if (isAndroid &&\n          globals.initUri == file?.uri &&\n          globals.initUri != null &&\n          globals.initUri!.startsWith('content://')) {\n        return;\n      }\n\n      if (file != null &&\n          controller.value.value.isInitialized &&\n          controller.value.value.duration.inSeconds != 0) {\n        logger(\n            'Save progress: ${file.name}, position: ${controller.value.value.position}, duration: ${controller.value.value.duration}');\n        useHistoryStore().add(Progress(\n          dateTime: DateTime.now().toUtc(),\n          position: controller.value.value.position,\n          duration: controller.value.value.duration,\n          file: file,\n        ));\n      }\n    };\n  }, [file]);\n\n  useEffect(() {\n    if (controller.value.value.isPlaying) {\n      logger('Enable wakelock');\n      WakelockPlus.enable();\n    } else {\n      logger('Disable wakelock');\n      WakelockPlus.disable();\n    }\n    return;\n  }, [controller.value.value.isPlaying]);\n\n  Future<void> play() async {\n    if (!controller.value.value.isInitialized &&\n        !isInitializing.value &&\n        file != null) {\n      init(file);\n    }\n    controller.value.play();\n  }\n\n  Future<void> pause() async {\n    controller.value.pause();\n  }\n\n  Future<void> seek(Duration newPosition) async {\n    logger('Seek to: $newPosition');\n    if (controller.value.value.duration == Duration.zero) return;\n    newPosition.inSeconds < 0\n        ? await controller.value.seekTo(Duration.zero)\n        : newPosition.inSeconds > controller.value.value.duration.inSeconds\n            ? await controller.value.seekTo(controller.value.value.duration)\n            : await controller.value.seekTo(newPosition);\n  }\n\n  Future<void> backward(int seconds) async => await seek(\n      Duration(seconds: controller.value.value.position.inSeconds - seconds));\n\n  Future<void> forward(int seconds) async => await seek(\n      Duration(seconds: controller.value.value.position.inSeconds + seconds));\n\n  Future<void> stepBackward() async {\n    if (file?.type == ContentType.video) {\n      await controller.value.step(frames: -1);\n      logger('Step backward');\n    }\n  }\n\n  Future<void> stepForward() async {\n    if (file?.type == ContentType.video) {\n      await controller.value.step(frames: 1);\n      logger('Step forward');\n    }\n  }\n\n  Future<void> saveProgress() async {\n    if (isAndroid &&\n        globals.initUri == file?.uri &&\n        globals.initUri != null &&\n        globals.initUri!.startsWith('content://')) {\n      return;\n    }\n\n    if (file != null && controller.value.value.duration != Duration.zero) {\n      logger(\n          'Save progress: ${file.name}, position: ${controller.value.value.position}, duration: ${controller.value.value.duration}');\n      useHistoryStore().add(Progress(\n        dateTime: DateTime.now().toUtc(),\n        position: controller.value.value.position,\n        duration: controller.value.value.duration,\n        file: file,\n      ));\n    }\n  }\n\n  useEffect(() => saveProgress, []);\n\n  final fvpPlayer = useMemoized(\n    () => FvpPlayer(\n      controller: controller.value,\n      isInitializing: isInitializing.value,\n      isPlaying: isPlaying,\n      externalSubtitle: externalSubtitle,\n      externalSubtitles: externalSubtitles,\n      position:\n          !controller.value.value.isInitialized || duration == Duration.zero\n              ? Duration.zero\n              : position,\n      duration: controller.value.value.isInitialized ? duration : Duration.zero,\n      buffer: buffered.isEmpty || duration == Duration.zero\n          ? Duration.zero\n          : buffered.reduce((max, curr) => curr.end > max.end ? curr : max).end,\n      width: width,\n      height: height,\n      play: play,\n      pause: pause,\n      backward: backward,\n      forward: forward,\n      stepBackward: stepBackward,\n      stepForward: stepForward,\n      seek: seek,\n      saveProgress: saveProgress,\n    ),\n    [\n      controller.value,\n      controller.value.value.isInitialized,\n      isInitializing.value,\n      isPlaying,\n      externalSubtitle.value,\n      externalSubtitles,\n      position,\n      duration,\n      buffered,\n      width,\n      height,\n      play,\n      pause,\n      seek,\n      backward,\n      forward,\n      stepBackward,\n      stepForward,\n      saveProgress,\n    ],\n  );\n\n  return fvpPlayer;\n}\n"
  },
  {
    "path": "lib/hooks/player/use_media_kit_player.dart",
    "content": "import 'dart:io';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:flutter_zustand/flutter_zustand.dart';\nimport 'package:iris/globals.dart' as globals;\nimport 'package:iris/models/file.dart';\nimport 'package:iris/models/player.dart';\nimport 'package:iris/models/progress.dart';\nimport 'package:iris/models/storages/storage.dart';\nimport 'package:iris/models/store/app_state.dart';\nimport 'package:iris/store/use_app_store.dart';\nimport 'package:iris/store/use_history_store.dart';\nimport 'package:iris/store/use_play_queue_store.dart';\nimport 'package:iris/store/use_player_ui_store.dart';\nimport 'package:iris/store/use_storage_store.dart';\nimport 'package:iris/utils/logger.dart';\nimport 'package:iris/utils/platform.dart';\nimport 'package:media_kit/media_kit.dart';\nimport 'package:media_kit_video/media_kit_video.dart';\nimport 'package:media_stream/media_stream.dart';\nimport 'package:path_provider/path_provider.dart';\n\nMediaKitPlayer useMediaKitPlayer(BuildContext context) {\n  final player = useMemoized(\n    () => Player(\n      configuration: const PlayerConfiguration(\n        libass: true,\n      ),\n    ),\n  );\n\n  final controller = useMemoized(() => VideoController(player));\n\n  final rate = useAppStore().select(context, (state) => state.rate);\n  final volume = useAppStore().select(context, (state) => state.volume);\n  final isMuted = useAppStore().select(context, (state) => state.isMuted);\n\n  useEffect(() {\n    () async {\n      player.setSubtitleTrack(SubtitleTrack.no());\n      player.setRate(rate);\n      player.setVolume(isMuted ? 0 : volume.toDouble());\n\n      if (Platform.isAndroid) {\n        NativePlayer nativePlayer = player.platform as NativePlayer;\n\n        final appSupportDir = await getApplicationSupportDirectory();\n        final String fontsDir = \"${appSupportDir.path}/fonts\";\n\n        final Directory fontsDirectory = Directory(fontsDir);\n        if (!await fontsDirectory.exists()) {\n          await fontsDirectory.create(recursive: true);\n          logger('fonts directory created');\n        }\n\n        final File file = File(\"$fontsDir/NotoSansCJKsc-Medium.otf\");\n        if (!await file.exists()) {\n          final ByteData data =\n              await rootBundle.load(\"assets/fonts/NotoSansCJKsc-Medium.otf\");\n          final Uint8List buffer = data.buffer.asUint8List();\n          await file.create(recursive: true);\n          await file.writeAsBytes(buffer);\n          logger('NotoSansCJKsc-Medium.otf copied');\n        }\n\n        await nativePlayer.setProperty(\"sub-fonts-dir\", fontsDir);\n        await nativePlayer.setProperty(\"sub-font\", \"NotoSansCJKsc-Medium\");\n      }\n    }();\n    return () {\n      player.dispose();\n    };\n  }, []);\n\n  final List<PlayQueueItem> playQueue =\n      usePlayQueueStore().select(context, (state) => state.playQueue);\n  final int currentIndex =\n      usePlayQueueStore().select(context, (state) => state.currentIndex);\n  final bool autoPlay =\n      useAppStore().select(context, (state) => state.autoPlay);\n  final Repeat repeat = useAppStore().select(context, (state) => state.repeat);\n  final bool alwaysPlayFromBeginning =\n      useAppStore().select(context, (state) => state.alwaysPlayFromBeginning);\n\n  final history = useHistoryStore().select(context, (state) => state.history);\n\n  final int currentPlayIndex = useMemoized(\n      () => playQueue.indexWhere((element) => element.index == currentIndex),\n      [playQueue, currentIndex]);\n\n  final FileItem? file = useMemoized(\n      () => playQueue.isEmpty || currentPlayIndex < 0\n          ? null\n          : playQueue[currentPlayIndex].file,\n      [playQueue, currentPlayIndex]);\n\n  final playingStream = useMemoized(() => player.stream.playing, []);\n  bool playing = useStream(playingStream).data ?? false;\n\n  final videoParamsStream = useMemoized(() => player.stream.videoParams, []);\n  VideoParams? videoParams = useStream(videoParamsStream).data;\n\n  // AudioParams? audioParams = useStream(player.stream.audioParams).data;\n\n  final positionStream = useMemoized(() => player.stream.position, []);\n  final position = useStream(positionStream).data ?? Duration.zero;\n\n  final durationStream = useMemoized(() => player.stream.duration, []);\n  Duration duration = useStream(durationStream).data ?? Duration.zero;\n\n  final bufferStream = useMemoized(() => player.stream.buffer, []);\n  Duration buffer = useStream(bufferStream).data ?? Duration.zero;\n\n  final completedStream = useMemoized(() => player.stream.completed, []);\n  bool completed = useStream(completedStream).data ?? false;\n\n  // double rate = useStream(player.stream.rate).data ?? 1.0;\n\n  final trackStream = useMemoized(() => player.stream.track, []);\n  Track? track = useStream(trackStream).data;\n  AudioTrack audio =\n      useMemoized(() => track?.audio ?? AudioTrack.no(), [track?.audio]);\n  SubtitleTrack subtitle = useMemoized(\n      () => track?.subtitle ?? SubtitleTrack.no(), [track?.subtitle]);\n\n  final tracksStream = useMemoized(() => player.stream.tracks, []);\n  Tracks? tracks = useStream(tracksStream).data;\n  List<AudioTrack> audios =\n      useMemoized(() => (tracks?.audio ?? []), [tracks?.audio]);\n  List<SubtitleTrack> subtitles = useMemoized(\n      () => [...(tracks?.subtitle ?? [])]\n        ..removeWhere((subtitle) => subtitle == SubtitleTrack.auto()),\n      [tracks?.subtitle]);\n\n  final List<Subtitle>? externalSubtitles = useMemoized(\n      () => [...file?.subtitles ?? []]..removeWhere(\n          (subtitle) => subtitles.any((item) => item.title == subtitle.name)),\n      [file?.subtitles, subtitles]);\n\n  final isInitializing = useState(false);\n\n  MediaStream mediaStream = useMemoized(() => MediaStream(), []);\n\n  Future<void> init(FileItem file) async {\n    if (file.uri == '') return;\n    isInitializing.value = true;\n\n    try {\n      final storage = useStorageStore().findById(file.storageId);\n      final auth = storage?.getAuth();\n      logger('Open file: $file');\n      await player.open(\n        Media(\n          file.storageType == StorageType.ftp\n              ? '${mediaStream.url}/${file.uri}'\n              : file.uri,\n          httpHeaders: auth != null ? {'authorization': auth} : {},\n        ),\n        play: autoPlay,\n      );\n    } catch (e) {\n      logger('Error initializing player: $e');\n    }\n\n    isInitializing.value = false;\n  }\n\n  useEffect(() {\n    if (file == null || playQueue.isEmpty) {\n      player.stop();\n    } else {\n      init(file);\n    }\n    return () {\n      if (isAndroid &&\n          globals.initUri == file?.uri &&\n          globals.initUri != null &&\n          globals.initUri!.startsWith('content://')) {\n        return;\n      }\n\n      if (file != null && player.state.duration != Duration.zero) {\n        logger(\n            'Save progress: ${file.name}, position: ${player.state.position}, duration: ${player.state.duration}');\n        useHistoryStore().add(Progress(\n          dateTime: DateTime.now().toUtc(),\n          position: player.state.position,\n          duration: player.state.duration,\n          file: file,\n        ));\n      }\n    };\n  }, [file]);\n\n  useEffect(() {\n    () async {\n      if (duration == Duration.zero) {\n        await player.setSubtitleTrack(SubtitleTrack.no());\n        return;\n      }\n      // 查询播放进度\n      if (file != null && file.type == ContentType.video) {\n        Progress? progress = history[file.getID()];\n        if (progress != null) {\n          if (!alwaysPlayFromBeginning &&\n              (progress.duration.inMilliseconds -\n                      progress.position.inMilliseconds) >\n                  5000) {\n            logger(\n                'Resume progress: ${file.name} position: ${progress.position} duration: ${progress.duration}');\n            await player.seek(progress.position);\n          }\n        }\n      }\n      // 设置字幕\n      if (externalSubtitles!.isNotEmpty) {\n        logger('Set external subtitle: ${externalSubtitles[0]}');\n        final uri = file?.storageType == StorageType.ftp\n            ? '${mediaStream.url}/${externalSubtitles[0].uri}'\n            : externalSubtitles[0].uri;\n        logger('External subtitle uri: $uri');\n        await player.setSubtitleTrack(\n          SubtitleTrack.uri(\n            uri,\n            title: externalSubtitles[0].name,\n          ),\n        );\n      } else if (subtitles.length > 1) {\n        logger(\n            'Set subtitle: ${subtitles[1].title ?? subtitles[1].language ?? subtitles[1].id}');\n        await player.setSubtitleTrack(subtitles[1]);\n      } else {\n        await player.setSubtitleTrack(SubtitleTrack.no());\n      }\n    }();\n    return;\n  }, [duration]);\n\n  useEffect(() {\n    () async {\n      if (completed) {\n        if (repeat == Repeat.one) return;\n        if (currentPlayIndex == playQueue.length - 1) {\n          if (repeat == Repeat.all) {\n            await usePlayQueueStore().updateCurrentIndex(playQueue[0].index);\n          }\n        } else {\n          await usePlayQueueStore()\n              .updateCurrentIndex(playQueue[currentPlayIndex + 1].index);\n        }\n      }\n    }();\n    return null;\n  }, [completed, repeat]);\n\n  useEffect(() {\n    player.setRate(rate);\n    return;\n  }, [rate]);\n\n  useEffect(() {\n    player.setVolume(isMuted ? 0 : volume.toDouble());\n    return;\n  }, [volume, isMuted]);\n\n  useEffect(() {\n    logger('$repeat');\n    if (repeat == Repeat.one) {\n      player.setPlaylistMode(PlaylistMode.loop);\n    } else {\n      player.setPlaylistMode(PlaylistMode.none);\n    }\n    return;\n  }, [repeat]);\n\n  useEffect(() {\n    if (file?.type != ContentType.video) {\n      usePlayerUiStore().updateAspectRatio(0);\n      return;\n    }\n\n    final width = videoParams?.w ?? 0;\n    final height = videoParams?.h ?? 0;\n    if (width == 0 || height == 0) {\n      usePlayerUiStore().updateAspectRatio(0);\n    } else {\n      usePlayerUiStore().updateAspectRatio(width / height);\n    }\n    return;\n  }, [file?.type, videoParams?.w, videoParams?.h]);\n\n  Future<void> saveProgress() async {\n    if (isAndroid &&\n        globals.initUri == file?.uri &&\n        globals.initUri != null &&\n        globals.initUri!.startsWith('content://')) {\n      return;\n    }\n\n    if (file != null && player.state.duration != Duration.zero) {\n      logger(\n          'Save progress: ${file.name}, position: ${player.state.position}, duration: ${player.state.duration}');\n      useHistoryStore().add(Progress(\n        dateTime: DateTime.now().toUtc(),\n        position: player.state.position,\n        duration: player.state.duration,\n        file: file,\n      ));\n    }\n  }\n\n  useEffect(() => saveProgress, []);\n\n  Future<void> play() async {\n    if (duration == Duration.zero && file != null && !isInitializing.value) {\n      await init(file);\n    }\n    await player.play();\n  }\n\n  Future<void> pause() async {\n    await player.pause();\n  }\n\n  Future<void> seek(Duration newPosition) async =>\n      newPosition.inMilliseconds < 0\n          ? await player.seek(Duration.zero)\n          : newPosition.inMilliseconds > duration.inMilliseconds\n              ? await player.seek(duration)\n              : await player.seek(newPosition);\n\n  Future<void> backward(int seconds) async {\n    await seek(Duration(seconds: position.inSeconds - seconds));\n  }\n\n  Future<void> forward(int seconds) async {\n    await seek(Duration(seconds: position.inSeconds + seconds));\n  }\n\n  Future<void> stepBackward() async {\n    final nativePlayer = player.platform;\n    if (nativePlayer is NativePlayer && file?.type == ContentType.video) {\n      await nativePlayer.command(['frame-back-step']);\n      logger('Step backward');\n    }\n  }\n\n  Future<void> stepForward() async {\n    final nativePlayer = player.platform;\n    if (nativePlayer is NativePlayer && file?.type == ContentType.video) {\n      await nativePlayer.command(['frame-step']);\n      logger('Step forward');\n    }\n  }\n\n  final mediaKitPlayer = useMemoized(\n    () => MediaKitPlayer(\n      player: player,\n      controller: controller,\n      subtitle: subtitle,\n      subtitles: subtitles,\n      externalSubtitles: externalSubtitles ?? [],\n      audio: audio,\n      audios: audios,\n      isInitializing: isInitializing.value,\n      isPlaying: playing,\n      position: duration == Duration.zero ? Duration.zero : position,\n      duration: duration,\n      buffer: duration == Duration.zero ? Duration.zero : buffer,\n      width: videoParams?.w?.toDouble() ?? 0,\n      height: videoParams?.h?.toDouble() ?? 0,\n      saveProgress: saveProgress,\n      play: play,\n      pause: pause,\n      backward: backward,\n      forward: forward,\n      stepBackward: stepBackward,\n      stepForward: stepForward,\n      seek: seek,\n    ),\n    [\n      player,\n      controller,\n      subtitle,\n      subtitles,\n      externalSubtitles,\n      audio,\n      audios,\n      isInitializing.value,\n      playing,\n      position,\n      duration,\n      buffer,\n      videoParams?.w,\n      videoParams?.h,\n      saveProgress,\n      play,\n      pause,\n      backward,\n      forward,\n      stepBackward,\n      stepForward,\n      seek,\n    ],\n  );\n\n  return mediaKitPlayer;\n}\n"
  },
  {
    "path": "lib/hooks/ui/use_full_screen.dart",
    "content": "import 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:flutter_zustand/flutter_zustand.dart';\nimport 'package:iris/store/use_player_ui_store.dart';\nimport 'package:iris/utils/platform.dart';\nimport 'package:window_manager/window_manager.dart';\n\nvoid useFullScreen() {\n  final context = useContext();\n\n  final isFullScreen =\n      usePlayerUiStore().select(context, (state) => state.isFullScreen);\n\n  useEffect(() {\n    () async {\n      if (isDesktop) {\n        await windowManager.setFullScreen(isFullScreen);\n      }\n    }();\n    return;\n  }, [isFullScreen]);\n}\n"
  },
  {
    "path": "lib/hooks/ui/use_orientation.dart",
    "content": "import 'dart:io';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:flutter_zustand/flutter_zustand.dart';\nimport 'package:iris/models/store/app_state.dart';\nimport 'package:iris/store/use_app_store.dart';\nimport 'package:iris/store/use_player_ui_store.dart';\n\nvoid useOrientation() {\n  final context = useContext();\n  final orientation =\n      useAppStore().select(context, (state) => state.orientation);\n\n  final aspectRatio =\n      usePlayerUiStore().select(context, (state) => state.aspectRatio);\n\n  setOrientation(ScreenOrientation orientation, double? aspect) {\n    if (Platform.isAndroid || Platform.isIOS) {\n      switch (orientation) {\n        case ScreenOrientation.device:\n          SystemChrome.setPreferredOrientations([]);\n          break;\n        case ScreenOrientation.landscape:\n          SystemChrome.setPreferredOrientations([\n            DeviceOrientation.landscapeLeft,\n            DeviceOrientation.landscapeRight,\n          ]);\n          break;\n        case ScreenOrientation.portrait:\n          SystemChrome.setPreferredOrientations([\n            DeviceOrientation.portraitUp,\n            DeviceOrientation.portraitDown,\n          ]);\n          break;\n      }\n    }\n  }\n\n  useEffect(() {\n    setOrientation(orientation, aspectRatio);\n    return () => SystemChrome.setPreferredOrientations([]);\n  }, []);\n\n  useEffect(() {\n    setOrientation(orientation, aspectRatio);\n    return;\n  }, [orientation, aspectRatio]);\n}\n"
  },
  {
    "path": "lib/hooks/ui/use_resize_window.dart",
    "content": "import 'dart:math' as math;\nimport 'package:flutter/material.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:flutter_zustand/flutter_zustand.dart';\nimport 'package:iris/models/file.dart';\nimport 'package:iris/store/use_app_store.dart';\nimport 'package:iris/store/use_play_queue_store.dart';\nimport 'package:iris/store/use_player_ui_store.dart';\nimport 'package:iris/utils/logger.dart';\nimport 'package:iris/utils/platform.dart';\nimport 'package:window_manager/window_manager.dart';\nimport 'package:window_size/window_size.dart';\n\nFuture<void> _applyResize(Rect newBounds) async {\n  if (await windowManager.isFullScreen() || await windowManager.isMaximized()) {\n    return;\n  }\n  await windowManager.setBounds(newBounds, animate: true);\n}\n\nvoid useResizeWindow() {\n  final context = useContext();\n\n  final autoResize = useAppStore().select(context, (state) => state.autoResize);\n  final isFullScreen =\n      usePlayerUiStore().select(context, (state) => state.isFullScreen);\n  final aspectRatio =\n      usePlayerUiStore().select(context, (state) => state.aspectRatio);\n\n  final currentPlay = usePlayQueueStore().select(context, (state) {\n    final index =\n        state.playQueue.indexWhere((e) => e.index == state.currentIndex);\n    return index != -1 ? state.playQueue[index] : null;\n  });\n  final contentType = currentPlay?.file.type ?? ContentType.other;\n\n  final prevIsFullScreen = usePrevious(isFullScreen);\n  final prevAspectRatio = usePrevious(aspectRatio);\n\n  useEffect(() {\n    if (!isDesktop) return;\n\n    Future<void> performResize() async {\n      if (isFullScreen) return;\n\n      if (!autoResize) {\n        await windowManager.setAspectRatio(0);\n        return;\n      }\n\n      if (contentType == ContentType.audio) {\n        await windowManager.setAspectRatio(0);\n        return;\n      }\n\n      if (contentType == ContentType.video) {\n        if (aspectRatio <= 0) {\n          await windowManager.setAspectRatio(0);\n          return;\n        }\n\n        await windowManager.setAspectRatio(aspectRatio);\n        final oldBounds = await windowManager.getBounds();\n        final screen = await getCurrentScreen();\n        if (screen == null) return;\n\n        if (oldBounds.size.aspectRatio.toStringAsFixed(2) ==\n            aspectRatio.toStringAsFixed(2)) {\n          return;\n        }\n\n        Size newSize;\n        final bool isPreviousPortrait = (prevAspectRatio ?? 1.0) < 1.0;\n        final bool isCurrentLandscape = aspectRatio >= 1.0;\n\n        if (isPreviousPortrait && isCurrentLandscape) {\n          logger('Resize rule: Portrait to Landscape (Height-based)');\n          double newHeight = oldBounds.height;\n          double newWidth = newHeight * aspectRatio;\n          newSize = Size(newWidth, newHeight);\n        } else {\n          logger('Resize rule: Standard (Normalized Area-based)');\n          double currentArea = oldBounds.width * oldBounds.height;\n          const double standardAspectRatio = 16.0 / 9.0;\n          double normalizedHeight =\n              math.sqrt(currentArea / standardAspectRatio);\n\n          double newHeight = normalizedHeight;\n          double newWidth = newHeight * aspectRatio;\n          newSize = Size(newWidth, newHeight);\n        }\n\n        double maxWidth = screen.frame.width / screen.scaleFactor * 0.95;\n        double maxHeight = screen.frame.height / screen.scaleFactor * 0.95;\n\n        if (newSize.width > maxWidth) {\n          newSize = Size(maxWidth, maxWidth / aspectRatio);\n        }\n        if (newSize.height > maxHeight) {\n          newSize = Size(maxHeight * aspectRatio, maxHeight);\n        }\n\n        final newPosition = Offset(\n          oldBounds.left + (oldBounds.width - newSize.width) / 2,\n          oldBounds.top + (oldBounds.height - newSize.height) / 2,\n        );\n\n        await _applyResize(Rect.fromLTWH(\n            newPosition.dx, newPosition.dy, newSize.width, newSize.height));\n      }\n    }\n\n    final wasFullScreen = prevIsFullScreen == true;\n    if (wasFullScreen && !isFullScreen) {\n      Future.delayed(const Duration(milliseconds: 50), performResize);\n    } else {\n      performResize();\n    }\n\n    return null;\n  }, [\n    autoResize,\n    isFullScreen,\n    aspectRatio,\n    contentType,\n  ]);\n}\n"
  },
  {
    "path": "lib/hooks/use_app_lifecycle.dart",
    "content": "import 'dart:ui';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:iris/models/player.dart';\nimport 'package:iris/utils/logger.dart';\nimport 'package:provider/provider.dart';\n\nvoid useAppLifecycle() {\n  final context = useContext();\n\n  AppLifecycleState? appLifecycleState = useAppLifecycleState();\n\n  useEffect(() {\n    try {\n      if (appLifecycleState == AppLifecycleState.paused) {\n        logger('App lifecycle state: paused');\n        context.read<MediaPlayer>().saveProgress();\n      }\n    } catch (e) {\n      logger('App lifecycle state error: $e');\n    }\n    return;\n  }, [appLifecycleState]);\n}\n"
  },
  {
    "path": "lib/hooks/use_brightness.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:iris/utils/logger.dart';\nimport 'package:screen_brightness/screen_brightness.dart';\n\nValueNotifier<double?> useBrightness(bool isGesture) {\n  final brightness = useState<double?>(null);\n\n  useEffect(() {\n    try {\n      () async {\n        if (!isGesture) return;\n        brightness.value = await ScreenBrightness.instance.application;\n      }();\n    } catch (e) {\n      logger('Error getting brightness: $e');\n    }\n    return () => brightness.value = null;\n  }, [isGesture]);\n\n  useEffect(() {\n    try {\n      if (brightness.value != null && isGesture) {\n        ScreenBrightness.instance\n            .setApplicationScreenBrightness(brightness.value!);\n      }\n    } catch (e) {\n      logger('Error setting brightness: $e');\n    }\n    return;\n  }, [brightness.value]);\n\n  // 退出时重置亮度\n  useEffect(\n    () => () {\n      try {\n        ScreenBrightness.instance.resetApplicationScreenBrightness();\n      } catch (e) {\n        logger('Error resetting brightness: $e');\n      }\n    },\n    [],\n  );\n\n  return brightness;\n}\n"
  },
  {
    "path": "lib/hooks/use_cover.dart",
    "content": "import 'package:collection/collection.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:flutter_zustand/flutter_zustand.dart';\nimport 'package:iris/models/file.dart';\nimport 'package:iris/models/storages/local.dart';\nimport 'package:iris/models/storages/storage.dart';\nimport 'package:iris/store/use_play_queue_store.dart';\nimport 'package:iris/store/use_storage_store.dart';\n\nFileItem? useCover() {\n  final context = useContext();\n\n  final playQueue =\n      usePlayQueueStore().select(context, (state) => state.playQueue);\n  final currentIndex =\n      usePlayQueueStore().select(context, (state) => state.currentIndex);\n\n  final FileItem? file = useMemoized(() {\n    final index =\n        playQueue.indexWhere((element) => element.index == currentIndex);\n    return playQueue.isEmpty || index < 0 ? null : playQueue[index].file;\n  }, [playQueue, currentIndex]);\n\n  final localStoragesFuture =\n      useMemoized(() async => await getLocalStorages(context), []);\n  final localStorages = useFuture(localStoragesFuture).data ?? [];\n\n  final storages = useStorageStore().select(context, (state) => state.storages);\n\n  final Storage? storage = useMemoized(\n      () => file == null\n          ? null\n          : [...localStorages, ...storages]\n              .firstWhereOrNull((storage) => storage.id == file.storageId),\n      [file, localStorages, storages]);\n\n  final cover = useState<FileItem?>(null);\n\n  useEffect(() {\n    () async {\n      if (storage == null || file == null || file.type != ContentType.audio) {\n        cover.value = null;\n        return;\n      }\n\n      final dir =\n          file.path.isEmpty ? <String>[] : ([...file.path]..removeLast());\n\n      final files = await storage.getFiles(dir);\n\n      final images =\n          files.where((file) => file.type == ContentType.image).toList();\n\n      cover.value = images.firstWhereOrNull((image) =>\n              image.name.split('.').first.toLowerCase() == 'cover') ??\n          images.firstWhereOrNull((image) =>\n              image.name.toLowerCase().startsWith('cover') ||\n              image.name.toLowerCase().startsWith('folder')) ??\n          images.firstOrNull;\n    }();\n    return null;\n  }, [storage, file]);\n\n  return cover.value;\n}\n"
  },
  {
    "path": "lib/hooks/use_gesture.dart",
    "content": "import 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:flutter_volume_controller/flutter_volume_controller.dart';\nimport 'package:iris/globals.dart' show speedStops, speedSelectorItemWidth;\nimport 'package:iris/hooks/use_brightness.dart';\nimport 'package:iris/hooks/use_volume.dart';\nimport 'package:iris/models/player.dart';\nimport 'package:iris/store/use_app_store.dart';\nimport 'package:iris/store/use_player_ui_store.dart';\nimport 'package:iris/utils/logger.dart';\nimport 'package:iris/utils/platform.dart';\nimport 'package:provider/provider.dart';\nimport 'package:window_manager/window_manager.dart';\n\nclass Gesture {\n  final void Function(TapDownDetails) onTapDown;\n  final void Function() onTap;\n  final void Function(TapDownDetails) onDoubleTapDown;\n  final void Function(LongPressStartDetails) onLongPressStart;\n  final void Function(LongPressMoveUpdateDetails) onLongPressMoveUpdate;\n  final void Function(LongPressEndDetails) onLongPressEnd;\n  final void Function() onLongPressCancel;\n  final void Function(DragStartDetails) onPanStart;\n  final void Function(DragUpdateDetails) onPanUpdate;\n  final void Function(DragEndDetails) onPanEnd;\n  final void Function() onPanCancel;\n  final void Function(PointerHoverEvent) onHover;\n\n  final bool isLongPress;\n  final bool isLeftGesture;\n  final bool isRightGesture;\n  final double? brightness;\n  final double? volume;\n\n  Gesture({\n    required this.onTapDown,\n    required this.onTap,\n    required this.onDoubleTapDown,\n    required this.onLongPressStart,\n    required this.onLongPressMoveUpdate,\n    required this.onLongPressEnd,\n    required this.onLongPressCancel,\n    required this.onPanStart,\n    required this.onPanUpdate,\n    required this.onPanEnd,\n    required this.onPanCancel,\n    required this.onHover,\n    required this.isLongPress,\n    required this.isLeftGesture,\n    required this.isRightGesture,\n    required this.brightness,\n    required this.volume,\n  });\n}\n\nGesture useGesture({\n  required void Function() showControl,\n  required void Function() hideControl,\n  required void Function() showProgress,\n  required void Function(Offset position) showSpeedSelector,\n  required void Function(double finalSpeed) hideSpeedSelector,\n  required void Function(double speed, double visualOffset) updateSelectedSpeed,\n}) {\n  final context = useContext();\n\n  final gestureState = useRef({\n    'isTouch': false,\n    'isLongPress': false,\n    'isDragging': false,\n    'startPanOffset': Offset.zero,\n    'startSeekPosition': Duration.zero,\n    'panDirection': null, // null: 未确定, Axis.horizontal, Axis.vertical\n  });\n\n  final isLeftGesture = useState(false);\n  final isRightGesture = useState(false);\n\n  final brightness = useBrightness(isLeftGesture.value);\n  final volume = useVolume(isRightGesture.value);\n\n  void onTapDown(TapDownDetails details) {\n    if (details.kind == PointerDeviceKind.touch) {\n      gestureState.value['isTouch'] = true;\n    }\n  }\n\n  void onTap() {\n    if (usePlayerUiStore().state.isShowControl) {\n      hideControl();\n    } else {\n      showControl();\n    }\n  }\n\n  void onDoubleTapDown(TapDownDetails details) {\n    final player = context.read<MediaPlayer>();\n\n    if (details.kind == PointerDeviceKind.touch) {\n      final screenWidth = MediaQuery.sizeOf(context).width;\n      final tapDx = details.globalPosition.dx;\n\n      if (tapDx > screenWidth * 0.75) {\n        // 右侧 25%\n        showProgress();\n        player.forward(10);\n      } else if (tapDx < screenWidth * 0.25) {\n        // 左侧 25%\n        showProgress();\n        player.backward(10);\n      } else {\n        // 中间 50%\n        if (player.isPlaying) {\n          useAppStore().updateAutoPlay(false);\n          player.pause();\n          showControl();\n        } else {\n          useAppStore().updateAutoPlay(true);\n          player.play();\n        }\n      }\n    } else if (isDesktop) {\n      // 桌面端双击切换全屏\n      usePlayerUiStore()\n          .updateFullScreen(!usePlayerUiStore().state.isFullScreen);\n    }\n  }\n\n  void onLongPressStart(LongPressStartDetails details) {\n    if (gestureState.value['isTouch'] as bool &&\n        context.read<MediaPlayer>().isPlaying) {\n      gestureState.value['isLongPress'] = true;\n      gestureState.value['startPanOffset'] = details.globalPosition;\n\n      final currentRate = useAppStore().state.rate;\n      final closestSpeed = speedStops.reduce(\n          (a, b) => (a - currentRate).abs() < (b - currentRate).abs() ? a : b);\n      gestureState.value['initialSpeedIndex'] =\n          speedStops.indexOf(closestSpeed);\n\n      showSpeedSelector(details.globalPosition);\n      updateSelectedSpeed(closestSpeed, 0.0);\n    }\n  }\n\n  void onLongPressMoveUpdate(LongPressMoveUpdateDetails details) {\n    if (!(gestureState.value['isLongPress'] as bool)) return;\n\n    final startDx = (gestureState.value['startPanOffset'] as Offset).dx;\n    final currentDx = details.globalPosition.dx;\n    final deltaDx = currentDx - startDx;\n\n    const double sensitivity = speedSelectorItemWidth;\n    final double visualOffset = deltaDx;\n\n    int steps = (-visualOffset / sensitivity).round();\n\n    int initialIndex = gestureState.value['initialSpeedIndex'] as int? ??\n        speedStops.indexOf(1.0);\n    int finalIndex = (initialIndex + steps).clamp(0, speedStops.length - 1);\n\n    double selectedSpeed = speedStops[finalIndex];\n\n    updateSelectedSpeed(selectedSpeed, visualOffset);\n    if (useAppStore().state.rate != selectedSpeed) {\n      useAppStore().updateRate(selectedSpeed);\n    }\n  }\n\n  void onLongPressEnd(LongPressEndDetails details) {\n    if (gestureState.value['isLongPress'] as bool) {\n      hideSpeedSelector(useAppStore().state.rate);\n    }\n    gestureState.value['isLongPress'] = false;\n    gestureState.value['isTouch'] = false;\n  }\n\n  void onLongPressCancel() {\n    if (gestureState.value['isLongPress'] as bool) {\n      hideSpeedSelector(useAppStore().state.rate);\n    }\n    gestureState.value['isLongPress'] = false;\n    gestureState.value['isTouch'] = false;\n  }\n\n  void onPanStart(DragStartDetails details) {\n    if (isDesktop && details.kind != PointerDeviceKind.touch) {\n      windowManager.startDragging();\n      return;\n    }\n\n    if (gestureState.value['isLongPress'] as bool) {\n      return;\n    }\n\n    if (details.kind == PointerDeviceKind.touch) {\n      const double edgeDeadZone = 48.0;\n      final screenSize = MediaQuery.sizeOf(context);\n      final startDx = details.globalPosition.dx;\n\n      if (startDx < edgeDeadZone || startDx > screenSize.width - edgeDeadZone) {\n        logger(\"Edge swipe detected. Ignoring for system navigation.\");\n        return;\n      }\n\n      gestureState.value['isTouch'] = true;\n      gestureState.value['isDragging'] = true;\n      gestureState.value['startPanOffset'] = details.globalPosition;\n      gestureState.value['startSeekPosition'] =\n          context.read<MediaPlayer>().position;\n      gestureState.value['panDirection'] = null;\n      isLeftGesture.value = false;\n      isRightGesture.value = false;\n    }\n  }\n\n  void onPanUpdate(DragUpdateDetails details) {\n    if (!(gestureState.value['isDragging'] as bool)) return;\n\n    final startOffset = gestureState.value['startPanOffset'] as Offset;\n    final totalDx = details.globalPosition.dx - startOffset.dx;\n    final totalDy = details.globalPosition.dy - startOffset.dy;\n\n    // 增加手势“死区”，防止误触\n    const double panDeadzone = 8.0;\n    if (gestureState.value['panDirection'] == null) {\n      if (totalDx.abs() > panDeadzone || totalDy.abs() > panDeadzone) {\n        gestureState.value['panDirection'] =\n            totalDx.abs() > totalDy.abs() ? Axis.horizontal : Axis.vertical;\n      }\n    }\n\n    final direction = gestureState.value['panDirection'];\n    if (direction == null) return;\n\n    // 水平滑动 (Seek)\n    if (direction == Axis.horizontal) {\n      if (!usePlayerUiStore().state.isSeeking) {\n        usePlayerUiStore().updateIsSeeking(true);\n      }\n\n      const double sensitivity = 3.0; // 每滑动3像素代表1秒\n      final double seekSecondsOffset = totalDx / sensitivity;\n      final startSeconds =\n          (gestureState.value['startSeekPosition'] as Duration).inSeconds;\n\n      int targetSeconds = (startSeconds + seekSecondsOffset).round();\n\n      // 边界检查\n      targetSeconds = targetSeconds.clamp(\n          0, context.read<MediaPlayer>().duration.inSeconds);\n\n      context.read<MediaPlayer>().seek(Duration(seconds: targetSeconds));\n      showProgress();\n    }\n\n    // 垂直滑动 (亮度和音量)\n    if (direction == Axis.vertical) {\n      // 仅在垂直滑动开始时判断一次左右区域\n      if (!isLeftGesture.value && !isRightGesture.value) {\n        isLeftGesture.value =\n            startOffset.dx < MediaQuery.sizeOf(context).width / 2;\n        isRightGesture.value = !isLeftGesture.value;\n\n        if (isRightGesture.value) {\n          FlutterVolumeController.updateShowSystemUI(false);\n        }\n      }\n\n      final double dy = details.delta.dy;\n\n      if (isLeftGesture.value && brightness.value != null) {\n        final newBrightness = brightness.value! - dy / 200;\n        brightness.value = newBrightness.clamp(0.0, 1.0);\n      }\n\n      if (isRightGesture.value && volume.value != null) {\n        final newVolume = volume.value! - dy / 200;\n        volume.value = newVolume.clamp(0.0, 1.0);\n      }\n    }\n  }\n\n  // ignore: no_leading_underscores_for_local_identifiers\n  void _resetPanState() {\n    if (usePlayerUiStore().state.isSeeking) {\n      usePlayerUiStore().updateIsSeeking(false);\n    }\n    gestureState.value = {\n      ...gestureState.value,\n      'isDragging': false,\n      'panDirection': null,\n    };\n    isLeftGesture.value = false;\n    isRightGesture.value = false;\n\n    FlutterVolumeController.updateShowSystemUI(true);\n  }\n\n  void onPanEnd(DragEndDetails details) => _resetPanState();\n  void onPanCancel() => _resetPanState();\n\n  void onHover(PointerHoverEvent event) {\n    if (event.kind != PointerDeviceKind.touch) {\n      usePlayerUiStore().updateIsHovering(true);\n      showControl();\n    }\n  }\n\n  return Gesture(\n    onTapDown: onTapDown,\n    onTap: onTap,\n    onDoubleTapDown: onDoubleTapDown,\n    onLongPressStart: onLongPressStart,\n    onLongPressMoveUpdate: onLongPressMoveUpdate,\n    onLongPressEnd: onLongPressEnd,\n    onLongPressCancel: onLongPressCancel,\n    onPanStart: onPanStart,\n    onPanUpdate: onPanUpdate,\n    onPanEnd: onPanEnd,\n    onPanCancel: onPanCancel,\n    onHover: onHover,\n    isLongPress: gestureState.value['isLongPress'] as bool,\n    isLeftGesture: isLeftGesture.value,\n    isRightGesture: isRightGesture.value,\n    brightness: brightness.value,\n    volume: volume.value,\n  );\n}\n"
  },
  {
    "path": "lib/hooks/use_keyboard.dart",
    "content": "import 'dart:io';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:iris/globals.dart';\nimport 'package:iris/models/player.dart';\nimport 'package:iris/models/storages/local.dart';\nimport 'package:iris/widgets/popups/history.dart';\nimport 'package:iris/widgets/popups/play_queue.dart';\nimport 'package:iris/widgets/popups/track/subtitle_and_audio_track.dart';\nimport 'package:iris/widgets/popups/settings/settings.dart';\nimport 'package:iris/widgets/popups/storages/storages.dart';\nimport 'package:iris/store/use_app_store.dart';\nimport 'package:iris/store/use_play_queue_store.dart';\nimport 'package:iris/store/use_player_ui_store.dart';\nimport 'package:iris/utils/platform.dart';\nimport 'package:iris/widgets/bottom_sheets/show_open_link_bottom_sheet.dart';\nimport 'package:iris/widgets/dialogs/show_open_link_dialog.dart';\nimport 'package:iris/widgets/popup.dart';\nimport 'package:provider/provider.dart';\nimport 'package:window_manager/window_manager.dart';\n\ntypedef KeyboardEvent = void Function(KeyEvent event);\n\nKeyboardEvent useKeyboard({\n  required void Function() showControl,\n  required Future<void> Function(Future<void>) showControlForHover,\n  required void Function() showProgress,\n}) {\n  final context = useContext();\n\n  void onKeyEvent(KeyEvent event) async {\n    final player = context.read<MediaPlayer>();\n\n    if (event.runtimeType == KeyDownEvent) {\n      if (HardwareKeyboard.instance.isAltPressed) {\n        switch (event.logicalKey) {\n          // 退出\n          case LogicalKeyboardKey.keyX:\n            showControl();\n            await player.saveProgress();\n            if (isDesktop) {\n              windowManager.close();\n            } else {\n              SystemNavigator.pop();\n              exit(0);\n            }\n        }\n        return;\n      }\n\n      if (HardwareKeyboard.instance.isControlPressed) {\n        final appState = useAppStore().state;\n        switch (event.logicalKey) {\n          // 上一个\n          case LogicalKeyboardKey.arrowLeft:\n            showControl();\n            usePlayQueueStore().previous();\n            break;\n          // 下一个\n          case LogicalKeyboardKey.arrowRight:\n            showControl();\n            usePlayQueueStore().next();\n            break;\n          // 设置\n          case LogicalKeyboardKey.keyP:\n            showControlForHover(\n              showPopup(\n                context: context,\n                child: const Settings(),\n                direction: PopupDirection.right,\n              ),\n            );\n            break;\n          // 打开文件\n          case LogicalKeyboardKey.keyO:\n            showControl();\n            await pickLocalFile();\n            showControl();\n            break;\n          // 随机\n          case LogicalKeyboardKey.keyX:\n            showControl();\n            if (appState.shuffle) {\n              usePlayQueueStore().sort();\n            } else {\n              usePlayQueueStore().shuffle();\n            }\n            useAppStore().updateShuffle(!appState.shuffle);\n            break;\n          // 循环\n          case LogicalKeyboardKey.keyR:\n            showControl();\n            useAppStore().toggleRepeat();\n            break;\n          // 视频缩放\n          case LogicalKeyboardKey.keyV:\n            showControl();\n            useAppStore().toggleFit();\n            break;\n          // 历史\n          case LogicalKeyboardKey.keyH:\n            showControlForHover(\n              showPopup(\n                context: context,\n                child: const History(),\n                direction: PopupDirection.right,\n              ),\n            );\n            break;\n          // 打开链接\n          case LogicalKeyboardKey.keyL:\n            showControl();\n            isDesktop\n                ? await showOpenLinkDialog(context)\n                : await showOpenLinkBottomSheet(context);\n            showControl();\n            break;\n          // 关闭当前播放媒体文件\n          case LogicalKeyboardKey.keyC:\n            showControl();\n            player.pause();\n            usePlayQueueStore().updateCurrentIndex(-1);\n            break;\n          // 静音\n          case LogicalKeyboardKey.keyM:\n            showControl();\n            useAppStore().toggleMute();\n            break;\n          default:\n            break;\n        }\n        return;\n      }\n\n      final playerUiState = usePlayerUiStore().state;\n      switch (event.logicalKey) {\n        // 播放 | 暂停\n        case LogicalKeyboardKey.space:\n        case LogicalKeyboardKey.mediaPlayPause:\n          showControl();\n          if (player.isPlaying) {\n            useAppStore().updateAutoPlay(false);\n            player.pause();\n          } else {\n            useAppStore().updateAutoPlay(true);\n            player.play();\n          }\n          break;\n        // 上一个\n        case LogicalKeyboardKey.mediaTrackPrevious:\n          usePlayQueueStore().previous();\n          showControl();\n          break;\n        // 下一个\n        case LogicalKeyboardKey.mediaTrackNext:\n          showControl();\n          usePlayQueueStore().next();\n          break;\n        // 存储\n        case LogicalKeyboardKey.keyF:\n          showControlForHover(\n            showPopup(\n              context: context,\n              child: const Storages(),\n              direction: PopupDirection.right,\n            ),\n          );\n          break;\n        // 播放队列\n        case LogicalKeyboardKey.keyP:\n          showControlForHover(\n            showPopup(\n              context: context,\n              child: const PlayQueue(),\n              direction: PopupDirection.right,\n            ),\n          );\n          break;\n        // 字幕和音轨\n        case LogicalKeyboardKey.keyS:\n          showControlForHover(\n            showPopup(\n              context: context,\n              child: Provider<MediaPlayer>.value(\n                value: context.read<MediaPlayer>(),\n                child: const SubtitleAndAudioTrack(),\n              ),\n              direction: PopupDirection.right,\n            ),\n          );\n          break;\n        // 退出全屏\n        case LogicalKeyboardKey.escape:\n          if (isDesktop && playerUiState.isFullScreen) {\n            usePlayerUiStore().updateFullScreen(false);\n          }\n          break;\n        // 全屏\n        case LogicalKeyboardKey.enter:\n        case LogicalKeyboardKey.f11:\n          if (isDesktop) {\n            usePlayerUiStore().updateFullScreen(!playerUiState.isFullScreen);\n          }\n          break;\n        case LogicalKeyboardKey.tab:\n          showControl();\n          break;\n        case LogicalKeyboardKey.f10:\n          showControl();\n          await usePlayerUiStore().toggleIsAlwaysOnTop();\n          break;\n        case LogicalKeyboardKey.equal:\n          await player.stepForward();\n          break;\n        case LogicalKeyboardKey.minus:\n          await player.stepBackward();\n          break;\n        case LogicalKeyboardKey.contextMenu:\n          showControl();\n          moreMenuKey.currentState?.showButtonMenu();\n          break;\n        default:\n          break;\n      }\n    }\n\n    if (event.runtimeType == KeyDownEvent ||\n        event.runtimeType == KeyRepeatEvent) {\n      switch (event.logicalKey) {\n        // 快退\n        case LogicalKeyboardKey.arrowLeft:\n          if (usePlayerUiStore().state.isShowControl) {\n            showControl();\n          } else {\n            showProgress();\n          }\n          player.backward(5);\n          break;\n        // 快进\n        case LogicalKeyboardKey.arrowRight:\n          if (usePlayerUiStore().state.isShowControl) {\n            showControl();\n          } else {\n            showProgress();\n          }\n          player.forward(5);\n          break;\n        // 提升音量\n        case LogicalKeyboardKey.arrowUp:\n          showControl();\n          await useAppStore().updateVolume(useAppStore().state.volume + 1);\n          break;\n        // 降低音量\n        case LogicalKeyboardKey.arrowDown:\n          showControl();\n          await useAppStore().updateVolume(useAppStore().state.volume - 1);\n          break;\n        default:\n          break;\n      }\n    }\n  }\n\n  return onKeyEvent;\n}\n"
  },
  {
    "path": "lib/hooks/use_volume.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:flutter_volume_controller/flutter_volume_controller.dart';\nimport 'package:iris/utils/logger.dart';\n\nValueNotifier<double?> useVolume(bool isGesture) {\n  final volume = useState<double?>(null);\n\n  useEffect(() {\n    try {\n      () async {\n        if (!isGesture) return;\n        volume.value = await FlutterVolumeController.getVolume();\n      }();\n    } catch (e) {\n      logger('Error getting volume: $e');\n    }\n    return () {\n      volume.value = null;\n    };\n  }, [isGesture]);\n\n  useEffect(() {\n    try {\n      if (volume.value != null && isGesture) {\n        FlutterVolumeController.setVolume(volume.value!);\n      }\n    } catch (e) {\n      logger('Error setting volume: $e');\n    }\n    return;\n  }, [volume.value]);\n\n  return volume;\n}\n"
  },
  {
    "path": "lib/info.dart",
    "content": "class INFO {\n  static const String title = 'IRIS';\n  static const String author = '22';\n  static const String authorUrl = 'https://github.com/nini22P';\n  static const String githubUrl = 'https://github.com/nini22P/iris';\n  static const String msStoreId = '9NML7WNHNRTJ';\n}\n"
  },
  {
    "path": "lib/l10n/app_en.arb",
    "content": "{\n  \"@@locale\": \"en\",\n  \"about\": \"About\",\n  \"add\": \"Add\",\n  \"add_favorite\": \"Add favorite\",\n  \"add_folder\": \"Add folder\",\n  \"add_ftp_storage\": \"Add FTP storage\",\n  \"add_local_storage\": \"Add local storage\",\n  \"add_storage\": \"Add storage\",\n  \"add_to_play_queue\": \"Add to play queue\",\n  \"add_webdav_storage\": \"Add WebDAV storage\",\n  \"always_on_top_off\": \"Always on top: Off\",\n  \"always_on_top_on\": \"Always on top: On\",\n  \"always_play_from_beginning\": \"Always play from the beginning\",\n  \"always_play_from_beginning_description\": \"When enabled, this option will automatically start the video from the beginning each time it is played\",\n  \"app_description\": \"A lightweight video player\",\n  \"audio\": \"audio\",\n  \"audio_track\": \"Audio track\",\n  \"author\": \"Author\",\n  \"auto\": \"Auto\",\n  \"auto_resize\": \"Auto resize window ratio\",\n  \"back\": \"Back\",\n  \"cancel\": \"Cancel\",\n  \"check_update\": \"Check update\",\n  \"checked_new_version\": \"Checked new version\",\n  \"close\": \"Close\",\n  \"confirmUpdate\": \"Confirm update\",\n  \"crop\": \"Crop\",\n  \"dark\": \"Datk\",\n  \"dependencies\": \"Dependencies\",\n  \"device\": \"Device\",\n  \"download\": \"Download\",\n  \"download_and_update\": \"Download and update\",\n  \"download_error\": \"Download error\",\n  \"edit\": \"Edit\",\n  \"edit_folder\": \"Edit folder\",\n  \"edit_ftp_storage\": \"Edit FTP storage\",\n  \"edit_local_storage\": \"Edit local storage\",\n  \"edit_webdav_storage\": \"Edit WebDAV storage\",\n  \"enter_fullscreen\": \"Enter fullscreen\",\n  \"exit\": \"Exit\",\n  \"exit_app_back_again\": \"Press back again to exit.\",\n  \"exit_fullscreen\": \"Exit fullscreen\",\n  \"experimental\": \"Experimental\",\n  \"favorites\": \"Favorites\",\n  \"fit\": \"Fit\",\n  \"folder\": \"Folder\",\n  \"folder_first\": \"Folder first\",\n  \"general\": \"General\",\n  \"grant_storage_permission\": \"Grant Storage Permission\",\n  \"history\": \"History\",\n  \"home\": \"Home\",\n  \"host\": \"Host\",\n  \"landscape\": \"Landscape\",\n  \"language\": \"Language\",\n  \"last_modified\": \"Last modified\",\n  \"light\": \"Light\",\n  \"local_storage\": \"Local storage\",\n  \"media_file_does_not_exist\": \"Media file does not exist\",\n  \"menu\": \"Menu\",\n  \"more_options\": \"More options\",\n  \"mute\": \"Mute\",\n  \"name\": \"Name\",\n  \"network_storage\": \"Network storage\",\n  \"next\": \"Next\",\n  \"no_new_version\": \"No new version\",\n  \"off\": \"Off\",\n  \"ok\": \"OK\",\n  \"on\": \"On\",\n  \"open_file\": \"Open file\",\n  \"open_in_folder\": \"Open in folder\",\n  \"open_link\": \"Open link\",\n  \"password\": \"Password\",\n  \"path\": \"Path\",\n  \"pause\": \"Pause\",\n  \"play\": \"Play\",\n  \"play_queue\": \"Play queue\",\n  \"playback_speed\": \"Playback speed\",\n  \"player_backend\": \"Player backend\",\n  \"port\": \"Port\",\n  \"portrait\": \"Portrait\",\n  \"previous\": \"Previous\",\n  \"refresh\": \"Refresh\",\n  \"releasePage\": \"Release page\",\n  \"remove\": \"Remove\",\n  \"remove_favorite\": \"Remove favorite\",\n  \"repeat_all\": \"Repeat: All\",\n  \"repeat_none\": \"Repeat: None\",\n  \"repeat_one\": \"Repeat: One\",\n  \"retry\": \"Retry\",\n  \"save\": \"Save\",\n  \"screen_orientation\": \"ScreenOrientation\",\n  \"select_language\": \"Select language\",\n  \"settings\": \"Settings\",\n  \"shuffle\": \"Shuffle\",\n  \"size\": \"Size\",\n  \"sort\": \"Sort\",\n  \"source_code\": \"Source code\",\n  \"stop\": \"Stop\",\n  \"storage\": \"Storage\",\n  \"stretch\": \"Stretch\",\n  \"subtitle\": \"Subtitle\",\n  \"subtitle_and_audio_track\": \"Subtitle and audio track\",\n  \"subtitle_file_does_not_exist\": \"Subtitle file does not exist\",\n  \"system\": \"System\",\n  \"test_connection\": \"Test connection\",\n  \"theme_mode\": \"Theme mode\",\n  \"unable_to_fetch_files\": \"Unable to fetch files.\",\n  \"unmute\": \"Unmute\",\n  \"url\": \"URL\",\n  \"usb_storage\": \"USB storage\",\n  \"username\": \"Username\",\n  \"version\": \"Version\",\n  \"video\": \"Video\",\n  \"video_zoom\": \"Video zoom\",\n  \"volume\": \"Volume\"\n}"
  },
  {
    "path": "lib/l10n/app_zh.arb",
    "content": "{\n  \"@@locale\": \"zh\",\n  \"about\": \"关于\",\n  \"add\": \"添加\",\n  \"add_favorite\": \"添加收藏\",\n  \"add_folder\": \"添加文件夹\",\n  \"add_ftp_storage\": \"添加 FTP 存储\",\n  \"add_local_storage\": \"添加本地存储\",\n  \"add_storage\": \"添加存储\",\n  \"add_to_play_queue\": \"添加到播放队列\",\n  \"add_webdav_storage\": \"添加 WebDAV 存储\",\n  \"always_on_top_off\": \"窗口置顶: 关\",\n  \"always_on_top_on\": \"窗口置顶: 开\",\n  \"always_play_from_beginning\": \"总是从头开始播放\",\n  \"always_play_from_beginning_description\": \"启用此选项后，每次播放视频时将自动从头开始播放\",\n  \"app_description\": \"轻量级视频播放器\",\n  \"audio\": \"音频\",\n  \"audio_track\": \"音轨\",\n  \"author\": \"作者\",\n  \"auto\": \"自动\",\n  \"auto_resize\": \"自动调整窗口比例\",\n  \"back\": \"返回\",\n  \"cancel\": \"取消\",\n  \"check_update\": \"检查更新\",\n  \"checked_new_version\": \"检查到新版本\",\n  \"close\": \"关闭\",\n  \"confirmUpdate\": \"确认更新\",\n  \"crop\": \"裁切\",\n  \"dark\": \"暗色\",\n  \"dependencies\": \"开源库\",\n  \"device\": \"设备\",\n  \"download\": \"下载\",\n  \"download_and_update\": \"下载并更新\",\n  \"download_error\": \"下载错误\",\n  \"edit\": \"编辑\",\n  \"edit_folder\": \"编辑文件夹\",\n  \"edit_ftp_storage\": \"编辑 FTP 存储\",\n  \"edit_local_storage\": \"编辑本地存储\",\n  \"edit_webdav_storage\": \"编辑 WebDAV 存储\",\n  \"enter_fullscreen\": \"进入全屏\",\n  \"exit\": \"退出\",\n  \"exit_app_back_again\": \"再次点击返回退出应用。\",\n  \"exit_fullscreen\": \"退出全屏\",\n  \"experimental\": \"实验性\",\n  \"favorites\": \"收藏\",\n  \"fit\": \"适应\",\n  \"folder\": \"文件夹\",\n  \"folder_first\": \"文件夹优先\",\n  \"general\": \"通用\",\n  \"grant_storage_permission\": \"授予存储权限\",\n  \"history\": \"历史\",\n  \"home\": \"主页\",\n  \"host\": \"主机\",\n  \"landscape\": \"横向\",\n  \"language\": \"语言\",\n  \"last_modified\": \"最后修改\",\n  \"light\": \"亮色\",\n  \"local_storage\": \"本地存储\",\n  \"media_file_does_not_exist\": \"媒体文件不存在\",\n  \"menu\": \"菜单\",\n  \"more_options\": \"更多选项\",\n  \"mute\": \"静音\",\n  \"name\": \"名称\",\n  \"network_storage\": \"网络存储\",\n  \"next\": \"下一个\",\n  \"no_new_version\": \"没有新版本\",\n  \"off\": \"关闭\",\n  \"ok\": \"确定\",\n  \"on\": \"开启\",\n  \"open_file\": \"打开文件\",\n  \"open_in_folder\": \"打开所在文件夹\",\n  \"open_link\": \"打开链接\",\n  \"password\": \"密码\",\n  \"path\": \"路径\",\n  \"pause\": \"暂停\",\n  \"play\": \"播放\",\n  \"play_queue\": \"播放队列\",\n  \"playback_speed\": \"播放速度\",\n  \"player_backend\": \"播放器后端\",\n  \"port\": \"端口\",\n  \"portrait\": \"纵向\",\n  \"previous\": \"上一个\",\n  \"refresh\": \"刷新\",\n  \"releasePage\": \"发布页面\",\n  \"remove\": \"移除\",\n  \"remove_favorite\": \"移除收藏\",\n  \"repeat_all\": \"重复: 全部\",\n  \"repeat_none\": \"重复: 关闭\",\n  \"repeat_one\": \"重复: 当前文件\",\n  \"retry\": \"重试\",\n  \"save\": \"保存\",\n  \"screen_orientation\": \"屏幕方向\",\n  \"select_language\": \"选择语言\",\n  \"settings\": \"设置\",\n  \"shuffle\": \"随机\",\n  \"size\": \"大小\",\n  \"sort\": \"排序\",\n  \"source_code\": \"源码\",\n  \"stop\": \"停止\",\n  \"storage\": \"存储\",\n  \"stretch\": \"拉伸\",\n  \"subtitle\": \"字幕\",\n  \"subtitle_and_audio_track\": \"字幕和音轨\",\n  \"subtitle_file_does_not_exist\": \"字幕文件不存在\",\n  \"system\": \"系统\",\n  \"test_connection\": \"测试连接\",\n  \"theme_mode\": \"主题模式\",\n  \"unable_to_fetch_files\": \"无法获取文件\",\n  \"unmute\": \"取消静音\",\n  \"url\": \"URL\",\n  \"usb_storage\": \"USB 存储\",\n  \"username\": \"用户名\",\n  \"version\": \"版本\",\n  \"video\": \"视频\",\n  \"video_zoom\": \"视频缩放\",\n  \"volume\": \"音量\"\n}"
  },
  {
    "path": "lib/l10n/iso_639.dart",
    "content": "class Info {\n  final List<String> en;\n\n  const Info({required this.en});\n}\n\nconst Map<String, Info> customLanguageCodes = {\n  'chs': Info(en: ['Chinese (Simplified)']),\n  'cht': Info(en: ['Chinese (Traditional)']),\n};\n\nconst Map<String, Info> iso_639_1 = {\n  'aa': Info(en: ['Afar']),\n  'ab': Info(en: ['Abkhazian']),\n  'ae': Info(en: ['Avestan']),\n  'af': Info(en: ['Afrikaans']),\n  'ak': Info(en: ['Akan']),\n  'am': Info(en: ['Amharic']),\n  'an': Info(en: ['Aragonese']),\n  'ar': Info(en: ['Arabic']),\n  'as': Info(en: ['Assamese']),\n  'av': Info(en: ['Avaric']),\n  'ay': Info(en: ['Aymara']),\n  'az': Info(en: ['Azerbaijani']),\n  'ba': Info(en: ['Bashkir']),\n  'be': Info(en: ['Belarusian']),\n  'bg': Info(en: ['Bulgarian']),\n  'bh': Info(en: ['Bihari languages']),\n  'bi': Info(en: ['Bislama']),\n  'bm': Info(en: ['Bambara']),\n  'bn': Info(en: ['Bengali']),\n  'bo': Info(en: ['Tibetan']),\n  'br': Info(en: ['Breton']),\n  'bs': Info(en: ['Bosnian']),\n  'ca': Info(en: ['Catalan', 'Valencian']),\n  'ce': Info(en: ['Chechen']),\n  'ch': Info(en: ['Chamorro']),\n  'co': Info(en: ['Corsican']),\n  'cr': Info(en: ['Cree']),\n  'cs': Info(en: ['Czech']),\n  'cu': Info(en: [\n    'Church Slavic',\n    'Old Slavonic',\n    'Church Slavonic',\n    'Old Bulgarian',\n    'Old Church Slavonic'\n  ]),\n  'cv': Info(en: ['Chuvash']),\n  'cy': Info(en: ['Welsh']),\n  'da': Info(en: ['Danish']),\n  'de': Info(en: ['German']),\n  'dv': Info(en: ['Divehi', 'Dhivehi', 'Maldivian']),\n  'dz': Info(en: ['Dzongkha']),\n  'ee': Info(en: ['Ewe']),\n  'el': Info(en: ['Greek, Modern (1453-)']),\n  'en': Info(en: ['English']),\n  'eo': Info(en: ['Esperanto']),\n  'es': Info(en: ['Spanish', 'Castilian']),\n  'et': Info(en: ['Estonian']),\n  'eu': Info(en: ['Basque']),\n  'fa': Info(en: ['Persian']),\n  'ff': Info(en: ['Fulah']),\n  'fi': Info(en: ['Finnish']),\n  'fj': Info(en: ['Fijian']),\n  'fo': Info(en: ['Faroese']),\n  'fr': Info(en: ['French']),\n  'fy': Info(en: ['Western Frisian']),\n  'ga': Info(en: ['Irish']),\n  'gd': Info(en: ['Gaelic', 'Scottish Gaelic']),\n  'gl': Info(en: ['Galician']),\n  'gn': Info(en: ['Guarani']),\n  'gu': Info(en: ['Gujarati']),\n  'gv': Info(en: ['Manx']),\n  'ha': Info(en: ['Hausa']),\n  'he': Info(en: ['Hebrew']),\n  'hi': Info(en: ['Hindi']),\n  'ho': Info(en: ['Hiri Motu']),\n  'hr': Info(en: ['Croatian']),\n  'ht': Info(en: ['Haitian', 'Haitian Creole']),\n  'hu': Info(en: ['Hungarian']),\n  'hy': Info(en: ['Armenian']),\n  'hz': Info(en: ['Herero']),\n  'ia':\n      Info(en: ['Interlingua (International Auxiliary Language Association)']),\n  'id': Info(en: ['Indonesian']),\n  'ie': Info(en: ['Interlingue', 'Occidental']),\n  'ig': Info(en: ['Igbo']),\n  'ii': Info(en: ['Sichuan Yi', 'Nuosu']),\n  'ik': Info(en: ['Inupiaq']),\n  'io': Info(en: ['Ido']),\n  'is': Info(en: ['Icelandic']),\n  'it': Info(en: ['Italian']),\n  'iu': Info(en: ['Inuktitut']),\n  'ja': Info(en: ['Japanese']),\n  'jv': Info(en: ['Javanese']),\n  'ka': Info(en: ['Georgian']),\n  'kg': Info(en: ['Kongo']),\n  'ki': Info(en: ['Kikuyu', 'Gikuyu']),\n  'kj': Info(en: ['Kuanyama', 'Kwanyama']),\n  'kk': Info(en: ['Kazakh']),\n  'kl': Info(en: ['Kalaallisut', 'Greenlandic']),\n  'km': Info(en: ['Central Khmer']),\n  'kn': Info(en: ['Kannada']),\n  'ko': Info(en: ['Korean']),\n  'kr': Info(en: ['Kanuri']),\n  'ks': Info(en: ['Kashmiri']),\n  'ku': Info(en: ['Kurdish']),\n  'kv': Info(en: ['Komi']),\n  'kw': Info(en: ['Cornish']),\n  'ky': Info(en: ['Kirghiz', 'Kyrgyz']),\n  'la': Info(en: ['Latin']),\n  'lb': Info(en: ['Luxembourgish', 'Letzeburgesch']),\n  'lg': Info(en: ['Ganda']),\n  'li': Info(en: ['Limburgan', 'Limburger', 'Limburgish']),\n  'ln': Info(en: ['Lingala']),\n  'lo': Info(en: ['Lao']),\n  'lt': Info(en: ['Lithuanian']),\n  'lu': Info(en: ['Luba-Katanga']),\n  'lv': Info(en: ['Latvian']),\n  'mg': Info(en: ['Malagasy']),\n  'mh': Info(en: ['Marshallese']),\n  'mi': Info(en: ['Maori']),\n  'mk': Info(en: ['Macedonian']),\n  'ml': Info(en: ['Malayalam']),\n  'mn': Info(en: ['Mongolian']),\n  'mr': Info(en: ['Marathi']),\n  'ms': Info(en: ['Malay']),\n  'mt': Info(en: ['Maltese']),\n  'my': Info(en: ['Burmese']),\n  'na': Info(en: ['Nauru']),\n  'nb': Info(en: ['Bokmål, Norwegian', 'Norwegian Bokmål']),\n  'nd': Info(en: ['Ndebele, North', 'North Ndebele']),\n  'ne': Info(en: ['Nepali']),\n  'ng': Info(en: ['Ndonga']),\n  'nl': Info(en: ['Dutch', 'Flemish']),\n  'nn': Info(en: ['Norwegian Nynorsk', 'Nynorsk, Norwegian']),\n  'no': Info(en: ['Norwegian']),\n  'nr': Info(en: ['Ndebele, South', 'South Ndebele']),\n  'nv': Info(en: ['Navajo', 'Navaho']),\n  'ny': Info(en: ['Chichewa', 'Chewa', 'Nyanja']),\n  'oc': Info(en: ['Occitan (post 1500)']),\n  'oj': Info(en: ['Ojibwa']),\n  'om': Info(en: ['Oromo']),\n  'or': Info(en: ['Oriya']),\n  'os': Info(en: ['Ossetian', 'Ossetic']),\n  'pa': Info(en: ['Panjabi', 'Punjabi']),\n  'pi': Info(en: ['Pali']),\n  'pl': Info(en: ['Polish']),\n  'ps': Info(en: ['Pushto', 'Pashto']),\n  'pt': Info(en: ['Portuguese']),\n  'qu': Info(en: ['Quechua']),\n  'rm': Info(en: ['Romansh']),\n  'rn': Info(en: ['Rundi']),\n  'ro': Info(en: ['Romanian', 'Moldavian', 'Moldovan']),\n  'ru': Info(en: ['Russian']),\n  'rw': Info(en: ['Kinyarwanda']),\n  'sa': Info(en: ['Sanskrit']),\n  'sc': Info(en: ['Sardinian']),\n  'sd': Info(en: ['Sindhi']),\n  'se': Info(en: ['Northern Sami']),\n  'sg': Info(en: ['Sango']),\n  'si': Info(en: ['Sinhala', 'Sinhalese']),\n  'sk': Info(en: ['Slovak']),\n  'sl': Info(en: ['Slovenian']),\n  'sm': Info(en: ['Samoan']),\n  'sn': Info(en: ['Shona']),\n  'so': Info(en: ['Somali']),\n  'sq': Info(en: ['Albanian']),\n  'sr': Info(en: ['Serbian']),\n  'ss': Info(en: ['Swati']),\n  'st': Info(en: ['Sotho, Southern']),\n  'su': Info(en: ['Sundanese']),\n  'sv': Info(en: ['Swedish']),\n  'sw': Info(en: ['Swahili']),\n  'ta': Info(en: ['Tamil']),\n  'te': Info(en: ['Telugu']),\n  'tg': Info(en: ['Tajik']),\n  'th': Info(en: ['Thai']),\n  'ti': Info(en: ['Tigrinya']),\n  'tk': Info(en: ['Turkmen']),\n  'tl': Info(en: ['Tagalog']),\n  'tn': Info(en: ['Tswana']),\n  'to': Info(en: ['Tonga (Tonga Islands)']),\n  'tr': Info(en: ['Turkish']),\n  'ts': Info(en: ['Tsonga']),\n  'tt': Info(en: ['Tatar']),\n  'tw': Info(en: ['Twi']),\n  'ty': Info(en: ['Tahitian']),\n  'ug': Info(en: ['Uighur', 'Uyghur']),\n  'uk': Info(en: ['Ukrainian']),\n  'ur': Info(en: ['Urdu']),\n  'uz': Info(en: ['Uzbek']),\n  've': Info(en: ['Venda']),\n  'vi': Info(en: ['Vietnamese']),\n  'vo': Info(en: ['Volapük']),\n  'wa': Info(en: ['Walloon']),\n  'wo': Info(en: ['Wolof']),\n  'xh': Info(en: ['Xhosa']),\n  'yi': Info(en: ['Yiddish']),\n  'yo': Info(en: ['Yoruba']),\n  'za': Info(en: ['Zhuang', 'Chuang']),\n  'zh': Info(en: ['Chinese']),\n  'zu': Info(en: ['Zulu']),\n};\n\nconst Map<String, Info> iso_639_2 = {\n  'aar': Info(en: ['Afar']),\n  'abk': Info(en: ['Abkhazian']),\n  'ace': Info(en: ['Achinese']),\n  'ach': Info(en: ['Acoli']),\n  'ada': Info(en: ['Adangme']),\n  'ady': Info(en: ['Adyghe', 'Adygei']),\n  'afa': Info(en: ['Afro-Asiatic languages']),\n  'afh': Info(en: ['Afrihili']),\n  'afr': Info(en: ['Afrikaans']),\n  'ain': Info(en: ['Ainu']),\n  'aka': Info(en: ['Akan']),\n  'akk': Info(en: ['Akkadian']),\n  'alb': Info(en: ['Albanian']),\n  'ale': Info(en: ['Aleut']),\n  'alg': Info(en: ['Algonquian languages']),\n  'alt': Info(en: ['Southern Altai']),\n  'amh': Info(en: ['Amharic']),\n  'ang': Info(en: ['English, Old (ca.450-1100)']),\n  'anp': Info(en: ['Angika']),\n  'apa': Info(en: ['Apache languages']),\n  'ara': Info(en: ['Arabic']),\n  'arc': Info(\n      en: ['Official Aramaic (700-300 BCE)', 'Imperial Aramaic (700-300 BCE)']),\n  'arg': Info(en: ['Aragonese']),\n  'arm': Info(en: ['Armenian']),\n  'arn': Info(en: ['Mapudungun', 'Mapuche']),\n  'arp': Info(en: ['Arapaho']),\n  'art': Info(en: ['Artificial languages']),\n  'arw': Info(en: ['Arawak']),\n  'asm': Info(en: ['Assamese']),\n  'ast': Info(en: ['Asturian', 'Bable', 'Leonese', 'Asturleonese']),\n  'ath': Info(en: ['Athapascan languages']),\n  'aus': Info(en: ['Australian languages']),\n  'ava': Info(en: ['Avaric']),\n  'ave': Info(en: ['Avestan']),\n  'awa': Info(en: ['Awadhi']),\n  'aym': Info(en: ['Aymara']),\n  'aze': Info(en: ['Azerbaijani']),\n  'bad': Info(en: ['Banda languages']),\n  'bai': Info(en: ['Bamileke languages']),\n  'bak': Info(en: ['Bashkir']),\n  'bal': Info(en: ['Baluchi']),\n  'bam': Info(en: ['Bambara']),\n  'ban': Info(en: ['Balinese']),\n  'baq': Info(en: ['Basque']),\n  'bas': Info(en: ['Basa']),\n  'bat': Info(en: ['Baltic languages']),\n  'bej': Info(en: ['Beja', 'Bedawiyet']),\n  'bel': Info(en: ['Belarusian']),\n  'bem': Info(en: ['Bemba']),\n  'ben': Info(en: ['Bengali']),\n  'ber': Info(en: ['Berber languages']),\n  'bho': Info(en: ['Bhojpuri']),\n  'bih': Info(en: ['Bihari languages']),\n  'bik': Info(en: ['Bikol']),\n  'bin': Info(en: ['Bini', 'Edo']),\n  'bis': Info(en: ['Bislama']),\n  'bla': Info(en: ['Siksika']),\n  'bnt': Info(en: ['Bantu languages']),\n  'bod': Info(en: ['Tibetan']),\n  'bos': Info(en: ['Bosnian']),\n  'bra': Info(en: ['Braj']),\n  'bre': Info(en: ['Breton']),\n  'btk': Info(en: ['Batak languages']),\n  'bua': Info(en: ['Buriat']),\n  'bug': Info(en: ['Buginese']),\n  'bul': Info(en: ['Bulgarian']),\n  'bur': Info(en: ['Burmese']),\n  'byn': Info(en: ['Blin', 'Bilin']),\n  'cad': Info(en: ['Caddo']),\n  'cai': Info(en: ['Central American Indian languages']),\n  'car': Info(en: ['Galibi Carib']),\n  'cat': Info(en: ['Catalan', 'Valencian']),\n  'cau': Info(en: ['Caucasian languages']),\n  'ceb': Info(en: ['Cebuano']),\n  'cel': Info(en: ['Celtic languages']),\n  'ces': Info(en: ['Czech']),\n  'cha': Info(en: ['Chamorro']),\n  'chb': Info(en: ['Chibcha']),\n  'che': Info(en: ['Chechen']),\n  'chg': Info(en: ['Chagatai']),\n  'chi': Info(en: ['Chinese']),\n  'chk': Info(en: ['Chuukese']),\n  'chm': Info(en: ['Mari']),\n  'chn': Info(en: ['Chinook jargon']),\n  'cho': Info(en: ['Choctaw']),\n  'chp': Info(en: ['Chipewyan', 'Dene Suline']),\n  'chr': Info(en: ['Cherokee']),\n  'chu': Info(en: [\n    'Church Slavic',\n    'Old Slavonic',\n    'Church Slavonic',\n    'Old Bulgarian',\n    'Old Church Slavonic'\n  ]),\n  'chv': Info(en: ['Chuvash']),\n  'chy': Info(en: ['Cheyenne']),\n  'cmc': Info(en: ['Chamic languages']),\n  'cop': Info(en: ['Coptic']),\n  'cor': Info(en: ['Cornish']),\n  'cos': Info(en: ['Corsican']),\n  'cpe': Info(en: ['Creoles and pidgins, English based']),\n  'cpf': Info(en: ['Creoles and pidgins, French-based']),\n  'cpp': Info(en: ['Creoles and pidgins, Portuguese-based']),\n  'cre': Info(en: ['Cree']),\n  'crh': Info(en: ['Crimean Tatar', 'Crimean Turkish']),\n  'crp': Info(en: ['Creoles and pidgins']),\n  'csb': Info(en: ['Kashubian']),\n  'cus': Info(en: ['Cushitic languages']),\n  'cym': Info(en: ['Welsh']),\n  'cze': Info(en: ['Czech']),\n  'dak': Info(en: ['Dakota']),\n  'dan': Info(en: ['Danish']),\n  'dar': Info(en: ['Dargwa']),\n  'day': Info(en: ['Land Dayak languages']),\n  'del': Info(en: ['Delaware']),\n  'den': Info(en: ['Slave (Athapascan)']),\n  'deu': Info(en: ['German']),\n  'dgr': Info(en: ['Dogrib']),\n  'din': Info(en: ['Dinka']),\n  'div': Info(en: ['Divehi', 'Dhivehi', 'Maldivian']),\n  'doi': Info(en: ['Dogri']),\n  'dra': Info(en: ['Dravidian languages']),\n  'dsb': Info(en: ['Lower Sorbian']),\n  'dua': Info(en: ['Duala']),\n  'dum': Info(en: ['Dutch, Middle (ca.1050-1350)']),\n  'dut': Info(en: ['Dutch', 'Flemish']),\n  'dyu': Info(en: ['Dyula']),\n  'dzo': Info(en: ['Dzongkha']),\n  'efi': Info(en: ['Efik']),\n  'egy': Info(en: ['Egyptian (Ancient)']),\n  'eka': Info(en: ['Ekajuk']),\n  'ell': Info(en: ['Greek, Modern (1453-)']),\n  'elx': Info(en: ['Elamite']),\n  'eng': Info(en: ['English']),\n  'enm': Info(en: ['English, Middle (1100-1500)']),\n  'epo': Info(en: ['Esperanto']),\n  'est': Info(en: ['Estonian']),\n  'eus': Info(en: ['Basque']),\n  'ewe': Info(en: ['Ewe']),\n  'ewo': Info(en: ['Ewondo']),\n  'fan': Info(en: ['Fang']),\n  'fao': Info(en: ['Faroese']),\n  'fas': Info(en: ['Persian']),\n  'fat': Info(en: ['Fanti']),\n  'fij': Info(en: ['Fijian']),\n  'fil': Info(en: ['Filipino', 'Pilipino']),\n  'fin': Info(en: ['Finnish']),\n  'fiu': Info(en: ['Finno-Ugrian languages']),\n  'fon': Info(en: ['Fon']),\n  'fra': Info(en: ['French']),\n  'fre': Info(en: ['French']),\n  'frm': Info(en: ['French, Middle (ca.1400-1600)']),\n  'fro': Info(en: ['French, Old (842-ca.1400)']),\n  'frr': Info(en: ['Northern Frisian']),\n  'frs': Info(en: ['Eastern Frisian']),\n  'fry': Info(en: ['Western Frisian']),\n  'ful': Info(en: ['Fulah']),\n  'fur': Info(en: ['Friulian']),\n  'gaa': Info(en: ['Ga']),\n  'gay': Info(en: ['Gayo']),\n  'gba': Info(en: ['Gbaya']),\n  'gem': Info(en: ['Germanic languages']),\n  'geo': Info(en: ['Georgian']),\n  'ger': Info(en: ['German']),\n  'gez': Info(en: ['Geez']),\n  'gil': Info(en: ['Gilbertese']),\n  'gla': Info(en: ['Gaelic', 'Scottish Gaelic']),\n  'gle': Info(en: ['Irish']),\n  'glg': Info(en: ['Galician']),\n  'glv': Info(en: ['Manx']),\n  'gmh': Info(en: ['German, Middle High (ca.1050-1500)']),\n  'goh': Info(en: ['German, Old High (ca.750-1050)']),\n  'gon': Info(en: ['Gondi']),\n  'gor': Info(en: ['Gorontalo']),\n  'got': Info(en: ['Gothic']),\n  'grb': Info(en: ['Grebo']),\n  'grc': Info(en: ['Greek, Ancient (to 1453)']),\n  'gre': Info(en: ['Greek, Modern (1453-)']),\n  'grn': Info(en: ['Guarani']),\n  'gsw': Info(en: ['Swiss German', 'Alemannic', 'Alsatian']),\n  'guj': Info(en: ['Gujarati']),\n  'gwi': Info(en: ['Gwich\\'in']),\n  'hai': Info(en: ['Haida']),\n  'hat': Info(en: ['Haitian', 'Haitian Creole']),\n  'hau': Info(en: ['Hausa']),\n  'haw': Info(en: ['Hawaiian']),\n  'heb': Info(en: ['Hebrew']),\n  'her': Info(en: ['Herero']),\n  'hil': Info(en: ['Hiligaynon']),\n  'him': Info(en: ['Himachali languages', 'Western Pahari languages']),\n  'hin': Info(en: ['Hindi']),\n  'hit': Info(en: ['Hittite']),\n  'hmn': Info(en: ['Hmong', 'Mong']),\n  'hmo': Info(en: ['Hiri Motu']),\n  'hrv': Info(en: ['Croatian']),\n  'hsb': Info(en: ['Upper Sorbian']),\n  'hun': Info(en: ['Hungarian']),\n  'hup': Info(en: ['Hupa']),\n  'hye': Info(en: ['Armenian']),\n  'iba': Info(en: ['Iban']),\n  'ibo': Info(en: ['Igbo']),\n  'ice': Info(en: ['Icelandic']),\n  'ido': Info(en: ['Ido']),\n  'iii': Info(en: ['Sichuan Yi', 'Nuosu']),\n  'ijo': Info(en: ['Ijo languages']),\n  'iku': Info(en: ['Inuktitut']),\n  'ile': Info(en: ['Interlingue', 'Occidental']),\n  'ilo': Info(en: ['Iloko']),\n  'ina':\n      Info(en: ['Interlingua (International Auxiliary Language Association)']),\n  'inc': Info(en: ['Indic languages']),\n  'ind': Info(en: ['Indonesian']),\n  'ine': Info(en: ['Indo-European languages']),\n  'inh': Info(en: ['Ingush']),\n  'ipk': Info(en: ['Inupiaq']),\n  'ira': Info(en: ['Iranian languages']),\n  'iro': Info(en: ['Iroquoian languages']),\n  'isl': Info(en: ['Icelandic']),\n  'ita': Info(en: ['Italian']),\n  'jav': Info(en: ['Javanese']),\n  'jbo': Info(en: ['Lojban']),\n  'jpn': Info(en: ['Japanese']),\n  'jpr': Info(en: ['Judeo-Persian']),\n  'jrb': Info(en: ['Judeo-Arabic']),\n  'kaa': Info(en: ['Kara-Kalpak']),\n  'kab': Info(en: ['Kabyle']),\n  'kac': Info(en: ['Kachin', 'Jingpho']),\n  'kal': Info(en: ['Kalaallisut', 'Greenlandic']),\n  'kam': Info(en: ['Kamba']),\n  'kan': Info(en: ['Kannada']),\n  'kar': Info(en: ['Karen languages']),\n  'kas': Info(en: ['Kashmiri']),\n  'kat': Info(en: ['Georgian']),\n  'kau': Info(en: ['Kanuri']),\n  'kaw': Info(en: ['Kawi']),\n  'kaz': Info(en: ['Kazakh']),\n  'kbd': Info(en: ['Kabardian']),\n  'kha': Info(en: ['Khasi']),\n  'khi': Info(en: ['Khoisan languages']),\n  'khm': Info(en: ['Central Khmer']),\n  'kho': Info(en: ['Khotanese', 'Sakan']),\n  'kik': Info(en: ['Kikuyu', 'Gikuyu']),\n  'kin': Info(en: ['Kinyarwanda']),\n  'kir': Info(en: ['Kirghiz', 'Kyrgyz']),\n  'kmb': Info(en: ['Kimbundu']),\n  'kok': Info(en: ['Konkani']),\n  'kom': Info(en: ['Komi']),\n  'kon': Info(en: ['Kongo']),\n  'kor': Info(en: ['Korean']),\n  'kos': Info(en: ['Kosraean']),\n  'kpe': Info(en: ['Kpelle']),\n  'krc': Info(en: ['Karachay-Balkar']),\n  'krl': Info(en: ['Karelian']),\n  'kro': Info(en: ['Kru languages']),\n  'kru': Info(en: ['Kurukh']),\n  'kua': Info(en: ['Kuanyama', 'Kwanyama']),\n  'kum': Info(en: ['Kumyk']),\n  'kur': Info(en: ['Kurdish']),\n  'kut': Info(en: ['Kutenai']),\n  'lad': Info(en: ['Ladino']),\n  'lah': Info(en: ['Lahnda']),\n  'lam': Info(en: ['Lamba']),\n  'lao': Info(en: ['Lao']),\n  'lat': Info(en: ['Latin']),\n  'lav': Info(en: ['Latvian']),\n  'lez': Info(en: ['Lezghian']),\n  'lim': Info(en: ['Limburgan', 'Limburger', 'Limburgish']),\n  'lin': Info(en: ['Lingala']),\n  'lit': Info(en: ['Lithuanian']),\n  'lol': Info(en: ['Mongo']),\n  'loz': Info(en: ['Lozi']),\n  'ltz': Info(en: ['Luxembourgish', 'Letzeburgesch']),\n  'lua': Info(en: ['Luba-Lulua']),\n  'lub': Info(en: ['Luba-Katanga']),\n  'lug': Info(en: ['Ganda']),\n  'lui': Info(en: ['Luiseno']),\n  'lun': Info(en: ['Lunda']),\n  'luo': Info(en: ['Luo (Kenya and Tanzania)']),\n  'lus': Info(en: ['Lushai']),\n  'mac': Info(en: ['Macedonian']),\n  'mad': Info(en: ['Madurese']),\n  'mag': Info(en: ['Magahi']),\n  'mah': Info(en: ['Marshallese']),\n  'mai': Info(en: ['Maithili']),\n  'mak': Info(en: ['Makasar']),\n  'mal': Info(en: ['Malayalam']),\n  'man': Info(en: ['Mandingo']),\n  'mao': Info(en: ['Maori']),\n  'map': Info(en: ['Austronesian languages']),\n  'mar': Info(en: ['Marathi']),\n  'mas': Info(en: ['Masai']),\n  'may': Info(en: ['Malay']),\n  'mdf': Info(en: ['Moksha']),\n  'mdr': Info(en: ['Mandar']),\n  'men': Info(en: ['Mende']),\n  'mga': Info(en: ['Irish, Middle (900-1200)']),\n  'mic': Info(en: ['Mi\\'kmaq', 'Micmac']),\n  'min': Info(en: ['Minangkabau']),\n  'mis': Info(en: ['Uncoded languages']),\n  'mkd': Info(en: ['Macedonian']),\n  'mkh': Info(en: ['Mon-Khmer languages']),\n  'mlg': Info(en: ['Malagasy']),\n  'mlt': Info(en: ['Maltese']),\n  'mnc': Info(en: ['Manchu']),\n  'mni': Info(en: ['Manipuri']),\n  'mno': Info(en: ['Manobo languages']),\n  'moh': Info(en: ['Mohawk']),\n  'mon': Info(en: ['Mongolian']),\n  'mos': Info(en: ['Mossi']),\n  'mri': Info(en: ['Maori']),\n  'msa': Info(en: ['Malay']),\n  'mul': Info(en: ['Multiple languages']),\n  'mun': Info(en: ['Munda languages']),\n  'mus': Info(en: ['Creek']),\n  'mwl': Info(en: ['Mirandese']),\n  'mwr': Info(en: ['Marwari']),\n  'mya': Info(en: ['Burmese']),\n  'myn': Info(en: ['Mayan languages']),\n  'myv': Info(en: ['Erzya']),\n  'nah': Info(en: ['Nahuatl languages']),\n  'nai': Info(en: ['North American Indian languages']),\n  'nap': Info(en: ['Neapolitan']),\n  'nau': Info(en: ['Nauru']),\n  'nav': Info(en: ['Navajo', 'Navaho']),\n  'nbl': Info(en: ['Ndebele, South', 'South Ndebele']),\n  'nde': Info(en: ['Ndebele, North', 'North Ndebele']),\n  'ndo': Info(en: ['Ndonga']),\n  'nds': Info(en: ['Low German', 'Low Saxon', 'German, Low', 'Saxon, Low']),\n  'nep': Info(en: ['Nepali']),\n  'new': Info(en: ['Nepal Bhasa', 'Newari']),\n  'nia': Info(en: ['Nias']),\n  'nic': Info(en: ['Niger-Kordofanian languages']),\n  'niu': Info(en: ['Niuean']),\n  'nld': Info(en: ['Dutch', 'Flemish']),\n  'nno': Info(en: ['Norwegian Nynorsk', 'Nynorsk, Norwegian']),\n  'nob': Info(en: ['Bokmål, Norwegian', 'Norwegian Bokmål']),\n  'nog': Info(en: ['Nogai']),\n  'non': Info(en: ['Norse, Old']),\n  'nor': Info(en: ['Norwegian']),\n  'nqo': Info(en: ['N\\'Ko']),\n  'nso': Info(en: ['Pedi', 'Sepedi', 'Northern Sotho']),\n  'nub': Info(en: ['Nubian languages']),\n  'nwc': Info(en: ['Classical Newari', 'Old Newari', 'Classical Nepal Bhasa']),\n  'nya': Info(en: ['Chichewa', 'Chewa', 'Nyanja']),\n  'nym': Info(en: ['Nyamwezi']),\n  'nyn': Info(en: ['Nyankole']),\n  'nyo': Info(en: ['Nyoro']),\n  'nzi': Info(en: ['Nzima']),\n  'oci': Info(en: ['Occitan (post 1500)']),\n  'oji': Info(en: ['Ojibwa']),\n  'ori': Info(en: ['Oriya']),\n  'orm': Info(en: ['Oromo']),\n  'osa': Info(en: ['Osage']),\n  'oss': Info(en: ['Ossetian', 'Ossetic']),\n  'ota': Info(en: ['Turkish, Ottoman (1500-1928)']),\n  'oto': Info(en: ['Otomian languages']),\n  'paa': Info(en: ['Papuan languages']),\n  'pag': Info(en: ['Pangasinan']),\n  'pal': Info(en: ['Pahlavi']),\n  'pam': Info(en: ['Pampanga', 'Kapampangan']),\n  'pan': Info(en: ['Panjabi', 'Punjabi']),\n  'pap': Info(en: ['Papiamento']),\n  'pau': Info(en: ['Palauan']),\n  'peo': Info(en: ['Persian, Old (ca.600-400 B.C.)']),\n  'per': Info(en: ['Persian']),\n  'phi': Info(en: ['Philippine languages']),\n  'phn': Info(en: ['Phoenician']),\n  'pli': Info(en: ['Pali']),\n  'pol': Info(en: ['Polish']),\n  'pon': Info(en: ['Pohnpeian']),\n  'por': Info(en: ['Portuguese']),\n  'pra': Info(en: ['Prakrit languages']),\n  'pro': Info(en: ['Provençal, Old (to 1500)', 'Occitan, Old (to 1500)']),\n  'pus': Info(en: ['Pushto', 'Pashto']),\n  'que': Info(en: ['Quechua']),\n  'raj': Info(en: ['Rajasthani']),\n  'rap': Info(en: ['Rapanui']),\n  'rar': Info(en: ['Rarotongan', 'Cook Islands Maori']),\n  'roa': Info(en: ['Romance languages']),\n  'roh': Info(en: ['Romansh']),\n  'rom': Info(en: ['Romany']),\n  'ron': Info(en: ['Romanian', 'Moldavian', 'Moldovan']),\n  'rum': Info(en: ['Romanian', 'Moldavian', 'Moldovan']),\n  'run': Info(en: ['Rundi']),\n  'rup': Info(en: ['Aromanian', 'Arumanian', 'Macedo-Romanian']),\n  'rus': Info(en: ['Russian']),\n  'sad': Info(en: ['Sandawe']),\n  'sag': Info(en: ['Sango']),\n  'sah': Info(en: ['Yakut']),\n  'sai': Info(en: ['South American Indian languages']),\n  'sal': Info(en: ['Salishan languages']),\n  'sam': Info(en: ['Samaritan Aramaic']),\n  'san': Info(en: ['Sanskrit']),\n  'sas': Info(en: ['Sasak']),\n  'sat': Info(en: ['Santali']),\n  'scn': Info(en: ['Sicilian']),\n  'sco': Info(en: ['Scots']),\n  'sel': Info(en: ['Selkup']),\n  'sem': Info(en: ['Semitic languages']),\n  'sga': Info(en: ['Irish, Old (to 900)']),\n  'sgn': Info(en: ['Sign Languages']),\n  'shn': Info(en: ['Shan']),\n  'sid': Info(en: ['Sidamo']),\n  'sin': Info(en: ['Sinhala', 'Sinhalese']),\n  'sio': Info(en: ['Siouan languages']),\n  'sit': Info(en: ['Sino-Tibetan languages']),\n  'sla': Info(en: ['Slavic languages']),\n  'slk': Info(en: ['Slovak']),\n  'slo': Info(en: ['Slovak']),\n  'slv': Info(en: ['Slovenian']),\n  'sma': Info(en: ['Southern Sami']),\n  'sme': Info(en: ['Northern Sami']),\n  'smi': Info(en: ['Sami languages']),\n  'smj': Info(en: ['Lule Sami']),\n  'smn': Info(en: ['Inari Sami']),\n  'smo': Info(en: ['Samoan']),\n  'sms': Info(en: ['Skolt Sami']),\n  'sna': Info(en: ['Shona']),\n  'snd': Info(en: ['Sindhi']),\n  'snk': Info(en: ['Soninke']),\n  'sog': Info(en: ['Sogdian']),\n  'som': Info(en: ['Somali']),\n  'son': Info(en: ['Songhai languages']),\n  'sot': Info(en: ['Sotho, Southern']),\n  'spa': Info(en: ['Spanish', 'Castilian']),\n  'sqi': Info(en: ['Albanian']),\n  'srd': Info(en: ['Sardinian']),\n  'srn': Info(en: ['Sranan Tongo']),\n  'srp': Info(en: ['Serbian']),\n  'srr': Info(en: ['Serer']),\n  'ssa': Info(en: ['Nilo-Saharan languages']),\n  'ssw': Info(en: ['Swati']),\n  'suk': Info(en: ['Sukuma']),\n  'sun': Info(en: ['Sundanese']),\n  'sus': Info(en: ['Susu']),\n  'sux': Info(en: ['Sumerian']),\n  'swa': Info(en: ['Swahili']),\n  'swe': Info(en: ['Swedish']),\n  'syc': Info(en: ['Classical Syriac']),\n  'syr': Info(en: ['Syriac']),\n  'tah': Info(en: ['Tahitian']),\n  'tai': Info(en: ['Tai languages']),\n  'tam': Info(en: ['Tamil']),\n  'tat': Info(en: ['Tatar']),\n  'tel': Info(en: ['Telugu']),\n  'tem': Info(en: ['Timne']),\n  'ter': Info(en: ['Tereno']),\n  'tet': Info(en: ['Tetum']),\n  'tgk': Info(en: ['Tajik']),\n  'tgl': Info(en: ['Tagalog']),\n  'tha': Info(en: ['Thai']),\n  'tib': Info(en: ['Tibetan']),\n  'tig': Info(en: ['Tigre']),\n  'tir': Info(en: ['Tigrinya']),\n  'tiv': Info(en: ['Tiv']),\n  'tkl': Info(en: ['Tokelau']),\n  'tlh': Info(en: ['Klingon', 'tlhIngan-Hol']),\n  'tli': Info(en: ['Tlingit']),\n  'tmh': Info(en: ['Tamashek']),\n  'tog': Info(en: ['Tonga (Nyasa)']),\n  'ton': Info(en: ['Tonga (Tonga Islands)']),\n  'tpi': Info(en: ['Tok Pisin']),\n  'tsi': Info(en: ['Tsimshian']),\n  'tsn': Info(en: ['Tswana']),\n  'tso': Info(en: ['Tsonga']),\n  'tuk': Info(en: ['Turkmen']),\n  'tum': Info(en: ['Tumbuka']),\n  'tup': Info(en: ['Tupi languages']),\n  'tur': Info(en: ['Turkish']),\n  'tut': Info(en: ['Altaic languages']),\n  'tvl': Info(en: ['Tuvalu']),\n  'twi': Info(en: ['Twi']),\n  'tyv': Info(en: ['Tuvinian']),\n  'udm': Info(en: ['Udmurt']),\n  'uga': Info(en: ['Ugaritic']),\n  'uig': Info(en: ['Uighur', 'Uyghur']),\n  'ukr': Info(en: ['Ukrainian']),\n  'umb': Info(en: ['Umbundu']),\n  'und': Info(en: ['Undetermined']),\n  'urd': Info(en: ['Urdu']),\n  'uzb': Info(en: ['Uzbek']),\n  'vai': Info(en: ['Vai']),\n  'ven': Info(en: ['Venda']),\n  'vie': Info(en: ['Vietnamese']),\n  'vol': Info(en: ['Volapük']),\n  'vot': Info(en: ['Votic']),\n  'wak': Info(en: ['Wakashan languages']),\n  'wal': Info(en: ['Wolaitta', 'Wolaytta']),\n  'war': Info(en: ['Waray']),\n  'was': Info(en: ['Washo']),\n  'wel': Info(en: ['Welsh']),\n  'wen': Info(en: ['Sorbian languages']),\n  'wln': Info(en: ['Walloon']),\n  'wol': Info(en: ['Wolof']),\n  'xal': Info(en: ['Kalmyk', 'Oirat']),\n  'xho': Info(en: ['Xhosa']),\n  'yao': Info(en: ['Yao']),\n  'yap': Info(en: ['Yapese']),\n  'yid': Info(en: ['Yiddish']),\n  'yor': Info(en: ['Yoruba']),\n  'ypk': Info(en: ['Yupik languages']),\n  'zap': Info(en: ['Zapotec']),\n  'zbl': Info(en: ['Blissymbols', 'Blissymbolics', 'Bliss']),\n  'zen': Info(en: ['Zenaga']),\n  'zgh': Info(en: ['Standard Moroccan Tamazight']),\n  'zha': Info(en: ['Zhuang', 'Chuang']),\n  'zho': Info(en: ['Chinese']),\n  'znd': Info(en: ['Zande languages']),\n  'zul': Info(en: ['Zulu']),\n  'zun': Info(en: ['Zuni']),\n  'zxx': Info(en: ['No linguistic content', 'Not applicable']),\n  'zza': Info(en: ['Zaza', 'Dimili', 'Dimli', 'Kirdki', 'Kirmanjki', 'Zazaki']),\n};\n"
  },
  {
    "path": "lib/l10n/languages.dart",
    "content": "const Map<String, String> languages = {\n  'zh': '简体中文',\n  'en': 'English',\n};\n"
  },
  {
    "path": "lib/main.dart",
    "content": "import 'dart:io';\nimport 'package:app_links/app_links.dart';\nimport 'package:flutter/services.dart';\nimport 'package:fvp/fvp.dart' as fvp;\nimport 'package:flutter/material.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:flutter_zustand/flutter_zustand.dart';\nimport 'package:iris/info.dart';\nimport 'package:iris/l10n/app_localizations.dart';\nimport 'package:iris/models/file.dart';\nimport 'package:iris/pages/home/home.dart';\nimport 'package:iris/store/use_app_store.dart';\nimport 'package:iris/store/use_play_queue_store.dart';\nimport 'package:iris/theme.dart';\nimport 'package:iris/utils/logger.dart';\nimport 'package:iris/utils/platform.dart';\nimport 'package:iris/utils/request_storage_permission.dart';\nimport 'package:media_kit/media_kit.dart';\nimport 'package:media_stream/media_stream.dart';\nimport 'package:permission_handler/permission_handler.dart';\nimport 'package:saf_util/saf_util.dart';\nimport 'package:window_manager/window_manager.dart';\nimport 'package:dynamic_color/dynamic_color.dart';\nimport 'globals.dart' as globals;\n\nvoid main(List<String> arguments) async {\n  logger('arguments: $arguments');\n  globals.arguments = arguments;\n\n  WidgetsFlutterBinding.ensureInitialized();\n\n  MediaKit.ensureInitialized();\n\n  fvp.registerWith(options: {\n    // 'fastSeek': true,\n    'player': {\n      if (Platform.isAndroid) 'audio.renderer': 'AudioTrack',\n      'avio.reconnect': '1',\n      'avio.reconnect_delay_max': '7',\n      'buffer': '2000+80000',\n      'demux.buffer.ranges': '8',\n    },\n    if (Platform.isAndroid)\n      'subtitleFontFile': 'assets/fonts/NotoSansCJKsc-Medium.otf',\n    'global': {\n      'log': 'debug',\n    }\n  });\n\n  final appLinks = AppLinks();\n  final initUri = await appLinks.getInitialLinkString();\n\n  if (initUri != null) {\n    logger('initUri: $initUri');\n    globals.initUri = initUri;\n  }\n\n  if (isDesktop) {\n    await windowManager.ensureInitialized();\n\n    WindowOptions windowOptions = const WindowOptions(\n      size: Size(1280, 720),\n      minimumSize: Size(427, 240),\n      center: true,\n      backgroundColor: Colors.transparent,\n      skipTaskbar: false,\n      titleBarStyle: TitleBarStyle.hidden,\n    );\n\n    windowManager.waitUntilReadyToShow(windowOptions, () async {\n      await windowManager.show();\n      await windowManager.focus();\n    });\n  }\n\n  SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky);\n\n  MediaStream mediaStream = MediaStream();\n  mediaStream.startServer();\n\n  runApp(const StoreScope(child: MyApp()));\n}\n\nclass MyApp extends HookWidget {\n  const MyApp({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    useEffect(() {\n      () async {\n        globals.storagePermissionStatus = Platform.isAndroid\n            ? await isAndroid11OrHigher()\n                ? await Permission.manageExternalStorage.status\n                : await Permission.storage.status\n            : PermissionStatus.granted;\n      }();\n      return null;\n    }, []);\n\n    ThemeMode themeMode =\n        useAppStore().select(context, (state) => state.themeMode);\n    String language = useAppStore().select(context, (state) => state.language);\n\n    final appLinks = useMemoized(() => AppLinks());\n    final String? uri = useStream(appLinks.stringLinkStream).data;\n\n    useEffect(() {\n      () async {\n        if (uri != null && globals.initUri != uri) {\n          logger('Uri: $uri');\n          if (Platform.isAndroid) {\n            final file = await SafUtil().documentFileFromUri(uri, false);\n            if (file != null) {\n              await useAppStore().updateAutoPlay(true);\n              await usePlayQueueStore().update(\n                playQueue: [\n                  PlayQueueItem(\n                    file: FileItem(\n                      name: file.name,\n                      uri: file.uri,\n                      size: file.length,\n                    ),\n                    index: 0,\n                  ),\n                ],\n                index: 0,\n              );\n            }\n          }\n        }\n      }();\n      return null;\n    }, [uri]);\n\n    return DynamicColorBuilder(builder: (\n      ColorScheme? lightDynamic,\n      ColorScheme? darkDynamic,\n    ) {\n      final theme = getTheme(\n        context: context,\n        lightDynamic: lightDynamic,\n        darkDynamic: darkDynamic,\n      );\n\n      return MaterialApp(\n        title: INFO.title,\n        theme: theme.light,\n        darkTheme: theme.dark,\n        themeMode: themeMode,\n        home: const Home(),\n        locale: language == 'system' || language == 'auto'\n            ? null\n            : Locale(language),\n        localizationsDelegates: AppLocalizations.localizationsDelegates,\n        localeResolutionCallback: (locale, supportedLocales) => supportedLocales\n                .map((e) => e.languageCode)\n                .toList()\n                .contains(locale!.languageCode)\n            ? null\n            : const Locale('en'),\n        supportedLocales: AppLocalizations.supportedLocales,\n      );\n    });\n  }\n}\n"
  },
  {
    "path": "lib/models/file.dart",
    "content": "import 'package:freezed_annotation/freezed_annotation.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:iris/models/storages/storage.dart';\n\npart 'file.freezed.dart';\npart 'file.g.dart';\n\nenum ContentType {\n  video,\n  audio,\n  image,\n  other,\n}\n\nenum FileOptions {\n  addToPlayQueue,\n  remove,\n  openInFolder,\n}\n\n@freezed\nabstract class FileItem with _$FileItem {\n  const FileItem._();\n  const factory FileItem({\n    @Default('') String storageId,\n    @Default(StorageType.none) StorageType storageType,\n    required String name,\n    required String uri,\n    @Default([]) List<String> path,\n    @Default(false) bool isDir,\n    @Default(0) int size,\n    DateTime? lastModified,\n    @Default(ContentType.video) ContentType type,\n    @Default([]) List<Subtitle> subtitles,\n  }) = _FileItem;\n\n  factory FileItem.fromJson(Map<String, dynamic> json) =>\n      _$FileItemFromJson(json);\n\n  String getID() => '$storageId:$uri';\n}\n\n@freezed\nabstract class Subtitle with _$Subtitle {\n  const factory Subtitle({\n    required String name,\n    required String uri,\n  }) = _Subtitle;\n\n  factory Subtitle.fromJson(Map<String, dynamic> json) =>\n      _$SubtitleFromJson(json);\n}\n\n@freezed\nabstract class PlayQueueItem with _$PlayQueueItem {\n  const factory PlayQueueItem({\n    required FileItem file,\n    required int index,\n  }) = _PlayQueueItem;\n\n  factory PlayQueueItem.fromJson(Map<String, dynamic> json) =>\n      _$PlayQueueItemFromJson(json);\n}\n"
  },
  {
    "path": "lib/models/player.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:iris/models/file.dart';\nimport 'package:media_kit/media_kit.dart' as media_kit;\nimport 'package:media_kit_video/media_kit_video.dart' as media_kit_video;\nimport 'package:video_player/video_player.dart';\n\nclass MediaPlayer {\n  final bool isInitializing;\n  final bool isPlaying;\n  final List<Subtitle> externalSubtitles;\n  final Duration position;\n  final Duration duration;\n  final Duration buffer;\n  final double width;\n  final double height;\n  final Future<void> Function() saveProgress;\n  final Future<void> Function() play;\n  final Future<void> Function() pause;\n  final Future<void> Function(int) backward;\n  final Future<void> Function(int) forward;\n  final Future<void> Function() stepBackward;\n  final Future<void> Function() stepForward;\n  final Future<void> Function(Duration) seek;\n\n  MediaPlayer({\n    required this.isInitializing,\n    required this.isPlaying,\n    required this.externalSubtitles,\n    required this.position,\n    required this.duration,\n    required this.buffer,\n    required this.width,\n    required this.height,\n    required this.saveProgress,\n    required this.play,\n    required this.pause,\n    required this.backward,\n    required this.forward,\n    required this.stepBackward,\n    required this.stepForward,\n    required this.seek,\n  });\n}\n\nclass MediaKitPlayer extends MediaPlayer {\n  final media_kit.Player player;\n  final media_kit_video.VideoController controller;\n  final media_kit.SubtitleTrack subtitle;\n  final List<media_kit.SubtitleTrack> subtitles;\n  final media_kit.AudioTrack audio;\n  final List<media_kit.AudioTrack> audios;\n\n  MediaKitPlayer({\n    required this.player,\n    required this.controller,\n    required this.subtitle,\n    required this.subtitles,\n    required super.externalSubtitles,\n    required this.audio,\n    required this.audios,\n    required super.isInitializing,\n    required super.isPlaying,\n    required super.position,\n    required super.duration,\n    required super.buffer,\n    required super.width,\n    required super.height,\n    required super.saveProgress,\n    required super.play,\n    required super.pause,\n    required super.backward,\n    required super.forward,\n    required super.stepBackward,\n    required super.stepForward,\n    required super.seek,\n  });\n}\n\nclass FvpPlayer extends MediaPlayer {\n  final VideoPlayerController controller;\n  final ValueNotifier<int?> externalSubtitle;\n\n  FvpPlayer({\n    required this.controller,\n    required super.isInitializing,\n    required super.isPlaying,\n    required this.externalSubtitle,\n    required super.externalSubtitles,\n    required super.position,\n    required super.duration,\n    required super.buffer,\n    required super.width,\n    required super.height,\n    required super.saveProgress,\n    required super.play,\n    required super.pause,\n    required super.backward,\n    required super.forward,\n    required super.stepBackward,\n    required super.stepForward,\n    required super.seek,\n  });\n}\n"
  },
  {
    "path": "lib/models/progress.dart",
    "content": "import 'package:freezed_annotation/freezed_annotation.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:iris/models/file.dart';\n\npart 'progress.freezed.dart';\npart 'progress.g.dart';\n\n@freezed\nabstract class Progress with _$Progress {\n  const factory Progress({\n    required DateTime dateTime,\n    required Duration position,\n    required Duration duration,\n    required FileItem file,\n  }) = _Progress;\n\n  factory Progress.fromJson(Map<String, dynamic> json) =>\n      _$ProgressFromJson(json);\n}\n"
  },
  {
    "path": "lib/models/storages/ftp.dart",
    "content": "import 'dart:convert';\nimport 'package:iris/models/file.dart';\nimport 'package:iris/models/storages/storage.dart';\nimport 'package:iris/utils/check_content_type.dart';\nimport 'package:iris/utils/get_subtitle_map.dart';\nimport 'package:iris/utils/logger.dart';\nimport 'package:path/path.dart' as p;\nimport 'package:pure_ftp/pure_ftp.dart';\n\nFuture<List<FileItem>> getFTPFiles(\n    FTPStorage storage, List<String> path) async {\n  final username = storage.username.isEmpty ? 'anonymous' : storage.username;\n\n  final client = FtpClient(\n    socketInitOptions: FtpSocketInitOptions(\n      host: storage.host,\n      port: int.tryParse(storage.port),\n    ),\n    authOptions: FtpAuthOptions(\n      username: username,\n      password: storage.password,\n      account: '',\n    ),\n    logCallback: null,\n  );\n\n  try {\n    await client.connect();\n    await client.fs.changeDirectory(path.join('/').replaceAll('//', '/'));\n\n    final files = await client.fs.listDirectory();\n\n    await client.disconnect();\n\n    final baseUri =\n        'ftp?host=${storage.host}&port=${storage.port}&path=${path.join('/').replaceAll('//', '/')}';\n\n    String getUri(String fileName) {\n      final separator = baseUri.endsWith('/') ? '' : '/';\n      return Uri.encodeFull('$baseUri$separator$fileName');\n    }\n\n    final subtitleMap = getSubtitleMap<FtpEntry>(\n      files: files,\n      getName: (file) => file.name,\n      getUri: (file) => getUri(file.name),\n    );\n\n    List<FileItem> fileItems = [];\n\n    for (final file in files) {\n      final basename = p.basenameWithoutExtension(file.name).split('.').first;\n      fileItems.add(\n        FileItem(\n          storageId: storage.id,\n          storageType: StorageType.ftp,\n          name: file.name,\n          uri: getUri(file.name),\n          path: [...path, file.name],\n          isDir: file.isDirectory,\n          size: file.isDirectory ? 0 : file.info?.size ?? 0,\n          lastModified: file.info?.modifyTime != null\n              ? DateTime.tryParse(file.info!.modifyTime!)\n              : null,\n          type: file.isDirectory\n              ? ContentType.other\n              : checkContentType(file.name),\n          subtitles: isVideoFile(file.name) ? subtitleMap[basename] ?? [] : [],\n        ),\n      );\n    }\n\n    return fileItems;\n  } catch (error) {\n    logger('Error getting FTP files: $error');\n    return [];\n  }\n}\n\nFuture<bool> testFTP(FTPStorage storage) async {\n  final client = FtpClient(\n    socketInitOptions: FtpSocketInitOptions(\n      host: storage.host,\n      port: int.tryParse(storage.port),\n    ),\n    authOptions: FtpAuthOptions(\n      username: storage.username.isEmpty ? 'anonymous' : storage.username,\n      password: storage.password,\n      account: '',\n    ),\n    logCallback: null,\n  );\n\n  try {\n    await client.connect();\n    await client.fs.listDirectory();\n    await client.disconnect();\n    return true;\n  } catch (error) {\n    logger('Error testing FTP: $error');\n    return false;\n  }\n}\n\nString getFTPAuth(FTPStorage storage) =>\n    'Basic ${base64Encode(utf8.encode('${storage.username.isEmpty ? 'anonymous' : storage.username}:${storage.password}'))}';\n"
  },
  {
    "path": "lib/models/storages/local.dart",
    "content": "import 'dart:io';\nimport 'package:android_x_storage/android_x_storage.dart';\nimport 'package:disks_desktop/disks_desktop.dart';\nimport 'package:drives_windows/drives_windows.dart';\nimport 'package:file_picker/file_picker.dart';\nimport 'package:flutter/material.dart';\nimport 'package:iris/models/storages/storage.dart';\nimport 'package:iris/models/store/play_queue_state.dart';\nimport 'package:iris/store/use_app_store.dart';\nimport 'package:iris/store/use_play_queue_store.dart';\nimport 'package:iris/utils/files_sort.dart';\nimport 'package:iris/utils/get_subtitle_map.dart';\nimport 'package:iris/utils/get_localizations.dart';\nimport 'package:iris/utils/logger.dart';\nimport 'package:iris/utils/path_conv.dart';\nimport 'package:iris/utils/platform.dart';\nimport 'package:path/path.dart' as p;\nimport 'package:iris/models/file.dart';\nimport 'package:iris/utils/check_content_type.dart';\nimport 'package:saf_util/saf_util.dart';\nimport 'package:saf_util/saf_util_platform_interface.dart';\n\nFuture<List<LocalStorage>> getLocalStorages(\n  BuildContext context,\n) async {\n  final t = getLocalizations(context);\n  if (isDesktop) {\n    List<LocalStorage> storages = [];\n\n    if (isWindows) {\n      final drivesWindows = DrivesWindows();\n      final drives = drivesWindows.getDrives();\n      final networkShortcuts = drivesWindows.getNetworkShortcuts();\n\n      for (var drive in drives) {\n        if (drive.type == DriveType.noRootDirectory) continue;\n\n        final type = drive.type == DriveType.network\n            ? StorageType.network\n            : StorageType.internal;\n        final name = drive.volumeLabel != null\n            ? '${drive.volumeLabel} (${drive.name})'\n            : '${drive.type == DriveType.network ? t.network_storage : t.local_storage} (${drive.name})';\n        final root = drive.root.replaceAll('\\\\', '');\n\n        final storage = LocalStorage(\n          type: type,\n          name: name,\n          basePath: [root],\n        );\n\n        storages.add(storage);\n      }\n\n      for (var shortcut in networkShortcuts) {\n        if (shortcut.path == null) continue;\n        final storage = LocalStorage(\n          type: StorageType.network,\n          name: shortcut.name,\n          basePath: [shortcut.path!],\n        );\n\n        storages.add(storage);\n      }\n    } else {\n      final repository = DisksRepository();\n      final disks = await repository.query;\n      List<LocalStorage> storages = [];\n\n      for (var disk in disks) {\n        for (var mountpoint in disk.mountpoints) {\n          final storage = LocalStorage(\n            type: StorageType.internal,\n            name:\n                '${t.local_storage} (${mountpoint.path.replaceAll('\\\\', '')})',\n            basePath: [mountpoint.path.replaceAll('\\\\', '')],\n          );\n\n          storages.add(storage);\n        }\n      }\n    }\n\n    return storages;\n  } else if (isAndroid) {\n    final androidXStorage = AndroidXStorage();\n    final external =\n        await androidXStorage.getExternalStorageDirectory().catchError((error) {\n      logger('Error getting external storage: $error');\n      return null;\n    });\n    final sdcard =\n        await androidXStorage.getSDCardStorageDirectory().catchError((error) {\n      logger('Error getting SD card: $error');\n      return null;\n    });\n    final usbs =\n        await androidXStorage.getUSBStorageDirectories().catchError((error) {\n      logger('Error getting USB storages: $error');\n      return <String?>[];\n    });\n\n    List<LocalStorage> storages = [];\n\n    if (external != null) {\n      final storage = LocalStorage(\n        type: StorageType.internal,\n        name: t.local_storage,\n        basePath: [external],\n      );\n\n      storages.add(storage);\n    }\n\n    if (sdcard != null) {\n      final storage = LocalStorage(\n        type: StorageType.sdcard,\n        name: 'SD Card',\n        basePath: [sdcard],\n      );\n\n      storages.add(storage);\n    }\n\n    for (var usb in usbs) {\n      if (usb != null) {\n        final storage = LocalStorage(\n          type: StorageType.usb,\n          name: t.usb_storage,\n          basePath: [usb],\n        );\n\n        storages.add(storage);\n      }\n    }\n\n    return storages;\n  }\n  return [];\n}\n\nFuture<PlayQueueState?> getLocalPlayQueue(String filePath) async {\n  final type = checkContentType(filePath);\n\n  if (type != ContentType.video && type != ContentType.audio) {\n    return null;\n  }\n\n  final convedPath = pathConv(filePath);\n\n  final dirPath = convedPath.sublist(0, convedPath.length - 1);\n  final files = await LocalStorage(\n    type: StorageType.internal,\n    name: convedPath.last,\n    basePath: dirPath,\n  ).getFiles(dirPath);\n  final List<FileItem> sortedFiles = filesSort(files: files);\n  final List<FileItem> filteredFiles = sortedFiles\n      .where(\n          (file) => [ContentType.video, ContentType.audio].contains(file.type))\n      .toList();\n\n  final List<PlayQueueItem> playQueue = filteredFiles\n      .asMap()\n      .entries\n      .map((entry) => PlayQueueItem(file: entry.value, index: entry.key))\n      .toList();\n\n  final clickedFile = filteredFiles.where((file) => file.uri == filePath).first;\n\n  final index = filteredFiles.indexOf(clickedFile);\n  return PlayQueueState(\n    playQueue: playQueue,\n    currentIndex: index < 0 || index >= playQueue.length ? 0 : index,\n  );\n}\n\nFuture<void> pickLocalFile() async {\n  FilePickerResult? result = await FilePicker.platform.pickFiles(\n    type: FileType.custom,\n    allowedExtensions: [...Formats.video, ...Formats.audio],\n  );\n\n  final filePath = result?.files.first.path;\n\n  if (filePath != null) {\n    final playQueue = await getLocalPlayQueue(filePath);\n\n    if (playQueue == null || playQueue.playQueue.isEmpty) return;\n\n    await useAppStore().updateAutoPlay(true);\n    await usePlayQueueStore().update(\n      playQueue: playQueue.playQueue,\n      index: playQueue.currentIndex,\n    );\n  }\n}\n\nFuture<List<FileItem>> getLocalFiles(\n    LocalStorage storage, List<String> path) async {\n  final directoryPath = p.joinAll(path);\n  final directory = Directory(directoryPath);\n\n  if (!await directory.exists()) {\n    logger('Error: Directory does not exist at $directoryPath');\n    return [];\n  }\n\n  final Map<String, List<FileSystemEntity>> groupedEntities = {};\n  final allEntities = await directory.list().toList();\n\n  for (final entity in allEntities) {\n    final baseName = p.basenameWithoutExtension(entity.path);\n    groupedEntities.putIfAbsent(baseName, () => []).add(entity);\n  }\n\n  final List<FileItem> fileItems = [];\n  final subtitleExtensions = {'ass', 'srt', 'vtt', 'sub'};\n\n  for (final group in groupedEntities.values) {\n    final videos = group\n        .where((e) =>\n            e is! Directory && checkContentType(e.path) == ContentType.video)\n        .toList();\n    final subtitles = group.where((e) {\n      final ext = p.extension(e.path).replaceFirst('.', '');\n      return e is! Directory && subtitleExtensions.contains(ext);\n    }).toList();\n    final others = group\n        .where((e) => !videos.contains(e) && !subtitles.contains(e))\n        .toList();\n\n    for (final video in videos) {\n      final videoStat = await video.stat();\n      final associatedSubtitles = subtitles.map((sub) {\n        final baseName = p.basenameWithoutExtension(video.path);\n        String subTitleName = p.basename(sub.path);\n        final regex = RegExp(r'^' + RegExp.escape(baseName) + r'\\.(.+?)\\.');\n        final match = regex.firstMatch(subTitleName);\n        if (match != null) {\n          subTitleName = match.group(1) ?? subTitleName;\n        }\n        return Subtitle(name: subTitleName, uri: sub.path);\n      }).toList();\n\n      fileItems.add(FileItem(\n        storageId: storage.id,\n        storageType: storage.type,\n        name: p.basename(video.path),\n        uri: video.path,\n        path: [...path, p.basename(video.path)],\n        isDir: false,\n        size: videoStat.size,\n        lastModified: videoStat.modified,\n        type: ContentType.video,\n        subtitles: associatedSubtitles,\n      ));\n    }\n\n    for (final entity in others) {\n      final stat = await entity.stat();\n      final isDir = entity is Directory;\n      fileItems.add(FileItem(\n        storageId: storage.id,\n        storageType: storage.type,\n        name: p.basename(entity.path),\n        uri: entity.path,\n        path: [...path, p.basename(entity.path)],\n        isDir: isDir,\n        size: isDir ? 0 : stat.size,\n        lastModified: stat.modified,\n        type: isDir ? ContentType.other : checkContentType(entity.path),\n        subtitles: [],\n      ));\n    }\n  }\n\n  return fileItems;\n}\n\nFuture<void> pickContentFile() async {\n  final file = await SafUtil().pickFile(mimeTypes: ['video/*', 'audio/*']);\n  if (file != null) {\n    await useAppStore().updateAutoPlay(true);\n    await usePlayQueueStore().update(\n      playQueue: [\n        PlayQueueItem(\n          file: FileItem(\n            name: file.name,\n            uri: file.uri,\n            size: file.length,\n          ),\n          index: 0,\n        ),\n      ],\n      index: 0,\n    );\n  }\n}\n\nFuture<List<FileItem>> getContentFiles(String uri) async {\n  final files = await SafUtil().list(uri);\n\n  final subtitleMap = getSubtitleMap<SafDocumentFile>(\n    files: files,\n    getName: (file) => file.name,\n    getUri: (file) => file.uri,\n  );\n\n  List<FileItem> fileItems = [];\n\n  for (final file in files) {\n    final basename = p.basenameWithoutExtension(file.name).split('.').first;\n    fileItems.add(FileItem(\n      name: file.name,\n      uri: file.uri,\n      path: [uri, file.name],\n      isDir: file.isDir,\n      size: file.isDir ? 0 : file.length,\n      lastModified: DateTime.fromMillisecondsSinceEpoch(file.lastModified),\n      type: file.isDir ? ContentType.other : checkContentType(file.name),\n      subtitles: isVideoFile(file.name) ? subtitleMap[basename] ?? [] : [],\n    ));\n  }\n\n  return fileItems;\n}\n"
  },
  {
    "path": "lib/models/storages/storage.dart",
    "content": "import 'package:collection/collection.dart';\nimport 'package:flutter/material.dart';\nimport 'package:freezed_annotation/freezed_annotation.dart';\nimport 'package:iris/models/file.dart';\nimport 'package:iris/models/storages/ftp.dart';\nimport 'package:iris/models/storages/local.dart';\nimport 'package:iris/models/storages/webdav.dart';\nimport 'package:iris/utils/platform.dart';\nimport 'package:iris/widgets/popup.dart';\nimport 'package:iris/widgets/popups/storages/storages.dart';\nimport 'package:iris/store/use_storage_store.dart';\n\npart 'storage.freezed.dart';\npart 'storage.g.dart';\n\nconst String localStorageId = 'local';\n\nenum StorageType {\n  none,\n  internal,\n  network,\n  usb,\n  sdcard,\n  webdav,\n  ftp,\n}\n\nenum StorageOptions {\n  edit,\n  remove,\n}\n\nabstract class _Storage {\n  String get id;\n  StorageType get type;\n  String get name;\n  List<String> get basePath;\n\n  Map<String, dynamic> toJson();\n\n  Future<List<FileItem>> getFiles(List<String> path);\n\n  String? getAuth();\n}\n\n@freezed\nsealed class Storage with _$Storage implements _Storage {\n  const Storage._();\n\n  factory Storage.local({\n    @Default(localStorageId) String id,\n    required StorageType type,\n    required String name,\n    required List<String> basePath,\n  }) = LocalStorage;\n\n  factory Storage.webdav({\n    required String id,\n    @Default(StorageType.webdav) StorageType type,\n    required String name,\n    @JsonKey(name: 'url') required String host,\n    required List<String> basePath,\n    required String port,\n    required String username,\n    required String password,\n    required bool https,\n  }) = WebDAVStorage;\n\n  factory Storage.ftp({\n    required String id,\n    @Default(StorageType.ftp) StorageType type,\n    required String name,\n    required String host,\n    required List<String> basePath,\n    required String port,\n    required String username,\n    required String password,\n  }) = FTPStorage;\n\n  factory Storage.fromJson(Map<String, dynamic> json) =>\n      _$StorageFromJson(json);\n\n  @override\n  Future<List<FileItem>> getFiles(List<String> path) async {\n    switch (type) {\n      case StorageType.internal:\n      case StorageType.network:\n      case StorageType.usb:\n      case StorageType.sdcard:\n        if (isAndroid && path[0].startsWith('content://')) {\n          return await getContentFiles(path.join('%2F'));\n        } else {\n          return await getLocalFiles(this as LocalStorage, path);\n        }\n      case StorageType.webdav:\n        return await getWebDAVFiles(this as WebDAVStorage, path);\n      case StorageType.ftp:\n        return await getFTPFiles(this as FTPStorage, path);\n      case StorageType.none:\n        return [];\n    }\n  }\n\n  @override\n  String? getAuth() {\n    switch (type) {\n      case StorageType.webdav:\n        return getWebDAVAuth(this as WebDAVStorage);\n      case StorageType.ftp:\n        return getFTPAuth(this as FTPStorage);\n      default:\n        return null;\n    }\n  }\n}\n\nFuture<void> openInFolder(BuildContext context, FileItem file) async {\n  if (file.path.isEmpty) return;\n  useStorageStore()\n      .updateCurrentPath(file.path.sublist(0, file.path.length - 1));\n\n  Storage? storage = useStorageStore().findById(file.storageId);\n\n  if (storage != null) {\n    useStorageStore().updateCurrentStorage(storage);\n  } else {\n    final localStorages = await getLocalStorages(context);\n    Storage? storage = localStorages\n        .firstWhereOrNull((element) => element.basePath[0] == file.path[0]);\n    if (storage != null) {\n      useStorageStore().updateCurrentStorage(storage);\n    } else {\n      useStorageStore().updateCurrentStorage(\n        LocalStorage(\n          type: file.storageType,\n          name: file.path[0],\n          basePath: [file.path[0]],\n        ),\n      );\n    }\n  }\n\n  if (context.mounted) {\n    replacePopup(\n      context: context,\n      child: Storages(),\n      direction: PopupDirection.right,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/models/storages/webdav.dart",
    "content": "import 'dart:convert';\nimport 'package:iris/models/storages/storage.dart';\nimport 'package:iris/utils/check_content_type.dart';\nimport 'package:iris/utils/get_subtitle_map.dart';\nimport 'package:iris/utils/logger.dart';\nimport 'package:path/path.dart' as p;\nimport 'package:webdav_client/webdav_client.dart' as webdav;\nimport 'package:iris/models/file.dart';\n\nFuture<bool> testWebDAV(WebDAVStorage storage) async {\n  final host = storage.host;\n  final port = storage.port;\n  final username = storage.username;\n  final password = storage.password;\n  final https = storage.https;\n  final basePath = storage.basePath;\n\n  try {\n    var client = webdav.newClient(\n      \"http${https ? 's' : ''}://$host:$port\",\n      user: username,\n      password: password,\n      debug: false,\n    );\n\n    client.setHeaders({'accept-charset': 'utf-8'});\n    client.setConnectTimeout(4000);\n    client.setSendTimeout(4000);\n    client.setReceiveTimeout(4000);\n\n    // await client.ping();\n    await client.readDir(basePath.join('/'));\n    return true;\n  } catch (e) {\n    logger(e.toString());\n    return false;\n  }\n}\n\nFuture<List<FileItem>> getWebDAVFiles(\n  WebDAVStorage storage,\n  List<String> path,\n) async {\n  final id = storage.id;\n  final host = storage.host;\n  final port = storage.port;\n  final username = storage.username;\n  final password = storage.password;\n  final https = storage.https;\n\n  var client = webdav.newClient(\n    \"http${https ? 's' : ''}://$host:$port\",\n    user: username,\n    password: password,\n    debug: false,\n  );\n\n  client.setHeaders({'accept-charset': 'utf-8'});\n  client.setConnectTimeout(8000);\n  client.setSendTimeout(8000);\n  client.setReceiveTimeout(8000);\n\n  var files = await client.readDir(path.join('/'));\n\n  final cleanPathSegments = path.map((e) => e.replaceAll('/', '')).toList();\n  final baseUri = Uri(\n    scheme: storage.https ? 'https' : 'http',\n    host: storage.host,\n    port: int.tryParse(storage.port),\n    pathSegments: cleanPathSegments,\n  );\n  final baseUriString = baseUri.toString();\n\n  String getUri(String fileName) {\n    try {\n      final dirUri = Uri.parse(\n          baseUriString.endsWith('/') ? baseUriString : '$baseUriString/');\n      return dirUri.resolve(fileName).toString();\n    } catch (e) {\n      final separator = baseUriString.endsWith('/') ? '' : '/';\n      return '$baseUriString$separator$fileName';\n    }\n  }\n\n  final subtitleMap = getSubtitleMap<webdav.File>(\n    files: files,\n    getName: (file) => file.name ?? '',\n    getUri: (file) => getUri(file.name ?? ''),\n  );\n\n  List<FileItem> fileItems = [];\n\n  for (final file in files) {\n    final fileName = file.name;\n\n    if (fileName == null) continue;\n\n    final isDir = file.isDir;\n    final basename = p.basenameWithoutExtension(fileName).split('.').first;\n    fileItems.add(FileItem(\n      storageId: id,\n      storageType: StorageType.webdav,\n      name: fileName,\n      uri: getUri(fileName),\n      path: [...path, fileName],\n      isDir: isDir ?? false,\n      size: file.size ?? 0,\n      lastModified: file.mTime,\n      type: isDir ?? false ? ContentType.other : checkContentType(fileName),\n      subtitles: isVideoFile(fileName) ? subtitleMap[basename] ?? [] : [],\n    ));\n  }\n\n  return fileItems;\n}\n\nString getWebDAVAuth(WebDAVStorage storage) =>\n    'Basic ${base64Encode(utf8.encode('${storage.username}:${storage.password}'))}';\n"
  },
  {
    "path": "lib/models/store/app_state.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:freezed_annotation/freezed_annotation.dart';\n\npart 'app_state.freezed.dart';\npart 'app_state.g.dart';\n\nenum PlayerBackend {\n  mediaKit,\n  fvp,\n}\n\nenum Repeat {\n  none,\n  all,\n  one,\n}\n\nenum SortBy {\n  name,\n  size,\n  lastModified,\n}\n\nenum SortOrder {\n  asc,\n  desc,\n}\n\nenum ScreenOrientation {\n  device,\n  landscape,\n  portrait,\n}\n\n@freezed\nabstract class AppState with _$AppState {\n  const factory AppState({\n    @Default(false) bool autoPlay,\n    @Default(false) bool shuffle,\n    @Default(Repeat.none) Repeat repeat,\n    @Default(BoxFit.contain) BoxFit fit,\n    @Default(1) double rate,\n    @Default(80) int volume,\n    @Default(false) bool isMuted,\n    @Default(ThemeMode.system) ThemeMode themeMode,\n    @Default('none') String preferedSubtitleLanguage,\n    @Default('system') String language,\n    @Default(false) bool autoCheckUpdate,\n    @Default(false) bool autoResize,\n    @Default(false) bool alwaysPlayFromBeginning,\n    @Default(PlayerBackend.mediaKit) PlayerBackend playerBackend,\n    @Default(SortBy.name) SortBy sortBy,\n    @Default(SortOrder.asc) SortOrder sortOrder,\n    @Default(true) bool folderFirst,\n    @Default(ScreenOrientation.device) ScreenOrientation orientation,\n  }) = _AppState;\n\n  factory AppState.fromJson(Map<String, dynamic> json) =>\n      _$AppStateFromJson(json);\n}\n"
  },
  {
    "path": "lib/models/store/history_state.dart",
    "content": "import 'package:freezed_annotation/freezed_annotation.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:iris/models/progress.dart';\n\npart 'history_state.freezed.dart';\npart 'history_state.g.dart';\n\n@freezed\nabstract class HistoryState with _$HistoryState {\n  const factory HistoryState({\n    @Default({}) Map<String, Progress> history,\n  }) = _HistoryState;\n\n  factory HistoryState.fromJson(Map<String, dynamic> json) =>\n      _$HistoryStateFromJson(json);\n}\n"
  },
  {
    "path": "lib/models/store/play_queue_state.dart",
    "content": "import 'package:freezed_annotation/freezed_annotation.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:iris/models/file.dart';\n\npart 'play_queue_state.freezed.dart';\npart 'play_queue_state.g.dart';\n\n@freezed\nabstract class PlayQueueState with _$PlayQueueState {\n  const factory PlayQueueState({\n    @Default([]) List<PlayQueueItem> playQueue,\n    @Default(0) int currentIndex,\n  }) = _PlayQueueState;\n\n  factory PlayQueueState.fromJson(Map<String, dynamic> json) =>\n      _$PlayQueueStateFromJson(json);\n}\n"
  },
  {
    "path": "lib/models/store/player_ui_state.dart",
    "content": "import 'package:freezed_annotation/freezed_annotation.dart';\nimport 'package:flutter/foundation.dart';\n\npart 'player_ui_state.freezed.dart';\npart 'player_ui_state.g.dart';\n\n@freezed\nabstract class PlayerUiState with _$PlayerUiState {\n  const factory PlayerUiState({\n    @Default(0) double aspectRatio,\n    @Default(false) bool isAlwaysOnTop,\n    @Default(false) bool isFullScreen,\n    @Default(false) bool isSeeking,\n    @Default(false) bool isHovering,\n    @Default(true) bool isShowControl,\n    @Default(false) bool isShowProgress,\n  }) = _PlayerUiState;\n\n  factory PlayerUiState.fromJson(Map<String, dynamic> json) =>\n      _$PlayerUiStateFromJson(json);\n}\n"
  },
  {
    "path": "lib/models/store/storage_state.dart",
    "content": "import 'package:freezed_annotation/freezed_annotation.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:iris/models/storages/storage.dart';\n\npart 'storage_state.freezed.dart';\npart 'storage_state.g.dart';\n\n@freezed\nabstract class Favorite with _$Favorite {\n  factory Favorite({\n    required String storageId,\n    required List<String> path,\n  }) = _Favorite;\n\n  factory Favorite.fromJson(Map<String, dynamic> json) =>\n      _$FavoriteFromJson(json);\n}\n\n@freezed\nabstract class StorageState with _$StorageState {\n  factory StorageState({\n    @Default([]) List<Storage> storages,\n    @Default([]) List<Favorite> favorites,\n    @Default(null) Storage? currentStorage,\n    @Default([]) List<String> currentPath,\n  }) = _StorageState;\n\n  factory StorageState.fromJson(Map<String, dynamic> json) =>\n      _$StorageStateFromJson(json);\n}\n"
  },
  {
    "path": "lib/oss_licenses.dart",
    "content": "// dart format off\n// cSpell:disable\n// ignore_for_file: always_put_required_named_parameters_first\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: sort_constructors_first\n\n// This code was generated by dart_pubspec_licenses\n// https://pub.dev/packages/dart_pubspec_licenses\n\n/// All dependencies including transitive dependencies.\nconst allDependencies = <Package>[\n  __fe_analyzer_shared,\n  _analyzer,\n  _analyzer_plugin,\n  _android_x_storage,\n  _app_links,\n  _app_links_linux,\n  _app_links_platform_interface,\n  _app_links_web,\n  _archive,\n  _args,\n  _asn1lib,\n  _async,\n  _boolean_selector,\n  _build,\n  _build_config,\n  _build_daemon,\n  _build_runner,\n  _built_collection,\n  _built_value,\n  _characters,\n  _charset,\n  _checked_yaml,\n  _ci,\n  _cli_util,\n  _clock,\n  _code_builder,\n  _collection,\n  _console,\n  _convert,\n  _cross_file,\n  _crypto,\n  _cryptography,\n  _csslib,\n  _cupertino_icons,\n  _custom_lint,\n  _custom_lint_builder,\n  _custom_lint_core,\n  _custom_lint_visitor,\n  _dart_pubspec_licenses,\n  _dart_style,\n  _dbus,\n  _desktop_drop,\n  _device_info_plus,\n  _device_info_plus_platform_interface,\n  _dio,\n  _dio_web_adapter,\n  _disks_desktop,\n  _drives_windows,\n  _dynamic_color,\n  _equatable,\n  _fake_async,\n  _ffi,\n  _file,\n  _file_picker,\n  _fixnum,\n  _flutter,\n  _flutter_breadcrumb,\n  _flutter_hooks,\n  _flutter_hooks_lint,\n  _flutter_lints,\n  _flutter_markdown,\n  _flutter_plugin_android_lifecycle,\n  _flutter_secure_storage,\n  _flutter_secure_storage_linux,\n  _flutter_secure_storage_macos,\n  _flutter_secure_storage_platform_interface,\n  _flutter_secure_storage_web,\n  _flutter_secure_storage_windows,\n  _flutter_volume_controller,\n  _flutter_web_plugins,\n  _flutter_zustand,\n  _freezed,\n  _freezed_annotation,\n  _frontend_server_client,\n  _fvp,\n  _get_it,\n  _glob,\n  _google_fonts,\n  _graphs,\n  _gtk,\n  _hotreloader,\n  _html,\n  _http,\n  _http_methods,\n  _http_multi_server,\n  _http_parser,\n  _image,\n  _intl,\n  _io,\n  _js,\n  _json_annotation,\n  _json_serializable,\n  _leak_tracker,\n  _leak_tracker_flutter_testing,\n  _leak_tracker_testing,\n  _lints,\n  _logging,\n  _markdown,\n  _matcher,\n  _material_color_utilities,\n  _media_kit,\n  _media_kit_libs_android_video,\n  _media_kit_libs_ios_video,\n  _media_kit_libs_linux,\n  _media_kit_libs_macos_video,\n  _media_kit_libs_video,\n  _media_kit_libs_windows_video,\n  _media_kit_video,\n  _media_stream,\n  _meta,\n  _mime,\n  _msix,\n  _mutex,\n  _nested,\n  _package_config,\n  _package_info_plus,\n  _package_info_plus_platform_interface,\n  _path,\n  _path_provider,\n  _path_provider_android,\n  _path_provider_foundation,\n  _path_provider_linux,\n  _path_provider_platform_interface,\n  _path_provider_windows,\n  _pedantic,\n  _permission_handler,\n  _permission_handler_android,\n  _permission_handler_apple,\n  _permission_handler_html,\n  _permission_handler_platform_interface,\n  _permission_handler_windows,\n  _petitparser,\n  _platform,\n  _plugin_platform_interface,\n  _pointycastle,\n  _pool,\n  _popover,\n  _posix,\n  _provider,\n  _pub_semver,\n  _pubspec_parse,\n  _pure_ftp,\n  _rxdart,\n  _saf_util,\n  _safe_local_storage,\n  _screen_brightness,\n  _screen_brightness_android,\n  _screen_brightness_ios,\n  _screen_brightness_macos,\n  _screen_brightness_ohos,\n  _screen_brightness_platform_interface,\n  _screen_brightness_windows,\n  _screen_retriever,\n  _screen_retriever_linux,\n  _screen_retriever_macos,\n  _screen_retriever_platform_interface,\n  _screen_retriever_windows,\n  _scrollable_positioned_list,\n  _shelf,\n  _shelf_router,\n  _shelf_web_socket,\n  _smb_connect,\n  _source_gen,\n  _source_helper,\n  _source_span,\n  _sprintf,\n  _stack_trace,\n  _stream_channel,\n  _stream_transform,\n  _string_scanner,\n  _synchronized,\n  _term_glyph,\n  _test_api,\n  _typed_data,\n  _universal_platform,\n  _uri_parser,\n  _url_launcher,\n  _url_launcher_android,\n  _url_launcher_ios,\n  _url_launcher_linux,\n  _url_launcher_macos,\n  _url_launcher_platform_interface,\n  _url_launcher_web,\n  _url_launcher_windows,\n  _uuid,\n  _vector_math,\n  _video_player,\n  _video_player_android,\n  _video_player_avfoundation,\n  _video_player_platform_interface,\n  _video_player_web,\n  _vm_service,\n  _volume_controller,\n  _wakelock_plus,\n  _wakelock_plus_platform_interface,\n  _watcher,\n  _web,\n  _web_socket,\n  _web_socket_channel,\n  _webdav_client,\n  _win32,\n  _win32_registry,\n  _window_manager,\n  _window_size,\n  _xdg_directories,\n  _xml,\n  _yaml,\n  _zustand\n];\n\n/// Direct `dependencies`.\nconst dependencies = <Package>[\n  _flutter,\n  _cupertino_icons,\n  _intl,\n  _file_picker,\n  _flutter_breadcrumb,\n  _flutter_hooks,\n  _flutter_secure_storage,\n  _flutter_zustand,\n  _media_kit,\n  _media_kit_video,\n  _media_kit_libs_video,\n  _path,\n  _path_provider,\n  _package_info_plus,\n  _provider,\n  _webdav_client,\n  _window_manager,\n  _url_launcher,\n  _scrollable_positioned_list,\n  _google_fonts,\n  _dynamic_color,\n  _window_size,\n  _uuid,\n  _flutter_markdown,\n  _http,\n  _collection,\n  _json_annotation,\n  _freezed_annotation,\n  _disks_desktop,\n  _android_x_storage,\n  _permission_handler,\n  _desktop_drop,\n  _app_links,\n  _device_info_plus,\n  _saf_util,\n  _screen_brightness,\n  _flutter_volume_controller,\n  _fvp,\n  _video_player,\n  _wakelock_plus,\n  _popover,\n  _pure_ftp,\n  _drives_windows,\n  _media_stream\n];\n\n/// Direct `dev_dependencies`.\nconst devDependencies = <Package>[\n  _flutter_lints,\n  _dart_pubspec_licenses,\n  _build_runner,\n  _freezed,\n  _json_serializable,\n  _msix,\n  _flutter_hooks_lint,\n  _custom_lint\n];\n\n/// Package license definition.\nclass Package {\n  /// Package name\n  final String name;\n\n  /// Description\n  final String description;\n\n  /// Authors\n  final List<String> authors;\n\n  /// Whether the license is in markdown format or not (plain text).\n  final bool isMarkdown;\n\n  /// Whether the package is included in the SDK or not.\n  final bool isSdk;\n\n  /// Direct dependencies\n  final List<PackageRef> dependencies;\n\n  /// Website URL\n  final String? homepage;\n\n  /// Repository URL\n  final String? repository;\n\n  /// Version\n  final String? version;\n\n  /// License\n  final String? license;\n\n  const Package({\n    required this.name,\n    required this.description,\n    required this.authors,\n    required this.isMarkdown,\n    required this.isSdk,\n    required this.dependencies,\n    this.homepage,\n    this.repository,\n    this.version,\n    this.license,\n  });\n}\n\nclass PackageRef {\n  final String name;\n\n  const PackageRef(this.name);\n\n  Package resolve() => allDependencies.firstWhere((d) => d.name == name);\n}\n\n/// _fe_analyzer_shared 88.0.0\nconst __fe_analyzer_shared = Package(\n    name: '_fe_analyzer_shared',\n    description:\n        'Logic that is shared between the front_end and analyzer packages.',\n    repository:\n        'https://github.com/dart-lang/sdk/tree/main/pkg/_fe_analyzer_shared',\n    authors: [],\n    version: '88.0.0',\n    license: '''Copyright 2019, the Dart project authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('meta')]);\n\n/// analyzer 8.1.1\nconst _analyzer = Package(\n    name: 'analyzer',\n    description:\n        'This package provides a library that performs static analysis of Dart code.',\n    repository: 'https://github.com/dart-lang/sdk/tree/main/pkg/analyzer',\n    authors: [],\n    version: '8.1.1',\n    license: '''Copyright 2013, the Dart project authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('_fe_analyzer_shared'),\n      PackageRef('collection'),\n      PackageRef('convert'),\n      PackageRef('crypto'),\n      PackageRef('glob'),\n      PackageRef('meta'),\n      PackageRef('package_config'),\n      PackageRef('path'),\n      PackageRef('pub_semver'),\n      PackageRef('source_span'),\n      PackageRef('watcher'),\n      PackageRef('yaml')\n    ]);\n\n/// analyzer_plugin 0.13.7\nconst _analyzer_plugin = Package(\n    name: 'analyzer_plugin',\n    description:\n        'A framework and support code for building plugins for the analysis server.',\n    repository:\n        'https://github.com/dart-lang/sdk/tree/main/pkg/analyzer_plugin',\n    authors: [],\n    version: '0.13.7',\n    license: '''Copyright 2017, the Dart project authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('analyzer'),\n      PackageRef('collection'),\n      PackageRef('dart_style'),\n      PackageRef('pub_semver'),\n      PackageRef('yaml'),\n      PackageRef('path')\n    ]);\n\n/// android_x_storage 1.0.2\nconst _android_x_storage = Package(\n    name: 'android_x_storage',\n    description:\n        'A new Flutter plugin for Android to get the external storage directories.',\n    homepage: 'https://github.com/djeddi-yacine/android_x_storage',\n    repository: 'https://github.com/djeddi-yacine/android_x_storage',\n    authors: [],\n    version: '1.0.2',\n    license: '''BSD 3-Clause License\n\nCopyright (c) 2023 Djeddi Yacine\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its\n   contributors may be used to endorse or promote products derived from\n   this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('plugin_platform_interface')\n    ]);\n\n/// app_links 6.4.1\nconst _app_links = Package(\n    name: 'app_links',\n    description:\n        'Android App Links, Deep Links, iOs Universal Links and Custom URL schemes handler for Flutter (desktop included).',\n    homepage: 'https://github.com/llfbandit/app_links',\n    authors: [],\n    version: '6.4.1',\n    license: '''Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('app_links_linux'),\n      PackageRef('app_links_platform_interface'),\n      PackageRef('app_links_web')\n    ]);\n\n/// app_links_linux 1.0.3\nconst _app_links_linux = Package(\n    name: 'app_links_linux',\n    description: 'Linux platform implementation of app_links plugin.',\n    homepage:\n        'https://github.com/llfbandit/app_links/tree/master/app_links_linux',\n    authors: [],\n    version: '1.0.3',\n    license: '''Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('app_links_platform_interface'),\n      PackageRef('gtk')\n    ]);\n\n/// app_links_platform_interface 2.0.2\nconst _app_links_platform_interface = Package(\n    name: 'app_links_platform_interface',\n    description: 'A common platform interface for the app_links plugin.',\n    homepage:\n        'https://github.com/llfbandit/app_links/tree/master/app_links_platform_interface',\n    authors: [],\n    version: '2.0.2',\n    license: '''Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('plugin_platform_interface')\n    ]);\n\n/// app_links_web 1.0.4\nconst _app_links_web = Package(\n    name: 'app_links_web',\n    description: 'Web platform implementation of app_links plugin.',\n    homepage:\n        'https://github.com/llfbandit/app_links/tree/master/app_links_web',\n    authors: [],\n    version: '1.0.4',\n    license: '''Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('flutter_web_plugins'),\n      PackageRef('app_links_platform_interface'),\n      PackageRef('web')\n    ]);\n\n/// archive 4.0.7\nconst _archive = Package(\n    name: 'archive',\n    description:\n        'Provides encoders and decoders for various archive and compression formats such as zip, tar, bzip2, gzip, and zlib.',\n    repository: 'https://github.com/brendan-duncan/archive',\n    authors: [],\n    version: '4.0.7',\n    license: '''The MIT License\n\nCopyright (c) 2013-2021 Brendan Duncan.\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('crypto'),\n      PackageRef('path'),\n      PackageRef('posix')\n    ]);\n\n/// args 2.7.0\nconst _args = Package(\n    name: 'args',\n    description:\n        'Library for defining parsers for parsing raw command-line arguments into a set of options and values using GNU and POSIX style options.',\n    repository: 'https://github.com/dart-lang/core/tree/main/pkgs/args',\n    authors: [],\n    version: '2.7.0',\n    license: '''Copyright 2013, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: []);\n\n/// asn1lib 1.6.5\nconst _asn1lib = Package(\n    name: 'asn1lib',\n    description:\n        'An ASN1 parser library for Dart. Encodes / decodes from ASN1 Objects to BER bytes',\n    homepage: 'https://github.com/wstrange/asn1lib',\n    authors: [],\n    version: '1.6.5',\n    license: '''http://opensource.org/licenses/BSD-3-Clause\nCopyright (c) 2015, Warren Strange\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n - Redistributions of source code must retain the above copyright notice,\n   this list of conditions and the following disclaimer.\n\n - Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: []);\n\n/// async 2.13.0\nconst _async = Package(\n    name: 'async',\n    description:\n        \"Utility functions and classes related to the 'dart:async' library.\",\n    repository: 'https://github.com/dart-lang/core/tree/main/pkgs/async',\n    authors: [],\n    version: '2.13.0',\n    license: '''Copyright 2015, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('collection'), PackageRef('meta')]);\n\n/// boolean_selector 2.1.2\nconst _boolean_selector = Package(\n    name: 'boolean_selector',\n    description:\n        \"A flexible syntax for boolean expressions, based on a simplified version of Dart's expression syntax.\",\n    repository:\n        'https://github.com/dart-lang/tools/tree/main/pkgs/boolean_selector',\n    authors: [],\n    version: '2.1.2',\n    license: '''Copyright 2016, the Dart project authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('source_span'), PackageRef('string_scanner')]);\n\n/// build 4.0.0\nconst _build = Package(\n    name: 'build',\n    description:\n        'A package for authoring build_runner compatible code generators.',\n    repository: 'https://github.com/dart-lang/build/tree/master/build',\n    authors: [],\n    version: '4.0.0',\n    license: '''Copyright 2016, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('analyzer'),\n      PackageRef('crypto'),\n      PackageRef('glob'),\n      PackageRef('logging'),\n      PackageRef('package_config'),\n      PackageRef('path')\n    ]);\n\n/// build_config 1.2.0\nconst _build_config = Package(\n    name: 'build_config',\n    description:\n        'Format definition and support for parsing `build.yaml` configuration.',\n    repository: 'https://github.com/dart-lang/build/tree/master/build_config',\n    authors: [],\n    version: '1.2.0',\n    license: '''Copyright 2017, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('checked_yaml'),\n      PackageRef('json_annotation'),\n      PackageRef('path'),\n      PackageRef('pubspec_parse')\n    ]);\n\n/// build_daemon 4.0.4\nconst _build_daemon = Package(\n    name: 'build_daemon',\n    description: 'A daemon for running Dart builds.',\n    repository: 'https://github.com/dart-lang/build/tree/master/build_daemon',\n    authors: [],\n    version: '4.0.4',\n    license: '''Copyright 2019, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('built_collection'),\n      PackageRef('built_value'),\n      PackageRef('crypto'),\n      PackageRef('http_multi_server'),\n      PackageRef('logging'),\n      PackageRef('path'),\n      PackageRef('pool'),\n      PackageRef('shelf'),\n      PackageRef('shelf_web_socket'),\n      PackageRef('stream_transform'),\n      PackageRef('watcher'),\n      PackageRef('web_socket_channel')\n    ]);\n\n/// build_runner 2.8.0\nconst _build_runner = Package(\n    name: 'build_runner',\n    description:\n        'A build system for Dart code generation and modular compilation.',\n    repository: 'https://github.com/dart-lang/build/tree/master/build_runner',\n    authors: [],\n    version: '2.8.0',\n    license: '''Copyright 2016, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('analyzer'),\n      PackageRef('args'),\n      PackageRef('async'),\n      PackageRef('build'),\n      PackageRef('build_config'),\n      PackageRef('build_daemon'),\n      PackageRef('built_collection'),\n      PackageRef('built_value'),\n      PackageRef('code_builder'),\n      PackageRef('collection'),\n      PackageRef('convert'),\n      PackageRef('crypto'),\n      PackageRef('dart_style'),\n      PackageRef('frontend_server_client'),\n      PackageRef('glob'),\n      PackageRef('graphs'),\n      PackageRef('http_multi_server'),\n      PackageRef('io'),\n      PackageRef('json_annotation'),\n      PackageRef('logging'),\n      PackageRef('meta'),\n      PackageRef('mime'),\n      PackageRef('package_config'),\n      PackageRef('path'),\n      PackageRef('pool'),\n      PackageRef('pub_semver'),\n      PackageRef('shelf'),\n      PackageRef('shelf_web_socket'),\n      PackageRef('stack_trace'),\n      PackageRef('stream_transform'),\n      PackageRef('watcher'),\n      PackageRef('web_socket_channel'),\n      PackageRef('yaml')\n    ]);\n\n/// built_collection 5.1.1\nconst _built_collection = Package(\n    name: 'built_collection',\n    description:\n        '''Immutable collections based on the SDK collections. Each SDK collection class is split into a new immutable collection class and a corresponding mutable builder class.\n''',\n    homepage: 'https://github.com/google/built_collection.dart',\n    authors: [],\n    version: '5.1.1',\n    license: '''Copyright 2015, Google Inc. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: []);\n\n/// built_value 8.12.0\nconst _built_value = Package(\n    name: 'built_value',\n    description:\n        '''Value types with builders, Dart classes as enums, and serialization. This library is the runtime dependency.\n''',\n    repository:\n        'https://github.com/google/built_value.dart/tree/master/built_value',\n    authors: [],\n    version: '8.12.0',\n    license: '''Copyright 2015, Google Inc. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('built_collection'),\n      PackageRef('collection'),\n      PackageRef('fixnum'),\n      PackageRef('meta')\n    ]);\n\n/// characters 1.4.0\nconst _characters = Package(\n    name: 'characters',\n    description:\n        'String replacement with operations that are Unicode/grapheme cluster aware.',\n    repository: 'https://github.com/dart-lang/core/tree/main/pkgs/characters',\n    authors: [],\n    version: '1.4.0',\n    license: '''Copyright 2019, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: []);\n\n/// charset 2.0.1\nconst _charset = Package(\n    name: 'charset',\n    description:\n        'Charset encoding and decoding Library, include iso-(2-15), windows series, gbk, euc-jp, euc-kr, shift-jis. And supportted charset detect, canEncode, canDecode.',\n    repository: 'https://github.com/shirne/charset-dart',\n    authors: [],\n    version: '2.0.1',\n    license: '''Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: []);\n\n/// checked_yaml 2.0.4\nconst _checked_yaml = Package(\n    name: 'checked_yaml',\n    description:\n        'Generate more helpful exceptions when decoding YAML documents using package:json_serializable and package:yaml.',\n    repository:\n        'https://github.com/google/json_serializable.dart/tree/master/checked_yaml',\n    authors: [],\n    version: '2.0.4',\n    license: '''Copyright 2019, the Dart project authors. All rights reserved.\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('json_annotation'),\n      PackageRef('source_span'),\n      PackageRef('yaml')\n    ]);\n\n/// ci 0.1.0\nconst _ci = Package(\n    name: 'ci',\n    description:\n        \"Detect whether you're running in a CI environment and information about the CI vendor.\",\n    repository:\n        'https://github.com/invertase/dart-cli-utilities/tree/main/packages/ci',\n    authors: [],\n    version: '0.1.0',\n    license: '''Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright 2021 Invertase Limited\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: []);\n\n/// cli_util 0.4.2\nconst _cli_util = Package(\n    name: 'cli_util',\n    description: 'A library to help in building Dart command-line apps.',\n    repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/cli_util',\n    authors: [],\n    version: '0.4.2',\n    license: '''Copyright 2015, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('meta'), PackageRef('path')]);\n\n/// clock 1.1.2\nconst _clock = Package(\n    name: 'clock',\n    description: 'A fakeable wrapper for dart:core clock APIs.',\n    repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/clock',\n    authors: [],\n    version: '1.1.2',\n    license: '''Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: []);\n\n/// code_builder 4.11.0\nconst _code_builder = Package(\n    name: 'code_builder',\n    description:\n        'A fluent, builder-based library for generating valid Dart code.',\n    repository:\n        'https://github.com/dart-lang/tools/tree/main/pkgs/code_builder',\n    authors: [],\n    version: '4.11.0',\n    license: '''Copyright 2016, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('built_collection'),\n      PackageRef('built_value'),\n      PackageRef('collection'),\n      PackageRef('matcher'),\n      PackageRef('meta')\n    ]);\n\n/// collection 1.19.1\nconst _collection = Package(\n    name: 'collection',\n    description:\n        'Collections and utilities functions and classes related to collections.',\n    repository: 'https://github.com/dart-lang/core/tree/main/pkgs/collection',\n    authors: [],\n    version: '1.19.1',\n    license: '''Copyright 2015, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: []);\n\n/// console 4.1.0\nconst _console = Package(\n    name: 'console',\n    description:\n        'A library for common features required by console applications, including color formatting, keyboard input, and progress bars.',\n    homepage: 'https://github.com/DirectMyFile/console.dart',\n    authors: ['Kenneth Endfinger <kaendfinger@gmail.com>'],\n    version: '4.1.0',\n    license: '''```\nThe MIT License (MIT)\n\nCopyright (c) 2014 DirectCode\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n```''',\n    isMarkdown: true,\n    isSdk: false,\n    dependencies: [PackageRef('vector_math')]);\n\n/// convert 3.1.2\nconst _convert = Package(\n    name: 'convert',\n    description:\n        'Utilities for converting between data representations. Provides a number of Sink, Codec, Decoder, and Encoder types.',\n    repository: 'https://github.com/dart-lang/core/tree/main/pkgs/convert',\n    authors: [],\n    version: '3.1.2',\n    license: '''Copyright 2015, the Dart project authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('typed_data')]);\n\n/// cross_file 0.3.4+2\nconst _cross_file = Package(\n    name: 'cross_file',\n    description:\n        'An abstraction to allow working with files across multiple platforms.',\n    repository:\n        'https://github.com/flutter/packages/tree/main/packages/cross_file',\n    authors: [],\n    version: '0.3.4+2',\n    license: '''Copyright 2013 The Flutter Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('meta'), PackageRef('web')]);\n\n/// crypto 3.0.6\nconst _crypto = Package(\n    name: 'crypto',\n    description:\n        'Implementations of SHA, MD5, and HMAC cryptographic functions.',\n    repository: 'https://github.com/dart-lang/core/tree/main/pkgs/crypto',\n    authors: [],\n    version: '3.0.6',\n    license: '''Copyright 2015, the Dart project authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('typed_data')]);\n\n/// cryptography 2.7.0\nconst _cryptography = Package(\n    name: 'cryptography',\n    description:\n        'Cryptographic algorithms for encryption, digital signatures, key agreement, authentication, and hashing. AES, Chacha20, ED25519, X25519, Argon2, and more. Good cross-platform support.',\n    homepage: 'https://github.com/dint-dev/cryptography',\n    authors: [],\n    version: '2.7.0',\n    license: '''Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('collection'),\n      PackageRef('crypto'),\n      PackageRef('ffi'),\n      PackageRef('js'),\n      PackageRef('meta'),\n      PackageRef('typed_data')\n    ]);\n\n/// csslib 1.0.2\nconst _csslib = Package(\n    name: 'csslib',\n    description:\n        'A library for parsing and analyzing CSS (Cascading Style Sheets).',\n    repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/csslib',\n    authors: [],\n    version: '1.0.2',\n    license: '''Copyright 2013, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('source_span')]);\n\n/// cupertino_icons 1.0.8\nconst _cupertino_icons = Package(\n    name: 'cupertino_icons',\n    description:\n        'Default icons asset for Cupertino widgets based on Apple styled icons',\n    repository:\n        'https://github.com/flutter/packages/tree/main/third_party/packages/cupertino_icons',\n    authors: [],\n    version: '1.0.8',\n    license: '''The MIT License (MIT)\n\nCopyright (c) 2016 Vladimir Kharlampidi\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: []);\n\n/// custom_lint 0.8.1\nconst _custom_lint = Package(\n    name: 'custom_lint',\n    description:\n        'Lint rules are a powerful way to improve the maintainability of a project. Custom Lint allows package authors and developers to easily write custom lint rules.',\n    repository: 'https://github.com/invertase/dart_custom_lint',\n    authors: [],\n    version: '0.8.1',\n    license: '''Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright 2020 Invertase Limited\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('analyzer'),\n      PackageRef('analyzer_plugin'),\n      PackageRef('args'),\n      PackageRef('async'),\n      PackageRef('ci'),\n      PackageRef('cli_util'),\n      PackageRef('collection'),\n      PackageRef('custom_lint_core'),\n      PackageRef('freezed_annotation'),\n      PackageRef('json_annotation'),\n      PackageRef('meta'),\n      PackageRef('package_config'),\n      PackageRef('path'),\n      PackageRef('pub_semver'),\n      PackageRef('pubspec_parse'),\n      PackageRef('rxdart'),\n      PackageRef('uuid'),\n      PackageRef('yaml')\n    ]);\n\n/// custom_lint_builder 0.8.1\nconst _custom_lint_builder = Package(\n    name: 'custom_lint_builder',\n    description: 'A package to help writing custom linters',\n    repository: 'https://github.com/invertase/dart_custom_lint',\n    authors: [],\n    version: '0.8.1',\n    license: '''Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright 2020 Invertase Limited\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('analyzer'),\n      PackageRef('analyzer_plugin'),\n      PackageRef('collection'),\n      PackageRef('custom_lint'),\n      PackageRef('custom_lint_core'),\n      PackageRef('custom_lint_visitor'),\n      PackageRef('glob'),\n      PackageRef('hotreloader'),\n      PackageRef('meta'),\n      PackageRef('package_config'),\n      PackageRef('path'),\n      PackageRef('pubspec_parse'),\n      PackageRef('rxdart')\n    ]);\n\n/// custom_lint_core 0.8.1\nconst _custom_lint_core = Package(\n    name: 'custom_lint_core',\n    description: 'A package to help writing custom linters',\n    repository: 'https://github.com/invertase/dart_custom_lint',\n    authors: [],\n    version: '0.8.1',\n    license: '''Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright 2020 Invertase Limited\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('analyzer'),\n      PackageRef('analyzer_plugin'),\n      PackageRef('collection'),\n      PackageRef('custom_lint_visitor'),\n      PackageRef('glob'),\n      PackageRef('matcher'),\n      PackageRef('meta'),\n      PackageRef('package_config'),\n      PackageRef('path'),\n      PackageRef('pubspec_parse'),\n      PackageRef('source_span'),\n      PackageRef('uuid'),\n      PackageRef('yaml')\n    ]);\n\n/// custom_lint_visitor 1.0.0+8.1.1\nconst _custom_lint_visitor = Package(\n    name: 'custom_lint_visitor',\n    description: 'A package that exports visitors for CustomLint.',\n    repository: 'https://github.com/invertase/dart_custom_lint',\n    authors: [],\n    version: '1.0.0+8.1.1',\n    license: '''Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright 2020 Invertase Limited\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('analyzer')]);\n\n/// dart_pubspec_licenses 3.0.8\nconst _dart_pubspec_licenses = Package(\n    name: 'dart_pubspec_licenses',\n    description:\n        'A library to make it easy to extract OSS license information from Dart packages using pubspec.yaml',\n    homepage:\n        'https://github.com/espresso3389/flutter_oss_licenses/tree/master/packages/dart_pubspec_licenses',\n    repository: 'https://github.com/espresso3389/flutter_oss_licenses',\n    authors: [],\n    version: '3.0.8',\n    license: '''MIT License\n\nCopyright (c) 2019 Takashi Kawasaki\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('yaml'),\n      PackageRef('path'),\n      PackageRef('json_annotation'),\n      PackageRef('args')\n    ]);\n\n/// dart_style 3.1.2\nconst _dart_style = Package(\n    name: 'dart_style',\n    description:\n        'Opinionated, automatic Dart source code formatter. Provides an API and a CLI tool.',\n    repository: 'https://github.com/dart-lang/dart_style',\n    authors: [],\n    version: '3.1.2',\n    license: '''Copyright 2014, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('analyzer'),\n      PackageRef('args'),\n      PackageRef('collection'),\n      PackageRef('package_config'),\n      PackageRef('path'),\n      PackageRef('pub_semver'),\n      PackageRef('source_span'),\n      PackageRef('yaml')\n    ]);\n\n/// dbus 0.7.11\nconst _dbus = Package(\n    name: 'dbus',\n    description:\n        'A native Dart implementation of the D-Bus message bus client. This package allows Dart applications to directly access services on the Linux desktop.',\n    homepage: 'https://github.com/canonical/dbus.dart',\n    authors: [],\n    version: '0.7.11',\n    license: '''Mozilla Public License Version 2.0\n==================================\n\n1. Definitions\n--------------\n\n1.1. \"Contributor\"\n    means each individual or legal entity that creates, contributes to\n    the creation of, or owns Covered Software.\n\n1.2. \"Contributor Version\"\n    means the combination of the Contributions of others (if any) used\n    by a Contributor and that particular Contributor's Contribution.\n\n1.3. \"Contribution\"\n    means Covered Software of a particular Contributor.\n\n1.4. \"Covered Software\"\n    means Source Code Form to which the initial Contributor has attached\n    the notice in Exhibit A, the Executable Form of such Source Code\n    Form, and Modifications of such Source Code Form, in each case\n    including portions thereof.\n\n1.5. \"Incompatible With Secondary Licenses\"\n    means\n\n    (a) that the initial Contributor has attached the notice described\n        in Exhibit B to the Covered Software; or\n\n    (b) that the Covered Software was made available under the terms of\n        version 1.1 or earlier of the License, but not also under the\n        terms of a Secondary License.\n\n1.6. \"Executable Form\"\n    means any form of the work other than Source Code Form.\n\n1.7. \"Larger Work\"\n    means a work that combines Covered Software with other material, in\n    a separate file or files, that is not Covered Software.\n\n1.8. \"License\"\n    means this document.\n\n1.9. \"Licensable\"\n    means having the right to grant, to the maximum extent possible,\n    whether at the time of the initial grant or subsequently, any and\n    all of the rights conveyed by this License.\n\n1.10. \"Modifications\"\n    means any of the following:\n\n    (a) any file in Source Code Form that results from an addition to,\n        deletion from, or modification of the contents of Covered\n        Software; or\n\n    (b) any new file in Source Code Form that contains any Covered\n        Software.\n\n1.11. \"Patent Claims\" of a Contributor\n    means any patent claim(s), including without limitation, method,\n    process, and apparatus claims, in any patent Licensable by such\n    Contributor that would be infringed, but for the grant of the\n    License, by the making, using, selling, offering for sale, having\n    made, import, or transfer of either its Contributions or its\n    Contributor Version.\n\n1.12. \"Secondary License\"\n    means either the GNU General Public License, Version 2.0, the GNU\n    Lesser General Public License, Version 2.1, the GNU Affero General\n    Public License, Version 3.0, or any later versions of those\n    licenses.\n\n1.13. \"Source Code Form\"\n    means the form of the work preferred for making modifications.\n\n1.14. \"You\" (or \"Your\")\n    means an individual or a legal entity exercising rights under this\n    License. For legal entities, \"You\" includes any entity that\n    controls, is controlled by, or is under common control with You. For\n    purposes of this definition, \"control\" means (a) the power, direct\n    or indirect, to cause the direction or management of such entity,\n    whether by contract or otherwise, or (b) ownership of more than\n    fifty percent (50%) of the outstanding shares or beneficial\n    ownership of such entity.\n\n2. License Grants and Conditions\n--------------------------------\n\n2.1. Grants\n\nEach Contributor hereby grants You a world-wide, royalty-free,\nnon-exclusive license:\n\n(a) under intellectual property rights (other than patent or trademark)\n    Licensable by such Contributor to use, reproduce, make available,\n    modify, display, perform, distribute, and otherwise exploit its\n    Contributions, either on an unmodified basis, with Modifications, or\n    as part of a Larger Work; and\n\n(b) under Patent Claims of such Contributor to make, use, sell, offer\n    for sale, have made, import, and otherwise transfer either its\n    Contributions or its Contributor Version.\n\n2.2. Effective Date\n\nThe licenses granted in Section 2.1 with respect to any Contribution\nbecome effective for each Contribution on the date the Contributor first\ndistributes such Contribution.\n\n2.3. Limitations on Grant Scope\n\nThe licenses granted in this Section 2 are the only rights granted under\nthis License. No additional rights or licenses will be implied from the\ndistribution or licensing of Covered Software under this License.\nNotwithstanding Section 2.1(b) above, no patent license is granted by a\nContributor:\n\n(a) for any code that a Contributor has removed from Covered Software;\n    or\n\n(b) for infringements caused by: (i) Your and any other third party's\n    modifications of Covered Software, or (ii) the combination of its\n    Contributions with other software (except as part of its Contributor\n    Version); or\n\n(c) under Patent Claims infringed by Covered Software in the absence of\n    its Contributions.\n\nThis License does not grant any rights in the trademarks, service marks,\nor logos of any Contributor (except as may be necessary to comply with\nthe notice requirements in Section 3.4).\n\n2.4. Subsequent Licenses\n\nNo Contributor makes additional grants as a result of Your choice to\ndistribute the Covered Software under a subsequent version of this\nLicense (see Section 10.2) or under the terms of a Secondary License (if\npermitted under the terms of Section 3.3).\n\n2.5. Representation\n\nEach Contributor represents that the Contributor believes its\nContributions are its original creation(s) or it has sufficient rights\nto grant the rights to its Contributions conveyed by this License.\n\n2.6. Fair Use\n\nThis License is not intended to limit any rights You have under\napplicable copyright doctrines of fair use, fair dealing, or other\nequivalents.\n\n2.7. Conditions\n\nSections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted\nin Section 2.1.\n\n3. Responsibilities\n-------------------\n\n3.1. Distribution of Source Form\n\nAll distribution of Covered Software in Source Code Form, including any\nModifications that You create or to which You contribute, must be under\nthe terms of this License. You must inform recipients that the Source\nCode Form of the Covered Software is governed by the terms of this\nLicense, and how they can obtain a copy of this License. You may not\nattempt to alter or restrict the recipients' rights in the Source Code\nForm.\n\n3.2. Distribution of Executable Form\n\nIf You distribute Covered Software in Executable Form then:\n\n(a) such Covered Software must also be made available in Source Code\n    Form, as described in Section 3.1, and You must inform recipients of\n    the Executable Form how they can obtain a copy of such Source Code\n    Form by reasonable means in a timely manner, at a charge no more\n    than the cost of distribution to the recipient; and\n\n(b) You may distribute such Executable Form under the terms of this\n    License, or sublicense it under different terms, provided that the\n    license for the Executable Form does not attempt to limit or alter\n    the recipients' rights in the Source Code Form under this License.\n\n3.3. Distribution of a Larger Work\n\nYou may create and distribute a Larger Work under terms of Your choice,\nprovided that You also comply with the requirements of this License for\nthe Covered Software. If the Larger Work is a combination of Covered\nSoftware with a work governed by one or more Secondary Licenses, and the\nCovered Software is not Incompatible With Secondary Licenses, this\nLicense permits You to additionally distribute such Covered Software\nunder the terms of such Secondary License(s), so that the recipient of\nthe Larger Work may, at their option, further distribute the Covered\nSoftware under the terms of either this License or such Secondary\nLicense(s).\n\n3.4. Notices\n\nYou may not remove or alter the substance of any license notices\n(including copyright notices, patent notices, disclaimers of warranty,\nor limitations of liability) contained within the Source Code Form of\nthe Covered Software, except that You may alter any license notices to\nthe extent required to remedy known factual inaccuracies.\n\n3.5. Application of Additional Terms\n\nYou may choose to offer, and to charge a fee for, warranty, support,\nindemnity or liability obligations to one or more recipients of Covered\nSoftware. However, You may do so only on Your own behalf, and not on\nbehalf of any Contributor. You must make it absolutely clear that any\nsuch warranty, support, indemnity, or liability obligation is offered by\nYou alone, and You hereby agree to indemnify every Contributor for any\nliability incurred by such Contributor as a result of warranty, support,\nindemnity or liability terms You offer. You may include additional\ndisclaimers of warranty and limitations of liability specific to any\njurisdiction.\n\n4. Inability to Comply Due to Statute or Regulation\n---------------------------------------------------\n\nIf it is impossible for You to comply with any of the terms of this\nLicense with respect to some or all of the Covered Software due to\nstatute, judicial order, or regulation then You must: (a) comply with\nthe terms of this License to the maximum extent possible; and (b)\ndescribe the limitations and the code they affect. Such description must\nbe placed in a text file included with all distributions of the Covered\nSoftware under this License. Except to the extent prohibited by statute\nor regulation, such description must be sufficiently detailed for a\nrecipient of ordinary skill to be able to understand it.\n\n5. Termination\n--------------\n\n5.1. The rights granted under this License will terminate automatically\nif You fail to comply with any of its terms. However, if You become\ncompliant, then the rights granted under this License from a particular\nContributor are reinstated (a) provisionally, unless and until such\nContributor explicitly and finally terminates Your grants, and (b) on an\nongoing basis, if such Contributor fails to notify You of the\nnon-compliance by some reasonable means prior to 60 days after You have\ncome back into compliance. Moreover, Your grants from a particular\nContributor are reinstated on an ongoing basis if such Contributor\nnotifies You of the non-compliance by some reasonable means, this is the\nfirst time You have received notice of non-compliance with this License\nfrom such Contributor, and You become compliant prior to 30 days after\nYour receipt of the notice.\n\n5.2. If You initiate litigation against any entity by asserting a patent\ninfringement claim (excluding declaratory judgment actions,\ncounter-claims, and cross-claims) alleging that a Contributor Version\ndirectly or indirectly infringes any patent, then the rights granted to\nYou by any and all Contributors for the Covered Software under Section\n2.1 of this License shall terminate.\n\n5.3. In the event of termination under Sections 5.1 or 5.2 above, all\nend user license agreements (excluding distributors and resellers) which\nhave been validly granted by You or Your distributors under this License\nprior to termination shall survive termination.\n\n************************************************************************\n*                                                                      *\n*  6. Disclaimer of Warranty                                           *\n*  -------------------------                                           *\n*                                                                      *\n*  Covered Software is provided under this License on an \"as is\"       *\n*  basis, without warranty of any kind, either expressed, implied, or  *\n*  statutory, including, without limitation, warranties that the       *\n*  Covered Software is free of defects, merchantable, fit for a        *\n*  particular purpose or non-infringing. The entire risk as to the     *\n*  quality and performance of the Covered Software is with You.        *\n*  Should any Covered Software prove defective in any respect, You     *\n*  (not any Contributor) assume the cost of any necessary servicing,   *\n*  repair, or correction. This disclaimer of warranty constitutes an   *\n*  essential part of this License. No use of any Covered Software is   *\n*  authorized under this License except under this disclaimer.         *\n*                                                                      *\n************************************************************************\n\n************************************************************************\n*                                                                      *\n*  7. Limitation of Liability                                          *\n*  --------------------------                                          *\n*                                                                      *\n*  Under no circumstances and under no legal theory, whether tort      *\n*  (including negligence), contract, or otherwise, shall any           *\n*  Contributor, or anyone who distributes Covered Software as          *\n*  permitted above, be liable to You for any direct, indirect,         *\n*  special, incidental, or consequential damages of any character      *\n*  including, without limitation, damages for lost profits, loss of    *\n*  goodwill, work stoppage, computer failure or malfunction, or any    *\n*  and all other commercial damages or losses, even if such party      *\n*  shall have been informed of the possibility of such damages. This   *\n*  limitation of liability shall not apply to liability for death or   *\n*  personal injury resulting from such party's negligence to the       *\n*  extent applicable law prohibits such limitation. Some               *\n*  jurisdictions do not allow the exclusion or limitation of           *\n*  incidental or consequential damages, so this exclusion and          *\n*  limitation may not apply to You.                                    *\n*                                                                      *\n************************************************************************\n\n8. Litigation\n-------------\n\nAny litigation relating to this License may be brought only in the\ncourts of a jurisdiction where the defendant maintains its principal\nplace of business and such litigation shall be governed by laws of that\njurisdiction, without reference to its conflict-of-law provisions.\nNothing in this Section shall prevent a party's ability to bring\ncross-claims or counter-claims.\n\n9. Miscellaneous\n----------------\n\nThis License represents the complete agreement concerning the subject\nmatter hereof. If any provision of this License is held to be\nunenforceable, such provision shall be reformed only to the extent\nnecessary to make it enforceable. Any law or regulation which provides\nthat the language of a contract shall be construed against the drafter\nshall not be used to construe this License against a Contributor.\n\n10. Versions of the License\n---------------------------\n\n10.1. New Versions\n\nMozilla Foundation is the license steward. Except as provided in Section\n10.3, no one other than the license steward has the right to modify or\npublish new versions of this License. Each version will be given a\ndistinguishing version number.\n\n10.2. Effect of New Versions\n\nYou may distribute the Covered Software under the terms of the version\nof the License under which You originally received the Covered Software,\nor under the terms of any subsequent version published by the license\nsteward.\n\n10.3. Modified Versions\n\nIf you create software not governed by this License, and you want to\ncreate a new license for such software, you may create and use a\nmodified version of this License if you rename the license and remove\nany references to the name of the license steward (except to note that\nsuch modified license differs from this License).\n\n10.4. Distributing Source Code Form that is Incompatible With Secondary\nLicenses\n\nIf You choose to distribute Source Code Form that is Incompatible With\nSecondary Licenses under the terms of this version of the License, the\nnotice described in Exhibit B of this License must be attached.\n\nExhibit A - Source Code Form License Notice\n-------------------------------------------\n\n  This Source Code Form is subject to the terms of the Mozilla Public\n  License, v. 2.0. If a copy of the MPL was not distributed with this\n  file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\nIf it is not possible or desirable to put the notice in a particular\nfile, then You may include the notice in a location (such as a LICENSE\nfile in a relevant directory) where a recipient would be likely to look\nfor such a notice.\n\nYou may add additional accurate notices of copyright ownership.\n\nExhibit B - \"Incompatible With Secondary Licenses\" Notice\n---------------------------------------------------------\n\n  This Source Code Form is \"Incompatible With Secondary Licenses\", as\n  defined by the Mozilla Public License, v. 2.0.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('args'),\n      PackageRef('ffi'),\n      PackageRef('meta'),\n      PackageRef('xml')\n    ]);\n\n/// desktop_drop 0.6.1\nconst _desktop_drop = Package(\n    name: 'desktop_drop',\n    description:\n        'A plugin which allows user dragging files to your flutter desktop applications.',\n    homepage:\n        'https://github.com/MixinNetwork/flutter-plugins/tree/main/packages/desktop_drop',\n    authors: [],\n    version: '0.6.1',\n    license: '''Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [2021] [Mixin]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('flutter_web_plugins'),\n      PackageRef('cross_file'),\n      PackageRef('web'),\n      PackageRef('universal_platform')\n    ]);\n\n/// device_info_plus 12.1.0\nconst _device_info_plus = Package(\n    name: 'device_info_plus',\n    description:\n        'Flutter plugin providing detailed information about the device (make, model, etc.), and Android or iOS version the app is running on.',\n    homepage: 'https://github.com/fluttercommunity/plus_plugins',\n    repository:\n        'https://github.com/fluttercommunity/plus_plugins/tree/main/packages/device_info_plus/device_info_plus',\n    authors: [],\n    version: '12.1.0',\n    license: '''Copyright 2017 The Chromium Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('device_info_plus_platform_interface'),\n      PackageRef('ffi'),\n      PackageRef('file'),\n      PackageRef('flutter'),\n      PackageRef('flutter_web_plugins'),\n      PackageRef('meta'),\n      PackageRef('web'),\n      PackageRef('win32'),\n      PackageRef('win32_registry')\n    ]);\n\n/// device_info_plus_platform_interface 7.0.3\nconst _device_info_plus_platform_interface = Package(\n    name: 'device_info_plus_platform_interface',\n    description: 'A common platform interface for the device_info_plus plugin.',\n    homepage: 'https://github.com/fluttercommunity/plus_plugins',\n    repository:\n        'https://github.com/fluttercommunity/plus_plugins/tree/main/packages/',\n    authors: [],\n    version: '7.0.3',\n    license: '''Copyright 2017 The Chromium Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('meta'),\n      PackageRef('plugin_platform_interface')\n    ]);\n\n/// dio 5.9.0\nconst _dio = Package(\n    name: 'dio',\n    description: '''A powerful HTTP networking package,\nsupports Interceptors,\nAborting and canceling a request,\nCustom adapters, Transformers, etc.\n''',\n    homepage: 'https://github.com/cfug/dio',\n    repository: 'https://github.com/cfug/dio/blob/main/dio',\n    authors: [],\n    version: '5.9.0',\n    license: '''MIT License\n\nCopyright (c) 2018 Wen Du (wendux)\nCopyright (c) 2022 The CFUG Team\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('async'),\n      PackageRef('collection'),\n      PackageRef('http_parser'),\n      PackageRef('meta'),\n      PackageRef('mime'),\n      PackageRef('path'),\n      PackageRef('dio_web_adapter')\n    ]);\n\n/// dio_web_adapter 2.1.1\nconst _dio_web_adapter = Package(\n    name: 'dio_web_adapter',\n    description: 'An adapter that supports Dio on Web.',\n    homepage: 'https://github.com/cfug/dio',\n    repository: 'https://github.com/cfug/dio/blob/main/plugins/web_adapter',\n    authors: [],\n    version: '2.1.1',\n    license: '''MIT License\n\nCopyright (c) 2018 Wen Du (wendux)\nCopyright (c) 2022 The CFUG Team\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('dio'),\n      PackageRef('http_parser'),\n      PackageRef('meta'),\n      PackageRef('web')\n    ]);\n\n/// disks_desktop 1.0.1\nconst _disks_desktop = Package(\n    name: 'disks_desktop',\n    description:\n        'A Flutter desktop library able to retrieve the installed devices information',\n    homepage: 'https://www.angelocassano.it',\n    repository: 'https://github.com/AngeloAvv/disks',\n    authors: [],\n    version: '1.0.1',\n    license: '''Copyright (c) 2022 Angelo Cassano\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('equatable'),\n      PackageRef('path')\n    ]);\n\n/// drives_windows 0.0.1\nconst _drives_windows = Package(\n    name: 'drives_windows',\n    description: 'A Flutter plugin get drives and network shortcuts on Windows',\n    homepage: 'https://github.com/nini22P/drives_windows',\n    repository: 'https://github.com/nini22P/drives_windows',\n    authors: [],\n    version: '0.0.1',\n    license: '''MIT License\n\nCopyright (c) 2025 22\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('ffi'),\n      PackageRef('flutter'),\n      PackageRef('path'),\n      PackageRef('win32')\n    ]);\n\n/// dynamic_color 1.8.1\nconst _dynamic_color = Package(\n    name: 'dynamic_color',\n    description:\n        \"A Flutter package to create Material color schemes based on a platform's implementation of dynamic color.\",\n    repository:\n        'https://github.com/material-foundation/flutter-packages/tree/main/packages/dynamic_color',\n    authors: [],\n    version: '1.8.1',\n    license: '''Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('material_color_utilities')\n    ]);\n\n/// equatable 2.0.7\nconst _equatable = Package(\n    name: 'equatable',\n    description:\n        'A Dart package that helps to implement value based equality without needing to explicitly override == and hashCode.',\n    homepage: 'https://github.com/felangel/equatable',\n    repository: 'https://github.com/felangel/equatable',\n    authors: [],\n    version: '2.0.7',\n    license: '''MIT License\n\nCopyright (c) 2024 Felix Angelov\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('collection'), PackageRef('meta')]);\n\n/// fake_async 1.3.3\nconst _fake_async = Package(\n    name: 'fake_async',\n    description:\n        'Fake asynchronous events such as timers and microtasks for deterministic testing.',\n    repository: 'https://github.com/dart-lang/test/tree/master/pkgs/fake_async',\n    authors: [],\n    version: '1.3.3',\n    license: '''Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('clock'), PackageRef('collection')]);\n\n/// ffi 2.1.4\nconst _ffi = Package(\n    name: 'ffi',\n    description:\n        'Utilities for working with Foreign Function Interface (FFI) code.',\n    repository: 'https://github.com/dart-lang/native/tree/main/pkgs/ffi',\n    authors: [],\n    version: '2.1.4',\n    license: '''Copyright 2019, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: []);\n\n/// file 7.0.1\nconst _file = Package(\n    name: 'file',\n    description:\n        'A pluggable, mockable file system abstraction for Dart. Supports local file system access, as well as in-memory file systems, record-replay file systems, and chroot file systems.',\n    repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/file',\n    authors: [],\n    version: '7.0.1',\n    license: '''Copyright 2017, the Dart project authors. All rights reserved.\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('meta'), PackageRef('path')]);\n\n/// file_picker 10.3.3\nconst _file_picker = Package(\n    name: 'file_picker',\n    description:\n        'A package that allows you to use a native file explorer to pick single or multiple absolute file paths, with extension filtering support.',\n    homepage: 'https://github.com/miguelpruivo/plugins_flutter_file_picker',\n    repository: 'https://github.com/miguelpruivo/flutter_file_picker',\n    authors: [],\n    version: '10.3.3',\n    license: '''MIT License\n\nCopyright (c) 2018 Miguel Ruivo\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('flutter_web_plugins'),\n      PackageRef('flutter_plugin_android_lifecycle'),\n      PackageRef('plugin_platform_interface'),\n      PackageRef('ffi'),\n      PackageRef('path'),\n      PackageRef('win32'),\n      PackageRef('cross_file'),\n      PackageRef('web'),\n      PackageRef('dbus')\n    ]);\n\n/// fixnum 1.1.1\nconst _fixnum = Package(\n    name: 'fixnum',\n    description:\n        'Library for 32- and 64-bit signed fixed-width integers with consistent behavior between native and JS runtimes.',\n    repository: 'https://github.com/dart-lang/core/tree/main/pkgs/fixnum',\n    authors: [],\n    version: '1.1.1',\n    license: '''Copyright 2014, the Dart project authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: []);\n\n/// flutter 3.35.3\nconst _flutter = Package(\n    name: 'flutter',\n    description: 'A framework for writing Flutter applications',\n    homepage: 'https://flutter.dev',\n    authors: [],\n    version: '3.35.3',\n    license: '''Copyright 2014 The Flutter Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: true,\n    dependencies: [\n      PackageRef('characters'),\n      PackageRef('collection'),\n      PackageRef('material_color_utilities'),\n      PackageRef('meta'),\n      PackageRef('vector_math')\n    ]);\n\n/// flutter_breadcrumb 1.0.1\nconst _flutter_breadcrumb = Package(\n    name: 'flutter_breadcrumb',\n    description: 'Flutter Widget that can easily create Breadcrumb in Flutter.',\n    homepage: 'https://github.com/payam-zahedi/flutter_breadcrumb',\n    repository: 'https://github.com/payam-zahedi/flutter_breadcrumb',\n    authors: [],\n    version: '1.0.1',\n    license: '''BSD 3-Clause License\n\nCopyright (c) 2020, Payam Zahedi\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its\n   contributors may be used to endorse or promote products derived from\n   this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('flutter'), PackageRef('pedantic')]);\n\n/// flutter_hooks 0.21.3+1\nconst _flutter_hooks = Package(\n    name: 'flutter_hooks',\n    description:\n        'A flutter implementation of React hooks. It adds a new kind of widget with enhanced code reuse.',\n    homepage: 'https://github.com/rrousselGit/flutter_hooks',\n    repository:\n        'https://github.com/rrousselGit/flutter_hooks/tree/master/packages/flutter_hooks',\n    authors: [],\n    version: '0.21.3+1',\n    license: '''MIT License\n\nCopyright (c) 2018 Remi Rousselet\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('flutter')]);\n\n/// flutter_hooks_lint 1.4.0\nconst _flutter_hooks_lint = Package(\n    name: 'flutter_hooks_lint',\n    description:\n        'A lint package providing guidelines for using flutter_hooks in your Flutter widget!',\n    homepage: 'https://github.com/nikaera/flutter_hooks_lint',\n    repository: 'https://github.com/nikaera/flutter_hooks_lint',\n    authors: [],\n    version: '1.4.0',\n    license: '''MIT License\n\nCopyright (c) 2024 nikaera\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('analyzer'), PackageRef('custom_lint_builder')]);\n\n/// flutter_lints 6.0.0\nconst _flutter_lints = Package(\n    name: 'flutter_lints',\n    description:\n        'Recommended lints for Flutter apps, packages, and plugins to encourage good coding practices.',\n    repository:\n        'https://github.com/flutter/packages/tree/main/packages/flutter_lints',\n    authors: [],\n    version: '6.0.0',\n    license: '''Copyright 2013 The Flutter Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('lints')]);\n\n/// flutter_markdown 0.7.7+1\nconst _flutter_markdown = Package(\n    name: 'flutter_markdown',\n    description:\n        'A Markdown renderer for Flutter. Create rich text output, including text styles, tables, links, and more, from plain text data formatted with simple Markdown tags.',\n    repository:\n        'https://github.com/flutter/packages/tree/main/packages/flutter_markdown',\n    authors: [],\n    version: '0.7.7+1',\n    license: '''Copyright 2013 The Flutter Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('markdown'),\n      PackageRef('meta'),\n      PackageRef('path')\n    ]);\n\n/// flutter_plugin_android_lifecycle 2.0.30\nconst _flutter_plugin_android_lifecycle = Package(\n    name: 'flutter_plugin_android_lifecycle',\n    description:\n        'Flutter plugin for accessing an Android Lifecycle within other plugins.',\n    repository:\n        'https://github.com/flutter/packages/tree/main/packages/flutter_plugin_android_lifecycle',\n    authors: [],\n    version: '2.0.30',\n    license: '''Copyright 2013 The Flutter Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('flutter')]);\n\n/// flutter_secure_storage 8.1.0\nconst _flutter_secure_storage = Package(\n    name: 'flutter_secure_storage',\n    description:\n        'Flutter Secure Storage provides API to store data in secure storage. Keychain is used in iOS, KeyStore based solution is used in Android.',\n    repository:\n        'https://github.com/mogol/flutter_secure_storage/tree/develop/flutter_secure_storage',\n    authors: [],\n    version: '8.1.0',\n    license: '''BSD 3-Clause License\n\nCopyright 2017 German Saprykin\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\n* Neither the name of the copyright holder nor the names of its\n  contributors may be used to endorse or promote products derived from\n  this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('flutter_secure_storage_linux'),\n      PackageRef('flutter_secure_storage_macos'),\n      PackageRef('flutter_secure_storage_platform_interface'),\n      PackageRef('flutter_secure_storage_web'),\n      PackageRef('flutter_secure_storage_windows'),\n      PackageRef('meta')\n    ]);\n\n/// flutter_secure_storage_linux 1.2.3\nconst _flutter_secure_storage_linux = Package(\n    name: 'flutter_secure_storage_linux',\n    description: 'Linux implementation of flutter_secure_storage',\n    repository: 'https://github.com/mogol/flutter_secure_storage',\n    authors: [],\n    version: '1.2.3',\n    license: '''BSD 3-Clause License\n\nCopyright 2017 German Saprykin\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\n* Neither the name of the copyright holder nor the names of its\n  contributors may be used to endorse or promote products derived from\n  this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('flutter_secure_storage_platform_interface')\n    ]);\n\n/// flutter_secure_storage_macos 3.1.3\nconst _flutter_secure_storage_macos = Package(\n    name: 'flutter_secure_storage_macos',\n    description: 'macOS implementation of flutter_secure_storage',\n    repository: 'https://github.com/mogol/flutter_secure_storage',\n    authors: [],\n    version: '3.1.3',\n    license: '''BSD 3-Clause License\n\nCopyright 2017 German Saprykin\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\n* Neither the name of the copyright holder nor the names of its\n  contributors may be used to endorse or promote products derived from\n  this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('flutter_secure_storage_platform_interface')\n    ]);\n\n/// flutter_secure_storage_platform_interface 1.1.2\nconst _flutter_secure_storage_platform_interface = Package(\n    name: 'flutter_secure_storage_platform_interface',\n    description:\n        'A common platform interface for the flutter_secure_storage plugin.',\n    homepage: 'https://github.com/mogol/flutter_secure_storage',\n    authors: [],\n    version: '1.1.2',\n    license: '''BSD 3-Clause License\n\nCopyright 2017 German Saprykin\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\n* Neither the name of the copyright holder nor the names of its\n  contributors may be used to endorse or promote products derived from\n  this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('plugin_platform_interface')\n    ]);\n\n/// flutter_secure_storage_web 1.2.1\nconst _flutter_secure_storage_web = Package(\n    name: 'flutter_secure_storage_web',\n    description:\n        'Web implementation of flutter_secure_storage. Use flutter_secure_storage for the full flutter package.',\n    repository: 'https://github.com/mogol/flutter_secure_storage',\n    authors: [],\n    version: '1.2.1',\n    license: '''BSD 3-Clause License\n\nCopyright 2017 German Saprykin\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\n* Neither the name of the copyright holder nor the names of its\n  contributors may be used to endorse or promote products derived from\n  this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('flutter_secure_storage_platform_interface'),\n      PackageRef('flutter_web_plugins'),\n      PackageRef('js')\n    ]);\n\n/// flutter_secure_storage_windows 2.1.1\nconst _flutter_secure_storage_windows = Package(\n    name: 'flutter_secure_storage_windows',\n    description:\n        'Windows implementation of flutter_secure_storage. Please use flutter_secure_storage instead of this package.',\n    repository: 'https://github.com/mogol/flutter_secure_storage',\n    authors: [],\n    version: '2.1.1',\n    license: '''BSD 3-Clause License\n\nCopyright 2017 German Saprykin\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\n* Neither the name of the copyright holder nor the names of its\n  contributors may be used to endorse or promote products derived from\n  this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('flutter_secure_storage_platform_interface')\n    ]);\n\n/// flutter_volume_controller 1.3.3\nconst _flutter_volume_controller = Package(\n    name: 'flutter_volume_controller',\n    description:\n        'A Flutter plugin to control system volume and listen for volume changes on different platforms.',\n    homepage: 'https://github.com/yosemiteyss/flutter_volume_controller',\n    authors: [],\n    version: '1.3.3',\n    license: '''MIT License\n\nCopyright (c) 2022 yosemiteyss\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('flutter_plugin_android_lifecycle')\n    ]);\n\n/// flutter_web_plugins null\nconst _flutter_web_plugins = Package(\n    name: 'flutter_web_plugins',\n    description: 'Library to register Flutter Web plugins',\n    homepage: 'https://flutter.dev',\n    authors: [],\n    isMarkdown: false,\n    isSdk: true,\n    dependencies: [PackageRef('flutter')]);\n\n/// flutter_zustand 0.0.5\nconst _flutter_zustand = Package(\n    name: 'flutter_zustand',\n    description:\n        \"Brings zustand's bear necessities for state management to Flutter\",\n    homepage:\n        'https://github.com/josiahsrc/flutter_zustand/tree/main/packages/flutter_zustand',\n    repository:\n        'https://github.com/josiahsrc/flutter_zustand/tree/main/packages/flutter_zustand',\n    authors: [],\n    version: '0.0.5',\n    license: '''MIT License\n\nCopyright (c) 2024 Josiah Saunders\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('provider'),\n      PackageRef('zustand')\n    ]);\n\n/// freezed 3.2.3\nconst _freezed = Package(\n    name: 'freezed',\n    description:\n        '''Code generation for immutable classes that has a simple syntax/API without compromising on the features.\n''',\n    repository: 'https://github.com/rrousselGit/freezed',\n    authors: [],\n    version: '3.2.3',\n    license: '''MIT License\n\nCopyright (c) 2020 Remi Rousselet\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('analyzer'),\n      PackageRef('build'),\n      PackageRef('build_config'),\n      PackageRef('collection'),\n      PackageRef('meta'),\n      PackageRef('source_gen'),\n      PackageRef('freezed_annotation'),\n      PackageRef('json_annotation'),\n      PackageRef('dart_style'),\n      PackageRef('pub_semver')\n    ]);\n\n/// freezed_annotation 3.1.0\nconst _freezed_annotation = Package(\n    name: 'freezed_annotation',\n    description:\n        '''Annotations for the freezed code-generator. This package does nothing without freezed too.\n''',\n    repository: 'https://github.com/rrousselGit/freezed',\n    authors: [],\n    version: '3.1.0',\n    license: '''MIT License\n\nCopyright (c) 2020 Remi Rousselet\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('collection'),\n      PackageRef('json_annotation'),\n      PackageRef('meta')\n    ]);\n\n/// frontend_server_client 4.0.0\nconst _frontend_server_client = Package(\n    name: 'frontend_server_client',\n    description:\n        'Client code to start and interact with the frontend_server compiler from the Dart SDK.',\n    repository:\n        'https://github.com/dart-lang/webdev/tree/master/frontend_server_client',\n    authors: [],\n    version: '4.0.0',\n    license: '''Copyright 2020, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('async'), PackageRef('path')]);\n\n/// fvp 0.34.0\nconst _fvp = Package(\n    name: 'fvp',\n    description:\n        'video_player plugin and backend APIs. Support all desktop/mobile platforms with hardware decoders, optimal renders. Supports most formats via FFmpeg',\n    homepage: 'https://github.com/wang-bin/fvp',\n    authors: [],\n    version: '0.34.0',\n    license: '''BSD-3-Clause License\n\nCopyright 2022 Wang Bin. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('ffi'),\n      PackageRef('flutter'),\n      PackageRef('logging'),\n      PackageRef('path'),\n      PackageRef('plugin_platform_interface'),\n      PackageRef('video_player'),\n      PackageRef('video_player_platform_interface'),\n      PackageRef('path_provider'),\n      PackageRef('http')\n    ]);\n\n/// get_it 8.2.0\nconst _get_it = Package(\n    name: 'get_it',\n    description:\n        'Simple direct Service Locator that allows to decouple the interface from a concrete implementation and  to access the concrete implementation from everywhere in your App\"',\n    homepage: 'https://github.com/flutter-it/get_it',\n    authors: [],\n    version: '8.2.0',\n    license: '''MIT License\n\nCopyright (c) 2018 Thomas Burkhart\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('async'),\n      PackageRef('collection'),\n      PackageRef('meta')\n    ]);\n\n/// glob 2.1.3\nconst _glob = Package(\n    name: 'glob',\n    description: 'A library to perform Bash-style file and directory globbing.',\n    repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/glob',\n    authors: [],\n    version: '2.1.3',\n    license: '''Copyright 2014, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('async'),\n      PackageRef('collection'),\n      PackageRef('file'),\n      PackageRef('path'),\n      PackageRef('string_scanner')\n    ]);\n\n/// google_fonts 6.3.1\nconst _google_fonts = Package(\n    name: 'google_fonts',\n    description:\n        'A Flutter package to use fonts from fonts.google.com. Supports HTTP fetching, caching, and asset bundling.',\n    repository:\n        'https://github.com/flutter/packages/tree/main/packages/google_fonts',\n    authors: [],\n    version: '6.3.1',\n    license: '''Copyright 2013 The Flutter Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('crypto'),\n      PackageRef('flutter'),\n      PackageRef('http'),\n      PackageRef('path_provider')\n    ]);\n\n/// graphs 2.3.2\nconst _graphs = Package(\n    name: 'graphs',\n    description:\n        'Graph algorithms that operate on graphs in any representation.',\n    repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/graphs',\n    authors: [],\n    version: '2.3.2',\n    license: '''Copyright 2017, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('collection')]);\n\n/// gtk 2.1.0\nconst _gtk = Package(\n    name: 'gtk',\n    description: 'GTK+ utilities for Flutter Linux applications.',\n    homepage: 'https://github.com/ubuntu-flutter-community/gtk.dart',\n    repository: 'https://github.com/ubuntu-flutter-community/gtk.dart',\n    authors: [],\n    version: '2.1.0',\n    license: '''Mozilla Public License Version 2.0\n==================================\n\n1. Definitions\n--------------\n\n1.1. \"Contributor\"\n    means each individual or legal entity that creates, contributes to\n    the creation of, or owns Covered Software.\n\n1.2. \"Contributor Version\"\n    means the combination of the Contributions of others (if any) used\n    by a Contributor and that particular Contributor's Contribution.\n\n1.3. \"Contribution\"\n    means Covered Software of a particular Contributor.\n\n1.4. \"Covered Software\"\n    means Source Code Form to which the initial Contributor has attached\n    the notice in Exhibit A, the Executable Form of such Source Code\n    Form, and Modifications of such Source Code Form, in each case\n    including portions thereof.\n\n1.5. \"Incompatible With Secondary Licenses\"\n    means\n\n    (a) that the initial Contributor has attached the notice described\n        in Exhibit B to the Covered Software; or\n\n    (b) that the Covered Software was made available under the terms of\n        version 1.1 or earlier of the License, but not also under the\n        terms of a Secondary License.\n\n1.6. \"Executable Form\"\n    means any form of the work other than Source Code Form.\n\n1.7. \"Larger Work\"\n    means a work that combines Covered Software with other material, in\n    a separate file or files, that is not Covered Software.\n\n1.8. \"License\"\n    means this document.\n\n1.9. \"Licensable\"\n    means having the right to grant, to the maximum extent possible,\n    whether at the time of the initial grant or subsequently, any and\n    all of the rights conveyed by this License.\n\n1.10. \"Modifications\"\n    means any of the following:\n\n    (a) any file in Source Code Form that results from an addition to,\n        deletion from, or modification of the contents of Covered\n        Software; or\n\n    (b) any new file in Source Code Form that contains any Covered\n        Software.\n\n1.11. \"Patent Claims\" of a Contributor\n    means any patent claim(s), including without limitation, method,\n    process, and apparatus claims, in any patent Licensable by such\n    Contributor that would be infringed, but for the grant of the\n    License, by the making, using, selling, offering for sale, having\n    made, import, or transfer of either its Contributions or its\n    Contributor Version.\n\n1.12. \"Secondary License\"\n    means either the GNU General Public License, Version 2.0, the GNU\n    Lesser General Public License, Version 2.1, the GNU Affero General\n    Public License, Version 3.0, or any later versions of those\n    licenses.\n\n1.13. \"Source Code Form\"\n    means the form of the work preferred for making modifications.\n\n1.14. \"You\" (or \"Your\")\n    means an individual or a legal entity exercising rights under this\n    License. For legal entities, \"You\" includes any entity that\n    controls, is controlled by, or is under common control with You. For\n    purposes of this definition, \"control\" means (a) the power, direct\n    or indirect, to cause the direction or management of such entity,\n    whether by contract or otherwise, or (b) ownership of more than\n    fifty percent (50%) of the outstanding shares or beneficial\n    ownership of such entity.\n\n2. License Grants and Conditions\n--------------------------------\n\n2.1. Grants\n\nEach Contributor hereby grants You a world-wide, royalty-free,\nnon-exclusive license:\n\n(a) under intellectual property rights (other than patent or trademark)\n    Licensable by such Contributor to use, reproduce, make available,\n    modify, display, perform, distribute, and otherwise exploit its\n    Contributions, either on an unmodified basis, with Modifications, or\n    as part of a Larger Work; and\n\n(b) under Patent Claims of such Contributor to make, use, sell, offer\n    for sale, have made, import, and otherwise transfer either its\n    Contributions or its Contributor Version.\n\n2.2. Effective Date\n\nThe licenses granted in Section 2.1 with respect to any Contribution\nbecome effective for each Contribution on the date the Contributor first\ndistributes such Contribution.\n\n2.3. Limitations on Grant Scope\n\nThe licenses granted in this Section 2 are the only rights granted under\nthis License. No additional rights or licenses will be implied from the\ndistribution or licensing of Covered Software under this License.\nNotwithstanding Section 2.1(b) above, no patent license is granted by a\nContributor:\n\n(a) for any code that a Contributor has removed from Covered Software;\n    or\n\n(b) for infringements caused by: (i) Your and any other third party's\n    modifications of Covered Software, or (ii) the combination of its\n    Contributions with other software (except as part of its Contributor\n    Version); or\n\n(c) under Patent Claims infringed by Covered Software in the absence of\n    its Contributions.\n\nThis License does not grant any rights in the trademarks, service marks,\nor logos of any Contributor (except as may be necessary to comply with\nthe notice requirements in Section 3.4).\n\n2.4. Subsequent Licenses\n\nNo Contributor makes additional grants as a result of Your choice to\ndistribute the Covered Software under a subsequent version of this\nLicense (see Section 10.2) or under the terms of a Secondary License (if\npermitted under the terms of Section 3.3).\n\n2.5. Representation\n\nEach Contributor represents that the Contributor believes its\nContributions are its original creation(s) or it has sufficient rights\nto grant the rights to its Contributions conveyed by this License.\n\n2.6. Fair Use\n\nThis License is not intended to limit any rights You have under\napplicable copyright doctrines of fair use, fair dealing, or other\nequivalents.\n\n2.7. Conditions\n\nSections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted\nin Section 2.1.\n\n3. Responsibilities\n-------------------\n\n3.1. Distribution of Source Form\n\nAll distribution of Covered Software in Source Code Form, including any\nModifications that You create or to which You contribute, must be under\nthe terms of this License. You must inform recipients that the Source\nCode Form of the Covered Software is governed by the terms of this\nLicense, and how they can obtain a copy of this License. You may not\nattempt to alter or restrict the recipients' rights in the Source Code\nForm.\n\n3.2. Distribution of Executable Form\n\nIf You distribute Covered Software in Executable Form then:\n\n(a) such Covered Software must also be made available in Source Code\n    Form, as described in Section 3.1, and You must inform recipients of\n    the Executable Form how they can obtain a copy of such Source Code\n    Form by reasonable means in a timely manner, at a charge no more\n    than the cost of distribution to the recipient; and\n\n(b) You may distribute such Executable Form under the terms of this\n    License, or sublicense it under different terms, provided that the\n    license for the Executable Form does not attempt to limit or alter\n    the recipients' rights in the Source Code Form under this License.\n\n3.3. Distribution of a Larger Work\n\nYou may create and distribute a Larger Work under terms of Your choice,\nprovided that You also comply with the requirements of this License for\nthe Covered Software. If the Larger Work is a combination of Covered\nSoftware with a work governed by one or more Secondary Licenses, and the\nCovered Software is not Incompatible With Secondary Licenses, this\nLicense permits You to additionally distribute such Covered Software\nunder the terms of such Secondary License(s), so that the recipient of\nthe Larger Work may, at their option, further distribute the Covered\nSoftware under the terms of either this License or such Secondary\nLicense(s).\n\n3.4. Notices\n\nYou may not remove or alter the substance of any license notices\n(including copyright notices, patent notices, disclaimers of warranty,\nor limitations of liability) contained within the Source Code Form of\nthe Covered Software, except that You may alter any license notices to\nthe extent required to remedy known factual inaccuracies.\n\n3.5. Application of Additional Terms\n\nYou may choose to offer, and to charge a fee for, warranty, support,\nindemnity or liability obligations to one or more recipients of Covered\nSoftware. However, You may do so only on Your own behalf, and not on\nbehalf of any Contributor. You must make it absolutely clear that any\nsuch warranty, support, indemnity, or liability obligation is offered by\nYou alone, and You hereby agree to indemnify every Contributor for any\nliability incurred by such Contributor as a result of warranty, support,\nindemnity or liability terms You offer. You may include additional\ndisclaimers of warranty and limitations of liability specific to any\njurisdiction.\n\n4. Inability to Comply Due to Statute or Regulation\n---------------------------------------------------\n\nIf it is impossible for You to comply with any of the terms of this\nLicense with respect to some or all of the Covered Software due to\nstatute, judicial order, or regulation then You must: (a) comply with\nthe terms of this License to the maximum extent possible; and (b)\ndescribe the limitations and the code they affect. Such description must\nbe placed in a text file included with all distributions of the Covered\nSoftware under this License. Except to the extent prohibited by statute\nor regulation, such description must be sufficiently detailed for a\nrecipient of ordinary skill to be able to understand it.\n\n5. Termination\n--------------\n\n5.1. The rights granted under this License will terminate automatically\nif You fail to comply with any of its terms. However, if You become\ncompliant, then the rights granted under this License from a particular\nContributor are reinstated (a) provisionally, unless and until such\nContributor explicitly and finally terminates Your grants, and (b) on an\nongoing basis, if such Contributor fails to notify You of the\nnon-compliance by some reasonable means prior to 60 days after You have\ncome back into compliance. Moreover, Your grants from a particular\nContributor are reinstated on an ongoing basis if such Contributor\nnotifies You of the non-compliance by some reasonable means, this is the\nfirst time You have received notice of non-compliance with this License\nfrom such Contributor, and You become compliant prior to 30 days after\nYour receipt of the notice.\n\n5.2. If You initiate litigation against any entity by asserting a patent\ninfringement claim (excluding declaratory judgment actions,\ncounter-claims, and cross-claims) alleging that a Contributor Version\ndirectly or indirectly infringes any patent, then the rights granted to\nYou by any and all Contributors for the Covered Software under Section\n2.1 of this License shall terminate.\n\n5.3. In the event of termination under Sections 5.1 or 5.2 above, all\nend user license agreements (excluding distributors and resellers) which\nhave been validly granted by You or Your distributors under this License\nprior to termination shall survive termination.\n\n************************************************************************\n*                                                                      *\n*  6. Disclaimer of Warranty                                           *\n*  -------------------------                                           *\n*                                                                      *\n*  Covered Software is provided under this License on an \"as is\"       *\n*  basis, without warranty of any kind, either expressed, implied, or  *\n*  statutory, including, without limitation, warranties that the       *\n*  Covered Software is free of defects, merchantable, fit for a        *\n*  particular purpose or non-infringing. The entire risk as to the     *\n*  quality and performance of the Covered Software is with You.        *\n*  Should any Covered Software prove defective in any respect, You     *\n*  (not any Contributor) assume the cost of any necessary servicing,   *\n*  repair, or correction. This disclaimer of warranty constitutes an   *\n*  essential part of this License. No use of any Covered Software is   *\n*  authorized under this License except under this disclaimer.         *\n*                                                                      *\n************************************************************************\n\n************************************************************************\n*                                                                      *\n*  7. Limitation of Liability                                          *\n*  --------------------------                                          *\n*                                                                      *\n*  Under no circumstances and under no legal theory, whether tort      *\n*  (including negligence), contract, or otherwise, shall any           *\n*  Contributor, or anyone who distributes Covered Software as          *\n*  permitted above, be liable to You for any direct, indirect,         *\n*  special, incidental, or consequential damages of any character      *\n*  including, without limitation, damages for lost profits, loss of    *\n*  goodwill, work stoppage, computer failure or malfunction, or any    *\n*  and all other commercial damages or losses, even if such party      *\n*  shall have been informed of the possibility of such damages. This   *\n*  limitation of liability shall not apply to liability for death or   *\n*  personal injury resulting from such party's negligence to the       *\n*  extent applicable law prohibits such limitation. Some               *\n*  jurisdictions do not allow the exclusion or limitation of           *\n*  incidental or consequential damages, so this exclusion and          *\n*  limitation may not apply to You.                                    *\n*                                                                      *\n************************************************************************\n\n8. Litigation\n-------------\n\nAny litigation relating to this License may be brought only in the\ncourts of a jurisdiction where the defendant maintains its principal\nplace of business and such litigation shall be governed by laws of that\njurisdiction, without reference to its conflict-of-law provisions.\nNothing in this Section shall prevent a party's ability to bring\ncross-claims or counter-claims.\n\n9. Miscellaneous\n----------------\n\nThis License represents the complete agreement concerning the subject\nmatter hereof. If any provision of this License is held to be\nunenforceable, such provision shall be reformed only to the extent\nnecessary to make it enforceable. Any law or regulation which provides\nthat the language of a contract shall be construed against the drafter\nshall not be used to construe this License against a Contributor.\n\n10. Versions of the License\n---------------------------\n\n10.1. New Versions\n\nMozilla Foundation is the license steward. Except as provided in Section\n10.3, no one other than the license steward has the right to modify or\npublish new versions of this License. Each version will be given a\ndistinguishing version number.\n\n10.2. Effect of New Versions\n\nYou may distribute the Covered Software under the terms of the version\nof the License under which You originally received the Covered Software,\nor under the terms of any subsequent version published by the license\nsteward.\n\n10.3. Modified Versions\n\nIf you create software not governed by this License, and you want to\ncreate a new license for such software, you may create and use a\nmodified version of this License if you rename the license and remove\nany references to the name of the license steward (except to note that\nsuch modified license differs from this License).\n\n10.4. Distributing Source Code Form that is Incompatible With Secondary\nLicenses\n\nIf You choose to distribute Source Code Form that is Incompatible With\nSecondary Licenses under the terms of this version of the License, the\nnotice described in Exhibit B of this License must be attached.\n\nExhibit A - Source Code Form License Notice\n-------------------------------------------\n\n  This Source Code Form is subject to the terms of the Mozilla Public\n  License, v. 2.0. If a copy of the MPL was not distributed with this\n  file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\nIf it is not possible or desirable to put the notice in a particular\nfile, then You may include the notice in a location (such as a LICENSE\nfile in a relevant directory) where a recipient would be likely to look\nfor such a notice.\n\nYou may add additional accurate notices of copyright ownership.\n\nExhibit B - \"Incompatible With Secondary Licenses\" Notice\n---------------------------------------------------------\n\n  This Source Code Form is \"Incompatible With Secondary Licenses\", as\n  defined by the Mozilla Public License, v. 2.0.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('ffi'),\n      PackageRef('flutter'),\n      PackageRef('meta')\n    ]);\n\n/// hotreloader 4.3.0\nconst _hotreloader = Package(\n    name: 'hotreloader',\n    description:\n        '''Automatic hot code reloader for Dart projects that monitors the source files of a Dart project for changes and automatically applies them to the running Dart process.\n''',\n    homepage: 'https://github.com/vegardit/dart-hotreloader',\n    repository: 'https://github.com/vegardit/dart-hotreloader.git',\n    authors: [],\n    version: '4.3.0',\n    license: '''Apache License\n                        Version 2.0, January 2004\n                     http://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n1. Definitions.\n\n   \"License\" shall mean the terms and conditions for use, reproduction,\n   and distribution as defined by Sections 1 through 9 of this document.\n\n   \"Licensor\" shall mean the copyright owner or entity authorized by\n   the copyright owner that is granting the License.\n\n   \"Legal Entity\" shall mean the union of the acting entity and all\n   other entities that control, are controlled by, or are under common\n   control with that entity. For the purposes of this definition,\n   \"control\" means (i) the power, direct or indirect, to cause the\n   direction or management of such entity, whether by contract or\n   otherwise, or (ii) ownership of fifty percent (50%) or more of the\n   outstanding shares, or (iii) beneficial ownership of such entity.\n\n   \"You\" (or \"Your\") shall mean an individual or Legal Entity\n   exercising permissions granted by this License.\n\n   \"Source\" form shall mean the preferred form for making modifications,\n   including but not limited to software source code, documentation\n   source, and configuration files.\n\n   \"Object\" form shall mean any form resulting from mechanical\n   transformation or translation of a Source form, including but\n   not limited to compiled object code, generated documentation,\n   and conversions to other media types.\n\n   \"Work\" shall mean the work of authorship, whether in Source or\n   Object form, made available under the License, as indicated by a\n   copyright notice that is included in or attached to the work\n   (an example is provided in the Appendix below).\n\n   \"Derivative Works\" shall mean any work, whether in Source or Object\n   form, that is based on (or derived from) the Work and for which the\n   editorial revisions, annotations, elaborations, or other modifications\n   represent, as a whole, an original work of authorship. For the purposes\n   of this License, Derivative Works shall not include works that remain\n   separable from, or merely link (or bind by name) to the interfaces of,\n   the Work and Derivative Works thereof.\n\n   \"Contribution\" shall mean any work of authorship, including\n   the original version of the Work and any modifications or additions\n   to that Work or Derivative Works thereof, that is intentionally\n   submitted to Licensor for inclusion in the Work by the copyright owner\n   or by an individual or Legal Entity authorized to submit on behalf of\n   the copyright owner. For the purposes of this definition, \"submitted\"\n   means any form of electronic, verbal, or written communication sent\n   to the Licensor or its representatives, including but not limited to\n   communication on electronic mailing lists, source code control systems,\n   and issue tracking systems that are managed by, or on behalf of, the\n   Licensor for the purpose of discussing and improving the Work, but\n   excluding communication that is conspicuously marked or otherwise\n   designated in writing by the copyright owner as \"Not a Contribution.\"\n\n   \"Contributor\" shall mean Licensor and any individual or Legal Entity\n   on behalf of whom a Contribution has been received by Licensor and\n   subsequently incorporated within the Work.\n\n2. Grant of Copyright License. Subject to the terms and conditions of\n   this License, each Contributor hereby grants to You a perpetual,\n   worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n   copyright license to reproduce, prepare Derivative Works of,\n   publicly display, publicly perform, sublicense, and distribute the\n   Work and such Derivative Works in Source or Object form.\n\n3. Grant of Patent License. Subject to the terms and conditions of\n   this License, each Contributor hereby grants to You a perpetual,\n   worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n   (except as stated in this section) patent license to make, have made,\n   use, offer to sell, sell, import, and otherwise transfer the Work,\n   where such license applies only to those patent claims licensable\n   by such Contributor that are necessarily infringed by their\n   Contribution(s) alone or by combination of their Contribution(s)\n   with the Work to which such Contribution(s) was submitted. If You\n   institute patent litigation against any entity (including a\n   cross-claim or counterclaim in a lawsuit) alleging that the Work\n   or a Contribution incorporated within the Work constitutes direct\n   or contributory patent infringement, then any patent licenses\n   granted to You under this License for that Work shall terminate\n   as of the date such litigation is filed.\n\n4. Redistribution. You may reproduce and distribute copies of the\n   Work or Derivative Works thereof in any medium, with or without\n   modifications, and in Source or Object form, provided that You\n   meet the following conditions:\n\n   (a) You must give any other recipients of the Work or\n       Derivative Works a copy of this License; and\n\n   (b) You must cause any modified files to carry prominent notices\n       stating that You changed the files; and\n\n   (c) You must retain, in the Source form of any Derivative Works\n       that You distribute, all copyright, patent, trademark, and\n       attribution notices from the Source form of the Work,\n       excluding those notices that do not pertain to any part of\n       the Derivative Works; and\n\n   (d) If the Work includes a \"NOTICE\" text file as part of its\n       distribution, then any Derivative Works that You distribute must\n       include a readable copy of the attribution notices contained\n       within such NOTICE file, excluding those notices that do not\n       pertain to any part of the Derivative Works, in at least one\n       of the following places: within a NOTICE text file distributed\n       as part of the Derivative Works; within the Source form or\n       documentation, if provided along with the Derivative Works; or,\n       within a display generated by the Derivative Works, if and\n       wherever such third-party notices normally appear. The contents\n       of the NOTICE file are for informational purposes only and\n       do not modify the License. You may add Your own attribution\n       notices within Derivative Works that You distribute, alongside\n       or as an addendum to the NOTICE text from the Work, provided\n       that such additional attribution notices cannot be construed\n       as modifying the License.\n\n   You may add Your own copyright statement to Your modifications and\n   may provide additional or different license terms and conditions\n   for use, reproduction, or distribution of Your modifications, or\n   for any such Derivative Works as a whole, provided Your use,\n   reproduction, and distribution of the Work otherwise complies with\n   the conditions stated in this License.\n\n5. Submission of Contributions. Unless You explicitly state otherwise,\n   any Contribution intentionally submitted for inclusion in the Work\n   by You to the Licensor shall be under the terms and conditions of\n   this License, without any additional terms or conditions.\n   Notwithstanding the above, nothing herein shall supersede or modify\n   the terms of any separate license agreement you may have executed\n   with Licensor regarding such Contributions.\n\n6. Trademarks. This License does not grant permission to use the trade\n   names, trademarks, service marks, or product names of the Licensor,\n   except as required for reasonable and customary use in describing the\n   origin of the Work and reproducing the content of the NOTICE file.\n\n7. Disclaimer of Warranty. Unless required by applicable law or\n   agreed to in writing, Licensor provides the Work (and each\n   Contributor provides its Contributions) on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n   implied, including, without limitation, any warranties or conditions\n   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n   PARTICULAR PURPOSE. You are solely responsible for determining the\n   appropriateness of using or redistributing the Work and assume any\n   risks associated with Your exercise of permissions under this License.\n\n8. Limitation of Liability. In no event and under no legal theory,\n   whether in tort (including negligence), contract, or otherwise,\n   unless required by applicable law (such as deliberate and grossly\n   negligent acts) or agreed to in writing, shall any Contributor be\n   liable to You for damages, including any direct, indirect, special,\n   incidental, or consequential damages of any character arising as a\n   result of this License or out of the use or inability to use the\n   Work (including but not limited to damages for loss of goodwill,\n   work stoppage, computer failure or malfunction, or any and all\n   other commercial damages or losses), even if such Contributor\n   has been advised of the possibility of such damages.\n\n9. Accepting Warranty or Additional Liability. While redistributing\n   the Work or Derivative Works thereof, You may choose to offer,\n   and charge a fee for, acceptance of support, warranty, indemnity,\n   or other liability obligations and/or rights consistent with this\n   License. However, in accepting such obligations, You may act only\n   on Your own behalf and on Your sole responsibility, not on behalf\n   of any other Contributor, and only if You agree to indemnify,\n   defend, and hold each Contributor harmless for any liability\n   incurred by, or claims asserted against, such Contributor by reason\n   of your accepting any such warranty or additional liability.\n\nEND OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\n   To apply the Apache License to your work, attach the following\n   boilerplate notice, with the fields enclosed by brackets \"[]\"\n   replaced with your own identifying information. (Don't include\n   the brackets!)  The text should be enclosed in the appropriate\n   comment syntax for the file format. We also recommend that a\n   file or class name and description of purpose be included on the\n   same \"printed page\" as the copyright notice for easier\n   identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('collection'),\n      PackageRef('logging'),\n      PackageRef('path'),\n      PackageRef('stream_transform'),\n      PackageRef('vm_service'),\n      PackageRef('watcher')\n    ]);\n\n/// html 0.15.6\nconst _html = Package(\n    name: 'html',\n    description:\n        'APIs for parsing and manipulating HTML content outside the browser.',\n    repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/html',\n    authors: [],\n    version: '0.15.6',\n    license: '''Copyright (c) 2006-2012 The Authors\n\nContributors:\nJames Graham - jg307@cam.ac.uk\nAnne van Kesteren - annevankesteren@gmail.com\nLachlan Hunt - lachlan.hunt@lachy.id.au\nMatt McDonald - kanashii@kanashii.ca\nSam Ruby - rubys@intertwingly.net\nIan Hickson (Google) - ian@hixie.ch\nThomas Broyer - t.broyer@ltgt.net\nJacques Distler - distler@golem.ph.utexas.edu\nHenri Sivonen - hsivonen@iki.fi\nAdam Barth - abarth@webkit.org\nEric Seidel - eric@webkit.org\nThe Mozilla Foundation (contributions from Henri Sivonen since 2008)\nDavid Flanagan (Mozilla) - dflanagan@mozilla.com\nGoogle LLC (contributed the Dart port) - misc@dartlang.org\n\nPermission 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:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE 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.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('csslib'), PackageRef('source_span')]);\n\n/// http 1.5.0\nconst _http = Package(\n    name: 'http',\n    description:\n        'A composable, multi-platform, Future-based API for HTTP requests.',\n    repository: 'https://github.com/dart-lang/http/tree/master/pkgs/http',\n    authors: [],\n    version: '1.5.0',\n    license: '''Copyright 2014, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('async'),\n      PackageRef('http_parser'),\n      PackageRef('meta'),\n      PackageRef('web')\n    ]);\n\n/// http_methods 1.1.1\nconst _http_methods = Package(\n    name: 'http_methods',\n    description:\n        '''List of all HTTP methods registered with IANA as list of strings, and metadata\nsuch as whether a method idempotent.\n''',\n    homepage: 'https://github.com/google/dart-neats/tree/master/http_methods',\n    repository: 'https://github.com/google/dart-neats.git',\n    authors: [],\n    version: '1.1.1',\n    license: '''Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: []);\n\n/// http_multi_server 3.2.2\nconst _http_multi_server = Package(\n    name: 'http_multi_server',\n    description:\n        'A dart:io HttpServer wrapper that handles requests from multiple servers.',\n    repository:\n        'https://github.com/dart-lang/http/tree/master/pkgs/http_multi_server',\n    authors: [],\n    version: '3.2.2',\n    license: '''Copyright 2014, the Dart project authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('async')]);\n\n/// http_parser 4.1.2\nconst _http_parser = Package(\n    name: 'http_parser',\n    description:\n        'A platform-independent package for parsing and serializing HTTP formats.',\n    repository:\n        'https://github.com/dart-lang/http/tree/master/pkgs/http_parser',\n    authors: [],\n    version: '4.1.2',\n    license: '''Copyright 2014, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('collection'),\n      PackageRef('source_span'),\n      PackageRef('string_scanner'),\n      PackageRef('typed_data')\n    ]);\n\n/// image 4.5.4\nconst _image = Package(\n    name: 'image',\n    description:\n        'Dart Image Library provides server and web apps the ability to load, manipulate, and save images with various image file formats.',\n    homepage: 'https://github.com/brendan-duncan/image',\n    authors: [],\n    version: '4.5.4',\n    license: '''The MIT License\n\nCopyright (c) 2013-2022 Brendan Duncan.\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('archive'),\n      PackageRef('meta'),\n      PackageRef('xml')\n    ]);\n\n/// intl 0.20.2\nconst _intl = Package(\n    name: 'intl',\n    description:\n        'Contains code to deal with internationalized/localized messages, date and number formatting and parsing, bi-directional text, and other internationalization issues.',\n    repository: 'https://github.com/dart-lang/i18n/tree/main/pkgs/intl',\n    authors: [],\n    version: '0.20.2',\n    license: '''Copyright 2013, the Dart project authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('clock'),\n      PackageRef('meta'),\n      PackageRef('path')\n    ]);\n\n/// io 1.0.5\nconst _io = Package(\n    name: 'io',\n    description:\n        'Utilities for the Dart VM Runtime including support for ANSI colors, file copying, and standard exit code values.',\n    repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/io',\n    authors: [],\n    version: '1.0.5',\n    license: '''Copyright 2017, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('meta'),\n      PackageRef('path'),\n      PackageRef('string_scanner')\n    ]);\n\n/// js 0.6.7\nconst _js = Package(\n    name: 'js',\n    description:\n        'Annotations to create static Dart interfaces for JavaScript APIs.',\n    repository: 'https://github.com/dart-lang/sdk/tree/main/pkg/js',\n    authors: [],\n    version: '0.6.7',\n    license: '''Copyright 2012, the Dart project authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('meta')]);\n\n/// json_annotation 4.9.0\nconst _json_annotation = Package(\n    name: 'json_annotation',\n    description:\n        'Classes and helper functions that support JSON code generation via the `json_serializable` package.',\n    repository:\n        'https://github.com/google/json_serializable.dart/tree/master/json_annotation',\n    authors: [],\n    version: '4.9.0',\n    license: '''Copyright 2017, the Dart project authors. All rights reserved.\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('meta')]);\n\n/// json_serializable 6.11.1\nconst _json_serializable = Package(\n    name: 'json_serializable',\n    description:\n        'Automatically generate code for converting to and from JSON by annotating Dart classes.',\n    repository:\n        'https://github.com/google/json_serializable.dart/tree/master/json_serializable',\n    authors: [],\n    version: '6.11.1',\n    license: '''Copyright 2017, the Dart project authors. All rights reserved.\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('analyzer'),\n      PackageRef('async'),\n      PackageRef('build'),\n      PackageRef('build_config'),\n      PackageRef('dart_style'),\n      PackageRef('json_annotation'),\n      PackageRef('meta'),\n      PackageRef('path'),\n      PackageRef('pub_semver'),\n      PackageRef('pubspec_parse'),\n      PackageRef('source_gen'),\n      PackageRef('source_helper')\n    ]);\n\n/// leak_tracker 11.0.2\nconst _leak_tracker = Package(\n    name: 'leak_tracker',\n    description:\n        'A framework for memory leak tracking for Dart and Flutter applications.',\n    repository:\n        'https://github.com/dart-lang/leak_tracker/tree/main/pkgs/leak_tracker',\n    authors: [],\n    version: '11.0.2',\n    license: '''Copyright 2022, the Dart project authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('clock'),\n      PackageRef('collection'),\n      PackageRef('meta'),\n      PackageRef('path'),\n      PackageRef('vm_service')\n    ]);\n\n/// leak_tracker_flutter_testing 3.0.10\nconst _leak_tracker_flutter_testing = Package(\n    name: 'leak_tracker_flutter_testing',\n    description: 'An internal package to test leak tracking with Flutter.',\n    repository:\n        'https://github.com/dart-lang/leak_tracker/tree/main/pkgs/leak_tracker_flutter_testing',\n    authors: [],\n    version: '3.0.10',\n    license: '''Copyright 2022, the Dart project authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('leak_tracker'),\n      PackageRef('leak_tracker_testing'),\n      PackageRef('matcher'),\n      PackageRef('meta')\n    ]);\n\n/// leak_tracker_testing 3.0.2\nconst _leak_tracker_testing = Package(\n    name: 'leak_tracker_testing',\n    description: 'Leak tracking code intended for usage in tests.',\n    repository:\n        'https://github.com/dart-lang/leak_tracker/tree/main/pkgs/leak_tracker_testing',\n    authors: [],\n    version: '3.0.2',\n    license: '''Copyright 2022, the Dart project authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('leak_tracker'),\n      PackageRef('matcher'),\n      PackageRef('meta')\n    ]);\n\n/// lints 6.0.0\nconst _lints = Package(\n    name: 'lints',\n    description:\n        \"\"\"Official Dart lint rules. Defines the 'core' and 'recommended' set of lints suggested by the Dart team.\n\"\"\",\n    repository: 'https://github.com/dart-lang/core/tree/main/pkgs/lints',\n    authors: [],\n    version: '6.0.0',\n    license: '''Copyright 2021, the Dart project authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: []);\n\n/// logging 1.3.0\nconst _logging = Package(\n    name: 'logging',\n    description:\n        'Provides APIs for debugging and error logging, similar to loggers in other languages, such as the Closure JS Logger and java.util.logging.Logger.',\n    repository: 'https://github.com/dart-lang/core/tree/main/pkgs/logging',\n    authors: [],\n    version: '1.3.0',\n    license: '''Copyright 2013, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: []);\n\n/// markdown 7.3.0\nconst _markdown = Package(\n    name: 'markdown',\n    description:\n        'A portable Markdown library written in Dart that can parse Markdown into HTML.',\n    repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/markdown',\n    authors: [],\n    version: '7.3.0',\n    license: '''Copyright 2012, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('args'), PackageRef('meta')]);\n\n/// matcher 0.12.17\nconst _matcher = Package(\n    name: 'matcher',\n    description:\n        'Support for specifying test expectations via an extensible Matcher class. Also includes a number of built-in Matcher implementations for common cases.',\n    repository: 'https://github.com/dart-lang/test/tree/master/pkgs/matcher',\n    authors: [],\n    version: '0.12.17',\n    license: '''Copyright 2014, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('async'),\n      PackageRef('meta'),\n      PackageRef('stack_trace'),\n      PackageRef('term_glyph'),\n      PackageRef('test_api')\n    ]);\n\n/// material_color_utilities 0.11.1\nconst _material_color_utilities = Package(\n    name: 'material_color_utilities',\n    description:\n        'Algorithms and utilities that power the Material Design 3 color system, including choosing theme colors from images and creating tones of colors; all in a new color space.',\n    repository:\n        'https://github.com/material-foundation/material-color-utilities/tree/main/dart',\n    authors: [],\n    version: '0.11.1',\n    license: '''Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n   To apply the Apache License to your work, attach the following\n   boilerplate notice, with the fields enclosed by brackets \"[]\"\n   replaced with your own identifying information. (Don't include\n   the brackets!)  The text should be enclosed in the appropriate\n   comment syntax for the file format. We also recommend that a\n   file or class name and description of purpose be included on the\n   same \"printed page\" as the copyright notice for easier\n   identification within third-party archives.\n\n   Copyright 2021 Google LLC\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('collection')]);\n\n/// media_kit 1.2.0\nconst _media_kit = Package(\n    name: 'media_kit',\n    description:\n        'A cross-platform video player & audio player for Flutter & Dart. Performant, stable, feature-proof & modular.',\n    homepage: 'https://github.com/media-kit/media-kit',\n    repository: 'https://github.com/media-kit/media-kit',\n    authors: [],\n    version: '1.2.0',\n    license: '''MIT License\n\nCopyright (c) 2021 & onwards Hitesh Kumar Saini <saini123hitesh@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('collection'),\n      PackageRef('http'),\n      PackageRef('image'),\n      PackageRef('meta'),\n      PackageRef('path'),\n      PackageRef('safe_local_storage'),\n      PackageRef('synchronized'),\n      PackageRef('universal_platform'),\n      PackageRef('web'),\n      PackageRef('uri_parser'),\n      PackageRef('uuid')\n    ]);\n\n/// media_kit_libs_android_video 1.3.7\nconst _media_kit_libs_android_video = Package(\n    name: 'media_kit_libs_android_video',\n    description:\n        'Android package providing video (& audio) native libraries for package:media_kit.',\n    homepage: 'https://github.com/media-kit/media-kit.git',\n    repository: 'https://github.com/media-kit/media-kit.git',\n    authors: [],\n    version: '1.3.7',\n    license: '''MIT License\n\nCopyright (c) 2021 & onwards Hitesh Kumar Saini <saini123hitesh@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('plugin_platform_interface')\n    ]);\n\n/// media_kit_libs_ios_video 1.1.4\nconst _media_kit_libs_ios_video = Package(\n    name: 'media_kit_libs_ios_video',\n    description:\n        'iOS package providing video (& audio) native libraries for package:media_kit.',\n    homepage: 'https://github.com/media-kit/media-kit.git',\n    repository: 'https://github.com/media-kit/media-kit.git',\n    authors: [],\n    version: '1.1.4',\n    license: '''MIT License\n\nCopyright (c) 2021 & onwards Hitesh Kumar Saini <saini123hitesh@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('plugin_platform_interface')\n    ]);\n\n/// media_kit_libs_linux 1.2.1\nconst _media_kit_libs_linux = Package(\n    name: 'media_kit_libs_linux',\n    description:\n        'GNU/Linux dependency package for package:media_kit. Necessary for initialization.',\n    homepage: 'https://github.com/media-kit/media-kit.git',\n    repository: 'https://github.com/media-kit/media-kit.git',\n    authors: [],\n    version: '1.2.1',\n    license: '''MIT License\n\nCopyright (c) 2021 & onwards Hitesh Kumar Saini <saini123hitesh@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('flutter')]);\n\n/// media_kit_libs_macos_video 1.1.4\nconst _media_kit_libs_macos_video = Package(\n    name: 'media_kit_libs_macos_video',\n    description:\n        'macOS package providing video (& audio) native libraries for package:media_kit.',\n    homepage: 'https://github.com/media-kit/media-kit.git',\n    repository: 'https://github.com/media-kit/media-kit.git',\n    authors: [],\n    version: '1.1.4',\n    license: '''MIT License\n\nCopyright (c) 2021 & onwards Hitesh Kumar Saini <saini123hitesh@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('plugin_platform_interface')\n    ]);\n\n/// media_kit_libs_video 1.0.6\nconst _media_kit_libs_video = Package(\n    name: 'media_kit_libs_video',\n    description:\n        'package:media_kit video (& audio) playback native libraries for all platforms.',\n    homepage: 'https://github.com/media-kit/media-kit.git',\n    repository: 'https://github.com/media-kit/media-kit.git',\n    authors: [],\n    version: '1.0.6',\n    license: '''MIT License\n\nCopyright (c) 2021 & onwards Hitesh Kumar Saini <saini123hitesh@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('media_kit_libs_android_video'),\n      PackageRef('media_kit_libs_ios_video'),\n      PackageRef('media_kit_libs_macos_video'),\n      PackageRef('media_kit_libs_windows_video'),\n      PackageRef('media_kit_libs_linux')\n    ]);\n\n/// media_kit_libs_windows_video 1.0.11\nconst _media_kit_libs_windows_video = Package(\n    name: 'media_kit_libs_windows_video',\n    description:\n        'Windows package providing video (& audio) native libraries for package:media_kit.',\n    homepage: 'https://github.com/media-kit/media-kit.git',\n    repository: 'https://github.com/media-kit/media-kit.git',\n    authors: [],\n    version: '1.0.11',\n    license: '''MIT License\n\nCopyright (c) 2021 & onwards Hitesh Kumar Saini <saini123hitesh@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('flutter')]);\n\n/// media_kit_video 1.3.0\nconst _media_kit_video = Package(\n    name: 'media_kit_video',\n    description:\n        'Native implementation for video playback in package:media_kit.',\n    homepage: 'https://github.com/media-kit/media-kit',\n    repository: 'https://github.com/media-kit/media-kit',\n    authors: [],\n    version: '1.3.0',\n    license: '''MIT License\n\nCopyright (c) 2021 & onwards Hitesh Kumar Saini <saini123hitesh@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('media_kit'),\n      PackageRef('synchronized'),\n      PackageRef('wakelock_plus'),\n      PackageRef('screen_brightness_android'),\n      PackageRef('screen_brightness_platform_interface'),\n      PackageRef('volume_controller'),\n      PackageRef('universal_platform'),\n      PackageRef('plugin_platform_interface'),\n      PackageRef('web')\n    ]);\n\n/// media_stream 0.0.1\nconst _media_stream = Package(\n    name: 'media_stream',\n    description: 'A server to stream media from FTP and SMB via HTTP.',\n    homepage: 'https://github.com/nini22P/media_stream',\n    repository: 'https://github.com/nini22P/media_stream',\n    authors: [],\n    version: '0.0.1',\n    license: '''MIT License\n\nCopyright (c) 2025 22\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('pure_ftp'),\n      PackageRef('smb_connect'),\n      PackageRef('shelf'),\n      PackageRef('shelf_router')\n    ]);\n\n/// meta 1.16.0\nconst _meta = Package(\n    name: 'meta',\n    description:\n        \"Annotations used to express developer intentions that can't otherwise be deduced by statically analyzing source code.\",\n    repository: 'https://github.com/dart-lang/sdk/tree/main/pkg/meta',\n    authors: [],\n    version: '1.16.0',\n    license: '''Copyright 2016, the Dart project authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: []);\n\n/// mime 2.0.0\nconst _mime = Package(\n    name: 'mime',\n    description:\n        'Utilities for handling media (MIME) types, including determining a type from a file extension and file contents.',\n    repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/mime',\n    authors: [],\n    version: '2.0.0',\n    license: '''Copyright 2015, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: []);\n\n/// msix 3.16.12\nconst _msix = Package(\n    name: 'msix',\n    description:\n        'A command-line tool that create Msix installer from your flutter windows-build files.',\n    homepage: 'https://github.com/YehudaKremer/msix',\n    authors: [],\n    version: '3.16.12',\n    license: '''MIT License\n\nCopyright (c) 2022 Yehuda Kremer\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('args'),\n      PackageRef('yaml'),\n      PackageRef('path'),\n      PackageRef('package_config'),\n      PackageRef('get_it'),\n      PackageRef('image'),\n      PackageRef('pub_semver'),\n      PackageRef('console'),\n      PackageRef('cli_util')\n    ]);\n\n/// mutex 3.1.0\nconst _mutex = Package(\n    name: 'mutex',\n    description:\n        'Mutual exclusion with implementation of normal and read-write mutex',\n    homepage: 'https://github.com/hoylen/dart-mutex',\n    authors: [],\n    version: '3.1.0',\n    license: '''Copyright (c) 2016, Hoylen Sue.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n    * Neither the name of the <organization> nor the\n      names of its contributors may be used to endorse or promote products\n      derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: []);\n\n/// nested 1.0.0\nconst _nested = Package(\n    name: 'nested',\n    description:\n        'A Flutter Widget which helps nest multiple widgets without needing to manually nest them.',\n    repository: 'https://github.com/rrousselGit/nested',\n    authors: [],\n    version: '1.0.0',\n    license: '''MIT License\n\nCopyright (c) 2019 Remi Rousselet\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('flutter')]);\n\n/// package_config 2.2.0\nconst _package_config = Package(\n    name: 'package_config',\n    description:\n        'Support for reading and writing Dart Package Configuration files.',\n    repository:\n        'https://github.com/dart-lang/tools/tree/main/pkgs/package_config',\n    authors: [],\n    version: '2.2.0',\n    license: '''Copyright 2019, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('path')]);\n\n/// package_info_plus 9.0.0\nconst _package_info_plus = Package(\n    name: 'package_info_plus',\n    description:\n        'Flutter plugin for querying information about the application package, such as CFBundleVersion on iOS or versionCode on Android.',\n    homepage: 'https://github.com/fluttercommunity/plus_plugins',\n    repository:\n        'https://github.com/fluttercommunity/plus_plugins/tree/main/packages/package_info_plus/package_info_plus',\n    authors: [],\n    version: '9.0.0',\n    license: '''Copyright 2017 The Chromium Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('ffi'),\n      PackageRef('flutter'),\n      PackageRef('flutter_web_plugins'),\n      PackageRef('http'),\n      PackageRef('meta'),\n      PackageRef('path'),\n      PackageRef('package_info_plus_platform_interface'),\n      PackageRef('web'),\n      PackageRef('win32'),\n      PackageRef('clock')\n    ]);\n\n/// package_info_plus_platform_interface 3.2.1\nconst _package_info_plus_platform_interface = Package(\n    name: 'package_info_plus_platform_interface',\n    description:\n        'A common platform interface for the package_info_plus plugin.',\n    homepage: 'https://github.com/fluttercommunity/plus_plugins',\n    repository:\n        'https://github.com/fluttercommunity/plus_plugins/tree/main/packages/',\n    authors: [],\n    version: '3.2.1',\n    license: '''Copyright 2017 The Chromium Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('meta'),\n      PackageRef('plugin_platform_interface')\n    ]);\n\n/// path 1.9.1\nconst _path = Package(\n    name: 'path',\n    description:\n        'A string-based path manipulation library. All of the path operations you know and love, with solid support for Windows, POSIX (Linux and Mac OS X), and the web.',\n    repository: 'https://github.com/dart-lang/core/tree/main/pkgs/path',\n    authors: [],\n    version: '1.9.1',\n    license: '''Copyright 2014, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: []);\n\n/// path_provider 2.1.5\nconst _path_provider = Package(\n    name: 'path_provider',\n    description:\n        'Flutter plugin for getting commonly used locations on host platform file systems, such as the temp and app data directories.',\n    repository:\n        'https://github.com/flutter/packages/tree/main/packages/path_provider/path_provider',\n    authors: [],\n    version: '2.1.5',\n    license: '''Copyright 2013 The Flutter Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('path_provider_android'),\n      PackageRef('path_provider_foundation'),\n      PackageRef('path_provider_linux'),\n      PackageRef('path_provider_platform_interface'),\n      PackageRef('path_provider_windows')\n    ]);\n\n/// path_provider_android 2.2.18\nconst _path_provider_android = Package(\n    name: 'path_provider_android',\n    description: 'Android implementation of the path_provider plugin.',\n    repository:\n        'https://github.com/flutter/packages/tree/main/packages/path_provider/path_provider_android',\n    authors: [],\n    version: '2.2.18',\n    license: '''Copyright 2013 The Flutter Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('path_provider_platform_interface')\n    ]);\n\n/// path_provider_foundation 2.4.2\nconst _path_provider_foundation = Package(\n    name: 'path_provider_foundation',\n    description: 'iOS and macOS implementation of the path_provider plugin',\n    repository:\n        'https://github.com/flutter/packages/tree/main/packages/path_provider/path_provider_foundation',\n    authors: [],\n    version: '2.4.2',\n    license: '''Copyright 2013 The Flutter Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('path_provider_platform_interface')\n    ]);\n\n/// path_provider_linux 2.2.1\nconst _path_provider_linux = Package(\n    name: 'path_provider_linux',\n    description: 'Linux implementation of the path_provider plugin',\n    repository:\n        'https://github.com/flutter/packages/tree/main/packages/path_provider/path_provider_linux',\n    authors: [],\n    version: '2.2.1',\n    license: '''Copyright 2013 The Flutter Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('ffi'),\n      PackageRef('flutter'),\n      PackageRef('path'),\n      PackageRef('path_provider_platform_interface'),\n      PackageRef('xdg_directories')\n    ]);\n\n/// path_provider_platform_interface 2.1.2\nconst _path_provider_platform_interface = Package(\n    name: 'path_provider_platform_interface',\n    description: 'A common platform interface for the path_provider plugin.',\n    repository:\n        'https://github.com/flutter/packages/tree/main/packages/path_provider/path_provider_platform_interface',\n    authors: [],\n    version: '2.1.2',\n    license: '''Copyright 2013 The Flutter Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('platform'),\n      PackageRef('plugin_platform_interface')\n    ]);\n\n/// path_provider_windows 2.3.0\nconst _path_provider_windows = Package(\n    name: 'path_provider_windows',\n    description: 'Windows implementation of the path_provider plugin',\n    repository:\n        'https://github.com/flutter/packages/tree/main/packages/path_provider/path_provider_windows',\n    authors: [],\n    version: '2.3.0',\n    license: '''Copyright 2013 The Flutter Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('ffi'),\n      PackageRef('flutter'),\n      PackageRef('path'),\n      PackageRef('path_provider_platform_interface')\n    ]);\n\n/// pedantic 1.11.1\nconst _pedantic = Package(\n    name: 'pedantic',\n    description:\n        'The Dart analyzer settings and best practices used internally at Google.',\n    homepage: 'https://github.com/google/pedantic',\n    authors: [],\n    version: '1.11.1',\n    license: '''Copyright 2017, the Dart project authors. All rights reserved.\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: []);\n\n/// permission_handler 12.0.1\nconst _permission_handler = Package(\n    name: 'permission_handler',\n    description:\n        'Permission plugin for Flutter. This plugin provides a cross-platform (iOS, Android) API to request and check permissions.',\n    repository: 'https://github.com/baseflow/flutter-permission-handler',\n    authors: [],\n    version: '12.0.1',\n    license: '''MIT License\n\nCopyright (c) 2018 Baseflow\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('meta'),\n      PackageRef('permission_handler_android'),\n      PackageRef('permission_handler_apple'),\n      PackageRef('permission_handler_html'),\n      PackageRef('permission_handler_windows'),\n      PackageRef('permission_handler_platform_interface')\n    ]);\n\n/// permission_handler_android 13.0.1\nconst _permission_handler_android = Package(\n    name: 'permission_handler_android',\n    description:\n        'Permission plugin for Flutter. This plugin provides the Android API to request and check permissions.',\n    homepage: 'https://github.com/baseflow/flutter-permission-handler',\n    authors: [],\n    version: '13.0.1',\n    license: '''MIT License\n\nCopyright (c) 2018 Baseflow\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('permission_handler_platform_interface')\n    ]);\n\n/// permission_handler_apple 9.4.7\nconst _permission_handler_apple = Package(\n    name: 'permission_handler_apple',\n    description:\n        'Permission plugin for Flutter. This plugin provides the iOS API to request and check permissions.',\n    repository: 'https://github.com/baseflow/flutter-permission-handler',\n    authors: [],\n    version: '9.4.7',\n    license: '''MIT License\n\nCopyright (c) 2018 Baseflow\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('permission_handler_platform_interface')\n    ]);\n\n/// permission_handler_html 0.1.3+5\nconst _permission_handler_html = Package(\n    name: 'permission_handler_html',\n    description:\n        'Permission plugin for Flutter. This plugin provides the web API to request and check permissions.',\n    homepage: 'https://github.com/baseflow/flutter-permission-handler',\n    authors: [],\n    version: '0.1.3+5',\n    license: '''MIT License\n\nCopyright (c) 2018 Baseflow\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('flutter_web_plugins'),\n      PackageRef('permission_handler_platform_interface'),\n      PackageRef('web')\n    ]);\n\n/// permission_handler_platform_interface 4.3.0\nconst _permission_handler_platform_interface = Package(\n    name: 'permission_handler_platform_interface',\n    description:\n        'A common platform interface for the permission_handler plugin.',\n    homepage:\n        'https://github.com/baseflow/flutter-permission-handler/tree/master/permission_handler_platform_interface',\n    authors: [],\n    version: '4.3.0',\n    license: '''MIT License\n\nCopyright (c) 2018 Baseflow\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('meta'),\n      PackageRef('plugin_platform_interface')\n    ]);\n\n/// permission_handler_windows 0.2.1\nconst _permission_handler_windows = Package(\n    name: 'permission_handler_windows',\n    description:\n        'Permission plugin for Flutter. This plugin provides the Windows API to request and check permissions.',\n    homepage: 'https://github.com/baseflow/flutter-permission-handler',\n    authors: [],\n    version: '0.2.1',\n    license: '''MIT License\n\nCopyright (c) 2018 Baseflow\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('permission_handler_platform_interface')\n    ]);\n\n/// petitparser 7.0.1\nconst _petitparser = Package(\n    name: 'petitparser',\n    description:\n        'A dynamic parser framework to build efficient grammars and parsers quickly.',\n    homepage: 'https://petitparser.github.io',\n    repository: 'https://github.com/petitparser/dart-petitparser',\n    authors: [],\n    version: '7.0.1',\n    license: '''The MIT License\n\nCopyright (c) 2006-2024 Lukas Renggli.\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('meta'), PackageRef('collection')]);\n\n/// platform 3.1.6\nconst _platform = Package(\n    name: 'platform',\n    description:\n        'A pluggable, mockable platform information abstraction for Dart.',\n    repository: 'https://github.com/dart-lang/core/tree/main/pkgs/platform',\n    authors: [],\n    version: '3.1.6',\n    license: '''Copyright 2017, the Dart project authors. All rights reserved.\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: []);\n\n/// plugin_platform_interface 2.1.8\nconst _plugin_platform_interface = Package(\n    name: 'plugin_platform_interface',\n    description:\n        'Reusable base class for platform interfaces of Flutter federated plugins, to help enforce best practices.',\n    repository:\n        'https://github.com/flutter/packages/tree/main/packages/plugin_platform_interface',\n    authors: [],\n    version: '2.1.8',\n    license: '''Copyright 2013 The Flutter Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('meta')]);\n\n/// pointycastle 3.9.1\nconst _pointycastle = Package(\n    name: 'pointycastle',\n    description:\n        'A Dart library implementing cryptographic algorithms and primitives, modeled on the BouncyCastle library.',\n    homepage: 'https://github.com/bcgit/pc-dart',\n    authors: [],\n    version: '3.9.1',\n    license:\n        '''Copyright (c) 2000 - 2019 The Legion of the Bouncy Castle Inc. (https://www.bouncycastle.org)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('collection'),\n      PackageRef('convert'),\n      PackageRef('js')\n    ]);\n\n/// pool 1.5.1\nconst _pool = Package(\n    name: 'pool',\n    description:\n        'Manage a finite pool of resources. Useful for controlling concurrent file system or network requests.',\n    repository: 'https://github.com/dart-lang/pool',\n    authors: [],\n    version: '1.5.1',\n    license: '''Copyright 2014, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('async'), PackageRef('stack_trace')]);\n\n/// popover 0.3.1\nconst _popover = Package(\n    name: 'popover',\n    description:\n        'A popover is a transient view that appears above other content onscreen when you tap a control or in an area.',\n    homepage: 'https://github.com/minikin/popover',\n    authors: [],\n    version: '0.3.1',\n    license: '''MIT License\n\nCopyright (c) 2021 - 2024 Oleksandr Prokhorenko\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('flutter')]);\n\n/// posix 6.0.3\nconst _posix = Package(\n    name: 'posix',\n    description: 'Exposes the POSIX api on OSx and Linux',\n    homepage: 'https://github.com/onepub-dev/dart_posix',\n    authors: [],\n    version: '6.0.3',\n    license: '''MIT License\n\nCopyright (c) 2020 Brett Sutton\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('ffi'), PackageRef('meta'), PackageRef('path')]);\n\n/// provider 6.1.5+1\nconst _provider = Package(\n    name: 'provider',\n    description:\n        'A wrapper around InheritedWidget to make them easier to use and more reusable.',\n    repository: 'https://github.com/rrousselGit/provider',\n    authors: [],\n    version: '6.1.5+1',\n    license: '''MIT License\n\nCopyright (c) 2019 Remi Rousselet\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('collection'),\n      PackageRef('flutter'),\n      PackageRef('nested')\n    ]);\n\n/// pub_semver 2.2.0\nconst _pub_semver = Package(\n    name: 'pub_semver',\n    description:\n        \"Versions and version constraints implementing pub's versioning policy. This is very similar to vanilla semver, with a few corner cases.\",\n    repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/pub_semver',\n    authors: [],\n    version: '2.2.0',\n    license: '''Copyright 2014, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('collection')]);\n\n/// pubspec_parse 1.5.0\nconst _pubspec_parse = Package(\n    name: 'pubspec_parse',\n    description:\n        'Simple package for parsing pubspec.yaml files with a type-safe API and rich error reporting.',\n    repository:\n        'https://github.com/dart-lang/tools/tree/main/pkgs/pubspec_parse',\n    authors: [],\n    version: '1.5.0',\n    license: '''Copyright 2018, the Dart project authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('checked_yaml'),\n      PackageRef('collection'),\n      PackageRef('json_annotation'),\n      PackageRef('pub_semver'),\n      PackageRef('yaml')\n    ]);\n\n/// pure_ftp 0.7.5\nconst _pure_ftp = Package(\n    name: 'pure_ftp',\n    description:\n        'Simple and powerful FTP client for Dart. Allow you to connect to FTP server and perform basic operations. now supports all native platforms(Web in progress)',\n    homepage: 'https://github.com/crifurch/pure_ftp',\n    authors: [],\n    version: '0.7.5',\n    license: '''MIT License\n\nCopyright (c) 2023 Artem Semirenko\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('meta')]);\n\n/// rxdart 0.28.0\nconst _rxdart = Package(\n    name: 'rxdart',\n    description:\n        '''RxDart is an implementation of the popular ReactiveX api for asynchronous programming, leveraging the native Dart Streams api.\n''',\n    repository: 'https://github.com/ReactiveX/rxdart',\n    authors: [],\n    version: '0.28.0',\n    license: '''Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: []);\n\n/// saf_util 0.11.0\nconst _saf_util = Package(\n    name: 'saf_util',\n    description: 'Util functions for SAF (Storage Access Framework).',\n    homepage: 'https://github.com/flutter-cavalry/saf_util',\n    authors: [],\n    version: '0.11.0',\n    license: '''BSD 3-Clause License\n\nCopyright (c) 2023, Mgenware (Liu YuanYuan)\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its\n   contributors may be used to endorse or promote products derived from\n   this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('plugin_platform_interface')\n    ]);\n\n/// safe_local_storage 2.0.1\nconst _safe_local_storage = Package(\n    name: 'safe_local_storage',\n    description:\n        'A safe caching library to read/write values on local storage.',\n    homepage: 'https://github.com/alexmercerind/safe_local_storage.git',\n    repository: 'https://github.com/alexmercerind/safe_local_storage.git',\n    authors: [],\n    version: '2.0.1',\n    license: '''MIT License\n\nCopyright (c) 2022 Hitesh Kumar Saini <saini123hitesh@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('path'), PackageRef('synchronized')]);\n\n/// screen_brightness 2.1.7\nconst _screen_brightness = Package(\n    name: 'screen_brightness',\n    description:\n        'A Plugin for controlling screen brightness with application life cycle reset implemented',\n    homepage: 'https://github.com/aaassseee/screen_brightness',\n    repository:\n        'https://github.com/aaassseee/screen_brightness/tree/master/screen_brightness',\n    authors: [],\n    version: '2.1.7',\n    license: '''MIT License\n\nCopyright (c) 2021 Jack Liu\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('screen_brightness_platform_interface'),\n      PackageRef('screen_brightness_android'),\n      PackageRef('screen_brightness_ios'),\n      PackageRef('screen_brightness_macos'),\n      PackageRef('screen_brightness_windows'),\n      PackageRef('screen_brightness_ohos')\n    ]);\n\n/// screen_brightness_android 2.1.3\nconst _screen_brightness_android = Package(\n    name: 'screen_brightness_android',\n    description:\n        'The Android federated plugin implementation of screen_brightness.',\n    homepage: 'https://github.com/aaassseee/screen_brightness',\n    repository:\n        'https://github.com/aaassseee/screen_brightness/tree/master/screen_brightness_android',\n    authors: [],\n    version: '2.1.3',\n    license: '''MIT License\n\nCopyright (c) 2021 Jack Liu\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('screen_brightness_platform_interface')\n    ]);\n\n/// screen_brightness_ios 2.1.2\nconst _screen_brightness_ios = Package(\n    name: 'screen_brightness_ios',\n    description:\n        'The iOS federated plugin implementation of the screen_brightness.',\n    homepage: 'https://github.com/aaassseee/screen_brightness',\n    repository:\n        'https://github.com/aaassseee/screen_brightness/tree/master/screen_brightness_ios',\n    authors: [],\n    version: '2.1.2',\n    license: '''MIT License\n\nCopyright (c) 2021 Jack Liu\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('screen_brightness_platform_interface')\n    ]);\n\n/// screen_brightness_macos 2.1.1\nconst _screen_brightness_macos = Package(\n    name: 'screen_brightness_macos',\n    description:\n        'The macOS federated plugin implementation of the screen_brightness.',\n    homepage: 'https://github.com/aaassseee/screen_brightness',\n    repository:\n        'https://github.com/aaassseee/screen_brightness/tree/master/screen_brightness_macos',\n    authors: [],\n    version: '2.1.1',\n    license: '''MIT License\n\nCopyright (c) 2021 Jack Liu\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('screen_brightness_platform_interface')\n    ]);\n\n/// screen_brightness_ohos 2.1.2\nconst _screen_brightness_ohos = Package(\n    name: 'screen_brightness_ohos',\n    description:\n        'The ohos federated plugin implementation of screen_brightness.',\n    homepage: 'https://github.com/aaassseee/screen_brightness',\n    repository:\n        'https://github.com/aaassseee/screen_brightness/tree/master/screen_brightness_ohos',\n    authors: [],\n    version: '2.1.2',\n    license: '''MIT License\n\nCopyright (c) 2025 ErBWs, Jack Liu\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('screen_brightness_platform_interface')\n    ]);\n\n/// screen_brightness_platform_interface 2.1.0\nconst _screen_brightness_platform_interface = Package(\n    name: 'screen_brightness_platform_interface',\n    description: 'A common platform interface for the screen_brightness plugin',\n    homepage: 'https://github.com/aaassseee/screen_brightness',\n    repository:\n        'https://github.com/aaassseee/screen_brightness/tree/patch-1/screen_brightness_platform_interface',\n    authors: [],\n    version: '2.1.0',\n    license: '''MIT License\n\nCopyright (c) 2021 Jack Liu\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('plugin_platform_interface')\n    ]);\n\n/// screen_brightness_windows 2.1.0\nconst _screen_brightness_windows = Package(\n    name: 'screen_brightness_windows',\n    description:\n        'The Windows federated plugin implementation of the screen_brightness.',\n    homepage: 'https://github.com/aaassseee/screen_brightness',\n    repository:\n        'https://github.com/aaassseee/screen_brightness/tree/master/screen_brightness_windows',\n    authors: [],\n    version: '2.1.0',\n    license: '''MIT License\n\nCopyright (c) 2022 Jack Liu\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('screen_brightness_platform_interface')\n    ]);\n\n/// screen_retriever 0.2.0\nconst _screen_retriever = Package(\n    name: 'screen_retriever',\n    description:\n        'This plugin allows Flutter desktop apps to Retrieve information about screen size, displays, cursor position, etc.',\n    homepage: 'https://github.com/leanflutter/screen_retriever',\n    authors: [],\n    version: '0.2.0',\n    license: '''MIT License\n\nCopyright (c) 2022-2024 LiJianying <lijy91@foxmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('screen_retriever_linux'),\n      PackageRef('screen_retriever_macos'),\n      PackageRef('screen_retriever_platform_interface'),\n      PackageRef('screen_retriever_windows')\n    ]);\n\n/// screen_retriever_linux 0.2.0\nconst _screen_retriever_linux = Package(\n    name: 'screen_retriever_linux',\n    description: 'Linux implementation of the screen_retriever plugin.',\n    repository:\n        'https://github.com/leanflutter/screen_retriever/tree/main/packages/screen_retriever_linux',\n    authors: [],\n    version: '0.2.0',\n    license: '''MIT License\n\nCopyright (c) 2022-2024 LiJianying <lijy91@foxmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('screen_retriever_platform_interface')\n    ]);\n\n/// screen_retriever_macos 0.2.0\nconst _screen_retriever_macos = Package(\n    name: 'screen_retriever_macos',\n    description: 'macOS implementation of the screen_retriever plugin.',\n    repository:\n        'https://github.com/leanflutter/screen_retriever/tree/main/packages/screen_retriever_macos',\n    authors: [],\n    version: '0.2.0',\n    license: '''MIT License\n\nCopyright (c) 2022-2024 LiJianying <lijy91@foxmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('screen_retriever_platform_interface')\n    ]);\n\n/// screen_retriever_platform_interface 0.2.0\nconst _screen_retriever_platform_interface = Package(\n    name: 'screen_retriever_platform_interface',\n    description: 'A common platform interface for the screen_retriever plugin.',\n    homepage:\n        'https://github.com/leanflutter/screen_retriever/blob/main/packages/screen_retriever_platform_interface',\n    authors: [],\n    version: '0.2.0',\n    license: '''MIT License\n\nCopyright (c) 2022-2024 LiJianying <lijy91@foxmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('json_annotation'),\n      PackageRef('plugin_platform_interface')\n    ]);\n\n/// screen_retriever_windows 0.2.0\nconst _screen_retriever_windows = Package(\n    name: 'screen_retriever_windows',\n    description: 'Windows implementation of the screen_retriever plugin.',\n    repository:\n        'https://github.com/leanflutter/screen_retriever/tree/main/packages/screen_retriever_windows',\n    authors: [],\n    version: '0.2.0',\n    license: '''MIT License\n\nCopyright (c) 2022-2024 LiJianying <lijy91@foxmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('screen_retriever_platform_interface')\n    ]);\n\n/// scrollable_positioned_list 0.3.8\nconst _scrollable_positioned_list = Package(\n    name: 'scrollable_positioned_list',\n    description:\n        '''A list with helper methods to programmatically scroll to an item.\n''',\n    homepage:\n        'https://github.com/google/flutter.widgets/tree/master/packages/scrollable_positioned_list',\n    authors: [],\n    version: '0.3.8',\n    license:\n        '''Copyright 2018 the Dart project authors, Inc. All rights reserved.\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('flutter'), PackageRef('collection')]);\n\n/// shelf 1.4.2\nconst _shelf = Package(\n    name: 'shelf',\n    description:\n        '''A model for web server middleware that encourages composition and easy reuse.\n''',\n    repository: 'https://github.com/dart-lang/shelf/tree/master/pkgs/shelf',\n    authors: [],\n    version: '1.4.2',\n    license: '''Copyright 2014, the Dart project authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('async'),\n      PackageRef('collection'),\n      PackageRef('http_parser'),\n      PackageRef('path'),\n      PackageRef('stack_trace'),\n      PackageRef('stream_channel')\n    ]);\n\n/// shelf_router 1.1.4\nconst _shelf_router = Package(\n    name: 'shelf_router',\n    description:\n        '''A convenient request router for the shelf web-framework, with support for URL-parameters, nested routers and routers generated from source annotations.\n''',\n    repository:\n        'https://github.com/dart-lang/shelf/tree/master/pkgs/shelf_router',\n    authors: [],\n    version: '1.1.4',\n    license: '''Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('http_methods'),\n      PackageRef('meta'),\n      PackageRef('shelf')\n    ]);\n\n/// shelf_web_socket 3.0.0\nconst _shelf_web_socket = Package(\n    name: 'shelf_web_socket',\n    description:\n        'A shelf handler that wires up a listener for every connection.',\n    repository:\n        'https://github.com/dart-lang/shelf/tree/master/pkgs/shelf_web_socket',\n    authors: [],\n    version: '3.0.0',\n    license: '''Copyright 2014, the Dart project authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('shelf'),\n      PackageRef('stream_channel'),\n      PackageRef('web_socket_channel')\n    ]);\n\n/// smb_connect 0.0.9\nconst _smb_connect = Package(\n    name: 'smb_connect',\n    description:\n        'Native SMB/CIFS client library written in Dart for Dart. Extremely fast, can be used for streaming music and video. Supported dialects: SMB 1.0, CIFS, SMB 2.0, SMB 2.1.',\n    homepage: 'https://github.com/vadia/smb_connect',\n    repository: 'https://github.com/vadia/smb_connect',\n    authors: [],\n    version: '0.0.9',\n    license: '''Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright 2025 Vadim Babin <vadim.babin@gmail.com>\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('asn1lib'),\n      PackageRef('charset'),\n      PackageRef('crypto'),\n      PackageRef('cryptography'),\n      PackageRef('mutex'),\n      PackageRef('pointycastle')\n    ]);\n\n/// source_gen 4.0.1\nconst _source_gen = Package(\n    name: 'source_gen',\n    description:\n        'Source code generation builders and utilities for the Dart build system',\n    repository:\n        'https://github.com/dart-lang/source_gen/tree/master/source_gen',\n    authors: [],\n    version: '4.0.1',\n    license: '''Copyright 2015, the Dart project authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('analyzer'),\n      PackageRef('async'),\n      PackageRef('build'),\n      PackageRef('dart_style'),\n      PackageRef('glob'),\n      PackageRef('path'),\n      PackageRef('pub_semver'),\n      PackageRef('source_span'),\n      PackageRef('yaml')\n    ]);\n\n/// source_helper 1.3.8\nconst _source_helper = Package(\n    name: 'source_helper',\n    description:\n        'Utilities to help with Dart source code generation. Includes utilities for properly generating String literals from any String value.',\n    repository: 'https://github.com/google/source_helper.dart',\n    authors: [],\n    version: '1.3.8',\n    license: '''Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('analyzer'), PackageRef('source_gen')]);\n\n/// source_span 1.10.1\nconst _source_span = Package(\n    name: 'source_span',\n    description:\n        'Provides a standard representation for source code locations and spans.',\n    repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/source_span',\n    authors: [],\n    version: '1.10.1',\n    license: '''Copyright 2014, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('collection'),\n      PackageRef('path'),\n      PackageRef('term_glyph')\n    ]);\n\n/// sprintf 7.0.0\nconst _sprintf = Package(\n    name: 'sprintf',\n    description:\n        'Dart implementation of sprintf. Provides simple printf like formatting such as sprintf(\"hello %s\", [\"world\"]);',\n    homepage: 'https://github.com/Naddiseo/dart-sprintf',\n    authors: [],\n    version: '7.0.0',\n    license: '''Copyright (c) 2012, Richard Eames\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, \nare permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this \n   list of conditions and the following disclaimer.\n2. Redistributions in binary form must reproduce the above copyright notice, \n   this list of conditions and the following disclaimer in the documentation \n   and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE \nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES \n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; \nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON \nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS \nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: []);\n\n/// stack_trace 1.12.1\nconst _stack_trace = Package(\n    name: 'stack_trace',\n    description:\n        'A package for manipulating stack traces and printing them readably.',\n    repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/stack_trace',\n    authors: [],\n    version: '1.12.1',\n    license: '''Copyright 2014, the Dart project authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('path')]);\n\n/// stream_channel 2.1.4\nconst _stream_channel = Package(\n    name: 'stream_channel',\n    description:\n        'An abstraction for two-way communication channels based on the Dart Stream class.',\n    repository:\n        'https://github.com/dart-lang/tools/tree/main/pkgs/stream_channel',\n    authors: [],\n    version: '2.1.4',\n    license: '''Copyright 2015, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('async')]);\n\n/// stream_transform 2.1.1\nconst _stream_transform = Package(\n    name: 'stream_transform',\n    description:\n        'A collection of utilities to transform and manipulate streams.',\n    repository:\n        'https://github.com/dart-lang/tools/tree/main/pkgs/stream_transform',\n    authors: [],\n    version: '2.1.1',\n    license: '''Copyright 2017, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: []);\n\n/// string_scanner 1.4.1\nconst _string_scanner = Package(\n    name: 'string_scanner',\n    description: 'A class for parsing strings using a sequence of patterns.',\n    repository:\n        'https://github.com/dart-lang/tools/tree/main/pkgs/string_scanner',\n    authors: [],\n    version: '1.4.1',\n    license: '''Copyright 2014, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('source_span')]);\n\n/// synchronized 3.4.0\nconst _synchronized = Package(\n    name: 'synchronized',\n    description:\n        'Lock mechanism to prevent concurrent access to asynchronous code.',\n    homepage:\n        'https://github.com/tekartik/synchronized.dart/tree/master/synchronized',\n    authors: [],\n    version: '3.4.0',\n    license: '''MIT License\n\nCopyright (c) 2016, Alexandre Roux Tekartik.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: []);\n\n/// term_glyph 1.2.2\nconst _term_glyph = Package(\n    name: 'term_glyph',\n    description: 'Useful Unicode glyphs and ASCII substitutes.',\n    repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/term_glyph',\n    authors: [],\n    version: '1.2.2',\n    license: '''Copyright 2017, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: []);\n\n/// test_api 0.7.6\nconst _test_api = Package(\n    name: 'test_api',\n    description:\n        'The user facing API for structuring Dart tests and checking expectations.',\n    repository: 'https://github.com/dart-lang/test/tree/master/pkgs/test_api',\n    authors: [],\n    version: '0.7.6',\n    license: '''Copyright 2018, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('async'),\n      PackageRef('boolean_selector'),\n      PackageRef('collection'),\n      PackageRef('meta'),\n      PackageRef('source_span'),\n      PackageRef('stack_trace'),\n      PackageRef('stream_channel'),\n      PackageRef('string_scanner'),\n      PackageRef('term_glyph')\n    ]);\n\n/// typed_data 1.4.0\nconst _typed_data = Package(\n    name: 'typed_data',\n    description:\n        'Utility functions and classes related to the dart:typed_data library.',\n    repository: 'https://github.com/dart-lang/core/tree/main/pkgs/typed_data',\n    authors: [],\n    version: '1.4.0',\n    license: '''Copyright 2015, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('collection')]);\n\n/// universal_platform 1.1.0\nconst _universal_platform = Package(\n    name: 'universal_platform',\n    description:\n        'Replacement for dart.io.Platform class which works on Web as well as Desktop and Mobile. Allows platform checks in your view/model layer easily.',\n    homepage: 'https://github.com/gskinnerTeam/flutter-universal-platform',\n    authors: [],\n    version: '1.1.0',\n    license: '''MIT License\n\nCopyright (c) 2019 gskinner.com\n\nPermission 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:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE 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.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: []);\n\n/// uri_parser 3.0.0\nconst _uri_parser = Package(\n    name: 'uri_parser',\n    description: 'A minimal & safe utility to parse URIs.',\n    homepage: 'https://github.com/alexmercerind/uri_parser',\n    repository: 'https://github.com/alexmercerind/uri_parser',\n    authors: [],\n    version: '3.0.0',\n    license: '''MIT License\n\nCopyright (c) 2021 & onwards Hitesh Kumar Saini <saini123hitesh@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('path'), PackageRef('safe_local_storage')]);\n\n/// url_launcher 6.3.2\nconst _url_launcher = Package(\n    name: 'url_launcher',\n    description:\n        'Flutter plugin for launching a URL. Supports web, phone, SMS, and email schemes.',\n    repository:\n        'https://github.com/flutter/packages/tree/main/packages/url_launcher/url_launcher',\n    authors: [],\n    version: '6.3.2',\n    license: '''Copyright 2013 The Flutter Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('url_launcher_android'),\n      PackageRef('url_launcher_ios'),\n      PackageRef('url_launcher_linux'),\n      PackageRef('url_launcher_macos'),\n      PackageRef('url_launcher_platform_interface'),\n      PackageRef('url_launcher_web'),\n      PackageRef('url_launcher_windows')\n    ]);\n\n/// url_launcher_android 6.3.21\nconst _url_launcher_android = Package(\n    name: 'url_launcher_android',\n    description: 'Android implementation of the url_launcher plugin.',\n    repository:\n        'https://github.com/flutter/packages/tree/main/packages/url_launcher/url_launcher_android',\n    authors: [],\n    version: '6.3.21',\n    license: '''Copyright 2013 The Flutter Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('url_launcher_platform_interface')\n    ]);\n\n/// url_launcher_ios 6.3.4\nconst _url_launcher_ios = Package(\n    name: 'url_launcher_ios',\n    description: 'iOS implementation of the url_launcher plugin.',\n    repository:\n        'https://github.com/flutter/packages/tree/main/packages/url_launcher/url_launcher_ios',\n    authors: [],\n    version: '6.3.4',\n    license: '''Copyright 2013 The Flutter Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('url_launcher_platform_interface')\n    ]);\n\n/// url_launcher_linux 3.2.1\nconst _url_launcher_linux = Package(\n    name: 'url_launcher_linux',\n    description: 'Linux implementation of the url_launcher plugin.',\n    repository:\n        'https://github.com/flutter/packages/tree/main/packages/url_launcher/url_launcher_linux',\n    authors: [],\n    version: '3.2.1',\n    license: '''Copyright 2013 The Flutter Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('url_launcher_platform_interface')\n    ]);\n\n/// url_launcher_macos 3.2.3\nconst _url_launcher_macos = Package(\n    name: 'url_launcher_macos',\n    description: 'macOS implementation of the url_launcher plugin.',\n    repository:\n        'https://github.com/flutter/packages/tree/main/packages/url_launcher/url_launcher_macos',\n    authors: [],\n    version: '3.2.3',\n    license: '''Copyright 2013 The Flutter Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('url_launcher_platform_interface')\n    ]);\n\n/// url_launcher_platform_interface 2.3.2\nconst _url_launcher_platform_interface = Package(\n    name: 'url_launcher_platform_interface',\n    description: 'A common platform interface for the url_launcher plugin.',\n    repository:\n        'https://github.com/flutter/packages/tree/main/packages/url_launcher/url_launcher_platform_interface',\n    authors: [],\n    version: '2.3.2',\n    license: '''Copyright 2013 The Flutter Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('plugin_platform_interface')\n    ]);\n\n/// url_launcher_web 2.4.1\nconst _url_launcher_web = Package(\n    name: 'url_launcher_web',\n    description: 'Web platform implementation of url_launcher',\n    repository:\n        'https://github.com/flutter/packages/tree/main/packages/url_launcher/url_launcher_web',\n    authors: [],\n    version: '2.4.1',\n    license: '''url_launcher_web\n\nCopyright 2013 The Flutter Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n--------------------------------------------------------------------------------\nplatform_detect\n\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright 2017 Workiva Inc.\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('flutter_web_plugins'),\n      PackageRef('url_launcher_platform_interface'),\n      PackageRef('web')\n    ]);\n\n/// url_launcher_windows 3.1.4\nconst _url_launcher_windows = Package(\n    name: 'url_launcher_windows',\n    description: 'Windows implementation of the url_launcher plugin.',\n    repository:\n        'https://github.com/flutter/packages/tree/main/packages/url_launcher/url_launcher_windows',\n    authors: [],\n    version: '3.1.4',\n    license: '''Copyright 2013 The Flutter Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('url_launcher_platform_interface')\n    ]);\n\n/// uuid 4.5.1\nconst _uuid = Package(\n    name: 'uuid',\n    description:\n        '''RFC4122 (v1, v4, v5, v6, v7, v8) UUID Generator and Parser for Dart\n''',\n    repository: 'https://github.com/Daegalus/dart-uuid',\n    authors: [],\n    version: '4.5.1',\n    license: '''Copyright (c) 2021 Yulian Kuncheff\n\nPermission 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:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE 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.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('crypto'),\n      PackageRef('sprintf'),\n      PackageRef('meta'),\n      PackageRef('fixnum')\n    ]);\n\n/// vector_math 2.2.0\nconst _vector_math = Package(\n    name: 'vector_math',\n    description: 'A Vector Math library for 2D and 3D applications.',\n    repository: 'https://github.com/google/vector_math.dart',\n    authors: [],\n    version: '2.2.0',\n    license: '''Copyright 2015, Google Inc. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nCopyright (C) 2013 Andrew Magill\n\nThis software is provided 'as-is', without any express or implied\nwarranty.  In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\n   claim that you wrote the original software. If you use this software\n   in a product, an acknowledgment in the product documentation would be\n   appreciated but is not required.\n2. Altered source versions must be plainly marked as such, and must not be\n   misrepresented as being the original software.\n3. This notice may not be removed or altered from any source distribution.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: []);\n\n/// video_player 2.10.0\nconst _video_player = Package(\n    name: 'video_player',\n    description:\n        'Flutter plugin for displaying inline video with other Flutter widgets on Android, iOS, macOS and web.',\n    repository:\n        'https://github.com/flutter/packages/tree/main/packages/video_player/video_player',\n    authors: [],\n    version: '2.10.0',\n    license: '''Copyright 2013 The Flutter Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('html'),\n      PackageRef('video_player_android'),\n      PackageRef('video_player_avfoundation'),\n      PackageRef('video_player_platform_interface'),\n      PackageRef('video_player_web')\n    ]);\n\n/// video_player_android 2.8.13\nconst _video_player_android = Package(\n    name: 'video_player_android',\n    description: 'Android implementation of the video_player plugin.',\n    repository:\n        'https://github.com/flutter/packages/tree/main/packages/video_player/video_player_android',\n    authors: [],\n    version: '2.8.13',\n    license: '''Copyright 2013 The Flutter Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('video_player_platform_interface')\n    ]);\n\n/// video_player_avfoundation 2.8.4\nconst _video_player_avfoundation = Package(\n    name: 'video_player_avfoundation',\n    description: 'iOS and macOS implementation of the video_player plugin.',\n    repository:\n        'https://github.com/flutter/packages/tree/main/packages/video_player/video_player_avfoundation',\n    authors: [],\n    version: '2.8.4',\n    license: '''Copyright 2013 The Flutter Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('video_player_platform_interface')\n    ]);\n\n/// video_player_platform_interface 6.4.0\nconst _video_player_platform_interface = Package(\n    name: 'video_player_platform_interface',\n    description: 'A common platform interface for the video_player plugin.',\n    repository:\n        'https://github.com/flutter/packages/tree/main/packages/video_player/video_player_platform_interface',\n    authors: [],\n    version: '6.4.0',\n    license: '''Copyright 2013 The Flutter Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('plugin_platform_interface')\n    ]);\n\n/// video_player_web 2.4.0\nconst _video_player_web = Package(\n    name: 'video_player_web',\n    description: 'Web platform implementation of video_player.',\n    repository:\n        'https://github.com/flutter/packages/tree/main/packages/video_player/video_player_web',\n    authors: [],\n    version: '2.4.0',\n    license: '''Copyright 2013 The Flutter Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('flutter_web_plugins'),\n      PackageRef('video_player_platform_interface'),\n      PackageRef('web')\n    ]);\n\n/// vm_service 15.0.2\nconst _vm_service = Package(\n    name: 'vm_service',\n    description:\n        'A library to communicate with a service implementing the Dart VM service protocol.',\n    repository: 'https://github.com/dart-lang/sdk/tree/main/pkg/vm_service',\n    authors: [],\n    version: '15.0.2',\n    license: '''Copyright 2015, the Dart project authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: []);\n\n/// volume_controller 3.4.0\nconst _volume_controller = Package(\n    name: 'volume_controller',\n    description:\n        'A Flutter volume plugin for multiple platform to control system volume.',\n    homepage: 'https://github.com/kurenai7968/volume_controller',\n    authors: [],\n    version: '3.4.0',\n    license: '''MIT License\n\nCopyright (c) 2021 kurenai7968\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('flutter')]);\n\n/// wakelock_plus 1.4.0\nconst _wakelock_plus = Package(\n    name: 'wakelock_plus',\n    description:\n        'Plugin that allows you to keep the device screen awake, i.e. prevent the screen from sleeping on Android, iOS, macOS, Windows, Linux, and web.',\n    repository:\n        'https://github.com/fluttercommunity/wakelock_plus/tree/main/wakelock_plus',\n    authors: [],\n    version: '1.4.0',\n    license: '''BSD 3-Clause License\n\nCopyright (c) 2020-2023, creativecreatorormaybenot\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its\n   contributors may be used to endorse or promote products derived from\n   this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('flutter_web_plugins'),\n      PackageRef('meta'),\n      PackageRef('wakelock_plus_platform_interface'),\n      PackageRef('win32'),\n      PackageRef('dbus'),\n      PackageRef('package_info_plus'),\n      PackageRef('web')\n    ]);\n\n/// wakelock_plus_platform_interface 1.3.0\nconst _wakelock_plus_platform_interface = Package(\n    name: 'wakelock_plus_platform_interface',\n    description:\n        'A common platform interface for the wakelock_plus plugin used by the different platform implementations.',\n    repository:\n        'https://github.com/fluttercommunity/wakelock_plus/tree/main/wakelock_plus_platform_interface',\n    authors: [],\n    version: '1.3.0',\n    license: '''BSD 3-Clause License\n\nCopyright (c) 2020-2023, creativecreatorormaybenot\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its\n   contributors may be used to endorse or promote products derived from\n   this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('plugin_platform_interface'),\n      PackageRef('meta')\n    ]);\n\n/// watcher 1.1.3\nconst _watcher = Package(\n    name: 'watcher',\n    description:\n        'A file system watcher. It monitors changes to contents of directories and sends notifications when files have been added, removed, or modified.',\n    repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/watcher',\n    authors: [],\n    version: '1.1.3',\n    license: '''Copyright 2014, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('async'), PackageRef('path')]);\n\n/// web 1.1.1\nconst _web = Package(\n    name: 'web',\n    description: 'Lightweight browser API bindings built around JS interop.',\n    repository: 'https://github.com/dart-lang/web',\n    authors: [],\n    version: '1.1.1',\n    license: '''Copyright 2023, the Dart project authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: []);\n\n/// web_socket 1.0.1\nconst _web_socket = Package(\n    name: 'web_socket',\n    description:\n        'Any easy-to-use library for communicating with WebSockets that has multiple implementations.',\n    repository: 'https://github.com/dart-lang/http/tree/master/pkgs/web_socket',\n    authors: [],\n    version: '1.0.1',\n    license: '''Copyright 2024, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('web')]);\n\n/// web_socket_channel 3.0.3\nconst _web_socket_channel = Package(\n    name: 'web_socket_channel',\n    description:\n        'StreamChannel wrappers for WebSockets. Provides a cross-platform WebSocketChannel API, a cross-platform implementation of that API that communicates over an underlying StreamChannel.',\n    repository:\n        'https://github.com/dart-lang/http/tree/master/pkgs/web_socket_channel',\n    authors: [],\n    version: '3.0.3',\n    license: '''Copyright 2016, the Dart project authors. \n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google LLC nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('async'),\n      PackageRef('crypto'),\n      PackageRef('stream_channel'),\n      PackageRef('web'),\n      PackageRef('web_socket')\n    ]);\n\n/// webdav_client 1.2.2\nconst _webdav_client = Package(\n    name: 'webdav_client',\n    description: 'A simple WebDAV client that supports some common methods.',\n    homepage: 'https://github.com/flymzero/webdav_client',\n    authors: [],\n    version: '1.2.2',\n    license: '''BSD 3-Clause License\n\nCopyright (c) 2020, MZERO\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its\n   contributors may be used to endorse or promote products derived from\n   this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('dio'),\n      PackageRef('xml'),\n      PackageRef('convert')\n    ]);\n\n/// win32 5.14.0\nconst _win32 = Package(\n    name: 'win32',\n    description:\n        '''Access common Win32 APIs directly from Dart using FFI — no C required!\n''',\n    homepage: 'https://win32.pub',\n    repository: 'https://github.com/halildurmus/win32',\n    authors: [],\n    version: '5.14.0',\n    license: '''BSD 3-Clause License\n\nCopyright (c) 2024, Halil Durmus\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its\n   contributors may be used to endorse or promote products derived from\n   this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('ffi')]);\n\n/// win32_registry 2.1.0\nconst _win32_registry = Package(\n    name: 'win32_registry',\n    description:\n        'A package that provides a friendly Dart API for accessing the Windows Registry.',\n    repository: 'https://github.com/halildurmus/win32_registry',\n    authors: [],\n    version: '2.1.0',\n    license: '''BSD 3-Clause License\n\nCopyright (c) 2023, Halil Durmus\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its\n   contributors may be used to endorse or promote products derived from\n   this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('ffi'), PackageRef('meta'), PackageRef('win32')]);\n\n/// window_manager 0.5.1\nconst _window_manager = Package(\n    name: 'window_manager',\n    description:\n        'This plugin allows Flutter desktop apps to resizing and repositioning the window.',\n    homepage: 'https://leanflutter.dev',\n    repository: 'https://github.com/leanflutter/window_manager',\n    authors: [],\n    version: '0.5.1',\n    license: '''MIT License\n\nCopyright (c) 2022-present LiJianying <lijy91@foxmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('flutter'),\n      PackageRef('path'),\n      PackageRef('screen_retriever')\n    ]);\n\n/// window_size 0.1.0\nconst _window_size = Package(\n    name: 'window_size',\n    description:\n        'Allows resizing and repositioning the window containing Flutter.',\n    authors: [],\n    version: '0.1.0',\n    license: '''Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('flutter')]);\n\n/// xdg_directories 1.1.0\nconst _xdg_directories = Package(\n    name: 'xdg_directories',\n    description:\n        'A Dart package for reading XDG directory configuration information on Linux.',\n    repository:\n        'https://github.com/flutter/packages/tree/main/packages/xdg_directories',\n    authors: [],\n    version: '1.1.0',\n    license: '''Copyright 2013 The Flutter Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('meta'), PackageRef('path')]);\n\n/// xml 6.6.1\nconst _xml = Package(\n    name: 'xml',\n    description:\n        'A lightweight library for parsing, traversing, querying, transforming and building XML documents.',\n    homepage: 'https://github.com/renggli/dart-xml',\n    authors: [],\n    version: '6.6.1',\n    license: '''The MIT License\n\nCopyright (c) 2006-2025 Lukas Renggli.\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('collection'),\n      PackageRef('meta'),\n      PackageRef('petitparser')\n    ]);\n\n/// yaml 3.1.3\nconst _yaml = Package(\n    name: 'yaml',\n    description:\n        'A parser for YAML, a human-friendly data serialization standard',\n    repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/yaml',\n    authors: [],\n    version: '3.1.3',\n    license: '''Copyright (c) 2014, the Dart project authors.\nCopyright (c) 2006, Kirill Simonov.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [\n      PackageRef('collection'),\n      PackageRef('source_span'),\n      PackageRef('string_scanner')\n    ]);\n\n/// zustand 0.0.5\nconst _zustand = Package(\n    name: 'zustand',\n    description:\n        \"Brings zustand's bear necessities for state management to Dart\",\n    homepage:\n        'https://github.com/josiahsrc/flutter_zustand/tree/main/packages/zustand',\n    repository:\n        'https://github.com/josiahsrc/flutter_zustand/tree/main/packages/zustand',\n    authors: [],\n    version: '0.0.5',\n    license: '''MIT License\n\nCopyright (c) 2024 Josiah Saunders\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.''',\n    isMarkdown: false,\n    isSdk: false,\n    dependencies: [PackageRef('meta')]);\n"
  },
  {
    "path": "lib/pages/home/home.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:flutter_zustand/flutter_zustand.dart';\nimport 'package:iris/hooks/ui/use_full_screen.dart';\nimport 'package:iris/hooks/ui/use_orientation.dart';\nimport 'package:iris/hooks/ui/use_resize_window.dart';\nimport 'package:iris/pages/player/player_view.dart';\nimport 'package:iris/store/use_app_store.dart';\n\nclass Home extends HookWidget {\n  const Home({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    useFullScreen();\n    useOrientation();\n    useResizeWindow();\n\n    final playerBackend =\n        useAppStore().select(context, (state) => state.playerBackend);\n\n    return Scaffold(\n      backgroundColor: Colors.black,\n      body: PlayerView(playerBackend: playerBackend),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/player/audio.dart",
    "content": "import 'dart:io';\nimport 'dart:ui';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:iris/models/file.dart';\nimport 'package:iris/models/storages/storage.dart';\nimport 'package:iris/store/use_storage_store.dart';\n\nclass _CoverImage extends StatelessWidget {\n  final FileItem cover;\n  final String? auth;\n  final BoxFit fit;\n\n  const _CoverImage({\n    required this.cover,\n    required this.auth,\n    required this.fit,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    final isLocal = cover.storageId == localStorageId;\n    if (isLocal) {\n      return Image.file(\n        File(cover.uri),\n        fit: fit,\n        gaplessPlayback: true,\n      );\n    } else {\n      return Image.network(\n        cover.uri,\n        headers: auth != null ? {'authorization': auth!} : null,\n        fit: fit,\n        gaplessPlayback: true,\n      );\n    }\n  }\n}\n\nclass Audio extends HookWidget {\n  const Audio({\n    super.key,\n    required this.cover,\n  });\n\n  final FileItem? cover;\n\n  @override\n  Widget build(BuildContext context) {\n    final storage = useMemoized(\n        () => cover?.storageId == null\n            ? null\n            : useStorageStore().findById(cover!.storageId),\n        [cover?.storageId]);\n    final auth = useMemoized(() => storage?.getAuth(), [storage]);\n\n    return IgnorePointer(\n      child: Stack(\n        fit: StackFit.expand,\n        children: [\n          const DecoratedBox(\n            decoration: BoxDecoration(\n              color: Colors.black,\n            ),\n          ),\n          if (cover != null)\n            _CoverImage(cover: cover!, auth: auth, fit: BoxFit.cover),\n          BackdropFilter(\n            filter: ImageFilter.blur(sigmaX: 24.0, sigmaY: 24.0),\n            child: DecoratedBox(\n              decoration: BoxDecoration(\n                gradient: LinearGradient(\n                  begin: Alignment.topCenter,\n                  end: Alignment.bottomCenter,\n                  colors: [\n                    Theme.of(context)\n                        .colorScheme\n                        .surface\n                        .withValues(alpha: 0.6),\n                    Theme.of(context)\n                        .colorScheme\n                        .surface\n                        .withValues(alpha: 0.2),\n                  ],\n                ),\n              ),\n            ),\n          ),\n          LayoutBuilder(\n            builder: (context, constraints) {\n              const double wideLayoutThreshold = 600;\n              final isWideScreen = constraints.maxWidth >= wideLayoutThreshold;\n\n              if (cover == null) {\n                return const SizedBox();\n              }\n\n              if (isWideScreen) {\n                return _buildWideLayout(context, constraints, cover!, auth);\n              } else {\n                return _buildNarrowLayout(context, constraints, cover!, auth);\n              }\n            },\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget _buildNarrowLayout(\n    BuildContext context,\n    BoxConstraints constraints,\n    FileItem cover,\n    String? auth,\n  ) {\n    return Center(\n      child: Padding(\n        padding: const EdgeInsets.fromLTRB(48, 56, 48, 144),\n        child: ConstrainedBox(\n          constraints: const BoxConstraints(\n            maxWidth: 400.0,\n            maxHeight: 400.0,\n          ),\n          child: AspectRatio(\n            aspectRatio: 1.0,\n            child: _buildCoverCard(\n              cover: cover,\n              auth: auth,\n              shadowColor: Theme.of(context)\n                  .colorScheme\n                  .onSurface\n                  .withValues(alpha: 0.15),\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget _buildWideLayout(\n    BuildContext context,\n    BoxConstraints constraints,\n    FileItem cover,\n    String? auth,\n  ) {\n    return Row(\n      children: [\n        Expanded(\n          flex: 5,\n          child: Center(\n            child: Padding(\n              padding: EdgeInsets.fromLTRB(\n                48,\n                56,\n                24,\n                constraints.maxWidth > 1024\n                    ? 64\n                    : constraints.maxWidth > 640\n                        ? 96\n                        : 144,\n              ),\n              child: ConstrainedBox(\n                constraints: const BoxConstraints(\n                  maxWidth: 320.0,\n                  maxHeight: 320.0,\n                ),\n                child: AspectRatio(\n                  aspectRatio: 1.0,\n                  child: _buildCoverCard(\n                    cover: cover,\n                    auth: auth,\n                    shadowColor: Theme.of(context)\n                        .colorScheme\n                        .onSurface\n                        .withValues(alpha: 0.15),\n                  ),\n                ),\n              ),\n            ),\n          ),\n        ),\n        Expanded(\n          flex: 5,\n          child: Container(\n            padding:\n                const EdgeInsets.symmetric(horizontal: 48.0, vertical: 24.0),\n          ),\n        ),\n      ],\n    );\n  }\n\n  Widget _buildCoverCard({\n    required FileItem cover,\n    required String? auth,\n    required Color shadowColor,\n  }) {\n    return Container(\n      decoration: BoxDecoration(\n        borderRadius: BorderRadius.circular(8),\n        boxShadow: [\n          BoxShadow(\n            color: shadowColor,\n            blurRadius: 32,\n            spreadRadius: 2,\n            offset: const Offset(0, 8),\n          ),\n        ],\n      ),\n      child: ClipRRect(\n        borderRadius: BorderRadius.circular(8),\n        child: _CoverImage(\n          cover: cover,\n          auth: auth,\n          fit: BoxFit.cover,\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/player/control_bar/control_bar.dart",
    "content": "import 'dart:io';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:flutter_zustand/flutter_zustand.dart';\nimport 'package:iris/globals.dart' show rateMenuKey, speedStops, moreMenuKey;\nimport 'package:iris/models/file.dart';\nimport 'package:iris/models/player.dart';\nimport 'package:iris/models/storages/local.dart';\nimport 'package:iris/models/store/app_state.dart';\nimport 'package:iris/store/use_player_ui_store.dart';\nimport 'package:iris/widgets/dialogs/show_open_link_dialog.dart';\nimport 'package:iris/widgets/dialogs/show_rate_dialog.dart';\nimport 'package:iris/pages/player/control_bar/control_bar_slider.dart';\nimport 'package:iris/widgets/popups/history.dart';\nimport 'package:iris/widgets/bottom_sheets/show_open_link_bottom_sheet.dart';\nimport 'package:iris/widgets/popups/settings/settings.dart';\nimport 'package:iris/pages/player/control_bar/volume_control.dart';\nimport 'package:iris/widgets/popups/track/subtitle_and_audio_track.dart';\nimport 'package:iris/store/use_app_store.dart';\nimport 'package:iris/store/use_play_queue_store.dart';\nimport 'package:iris/utils/get_localizations.dart';\nimport 'package:iris/widgets/popups/play_queue.dart';\nimport 'package:iris/utils/platform.dart';\nimport 'package:iris/widgets/popup.dart';\nimport 'package:iris/widgets/popups/storages/storages.dart';\nimport 'package:provider/provider.dart';\nimport 'package:window_manager/window_manager.dart';\n\nclass ControlBar extends HookWidget {\n  const ControlBar({\n    super.key,\n    required this.showControl,\n    required this.showControlForHover,\n    this.color,\n    this.overlayColor,\n  });\n\n  final void Function() showControl;\n  final Future<void> Function(Future<void> callback) showControlForHover;\n  final Color? color;\n  final WidgetStateProperty<Color?>? overlayColor;\n\n  @override\n  Widget build(BuildContext context) {\n    final width = MediaQuery.sizeOf(context).width;\n    final t = getLocalizations(context);\n\n    final isPlaying =\n        context.select<MediaPlayer, bool>((player) => player.isPlaying);\n\n    final isInitializing =\n        context.select<MediaPlayer, bool>((player) => player.isInitializing);\n\n    final rate = useAppStore().select(context, (state) => state.rate);\n    final volume = useAppStore().select(context, (state) => state.volume);\n    final isMuted = useAppStore().select(context, (state) => state.isMuted);\n\n    final isFullScreen =\n        usePlayerUiStore().select(context, (state) => state.isFullScreen);\n    final int playQueueLength =\n        usePlayQueueStore().select(context, (state) => state.playQueue.length);\n\n    final bool shuffle =\n        useAppStore().select(context, (state) => state.shuffle);\n    final Repeat repeat =\n        useAppStore().select(context, (state) => state.repeat);\n    final BoxFit fit = useAppStore().select(context, (state) => state.fit);\n\n    final isSeeking =\n        usePlayerUiStore().select(context, (state) => state.isSeeking);\n\n    final displayIsPlaying = useState(isPlaying);\n\n    final playQueue =\n        usePlayQueueStore().select(context, (state) => state.playQueue);\n    final currentIndex =\n        usePlayQueueStore().select(context, (state) => state.currentIndex);\n\n    final FileItem? file = useMemoized(() {\n      final index =\n          playQueue.indexWhere((element) => element.index == currentIndex);\n      return playQueue.isEmpty || index < 0 ? null : playQueue[index].file;\n    }, [playQueue, currentIndex]);\n\n    useEffect(() {\n      if (!isSeeking) {\n        displayIsPlaying.value = isPlaying;\n      }\n      return null;\n    }, [isPlaying]);\n\n    final playPauseButton = Stack(\n      alignment: Alignment.center,\n      children: [\n        if (isInitializing)\n          SizedBox(\n            width: 32,\n            height: 32,\n            child: CircularProgressIndicator(\n              strokeWidth: 4,\n              color: Theme.of(context).colorScheme.surface,\n            ),\n          ),\n        IconButton(\n          tooltip: '${displayIsPlaying.value ? t.pause : t.play} ( Space )',\n          icon: Icon(\n            displayIsPlaying.value\n                ? Icons.pause_rounded\n                : Icons.play_arrow_rounded,\n            size: 32,\n            color: color,\n          ),\n          onPressed: () {\n            showControl();\n            if (isPlaying == true) {\n              useAppStore().updateAutoPlay(false);\n              context.read<MediaPlayer>().pause();\n            } else {\n              useAppStore().updateAutoPlay(true);\n              context.read<MediaPlayer>().play();\n            }\n          },\n          style: ButtonStyle(overlayColor: overlayColor),\n        ),\n      ],\n    );\n\n    final stopButton = IconButton(\n      tooltip: '${t.stop} ( Ctrl + C )',\n      icon: Icon(\n        Icons.stop_rounded,\n        size: 26,\n        color: color,\n      ),\n      onPressed: () {\n        showControl();\n        useAppStore().updateAutoPlay(false);\n        context.read<MediaPlayer>().pause();\n        usePlayQueueStore().updateCurrentIndex(-1);\n      },\n      style: ButtonStyle(overlayColor: overlayColor),\n    );\n\n    final prevButton = playQueueLength > 1\n        ? IconButton(\n            tooltip: '${t.previous} ( Ctrl + ← )',\n            icon: Icon(\n              Icons.skip_previous_rounded,\n              size: 26,\n              color: color,\n            ),\n            onPressed: () {\n              showControl();\n              usePlayQueueStore().previous();\n            },\n            style: ButtonStyle(overlayColor: overlayColor),\n          )\n        : const SizedBox.shrink();\n\n    final nextButton = playQueueLength > 1\n        ? IconButton(\n            tooltip: '${t.next} ( Ctrl + → )',\n            icon: Icon(\n              Icons.skip_next_rounded,\n              size: 26,\n              color: color,\n            ),\n            onPressed: () {\n              showControl();\n              usePlayQueueStore().next();\n            },\n            style: ButtonStyle(overlayColor: overlayColor),\n          )\n        : const SizedBox.shrink();\n\n    final shuffleButton = Builder(\n      builder: (context) => IconButton(\n        tooltip: '${t.shuffle}: ${shuffle ? t.on : t.off} ( Ctrl + X )',\n        icon: Icon(\n          Icons.shuffle_rounded,\n          size: 20,\n          color: !shuffle ? color?.withAlpha(153) : color,\n        ),\n        onPressed: () {\n          showControl();\n          shuffle ? usePlayQueueStore().sort() : usePlayQueueStore().shuffle();\n          useAppStore().updateShuffle(!shuffle);\n        },\n        style: ButtonStyle(overlayColor: overlayColor),\n      ),\n    );\n\n    final repeatButton = Builder(\n      builder: (context) => IconButton(\n        tooltip:\n            '${repeat == Repeat.one ? t.repeat_one : repeat == Repeat.all ? t.repeat_all : t.repeat_none} ( Ctrl + R )',\n        icon: Icon(\n          repeat == Repeat.one\n              ? Icons.repeat_one_rounded\n              : Icons.repeat_rounded,\n          size: 20,\n          color: repeat == Repeat.none ? color?.withAlpha(153) : color,\n        ),\n        onPressed: () {\n          showControl();\n          useAppStore().toggleRepeat();\n        },\n        style: ButtonStyle(overlayColor: overlayColor),\n      ),\n    );\n\n    final fitButton = IconButton(\n      tooltip:\n          '${t.video_zoom}: ${fit == BoxFit.contain ? t.fit : fit == BoxFit.fill ? t.stretch : fit == BoxFit.cover ? t.crop : '100%'} ( Ctrl + V )',\n      icon: Icon(\n        fit == BoxFit.contain\n            ? Icons.fit_screen_rounded\n            : fit == BoxFit.fill\n                ? Icons.aspect_ratio_rounded\n                : fit == BoxFit.cover\n                    ? Icons.crop_landscape_rounded\n                    : Icons.crop_free_rounded,\n        size: 20,\n        color: color,\n      ),\n      onPressed: () {\n        showControl();\n        useAppStore().toggleFit();\n      },\n      style: ButtonStyle(overlayColor: overlayColor),\n    );\n\n    final rateButton = PopupMenuButton(\n      key: rateMenuKey,\n      clipBehavior: Clip.hardEdge,\n      constraints: const BoxConstraints(minWidth: 0),\n      itemBuilder: (BuildContext context) => speedStops\n          .map(\n            (item) => PopupMenuItem(\n              child: Text(\n                '${item}X',\n                style: TextStyle(\n                  color: item == rate\n                      ? Theme.of(context).colorScheme.primary\n                      : null,\n                  fontWeight: item == rate ? FontWeight.bold : FontWeight.w100,\n                  height: 1,\n                ),\n              ),\n              onTap: () async {\n                showControl();\n                useAppStore().updateRate(item);\n              },\n            ),\n          )\n          .toList(),\n      child: Tooltip(\n        message: t.playback_speed,\n        child: TextButton(\n          onPressed: () => rateMenuKey.currentState?.showButtonMenu(),\n          style: ButtonStyle(overlayColor: overlayColor),\n          child: Text(\n            '${rate}X',\n            style: TextStyle(\n              fontWeight: FontWeight.bold,\n              color: color,\n            ),\n          ),\n        ),\n      ),\n    );\n\n    final volumeWidget = width < 768\n        ? Builder(\n            builder: (context) => IconButton(\n              tooltip: '${t.volume}: $volume',\n              icon: Icon(\n                isMuted || volume == 0\n                    ? Icons.volume_off_rounded\n                    : volume < 50\n                        ? Icons.volume_down_rounded\n                        : Icons.volume_up_rounded,\n                size: 20,\n                color: color,\n              ),\n              onPressed: () => showControlForHover(\n                showVolumePopover(context, showControl),\n              ),\n              style: ButtonStyle(overlayColor: overlayColor),\n            ),\n          )\n        : SizedBox(\n            width: 160,\n            child: VolumeControl(\n              showControl: showControl,\n              showVolumeText: false,\n              color: color,\n              overlayColor: overlayColor,\n            ),\n          );\n\n    final sliderWidget =\n        ControlBarSlider(showControl: showControl, color: color);\n\n    final subtitleButton = IconButton(\n      tooltip: '${t.subtitle_and_audio_track} ( S )',\n      icon: Icon(\n        Icons.subtitles_rounded,\n        size: 20,\n        color: color,\n      ),\n      onPressed: () async {\n        showControlForHover(\n          showPopup(\n            context: context,\n            child: Provider<MediaPlayer>.value(\n              value: context.read<MediaPlayer>(),\n              child: const SubtitleAndAudioTrack(),\n            ),\n            direction: PopupDirection.right,\n          ),\n        );\n      },\n      style: ButtonStyle(overlayColor: overlayColor),\n    );\n\n    final playQueueButton = IconButton(\n      tooltip: '${t.play_queue} ( P )',\n      icon: Transform.translate(\n        offset: const Offset(1, 1.5),\n        child: Icon(\n          Icons.playlist_play_rounded,\n          size: 28,\n          color: color,\n        ),\n      ),\n      onPressed: () async {\n        showControlForHover(\n          showPopup(\n            context: context,\n            child: const PlayQueue(),\n            direction: PopupDirection.right,\n          ),\n        );\n      },\n      style: ButtonStyle(overlayColor: overlayColor),\n    );\n\n    final storageButton = IconButton(\n      tooltip: '${t.storage} ( F )',\n      icon: Icon(\n        Icons.storage_rounded,\n        size: 18,\n        color: color,\n      ),\n      onPressed: () => showControlForHover(\n        showPopup(\n          context: context,\n          child: const Storages(),\n          direction: PopupDirection.right,\n        ),\n      ),\n      style: ButtonStyle(overlayColor: overlayColor),\n    );\n\n    final fullscreenButton = IconButton(\n      tooltip: isFullScreen\n          ? '${t.exit_fullscreen} ( Escape, F11, Enter )'\n          : '${t.enter_fullscreen} ( F11, Enter )',\n      icon: Icon(\n        isFullScreen\n            ? Icons.close_fullscreen_rounded\n            : Icons.open_in_full_rounded,\n        size: 19,\n        color: color,\n      ),\n      onPressed: () async {\n        showControl();\n        usePlayerUiStore().updateFullScreen(!isFullScreen);\n      },\n      style: ButtonStyle(overlayColor: overlayColor),\n    );\n\n    final moreMenuButton = PopupMenuButton(\n      key: moreMenuKey,\n      icon: Icon(\n        Icons.more_vert_rounded,\n        size: 20,\n        color: color,\n      ),\n      style: ButtonStyle(overlayColor: overlayColor),\n      clipBehavior: Clip.hardEdge,\n      constraints: const BoxConstraints(minWidth: 200),\n      itemBuilder: (BuildContext context) => [\n        PopupMenuItem(\n          child: ListTile(\n            mouseCursor: SystemMouseCursors.click,\n            leading: const Icon(\n              Icons.file_open_rounded,\n              size: 16.5,\n            ),\n            title: Text(t.open_file),\n            trailing: Text(\n              'Ctrl + O',\n              style: TextStyle(\n                fontSize: 12,\n                color: Theme.of(context).dividerColor,\n              ),\n            ),\n          ),\n          onTap: () async {\n            showControl();\n            if (Platform.isAndroid) {\n              await pickContentFile();\n            } else {\n              await pickLocalFile();\n            }\n            showControl();\n          },\n        ),\n        PopupMenuItem(\n          child: ListTile(\n            mouseCursor: SystemMouseCursors.click,\n            leading: const Icon(\n              Icons.file_present_rounded,\n              size: 16.5,\n            ),\n            title: Text(t.open_link),\n            trailing: Text(\n              'Ctrl + L',\n              style: TextStyle(\n                fontSize: 12,\n                color: Theme.of(context).dividerColor,\n              ),\n            ),\n          ),\n          onTap: () async {\n            isDesktop\n                ? await showOpenLinkDialog(context)\n                : await showOpenLinkBottomSheet(context);\n            showControl();\n          },\n        ),\n        if (width < 600)\n          PopupMenuItem(\n            child: ListTile(\n              mouseCursor: SystemMouseCursors.click,\n              leading: const Icon(\n                Icons.speed_rounded,\n                size: 20,\n              ),\n              title: Text('${t.playback_speed}: ${rate}X'),\n            ),\n            onTap: () => showControlForHover(showRateDialog(context)),\n          ),\n        PopupMenuItem(\n          child: ListTile(\n            mouseCursor: SystemMouseCursors.click,\n            leading: const Icon(\n              Icons.history_rounded,\n              size: 20,\n            ),\n            title: Text(t.history),\n            trailing: Text(\n              'Ctrl + H',\n              style: TextStyle(\n                fontSize: 12,\n                color: Theme.of(context).dividerColor,\n              ),\n            ),\n          ),\n          onTap: () => showControlForHover(\n            showPopup(\n              context: context,\n              child: const History(),\n              direction: PopupDirection.right,\n            ),\n          ),\n        ),\n        PopupMenuItem(\n          child: ListTile(\n            mouseCursor: SystemMouseCursors.click,\n            leading: const Icon(\n              Icons.settings_rounded,\n              size: 20,\n            ),\n            title: Text(t.settings),\n            trailing: Text(\n              'Ctrl + P',\n              style: TextStyle(\n                fontSize: 12,\n                color: Theme.of(context).dividerColor,\n              ),\n            ),\n          ),\n          onTap: () => showControlForHover(\n            showPopup(\n              context: context,\n              child: const Settings(),\n              direction: PopupDirection.right,\n            ),\n          ),\n        ),\n        PopupMenuItem(\n          child: ListTile(\n            mouseCursor: SystemMouseCursors.click,\n            leading: const Icon(\n              Icons.exit_to_app_rounded,\n              size: 20,\n            ),\n            title: Text(t.exit),\n            trailing: Text(\n              'Alt + X',\n              style: TextStyle(\n                fontSize: 12,\n                color: Theme.of(context).dividerColor,\n              ),\n            ),\n          ),\n          onTap: () async {\n            await context.read<MediaPlayer>().saveProgress();\n            if (isDesktop) {\n              windowManager.close();\n            } else {\n              SystemNavigator.pop();\n              exit(0);\n            }\n          },\n        ),\n      ],\n    );\n\n    const double mobileBreakpoint = 640.0;\n    const double tabletBreakpoint = 1024.0;\n\n    final Widget controlLayout;\n\n    if (width < mobileBreakpoint) {\n      controlLayout = Column(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          sliderWidget,\n          Row(\n            mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n            crossAxisAlignment: CrossAxisAlignment.center,\n            children: [\n              shuffleButton,\n              prevButton,\n              playPauseButton,\n              stopButton,\n              nextButton,\n              repeatButton,\n            ],\n          ),\n          Row(\n            mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n            crossAxisAlignment: CrossAxisAlignment.center,\n            children: [\n              if (file?.type != ContentType.audio) fitButton,\n              volumeWidget,\n              subtitleButton,\n              playQueueButton,\n              storageButton,\n              if (isDesktop) fullscreenButton,\n              moreMenuButton,\n            ],\n          )\n        ],\n      );\n    } else if (width < tabletBreakpoint) {\n      controlLayout = Column(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          sliderWidget,\n          const SizedBox(height: 4),\n          Row(\n            crossAxisAlignment: CrossAxisAlignment.center,\n            children: [\n              playPauseButton,\n              stopButton,\n              prevButton,\n              nextButton,\n              shuffleButton,\n              repeatButton,\n              if (file?.type != ContentType.audio) fitButton,\n              rateButton,\n              volumeWidget,\n              const Spacer(),\n              subtitleButton,\n              playQueueButton,\n              storageButton,\n              if (isDesktop) fullscreenButton,\n              moreMenuButton,\n            ],\n          ),\n        ],\n      );\n    } else {\n      controlLayout = Row(\n        crossAxisAlignment: CrossAxisAlignment.center,\n        children: [\n          playPauseButton,\n          stopButton,\n          prevButton,\n          nextButton,\n          shuffleButton,\n          repeatButton,\n          if (file?.type != ContentType.audio) fitButton,\n          rateButton,\n          volumeWidget,\n          Expanded(child: sliderWidget),\n          subtitleButton,\n          playQueueButton,\n          storageButton,\n          if (isDesktop) fullscreenButton,\n          moreMenuButton,\n        ],\n      );\n    }\n\n    return Container(\n      padding: const EdgeInsets.all(8),\n      decoration: BoxDecoration(\n        gradient: LinearGradient(\n          begin: Alignment.topCenter,\n          end: Alignment.bottomCenter,\n          colors: [\n            Colors.black.withValues(alpha: 0),\n            Colors.black.withValues(alpha: 0.25),\n            Colors.black.withValues(alpha: 0.65),\n          ],\n        ),\n      ),\n      child: controlLayout,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/player/control_bar/control_bar_slider.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:flutter_zustand/flutter_zustand.dart';\nimport 'package:iris/models/player.dart';\nimport 'package:iris/store/use_app_store.dart';\nimport 'package:iris/store/use_player_ui_store.dart';\nimport 'package:iris/utils/format_duration_to_minutes.dart';\nimport 'package:provider/provider.dart';\n\nclass ControlBarSlider extends HookWidget {\n  const ControlBarSlider({\n    super.key,\n    this.showControl,\n    this.disabled = false,\n    this.color,\n  });\n\n  final void Function()? showControl;\n  final bool disabled;\n  final Color? color;\n\n  @override\n  Widget build(BuildContext context) {\n    final autoPlay = useAppStore().select(context, (state) => state.autoPlay);\n\n    final progress = context.select<\n        MediaPlayer,\n        ({\n          Duration position,\n          Duration duration,\n          Duration buffer,\n        })>(\n      (player) => (\n        position: player.position,\n        duration: player.duration,\n        buffer: player.buffer,\n      ),\n    );\n\n    final play = context.read<MediaPlayer>().play;\n    final pause = context.read<MediaPlayer>().pause;\n    final seek = context.read<MediaPlayer>().seek;\n\n    final double max = progress.duration.inMilliseconds.toDouble();\n    final double positionValue =\n        progress.position.inMilliseconds.toDouble().clamp(0.0, max);\n    final double bufferValue =\n        progress.buffer.inMilliseconds.toDouble().clamp(0.0, max);\n\n    return ExcludeFocus(\n      child: Container(\n        padding: const EdgeInsets.fromLTRB(12, 0, 12, 0),\n        child: Row(\n          children: [\n            Visibility(\n              visible: !disabled,\n              child: Text(\n                formatDurationToMinutes(progress.position),\n                style: TextStyle(color: color, height: 2),\n              ),\n            ),\n            Expanded(\n              child: SliderTheme(\n                data: SliderTheme.of(context).copyWith(\n                  activeTrackColor: color?.withAlpha(222) ??\n                      Theme.of(context).colorScheme.primary,\n                  inactiveTrackColor: color?.withAlpha(70) ??\n                      Theme.of(context)\n                          .colorScheme\n                          .onSurface\n                          .withValues(alpha: 0.25),\n                  secondaryActiveTrackColor: color?.withAlpha(120) ??\n                      Theme.of(context)\n                          .colorScheme\n                          .onSurface\n                          .withValues(alpha: 0.4),\n                  thumbColor: color ?? Theme.of(context).colorScheme.primary,\n                  thumbShape: RoundSliderThumbShape(\n                    enabledThumbRadius: disabled ? 0 : 6,\n                  ),\n                  overlayShape: const RoundSliderOverlayShape(\n                    overlayRadius: 12,\n                  ),\n                  trackHeight: 4,\n                  trackShape: const _CustomTrackShape(),\n                ),\n                child: Slider(\n                  value: positionValue,\n                  secondaryTrackValue: bufferValue,\n                  min: 0,\n                  max: max > 0 ? max : 1.0,\n                  onChanged: disabled\n                      ? null\n                      : (value) {\n                          showControl?.call();\n                          seek(Duration(milliseconds: value.toInt()));\n                        },\n                  onChangeStart: disabled\n                      ? null\n                      : (value) {\n                          usePlayerUiStore().updateIsSeeking(true);\n                          pause();\n                        },\n                  onChangeEnd: disabled\n                      ? null\n                      : (value) async {\n                          if (autoPlay) {\n                            play();\n                          }\n                          usePlayerUiStore().updateIsSeeking(false);\n                        },\n                ),\n              ),\n            ),\n            Visibility(\n              visible: !disabled,\n              child: Text(\n                formatDurationToMinutes(progress.duration),\n                style: TextStyle(color: color, height: 2),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n\nclass _CustomTrackShape extends RoundedRectSliderTrackShape {\n  const _CustomTrackShape();\n\n  @override\n  void paint(\n    PaintingContext context,\n    Offset offset, {\n    required RenderBox parentBox,\n    required SliderThemeData sliderTheme,\n    required Animation<double> enableAnimation,\n    required TextDirection textDirection,\n    required Offset thumbCenter,\n    Offset? secondaryOffset,\n    bool isDiscrete = false,\n    bool isEnabled = false,\n    double additionalActiveTrackHeight = 2,\n  }) {\n    if (sliderTheme.trackHeight == null || sliderTheme.trackHeight! <= 0) {\n      return;\n    }\n\n    final Rect trackRect = getPreferredRect(\n      parentBox: parentBox,\n      offset: offset,\n      sliderTheme: sliderTheme,\n      isEnabled: isEnabled,\n      isDiscrete: isDiscrete,\n    );\n\n    final Radius trackRadius = Radius.circular(trackRect.height / 2);\n\n    final Paint inactivePaint = Paint()\n      ..color = sliderTheme.inactiveTrackColor!;\n    context.canvas.drawRRect(\n      RRect.fromRectAndRadius(trackRect, trackRadius),\n      inactivePaint,\n    );\n\n    if (secondaryOffset != null) {\n      final Paint secondaryPaint = Paint()\n        ..color = sliderTheme.secondaryActiveTrackColor!;\n      final Rect secondaryRect = Rect.fromLTRB(\n        trackRect.left,\n        trackRect.top,\n        secondaryOffset.dx,\n        trackRect.bottom,\n      );\n      context.canvas.drawRRect(\n        RRect.fromRectAndRadius(secondaryRect, trackRadius),\n        secondaryPaint,\n      );\n    }\n\n    final Paint activePaint = Paint()..color = sliderTheme.activeTrackColor!;\n    final Rect activeRect = Rect.fromLTRB(\n      trackRect.left,\n      trackRect.top,\n      thumbCenter.dx,\n      trackRect.bottom,\n    );\n    context.canvas.drawRRect(\n      RRect.fromRectAndRadius(activeRect, trackRadius),\n      activePaint,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/player/control_bar/volume_control.dart",
    "content": "import 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:flutter_zustand/flutter_zustand.dart';\nimport 'package:iris/pages/player/control_bar/volume_slider.dart';\nimport 'package:iris/store/use_app_store.dart';\nimport 'package:iris/utils/get_localizations.dart';\nimport 'package:popover/popover.dart';\n\nFuture<void> showVolumePopover(\n  BuildContext context,\n  void Function() showControl,\n) async =>\n    showPopover(\n      context: context,\n      bodyBuilder: (context) => Container(\n        padding: EdgeInsets.fromLTRB(8, 0, 16, 0),\n        child: VolumeControl(showControl: showControl),\n      ),\n      direction: PopoverDirection.top,\n      width: 240,\n      height: 48,\n      arrowHeight: 0,\n      arrowWidth: 0,\n      backgroundColor: Theme.of(context).colorScheme.surface,\n      barrierColor: Colors.transparent,\n    );\n\nclass VolumeControl extends HookWidget {\n  const VolumeControl({\n    super.key,\n    required this.showControl,\n    this.showVolumeText = true,\n    this.color,\n    this.overlayColor,\n  });\n\n  final void Function() showControl;\n  final bool showVolumeText;\n  final Color? color;\n  final WidgetStateProperty<Color?>? overlayColor;\n\n  @override\n  Widget build(BuildContext context) {\n    final t = getLocalizations(context);\n    final volume = useAppStore().select(context, (state) => state.volume);\n    final isMuted = useAppStore().select(context, (state) => state.isMuted);\n    return Listener(\n      onPointerSignal: (PointerSignalEvent event) async {\n        if (event is PointerScrollEvent) {\n          if (event.scrollDelta.dy < 0) {\n            showControl();\n            if (isMuted) {\n              await useAppStore().updateVolume(0);\n              await useAppStore().updateMute(false);\n            } else {\n              useAppStore().updateVolume(volume + 2);\n            }\n          } else {\n            showControl();\n            useAppStore().updateVolume(volume - 2);\n          }\n        }\n      },\n      child: Row(\n        crossAxisAlignment: CrossAxisAlignment.center,\n        textBaseline: TextBaseline.ideographic,\n        children: [\n          IconButton(\n            tooltip: '${isMuted ? t.unmute : t.mute} ( Ctrl + M  )',\n            icon: Icon(\n              isMuted || volume == 0\n                  ? Icons.volume_off_rounded\n                  : volume < 50\n                      ? Icons.volume_down_rounded\n                      : Icons.volume_up_rounded,\n              size: 20,\n              color: color,\n            ),\n            onPressed: () {\n              showControl();\n              if (volume == 0) {\n                useAppStore().updateVolume(80);\n              } else {\n                useAppStore().toggleMute();\n              }\n            },\n            style: ButtonStyle(overlayColor: overlayColor),\n          ),\n          Expanded(\n            child: VolumeSlider(\n              showControl: showControl,\n              color: color,\n            ),\n          ),\n          if (showVolumeText) const SizedBox(width: 8),\n          if (showVolumeText) Text('${volume >= 100 ? '' : '  '}$volume'),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/player/control_bar/volume_slider.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:flutter_zustand/flutter_zustand.dart';\nimport 'package:iris/store/use_app_store.dart';\n\nclass VolumeSlider extends HookWidget {\n  const VolumeSlider({\n    super.key,\n    required this.showControl,\n    this.color,\n  });\n\n  final void Function() showControl;\n  final Color? color;\n\n  @override\n  Widget build(BuildContext context) {\n    final volume = useAppStore().select(context, (state) => state.volume);\n    final isMuted = useAppStore().select(context, (state) => state.isMuted);\n\n    return ExcludeFocus(\n      child: SizedBox(\n        width: 128,\n        child: SliderTheme(\n          data: SliderTheme.of(context).copyWith(\n            thumbColor: color,\n            activeTrackColor: color?.withAlpha(222),\n            inactiveTrackColor: color?.withAlpha(99),\n            thumbShape: RoundSliderThumbShape(\n              enabledThumbRadius: 5.6,\n            ),\n            overlayShape: const RoundSliderOverlayShape(\n              overlayRadius: 4,\n            ),\n            trackHeight: 2.4,\n          ),\n          child: Slider(\n            value: isMuted ? 0 : volume.toDouble(),\n            onChanged: (value) {\n              showControl();\n              useAppStore().updateMute(false);\n              useAppStore().updateVolume((value).toInt());\n            },\n            min: 0,\n            max: 100,\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/player/overlays/controls_overlay.dart",
    "content": "import 'dart:async';\nimport 'dart:ui';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_zustand/flutter_zustand.dart';\nimport 'package:iris/models/file.dart';\nimport 'package:iris/models/player.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:iris/pages/player/control_bar/control_bar.dart';\nimport 'package:iris/store/use_player_ui_store.dart';\nimport 'package:iris/widgets/drag_area.dart';\nimport 'package:iris/pages/player/title_bar.dart';\nimport 'package:provider/provider.dart';\n\nclass ControlsOverlay extends HookWidget {\n  const ControlsOverlay({\n    super.key,\n    required this.file,\n    required this.title,\n    required this.showControl,\n    required this.showControlForHover,\n    required this.hideControl,\n    required this.showProgress,\n  });\n\n  final FileItem? file;\n  final String title;\n  final Function() showControl;\n  final Future<void> Function(Future<void> callback) showControlForHover;\n  final Function() hideControl;\n  final Function() showProgress;\n\n  @override\n  Widget build(BuildContext context) {\n    final saveProgress = context.read<MediaPlayer>().saveProgress;\n\n    final isShowControl =\n        usePlayerUiStore().select(context, (state) => state.isShowControl);\n\n    final contentColor = useMemoized(\n        () => Theme.of(context).brightness == Brightness.dark\n            ? Theme.of(context).colorScheme.onSurface\n            : Theme.of(context).colorScheme.surface,\n        [context]);\n\n    final overlayColor = useMemoized(\n        () =>\n            WidgetStateProperty.resolveWith<Color?>((Set<WidgetState> states) {\n              if (states.contains(WidgetState.pressed)) {\n                return contentColor.withValues(alpha: 0.2);\n              } else if (states.contains(WidgetState.hovered)) {\n                return contentColor.withValues(alpha: 0.2);\n              }\n              return null;\n            }),\n        [contentColor]);\n\n    void onHover(PointerHoverEvent event) {\n      if (event.kind != PointerDeviceKind.touch) {\n        usePlayerUiStore().updateIsHovering(true);\n        showControl();\n      }\n    }\n\n    return Stack(\n      children: [\n        // 标题栏\n        AnimatedPositioned(\n          duration: const Duration(milliseconds: 200),\n          curve: Curves.easeInOutCubicEmphasized,\n          top: isShowControl || file?.type != ContentType.video ? 0 : -72,\n          left: 0,\n          right: 0,\n          child: MouseRegion(\n            onHover: onHover,\n            child: GestureDetector(\n              onTap: () => showControl(),\n              child: DragArea(\n                child: TitleBar(\n                  title: title,\n                  actions: [const SizedBox(width: 8)],\n                  color: contentColor,\n                  overlayColor: overlayColor,\n                  saveProgress: () => saveProgress(),\n                ),\n              ),\n            ),\n          ),\n        ),\n        // 控制栏\n        AnimatedPositioned(\n          duration: const Duration(milliseconds: 200),\n          curve: Curves.easeInOutCubicEmphasized,\n          bottom: isShowControl || file?.type != ContentType.video ? 0 : -128,\n          left: 0,\n          right: 0,\n          child: Align(\n            alignment: Alignment.bottomCenter,\n            child: MouseRegion(\n              onHover: onHover,\n              child: GestureDetector(\n                onTap: () => showControl(),\n                child: ControlBar(\n                  showControl: showControl,\n                  showControlForHover: showControlForHover,\n                  color: contentColor,\n                  overlayColor: overlayColor,\n                ),\n              ),\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/player/overlays/gesture_overlay.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:flutter_zustand/flutter_zustand.dart';\nimport 'package:iris/globals.dart';\nimport 'package:iris/hooks/use_gesture.dart';\nimport 'package:iris/models/player.dart';\nimport 'package:iris/pages/player/overlays/speed_selector.dart';\nimport 'package:iris/store/use_app_store.dart';\nimport 'package:iris/store/use_player_ui_store.dart';\nimport 'package:provider/provider.dart';\n\nclass GestureOverlay extends HookWidget {\n  const GestureOverlay({\n    super.key,\n    required this.showControl,\n    required this.hideControl,\n    required this.showProgress,\n  });\n\n  final Function() showControl;\n  final Function() hideControl;\n  final Function() showProgress;\n\n  @override\n  Widget build(BuildContext context) {\n    final isPlaying =\n        context.select<MediaPlayer, bool>((player) => player.isPlaying);\n\n    final isShowControl =\n        usePlayerUiStore().select(context, (state) => state.isShowControl);\n\n    final cursor = useMemoized(\n        () => isShowControl || !isPlaying\n            ? SystemMouseCursors.basic\n            : SystemMouseCursors.none,\n        [isShowControl, isPlaying]);\n\n    final isSpeedSelectorVisible = useState(false);\n    final selectedSpeed = useState(1.0);\n    final speedSelectorPosition = useState(Offset.zero);\n    final visualOffset = useState(0.0);\n    final initialSpeed = useRef(1.0);\n\n    void showSpeedSelectorCallback(Offset position) {\n      isSpeedSelectorVisible.value = true;\n      speedSelectorPosition.value = position;\n      visualOffset.value = 0.0;\n      initialSpeed.value = useAppStore().state.rate;\n    }\n\n    void hideSpeedSelectorCallback(double finalSpeed) {\n      final initialIndex = speedStops.indexOf(initialSpeed.value);\n      final finalIndex = speedStops.indexOf(finalSpeed);\n\n      if (initialIndex == -1 || finalIndex == -1) return;\n\n      visualOffset.value = (initialIndex - finalIndex) * speedSelectorItemWidth;\n\n      Future.delayed(\n        const Duration(milliseconds: 200),\n        () {\n          if (context.mounted) {\n            isSpeedSelectorVisible.value = false;\n          }\n        },\n      );\n    }\n\n    void updateSelectedSpeedCallback(double speed, double newVisualOffset) {\n      selectedSpeed.value = speed;\n      visualOffset.value = newVisualOffset;\n    }\n\n    final gesture = useGesture(\n      showControl: showControl,\n      hideControl: hideControl,\n      showProgress: showProgress,\n      showSpeedSelector: showSpeedSelectorCallback,\n      hideSpeedSelector: hideSpeedSelectorCallback,\n      updateSelectedSpeed: updateSelectedSpeedCallback,\n    );\n\n    return MouseRegion(\n      cursor: cursor,\n      onHover: gesture.onHover,\n      child: GestureDetector(\n        behavior: HitTestBehavior.opaque,\n        onTap: gesture.onTap,\n        onTapDown: gesture.onTapDown,\n        onDoubleTapDown: gesture.onDoubleTapDown,\n        onLongPressStart: gesture.onLongPressStart,\n        onLongPressMoveUpdate: gesture.onLongPressMoveUpdate,\n        onLongPressEnd: gesture.onLongPressEnd,\n        onLongPressCancel: gesture.onLongPressCancel,\n        onPanStart: gesture.onPanStart,\n        onPanUpdate: gesture.onPanUpdate,\n        onPanEnd: gesture.onPanEnd,\n        onPanCancel: gesture.onPanCancel,\n        child: Stack(\n          children: [\n            // 播放速度\n            if (isSpeedSelectorVisible.value)\n              Positioned.fill(\n                child: SpeedSelector(\n                  selectedSpeed: selectedSpeed.value,\n                  visualOffset: visualOffset.value,\n                  initialSpeed: initialSpeed.value,\n                ),\n              ),\n\n            // 屏幕亮度\n            if (gesture.isLeftGesture && gesture.brightness != null)\n              Positioned.fill(\n                child: Center(\n                  child: Container(\n                    padding: const EdgeInsets.fromLTRB(12, 12, 18, 12),\n                    decoration: BoxDecoration(\n                      color: Colors.black54,\n                      borderRadius: BorderRadius.circular(8),\n                    ),\n                    child: Row(\n                      mainAxisSize: MainAxisSize.min,\n                      children: [\n                        Icon(\n                          gesture.brightness == 0\n                              ? Icons.brightness_low_rounded\n                              : gesture.brightness! < 1\n                                  ? Icons.brightness_medium_rounded\n                                  : Icons.brightness_high_rounded,\n                          color: Colors.white,\n                          size: 24,\n                        ),\n                        const SizedBox(width: 12),\n                        SizedBox(\n                          width: 100,\n                          child: LinearProgressIndicator(\n                            value: gesture.brightness,\n                            borderRadius: BorderRadius.circular(4),\n                            backgroundColor: Colors.grey,\n                            valueColor: const AlwaysStoppedAnimation<Color>(\n                                Colors.white),\n                          ),\n                        ),\n                      ],\n                    ),\n                  ),\n                ),\n              ),\n\n            // 音量\n            if (gesture.isRightGesture && gesture.volume != null)\n              Positioned.fill(\n                child: Center(\n                  child: Container(\n                    padding: const EdgeInsets.fromLTRB(12, 12, 18, 12),\n                    decoration: BoxDecoration(\n                      color: Colors.black54,\n                      borderRadius: BorderRadius.circular(8),\n                    ),\n                    child: Row(\n                      mainAxisSize: MainAxisSize.min,\n                      children: [\n                        Icon(\n                          gesture.volume == 0\n                              ? Icons.volume_mute_rounded\n                              : gesture.volume! < 0.5\n                                  ? Icons.volume_down_rounded\n                                  : Icons.volume_up_rounded,\n                          color: Colors.white,\n                          size: 24,\n                        ),\n                        const SizedBox(width: 12),\n                        SizedBox(\n                          width: 100,\n                          child: LinearProgressIndicator(\n                            value: gesture.volume,\n                            borderRadius: BorderRadius.circular(4),\n                            backgroundColor: Colors.grey,\n                            valueColor: const AlwaysStoppedAnimation<Color>(\n                                Colors.white),\n                          ),\n                        ),\n                      ],\n                    ),\n                  ),\n                ),\n              ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/player/overlays/minimal_progress_overlay.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_zustand/flutter_zustand.dart';\nimport 'package:iris/models/file.dart';\nimport 'package:iris/models/player.dart';\nimport 'package:iris/pages/player/control_bar/control_bar_slider.dart';\nimport 'package:iris/store/use_player_ui_store.dart';\nimport 'package:iris/utils/format_duration_to_minutes.dart';\nimport 'package:provider/provider.dart';\n\nclass MinimalProgressOverlay extends StatelessWidget {\n  const MinimalProgressOverlay({\n    super.key,\n    required this.title,\n    required this.file,\n  });\n\n  final String title;\n  final FileItem? file;\n\n  @override\n  Widget build(BuildContext context) {\n    final progress =\n        context.select<MediaPlayer, ({Duration position, Duration duration})>(\n      (player) => (position: player.position, duration: player.duration),\n    );\n\n    const overlayTextStyle = TextStyle(\n      color: Colors.white,\n      decoration: TextDecoration.none,\n      shadows: [\n        Shadow(\n          color: Colors.black,\n          offset: Offset(0, 0),\n          blurRadius: 1,\n        ),\n      ],\n    );\n\n    final isShowControl =\n        usePlayerUiStore().select(context, (state) => state.isShowControl);\n    final isShowProgress =\n        usePlayerUiStore().select(context, (state) => state.isShowProgress);\n\n    if (isShowProgress && !isShowControl && file?.type == ContentType.video) {\n      return Stack(\n        children: [\n          Positioned(\n            left: 12,\n            top: 12,\n            child: Text(\n              title,\n              style: overlayTextStyle.copyWith(fontSize: 20, height: 1),\n            ),\n          ),\n          Positioned(\n            left: -28,\n            right: -28,\n            bottom: -16,\n            height: 32,\n            child: ControlBarSlider(\n              disabled: true,\n            ),\n          ),\n          Positioned(\n            left: 12,\n            bottom: 6,\n            child: Text(\n              '${formatDurationToMinutes(progress.position)} / ${formatDurationToMinutes(progress.duration)}',\n              style: overlayTextStyle.copyWith(fontSize: 16, height: 2),\n            ),\n          ),\n        ],\n      );\n    } else {\n      return const SizedBox.shrink();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/player/overlays/speed_selector.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:iris/globals.dart' show speedStops, speedSelectorItemWidth;\n\nclass SpeedSelector extends HookWidget {\n  const SpeedSelector({\n    super.key,\n    required this.selectedSpeed,\n    required this.visualOffset,\n    required this.initialSpeed,\n  });\n\n  final double selectedSpeed;\n  final double visualOffset;\n  final double initialSpeed;\n\n  @override\n  Widget build(BuildContext context) {\n    final screenSize = MediaQuery.sizeOf(context);\n\n    const double itemWidth = speedSelectorItemWidth;\n    const double horizontalPadding = 12.0;\n\n    final initialIndex = speedStops.indexOf(initialSpeed);\n    final double initialCenterOffset = (screenSize.width / 2) -\n        (initialIndex * itemWidth) -\n        (itemWidth / 2) -\n        horizontalPadding;\n\n    final double targetOffset = initialCenterOffset + visualOffset;\n\n    final double topPosition = screenSize.height / 2 - 30;\n\n    return IgnorePointer(\n      child: Stack(\n        children: [\n          AnimatedPositioned(\n            duration: const Duration(milliseconds: 150),\n            curve: Curves.easeOutCubic,\n            left: targetOffset,\n            top: topPosition,\n            child: Container(\n              height: 60,\n              decoration: BoxDecoration(\n                color: Colors.black54,\n                borderRadius: BorderRadius.circular(30),\n                boxShadow: [\n                  BoxShadow(\n                    color: Colors.black26,\n                    blurRadius: 10,\n                    spreadRadius: 2,\n                  )\n                ],\n              ),\n              child: Row(\n                children: [\n                  const SizedBox(width: horizontalPadding),\n                  ...speedStops.map((speed) {\n                    final bool isSelected = speed == selectedSpeed;\n                    return SizedBox(\n                      width: itemWidth,\n                      child: Center(\n                        child: AnimatedDefaultTextStyle(\n                          duration: const Duration(milliseconds: 150),\n                          style: TextStyle(\n                            fontSize: isSelected ? 20 : 16,\n                            fontWeight: isSelected\n                                ? FontWeight.bold\n                                : FontWeight.normal,\n                            color: isSelected ? Colors.white : Colors.white70,\n                            height: 1.0,\n                          ),\n                          child: Text('${speed}x'),\n                        ),\n                      ),\n                    );\n                  }),\n                  const SizedBox(width: horizontalPadding),\n                ],\n              ),\n            ),\n          ),\n          Positioned(\n            left: screenSize.width / 2 - 1.5,\n            top: topPosition - 10,\n            child: Container(\n              width: 3,\n              height: 80,\n              decoration: BoxDecoration(\n                  color: Colors.white,\n                  borderRadius: BorderRadius.circular(2),\n                  boxShadow: [\n                    BoxShadow(\n                      color: Colors.white.withAlpha(100),\n                      blurRadius: 5,\n                    )\n                  ]),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/player/player.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\nimport 'package:desktop_drop/desktop_drop.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:flutter_zustand/flutter_zustand.dart';\nimport 'package:iris/hooks/use_app_lifecycle.dart';\nimport 'package:iris/hooks/use_cover.dart';\nimport 'package:iris/hooks/use_keyboard.dart';\nimport 'package:iris/info.dart';\nimport 'package:iris/models/file.dart';\nimport 'package:iris/models/player.dart';\nimport 'package:iris/models/storages/local.dart';\nimport 'package:iris/pages/player/audio.dart';\nimport 'package:iris/pages/player/overlays/controls_overlay.dart';\nimport 'package:iris/pages/player/overlays/gesture_overlay.dart';\nimport 'package:iris/pages/player/overlays/minimal_progress_overlay.dart';\nimport 'package:iris/pages/player/video_view.dart';\nimport 'package:iris/store/use_player_ui_store.dart';\nimport 'package:iris/utils/check_content_type.dart';\nimport 'package:iris/utils/logger.dart';\nimport 'package:iris/utils/platform.dart';\nimport 'package:iris/store/use_app_store.dart';\nimport 'package:iris/store/use_play_queue_store.dart';\nimport 'package:provider/provider.dart';\nimport 'package:window_manager/window_manager.dart';\n\nclass Player extends HookWidget {\n  const Player({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    final width = context.select<MediaPlayer, double>((player) => player.width);\n    final height =\n        context.select<MediaPlayer, double>((player) => player.height);\n\n    useAppLifecycle();\n\n    final cover = useCover();\n\n    final controlHideTimer = useRef<Timer?>(null);\n    final progressHideTimer = useRef<Timer?>(null);\n\n    final fit = useAppStore().select(context, (state) => state.fit);\n\n    final playQueue =\n        usePlayQueueStore().select(context, (state) => state.playQueue);\n    final currentIndex =\n        usePlayQueueStore().select(context, (state) => state.currentIndex);\n\n    final int currentPlayIndex = useMemoized(\n        () => playQueue.indexWhere((element) => element.index == currentIndex),\n        [playQueue, currentIndex]);\n\n    final FileItem? file = useMemoized(\n        () => playQueue.isEmpty || currentPlayIndex < 0\n            ? null\n            : playQueue[currentPlayIndex].file,\n        [playQueue, currentPlayIndex]);\n\n    final title = useMemoized(\n        () => file != null\n            ? playQueue.length > 1\n                ? '[${currentPlayIndex + 1}/${playQueue.length}] ${file.name}'\n                : file.name\n            : INFO.title,\n        [file, currentPlayIndex, playQueue]);\n\n    final focusNode = useFocusNode();\n\n    useEffect(() {\n      focusNode.requestFocus();\n      return;\n    }, []);\n\n    void startControlHideTimer() {\n      controlHideTimer.value = Timer(\n        const Duration(seconds: 5),\n        () {\n          if (usePlayerUiStore().state.isShowControl &&\n              !usePlayerUiStore().state.isHovering) {\n            usePlayerUiStore().updateIsShowControl(false);\n          }\n        },\n      );\n    }\n\n    void startProgressHideTimer() {\n      progressHideTimer.value = Timer(\n        const Duration(seconds: 5),\n        () {\n          if (usePlayerUiStore().state.isShowProgress) {\n            usePlayerUiStore().updateIsShowProgress(false);\n          }\n        },\n      );\n    }\n\n    void resetControlHideTimer() {\n      controlHideTimer.value?.cancel();\n      startControlHideTimer();\n    }\n\n    void resetBottomProgressTimer() {\n      progressHideTimer.value?.cancel();\n      startProgressHideTimer();\n    }\n\n    void showControl() {\n      usePlayerUiStore().updateIsShowControl(true);\n      usePlayerUiStore().updateIsHovering(false);\n      resetControlHideTimer();\n    }\n\n    void hideControl() {\n      usePlayerUiStore().updateIsShowControl(false);\n      usePlayerUiStore().updateIsHovering(false);\n      controlHideTimer.value?.cancel();\n    }\n\n    Future<void> showControlForHover(Future<void> callback) async {\n      try {\n        context.read<MediaPlayer>().saveProgress();\n        showControl();\n        usePlayerUiStore().updateIsHovering(true);\n        await callback;\n        showControl();\n      } catch (e) {\n        logger(e.toString());\n      }\n    }\n\n    void showProgress() {\n      usePlayerUiStore().updateIsShowProgress(true);\n      resetBottomProgressTimer();\n    }\n\n    final onKeyEvent = useKeyboard(\n      showControl: showControl,\n      showControlForHover: showControlForHover,\n      showProgress: showProgress,\n    );\n\n    useEffect(() {\n      startControlHideTimer();\n      return () => controlHideTimer.value?.cancel();\n    }, []);\n\n    useEffect(() {\n      return () => progressHideTimer.value?.cancel();\n    }, []);\n\n    useEffect(() {\n      if (isDesktop) {\n        windowManager.setTitle(title);\n      }\n      return;\n    }, [title]);\n\n    final Size windowSize = useMemoized(\n        () => MediaQuery.sizeOf(context), [MediaQuery.sizeOf(context)]);\n\n    final scaleFactor = useMemoized(\n      () => View.of(context).physicalSize.width / windowSize.width,\n      [View.of(context).physicalSize.width],\n    );\n\n    final videoViewSize = useMemoized(() {\n      if (fit != BoxFit.none || width == 0 || height == 0) {\n        return windowSize;\n      } else {\n        return Size(width / scaleFactor, height / scaleFactor);\n      }\n    }, [fit, windowSize, width, height, scaleFactor]);\n\n    final videoViewOffset = useMemoized(\n        () => fit == BoxFit.none\n            ? Offset(\n                (windowSize.width - videoViewSize.width) / 2,\n                (windowSize.height - videoViewSize.height) / 2,\n              )\n            : Offset(0, 0),\n        [fit, windowSize, videoViewSize]);\n\n    return DropTarget(\n      onDragDone: (details) async {\n        final files = details.files\n            .map((file) => checkContentType(file.path) == ContentType.video ||\n                    checkContentType(file.path) == ContentType.audio\n                ? file.path\n                : null)\n            .where((element) => element != null)\n            .toList() as List<String>;\n        if (files.isNotEmpty) {\n          final firstFile = files[0];\n          if (firstFile.isEmpty) return;\n          final playQueue = await getLocalPlayQueue(firstFile);\n          if (playQueue == null || playQueue.playQueue.isEmpty) return;\n          final List<PlayQueueItem> filteredPlayQueue = [];\n          for (final item in playQueue.playQueue) {\n            final file = item.file;\n            if (files.contains(file.uri)) {\n              filteredPlayQueue.add(item);\n            }\n          }\n          if (filteredPlayQueue.isEmpty) return;\n          useAppStore().updateAutoPlay(true);\n          usePlayQueueStore().update(\n              playQueue: filteredPlayQueue, index: playQueue.currentIndex);\n        }\n      },\n      child: PopScope(\n        canPop: false,\n        onPopInvokedWithResult: (bool didPop, Object? result) async {\n          if (!didPop) {\n            await context.read<MediaPlayer>().saveProgress();\n            if (isDesktop) {\n              windowManager.close();\n            } else {\n              SystemNavigator.pop();\n              exit(0);\n            }\n          }\n        },\n        child: KeyboardListener(\n          focusNode: focusNode,\n          onKeyEvent: onKeyEvent,\n          child: Stack(\n            children: [\n              // Video\n              Positioned(\n                left: videoViewOffset.dx,\n                top: videoViewOffset.dy,\n                width: videoViewSize.width,\n                height: videoViewSize.height,\n                child: VideoView(\n                  key: ValueKey(file?.uri),\n                  fit: fit,\n                ),\n              ),\n              Positioned.fill(\n                child: MinimalProgressOverlay(\n                  title: title,\n                  file: file,\n                ),\n              ),\n              // Audio\n              if (file?.type == ContentType.audio)\n                Positioned.fill(\n                  child: Audio(cover: cover),\n                ),\n              Positioned.fill(\n                child: GestureOverlay(\n                  showControl: showControl,\n                  hideControl: hideControl,\n                  showProgress: showProgress,\n                ),\n              ),\n              Positioned.fill(\n                child: ControlsOverlay(\n                  file: file,\n                  title: title,\n                  showControl: showControl,\n                  showControlForHover: showControlForHover,\n                  hideControl: hideControl,\n                  showProgress: showProgress,\n                ),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/player/player_view.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:iris/hooks/player/use_fvp_player.dart';\nimport 'package:iris/hooks/player/use_media_kit_player.dart';\nimport 'package:iris/models/player.dart';\nimport 'package:iris/models/store/app_state.dart';\nimport 'package:iris/pages/player/player.dart';\nimport 'package:provider/provider.dart';\n\nclass PlayerView extends HookWidget {\n  const PlayerView({super.key, required this.playerBackend});\n\n  final PlayerBackend playerBackend;\n\n  @override\n  Widget build(BuildContext context) {\n    switch (playerBackend) {\n      case PlayerBackend.mediaKit:\n        return const _MediaKitPlayerHost();\n      case PlayerBackend.fvp:\n        return const _FvpPlayerHost();\n    }\n  }\n}\n\nclass _MediaKitPlayerHost extends HookWidget {\n  const _MediaKitPlayerHost();\n\n  @override\n  Widget build(BuildContext context) {\n    final player = useMediaKitPlayer(context);\n    return Provider<MediaPlayer>.value(\n      value: player,\n      child: const Player(key: ValueKey('media_kit_player')),\n    );\n  }\n}\n\nclass _FvpPlayerHost extends HookWidget {\n  const _FvpPlayerHost();\n\n  @override\n  Widget build(BuildContext context) {\n    final player = useFvpPlayer(context);\n    return Provider<MediaPlayer>.value(\n      value: player,\n      child: const Player(key: ValueKey('fvp_player')),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/player/title_bar.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:flutter_zustand/flutter_zustand.dart';\nimport 'package:iris/info.dart';\nimport 'package:iris/store/use_player_ui_store.dart';\nimport 'package:iris/utils/get_localizations.dart';\nimport 'package:iris/utils/platform.dart';\nimport 'package:window_manager/window_manager.dart';\n\nclass TitleBar extends HookWidget {\n  const TitleBar({\n    super.key,\n    this.title,\n    this.actions,\n    this.color,\n    this.overlayColor,\n    this.saveProgress,\n  });\n\n  final String? title;\n  final List<Widget>? actions;\n  final Color? color;\n  final WidgetStateProperty<Color?>? overlayColor;\n  final Future<void> Function()? saveProgress;\n\n  @override\n  Widget build(BuildContext context) {\n    final t = getLocalizations(context);\n    final isAlwaysOnTop =\n        usePlayerUiStore().select(context, (state) => state.isAlwaysOnTop);\n    final isFullScreen =\n        usePlayerUiStore().select(context, (state) => state.isFullScreen);\n\n    return Container(\n      padding: isDesktop\n          ? const EdgeInsets.fromLTRB(12, 4, 4, 8)\n          : const EdgeInsets.fromLTRB(16, 8, 8, 8),\n      decoration: BoxDecoration(\n        gradient: LinearGradient(\n          begin: Alignment.topCenter,\n          end: Alignment.bottomCenter,\n          colors: [\n            Colors.black87.withValues(alpha: 0.6),\n            Colors.black87.withValues(alpha: 0.25),\n            Colors.black87.withValues(alpha: 0),\n          ],\n        ),\n      ),\n      child: ExcludeFocus(\n        child: Row(\n          crossAxisAlignment: CrossAxisAlignment.center,\n          children: [\n            Image.asset(\n              'assets/images/logo_transparent.png',\n              width: 32,\n              height: 32,\n            ),\n            const SizedBox(width: 8),\n            Expanded(\n              child: Text(\n                title!.isEmpty ? INFO.title : title!,\n                maxLines: 1,\n                textAlign: TextAlign.start,\n                style: TextStyle(\n                  fontSize: 16,\n                  overflow: TextOverflow.ellipsis,\n                  color: color,\n                ),\n              ),\n            ),\n            Row(\n              children: [\n                ...actions ?? [],\n                if (isDesktop) ...[\n                  FutureBuilder<bool>(\n                    future: () async {\n                      final isMaximized =\n                          isDesktop && await windowManager.isMaximized();\n\n                      return isMaximized;\n                    }(),\n                    builder: (\n                      BuildContext context,\n                      AsyncSnapshot<bool> snapshot,\n                    ) {\n                      final isMaximized = snapshot.data ?? false;\n\n                      return Row(\n                        children: [\n                          Visibility(\n                            visible: !isFullScreen,\n                            child: IconButton(\n                              tooltip: isAlwaysOnTop\n                                  ? '${t.always_on_top_on} ( F10 )'\n                                  : '${t.always_on_top_off} ( F10 )',\n                              icon: Icon(\n                                isAlwaysOnTop\n                                    ? Icons.push_pin_rounded\n                                    : Icons.push_pin_outlined,\n                                size: 18,\n                                color: color,\n                              ),\n                              onPressed: usePlayerUiStore().toggleIsAlwaysOnTop,\n                              style: ButtonStyle(overlayColor: overlayColor),\n                            ),\n                          ),\n                          Visibility(\n                            visible: isFullScreen,\n                            child: IconButton(\n                              tooltip: isFullScreen\n                                  ? '${t.exit_fullscreen} ( Escape, F11, Enter )'\n                                  : '${t.enter_fullscreen} ( F11, Enter )',\n                              icon: Icon(\n                                isFullScreen\n                                    ? Icons.close_fullscreen_rounded\n                                    : Icons.open_in_full_rounded,\n                                size: 18,\n                                color: color,\n                              ),\n                              onPressed: () async {\n                                usePlayerUiStore()\n                                    .updateFullScreen(!isFullScreen);\n                              },\n                              style: ButtonStyle(overlayColor: overlayColor),\n                            ),\n                          ),\n                          Visibility(\n                            visible: !isFullScreen,\n                            child: IconButton(\n                              onPressed: () => windowManager.minimize(),\n                              icon: Icon(\n                                Icons.remove_rounded,\n                                color: color,\n                              ),\n                              style: ButtonStyle(overlayColor: overlayColor),\n                            ),\n                          ),\n                          Visibility(\n                            visible: !isFullScreen,\n                            child: IconButton(\n                              onPressed: () async {\n                                if (isMaximized) {\n                                  await windowManager.unmaximize();\n                                } else {\n                                  await windowManager.maximize();\n                                }\n                              },\n                              icon: isMaximized\n                                  ? RotatedBox(\n                                      quarterTurns: 2,\n                                      child: Icon(\n                                        Icons.filter_none_rounded,\n                                        size: 18,\n                                        color: color,\n                                      ),\n                                    )\n                                  : Icon(\n                                      Icons.crop_din_rounded,\n                                      size: 20,\n                                      color: color,\n                                    ),\n                              style: ButtonStyle(overlayColor: overlayColor),\n                            ),\n                          ),\n                        ],\n                      );\n                    },\n                  ),\n                  IconButton(\n                    onPressed: () async {\n                      await saveProgress?.call();\n                      windowManager.close();\n                    },\n                    icon: Icon(\n                      Icons.close_rounded,\n                      color: color,\n                    ),\n                    style: ButtonStyle(\n                      overlayColor: WidgetStateProperty.resolveWith<Color?>(\n                          (Set<WidgetState> states) {\n                        if (states.contains(WidgetState.pressed)) {\n                          return Colors.red.withValues(alpha: 0.4);\n                        } else if (states.contains(WidgetState.hovered)) {\n                          return Colors.red.withValues(alpha: 0.5);\n                        }\n                        return null;\n                      }),\n                    ),\n                  ),\n                ],\n              ],\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/player/video_view.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:iris/models/player.dart';\nimport 'package:media_kit_video/media_kit_video.dart';\nimport 'package:provider/provider.dart';\nimport 'package:video_player/video_player.dart';\n\nclass VideoView extends HookWidget {\n  const VideoView({\n    super.key,\n    required this.fit,\n  });\n\n  final BoxFit fit;\n\n  @override\n  Widget build(BuildContext context) {\n    final player = context.read<MediaPlayer>();\n\n    return switch (player) {\n      MediaKitPlayer player => Video(\n          controller: player.controller,\n          controls: NoVideoControls,\n          fit: fit == BoxFit.none ? BoxFit.contain : fit,\n        ),\n      FvpPlayer player => FittedBox(\n          fit: fit,\n          child: SizedBox(\n            width: player.width,\n            height: player.height,\n            child: VideoPlayer(player.controller),\n          ),\n        ),\n      _ => Container(),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/store/persistent_store.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_zustand/flutter_zustand.dart';\n\nabstract class PersistentStore<T> extends Store<T> {\n  PersistentStore(super.initialState) {\n    _init();\n  }\n\n  Future<void> _init() async {\n    final loaded = await load();\n    if (loaded != null) {\n      set(loaded);\n    }\n  }\n\n  Future<T?> load();\n\n  Future<void> save(T state);\n\n  @override\n  @mustCallSuper\n  Future<void> dispose() async {\n    await save(state);\n    await super.dispose();\n  }\n}\n"
  },
  {
    "path": "lib/store/use_app_store.dart",
    "content": "import 'dart:convert';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_secure_storage/flutter_secure_storage.dart';\nimport 'package:flutter_zustand/flutter_zustand.dart';\nimport 'package:iris/models/store/app_state.dart';\nimport 'package:iris/store/persistent_store.dart';\nimport 'package:iris/utils/logger.dart';\n\nclass AppStore extends PersistentStore<AppState> {\n  AppStore() : super(AppState());\n\n  Future<void> updateAutoPlay(bool autoPlay) async =>\n      set(state.copyWith(autoPlay: autoPlay));\n\n  Future<void> updateShuffle(bool shuffle) async {\n    set(state.copyWith(shuffle: shuffle));\n    await save(state);\n  }\n\n  Future<void> updateRepeat(Repeat repeat) async {\n    set(state.copyWith(repeat: repeat));\n    await save(state);\n  }\n\n  Future<void> toggleRepeat() async {\n    switch (state.repeat) {\n      case Repeat.none:\n        set(state.copyWith(repeat: Repeat.one));\n        break;\n      case Repeat.one:\n        set(state.copyWith(repeat: Repeat.all));\n        break;\n      case Repeat.all:\n        set(state.copyWith(repeat: Repeat.none));\n        break;\n    }\n    await save(state);\n  }\n\n  Future<void> updateFit(BoxFit fit) async {\n    set(state.copyWith(fit: fit));\n    await save(state);\n  }\n\n  Future<void> toggleFit() async {\n    switch (state.fit) {\n      case BoxFit.contain:\n        set(state.copyWith(fit: BoxFit.fill));\n        break;\n      case BoxFit.fill:\n        set(state.copyWith(fit: BoxFit.cover));\n        break;\n      case BoxFit.cover:\n        set(state.copyWith(fit: BoxFit.none));\n        break;\n      case BoxFit.none:\n        set(state.copyWith(fit: BoxFit.contain));\n        break;\n      default:\n        break;\n    }\n    await save(state);\n  }\n\n  Future<void> updateRate(double value) async {\n    logger('updateRate: $value');\n    set(state.copyWith(rate: value));\n    await save(state);\n  }\n\n  Future<void> updateVolume(int volume) async {\n    set(state.copyWith(\n        volume: volume < 0\n            ? 0\n            : volume > 100\n                ? 100\n                : volume));\n    await save(state);\n  }\n\n  Future<void> updateMute(bool isMuted) async {\n    set(state.copyWith(isMuted: isMuted));\n    await save(state);\n  }\n\n  Future<void> toggleMute() async {\n    set(state.copyWith(isMuted: !state.isMuted));\n    save(state);\n  }\n\n  Future<void> updateThemeMode(ThemeMode themeMode) async {\n    set(state.copyWith(themeMode: themeMode));\n    await save(state);\n  }\n\n  Future<void> updateLanguage(String language) async {\n    set(state.copyWith(language: language));\n    await save(state);\n  }\n\n  Future<void> toggleAutoResize() async {\n    set(state.copyWith(autoResize: !state.autoResize));\n    await save(state);\n  }\n\n  Future<void> toggleAlwaysPlayFromBeginning() async {\n    set(state.copyWith(\n        alwaysPlayFromBeginning: !state.alwaysPlayFromBeginning));\n    await save(state);\n  }\n\n  Future<void> updatePlayerBackend(PlayerBackend backend) async {\n    set(state.copyWith(playerBackend: backend));\n    await save(state);\n  }\n\n  Future<void> updateSortBy(SortBy sortBy) async {\n    set(state.copyWith(sortBy: sortBy));\n    await save(state);\n  }\n\n  Future<void> updateSortOrder(SortOrder sortOrder) async {\n    set(state.copyWith(sortOrder: sortOrder));\n    await save(state);\n  }\n\n  Future<void> updateFolderFirst(bool folderFirst) async {\n    set(state.copyWith(folderFirst: folderFirst));\n    await save(state);\n  }\n\n  Future<void> updateOrientation(ScreenOrientation orientation) async {\n    set(state.copyWith(orientation: orientation));\n    await save(state);\n  }\n\n  @override\n  Future<AppState?> load() async {\n    logger('Loading AppState');\n    try {\n      AndroidOptions getAndroidOptions() => const AndroidOptions(\n            encryptedSharedPreferences: true,\n          );\n      final storage = FlutterSecureStorage(aOptions: getAndroidOptions());\n\n      String? appState = await storage.read(key: 'app_state');\n\n      if (appState != null) {\n        return AppState.fromJson(json.decode(appState)).copyWith(\n          autoPlay: false,\n        );\n      }\n    } catch (e) {\n      logger('Error loading AppState: $e');\n    }\n    return null;\n  }\n\n  @override\n  Future<void> save(AppState state) async {\n    try {\n      AndroidOptions getAndroidOptions() => const AndroidOptions(\n            encryptedSharedPreferences: true,\n          );\n      final storage = FlutterSecureStorage(aOptions: getAndroidOptions());\n\n      await storage.write(key: 'app_state', value: json.encode(state.toJson()));\n    } catch (e) {\n      logger('Error saving AppState: $e');\n    }\n  }\n}\n\nAppStore useAppStore() => create(() => AppStore());\n"
  },
  {
    "path": "lib/store/use_history_store.dart",
    "content": "import 'dart:convert';\nimport 'package:flutter_secure_storage/flutter_secure_storage.dart';\nimport 'package:flutter_zustand/flutter_zustand.dart';\nimport 'package:iris/models/progress.dart';\nimport 'package:iris/models/store/history_state.dart';\nimport 'package:iris/store/persistent_store.dart';\nimport 'package:iris/utils/logger.dart';\n\nclass HistoryStore extends PersistentStore<HistoryState> {\n  HistoryStore() : super(HistoryState());\n\n  Progress? findById(String id) => state.history[id];\n\n  Future<void> add(Progress progress) async {\n    set(state.copyWith(\n      history: {\n        ...state.history,\n        progress.file.getID(): progress,\n      },\n    ));\n    await save(state);\n  }\n\n  Future<void> remove(Progress progress) async {\n    set(state.copyWith(\n        history: {...state.history}..remove(progress.file.getID())));\n    await save(state);\n  }\n\n  Future<void> clear() async {\n    set(state.copyWith(history: {}));\n    await save(state);\n  }\n\n  @override\n  Future<HistoryState?> load() async {\n    logger('Loading HistoryState');\n    try {\n      AndroidOptions getAndroidOptions() => const AndroidOptions(\n            encryptedSharedPreferences: true,\n          );\n      final storage = FlutterSecureStorage(aOptions: getAndroidOptions());\n\n      String? historyState = await storage.read(key: 'history_state');\n      if (historyState != null) {\n        return HistoryState.fromJson(json.decode(historyState));\n      }\n    } catch (e) {\n      logger('Error loading HistoryState: $e');\n    }\n    return null;\n  }\n\n  @override\n  Future<void> save(HistoryState state) async {\n    try {\n      AndroidOptions getAndroidOptions() => const AndroidOptions(\n            encryptedSharedPreferences: true,\n          );\n      final storage = FlutterSecureStorage(aOptions: getAndroidOptions());\n\n      await storage.write(\n          key: 'history_state', value: json.encode(state.toJson()));\n    } catch (e) {\n      logger('Error saving HistoryState: $e');\n    }\n  }\n}\n\nHistoryStore useHistoryStore() => create(() => HistoryStore());\n"
  },
  {
    "path": "lib/store/use_play_queue_store.dart",
    "content": "import 'dart:convert';\nimport 'dart:io';\nimport 'dart:math';\nimport 'package:flutter_secure_storage/flutter_secure_storage.dart';\nimport 'package:flutter_zustand/flutter_zustand.dart';\nimport 'package:iris/models/file.dart';\nimport 'package:iris/models/storages/local.dart';\nimport 'package:iris/models/store/play_queue_state.dart';\nimport 'package:iris/store/persistent_store.dart';\nimport 'package:iris/globals.dart' as globals;\nimport 'package:iris/store/use_app_store.dart';\nimport 'package:iris/utils/check_content_type.dart';\nimport 'package:iris/utils/get_shuffle_play_queue.dart';\nimport 'package:iris/utils/logger.dart';\nimport 'package:iris/utils/platform.dart';\nimport 'package:saf_util/saf_util.dart';\n\nclass PlayQueueStore extends PersistentStore<PlayQueueState> {\n  PlayQueueStore() : super(PlayQueueState());\n\n  Future<void> update({\n    required List<PlayQueueItem> playQueue,\n    int? index,\n  }) async {\n    set(state.copyWith(\n      playQueue: playQueue,\n      currentIndex: index ?? state.currentIndex,\n    ));\n    if (Platform.isAndroid &&\n        state.playQueue.any((e) => e.file.uri.startsWith('content://'))) {\n      return;\n    }\n    await save(state);\n  }\n\n  Future<void> updateCurrentIndex(int index) async {\n    set(state.copyWith(currentIndex: index));\n    if (Platform.isAndroid &&\n        state.playQueue.any((e) =>\n            globals.initUri == e.file.uri &&\n            e.file.uri.startsWith('content://'))) {\n      return;\n    }\n    await save(state);\n  }\n\n  Future<void> add(List<FileItem> files) async {\n    final int maxIndex = state.playQueue.isEmpty\n        ? -1\n        : state.playQueue.map((e) => e.index).reduce(max);\n    final int startIndex = maxIndex + 1;\n\n    final List<PlayQueueItem> playQueue = files\n        .asMap()\n        .entries\n        .map((entry) =>\n            PlayQueueItem(file: entry.value, index: startIndex + entry.key))\n        .toList();\n\n    set(state.copyWith(playQueue: [...state.playQueue, ...playQueue]));\n    if (Platform.isAndroid &&\n        state.playQueue.any((e) =>\n            globals.initUri == e.file.uri &&\n            e.file.uri.startsWith('content://'))) {\n      return;\n    }\n    await save(state);\n  }\n\n  Future<void> remove(PlayQueueItem item) async {\n    if (state.playQueue.length <= 1) {\n      set(state.copyWith(playQueue: [], currentIndex: 0));\n    } else {\n      final index = state.playQueue.indexOf(item);\n      if (state.playQueue[index].index == state.currentIndex) {\n        if (index + 1 < state.playQueue.length) {\n          set(state.copyWith(\n            playQueue: [...state.playQueue]..remove(item),\n            currentIndex: state.playQueue[index + 1].index,\n          ));\n        } else {\n          set(state.copyWith(\n            playQueue: [...state.playQueue]..remove(item),\n            currentIndex: state.playQueue[index - 1].index,\n          ));\n        }\n      } else {\n        set(state.copyWith(\n          playQueue: [...state.playQueue]..remove(item),\n        ));\n      }\n    }\n    if (Platform.isAndroid &&\n        state.playQueue.any((e) => e.file.uri.startsWith('content://'))) {\n      return;\n    }\n    await save(state);\n  }\n\n  Future<void> previous() async {\n    final int currentPlayIndex = state.playQueue\n        .indexWhere((element) => element.index == state.currentIndex);\n    if (currentPlayIndex <= 0) {\n      await updateCurrentIndex(state.playQueue.last.index);\n    } else {\n      await updateCurrentIndex(state.playQueue[currentPlayIndex - 1].index);\n    }\n  }\n\n  Future<void> next() async {\n    final int currentPlayIndex = state.playQueue\n        .indexWhere((element) => element.index == state.currentIndex);\n    if (currentPlayIndex >= state.playQueue.length - 1) {\n      await updateCurrentIndex(state.playQueue.first.index);\n    } else {\n      await updateCurrentIndex(state.playQueue[currentPlayIndex + 1].index);\n    }\n  }\n\n  Future<void> shuffle() async => update(\n        playQueue: getShufflePlayQueue(state.playQueue, state.currentIndex),\n        index: state.currentIndex,\n      );\n\n  Future<void> sort() async => update(\n        playQueue: [...state.playQueue]\n          ..sort((a, b) => a.index.compareTo(b.index)),\n        index: state.currentIndex,\n      );\n\n  @override\n  Future<PlayQueueState?> load() async {\n    logger('Loading PlayQueueState');\n    try {\n      if (isDesktop && globals.arguments.isNotEmpty) {\n        String uri = globals.arguments[0];\n        // 在线播放\n        if (RegExp(r'^(http://|https://)').hasMatch(uri)) {\n          final state = PlayQueueState(\n            playQueue: [\n              PlayQueueItem(\n                file: FileItem(\n                  name: uri,\n                  uri: uri,\n                ),\n                index: 0,\n              )\n            ],\n            currentIndex: 0,\n          );\n          await useAppStore().updateAutoPlay(true);\n          save(state);\n          return state;\n        }\n\n        // 本地播放\n        final filePath = uri;\n        if (isMediaFile(filePath)) {\n          final state = await getLocalPlayQueue(filePath);\n          if (state != null && state.playQueue.isNotEmpty) {\n            await useAppStore().updateAutoPlay(true);\n            save(state);\n            return state;\n          }\n        }\n      }\n\n      final uri = globals.initUri;\n\n      // Android\n      if (uri != null && Platform.isAndroid) {\n        final file = await SafUtil().documentFileFromUri(uri, false);\n        if (file != null) {\n          await useAppStore().updateAutoPlay(true);\n          return PlayQueueState(\n            playQueue: [\n              PlayQueueItem(\n                file: FileItem(\n                  name: file.name,\n                  uri: file.uri,\n                  size: file.length,\n                ),\n                index: 0,\n              ),\n            ],\n            currentIndex: 0,\n          );\n        }\n      }\n\n      AndroidOptions getAndroidOptions() => const AndroidOptions(\n            encryptedSharedPreferences: true,\n          );\n      final storage = FlutterSecureStorage(aOptions: getAndroidOptions());\n\n      String? appState = await storage.read(key: 'playQueue_state');\n      if (appState != null) {\n        return PlayQueueState.fromJson(json.decode(appState));\n      }\n    } catch (e) {\n      logger('Error loading PlayQueueState: $e');\n    }\n    return null;\n  }\n\n  @override\n  Future<void> save(PlayQueueState state) async {\n    try {\n      AndroidOptions getAndroidOptions() => const AndroidOptions(\n            encryptedSharedPreferences: true,\n          );\n      final storage = FlutterSecureStorage(aOptions: getAndroidOptions());\n\n      await storage.write(\n          key: 'playQueue_state', value: json.encode(state.toJson()));\n    } catch (e) {\n      logger('Error saving PlayQueueState: $e');\n    }\n  }\n}\n\nPlayQueueStore usePlayQueueStore() => create(() => PlayQueueStore());\n"
  },
  {
    "path": "lib/store/use_player_ui_store.dart",
    "content": "import 'package:flutter_zustand/flutter_zustand.dart';\nimport 'package:iris/models/store/player_ui_state.dart';\nimport 'package:iris/utils/platform.dart';\nimport 'package:window_manager/window_manager.dart';\n\nclass PlayerUiStore extends Store<PlayerUiState> {\n  PlayerUiStore() : super(const PlayerUiState());\n\n  void updateAspectRatio(double ratio) {\n    set(state.copyWith(aspectRatio: ratio));\n  }\n\n  Future<void> toggleIsAlwaysOnTop() async {\n    if (isDesktop) {\n      windowManager.setAlwaysOnTop(!state.isAlwaysOnTop);\n      set(state.copyWith(isAlwaysOnTop: !state.isAlwaysOnTop));\n    }\n  }\n\n  Future<void> updateFullScreen(bool bool) async {\n    if (isDesktop) {\n      windowManager.setFullScreen(!state.isFullScreen);\n      set(state.copyWith(isFullScreen: !state.isFullScreen));\n    }\n  }\n\n  void updateIsSeeking(bool bool) {\n    set(state.copyWith(isSeeking: bool));\n  }\n\n  void updateIsHovering(bool bool) {\n    set(state.copyWith(isHovering: bool));\n  }\n\n  void updateIsShowControl(bool bool) {\n    set(state.copyWith(isShowControl: bool));\n  }\n\n  void updateIsShowProgress(bool bool) {\n    set(state.copyWith(isShowProgress: bool));\n  }\n}\n\nPlayerUiStore usePlayerUiStore() => create(() => PlayerUiStore());\n"
  },
  {
    "path": "lib/store/use_storage_store.dart",
    "content": "import 'dart:convert';\nimport 'package:collection/collection.dart';\nimport 'package:flutter_secure_storage/flutter_secure_storage.dart';\nimport 'package:flutter_zustand/flutter_zustand.dart';\nimport 'package:iris/models/storages/storage.dart';\nimport 'package:iris/models/store/storage_state.dart';\nimport 'package:iris/store/persistent_store.dart';\nimport 'package:iris/utils/logger.dart';\n\nclass StorageStore extends PersistentStore<StorageState> {\n  StorageStore() : super(StorageState());\n\n  Storage? findById(String id) =>\n      state.storages.firstWhereOrNull((storage) => storage.id == id);\n\n  Future<void> addStorage(Storage storage) async {\n    set(state.copyWith(storages: [...state.storages, storage]));\n    await save(state);\n  }\n\n  Future<void> updateStorage(int index, Storage storage) async {\n    if (index < 0 || index >= state.storages.length) {\n      return;\n    }\n\n    set(state.copyWith(\n        storages: [...state.storages]\n          ..removeAt(index)\n          ..insert(index, storage)));\n    await save(state);\n  }\n\n  Future<void> removeStorage(Storage storage) async {\n    set(state.copyWith(storages: [...state.storages]..remove(storage)));\n    await save(state);\n  }\n\n  Future<void> addFavorite(Favorite favorite) async {\n    set(state.copyWith(favorites: [...state.favorites, favorite]));\n    await save(state);\n  }\n\n  Future<void> removeFavorite(Favorite favorite) async {\n    set(state.copyWith(favorites: [...state.favorites]..remove(favorite)));\n    await save(state);\n  }\n\n  Future<void> updateCurrentStorage(Storage? storage) async {\n    set(state.copyWith(currentStorage: storage));\n    await save(state);\n  }\n\n  Future<void> updateCurrentPath(List<String> path) async {\n    set(state.copyWith(currentPath: path));\n    await save(state);\n  }\n\n  @override\n  Future<StorageState?> load() async {\n    logger('Loading StorageState');\n    try {\n      AndroidOptions getAndroidOptions() => const AndroidOptions(\n            encryptedSharedPreferences: true,\n          );\n      final storage = FlutterSecureStorage(aOptions: getAndroidOptions());\n\n      String? storageState = await storage.read(key: 'storage_state');\n      if (storageState != null) {\n        return StorageState.fromJson(json.decode(storageState));\n      }\n    } catch (e) {\n      logger('Error loading StorageState: $e');\n    }\n    return null;\n  }\n\n  @override\n  Future<void> save(StorageState state) async {\n    try {\n      AndroidOptions getAndroidOptions() => const AndroidOptions(\n            encryptedSharedPreferences: true,\n          );\n      final storage = FlutterSecureStorage(aOptions: getAndroidOptions());\n\n      await storage.write(\n          key: 'storage_state', value: json.encode(state.toJson()));\n    } catch (e) {\n      logger('Error saving StorageState: $e');\n    }\n  }\n}\n\nStorageStore useStorageStore() => create(() => StorageStore());\n"
  },
  {
    "path": "lib/theme.dart",
    "content": "import 'package:dynamic_color/dynamic_color.dart';\nimport 'package:flutter/material.dart';\nimport 'package:google_fonts/google_fonts.dart';\n\nThemeData baseTheme(BuildContext context) {\n  return ThemeData(\n    popupMenuTheme: PopupMenuThemeData(\n      menuPadding: const EdgeInsets.all(0),\n      shape: RoundedRectangleBorder(\n        borderRadius: BorderRadius.circular(16),\n      ),\n      shadowColor: null,\n      elevation: 0,\n    ),\n    listTileTheme: ListTileThemeData(\n      shape: RoundedRectangleBorder(\n        borderRadius: BorderRadius.circular(12),\n      ),\n    ),\n  );\n}\n\nColorScheme customColorScheme =\n    ColorScheme.fromSeed(seedColor: const Color(0xFFB3BCDF));\nColorScheme customDarkColorScheme = ColorScheme.fromSeed(\n    seedColor: const Color(0xFFB3BCDF), brightness: Brightness.dark);\n\nclass CustomTheme {\n  final ThemeData light;\n  final ThemeData dark;\n\n  CustomTheme({required this.light, required this.dark});\n}\n\nCustomTheme getTheme({\n  required BuildContext context,\n  required ColorScheme? lightDynamic,\n  required ColorScheme? darkDynamic,\n}) {\n  ColorScheme colorScheme =\n      lightDynamic != null ? lightDynamic.harmonized() : customColorScheme;\n  ColorScheme darkColorScheme =\n      darkDynamic != null ? darkDynamic.harmonized() : customDarkColorScheme;\n\n  final base = baseTheme(context);\n\n  final lightTheme = ThemeData(\n    colorScheme: colorScheme,\n    useMaterial3: true,\n    textTheme: GoogleFonts.notoSansScTextTheme(),\n    popupMenuTheme: base.popupMenuTheme,\n    dropdownMenuTheme: base.dropdownMenuTheme,\n    listTileTheme: base.listTileTheme,\n  );\n\n  final darkTheme = ThemeData.dark(useMaterial3: true).copyWith(\n    colorScheme: darkColorScheme,\n    textTheme: GoogleFonts.notoSansScTextTheme(\n      ThemeData.dark(useMaterial3: true)\n          .copyWith(colorScheme: darkColorScheme)\n          .textTheme,\n    ),\n    popupMenuTheme: base.popupMenuTheme,\n    dropdownMenuTheme: base.dropdownMenuTheme,\n    listTileTheme: base.listTileTheme,\n  );\n\n  return CustomTheme(light: lightTheme, dark: darkTheme);\n}\n"
  },
  {
    "path": "lib/utils/check_content_type.dart",
    "content": "import 'package:iris/models/file.dart';\n\nclass Formats {\n  static const List<String> audio = [\n    'aac',\n    'aiff',\n    'alac',\n    'amr',\n    'ape',\n    'caf',\n    'cda',\n    'dsd',\n    'dts',\n    'flac',\n    'm4a',\n    'midi',\n    'mp3',\n    'mpc',\n    'oga',\n    'ogg',\n    'opus',\n    'raw',\n    'spx',\n    'tak',\n    'tta',\n    'wav',\n    'wma',\n    'wv',\n  ];\n\n  static const List<String> video = [\n    '3gp',\n    'amv',\n    'asf',\n    'avi',\n    'divx',\n    'dpx',\n    'drc',\n    'dv',\n    'f4v',\n    'flv',\n    'h264',\n    'h265',\n    'hevc',\n    'm2ts',\n    'm4p',\n    'm4v',\n    'mkv',\n    'mng',\n    'mov',\n    'mp2',\n    'mp4',\n    'mpe',\n    'mpeg',\n    'mpg',\n    'mpv',\n    'mts',\n    'mxf',\n    'nsv',\n    'ogv',\n    'qt',\n    'rm',\n    'rmvb',\n    'ts',\n    'vob',\n    'webm',\n    'wmv',\n    'yuv',\n  ];\n\n  static const List<String> image = [\n    'avif',\n    'bmp',\n    'exif',\n    'gif',\n    'heif',\n    'ico',\n    'jpeg',\n    'jpg',\n    'pbm',\n    'pgm',\n    'png',\n    'ppm',\n    'raw',\n    'svg',\n    'tiff',\n    'webp',\n  ];\n}\n\nContentType checkContentType(String name) {\n  final fileTypeMap = {\n    ContentType.audio: Formats.audio,\n    ContentType.video: Formats.video,\n    ContentType.image: Formats.image,\n  };\n\n  for (var entry in fileTypeMap.entries) {\n    if (entry.value.any((format) => name.toLowerCase().endsWith('.$format'))) {\n      return entry.key;\n    }\n  }\n\n  return ContentType.other;\n}\n\nbool isMediaFile(String name) =>\n    checkContentType(name) == ContentType.video ||\n    checkContentType(name) == ContentType.audio;\n\nbool isVideoFile(String name) => checkContentType(name) == ContentType.video;\nbool isAudioFile(String name) => checkContentType(name) == ContentType.audio;\nbool isImageFile(String name) => checkContentType(name) == ContentType.image;\n"
  },
  {
    "path": "lib/utils/check_data_source_type.dart",
    "content": "import 'dart:io';\nimport 'package:iris/models/file.dart';\nimport 'package:iris/models/storages/storage.dart';\nimport 'package:video_player/video_player.dart';\n\nDataSourceType checkDataSourceType(FileItem file) {\n  if (Platform.isAndroid && file.uri.startsWith('content://')) {\n    return DataSourceType.contentUri;\n  }\n\n  switch (file.storageType) {\n    case StorageType.internal:\n    case StorageType.network:\n    case StorageType.sdcard:\n    case StorageType.usb:\n      return DataSourceType.file;\n    case StorageType.webdav:\n    case StorageType.ftp:\n    case StorageType.none:\n      return DataSourceType.network;\n  }\n}\n"
  },
  {
    "path": "lib/utils/data_migration.dart",
    "content": "import 'dart:io';\nimport 'package:iris/utils/logger.dart';\nimport 'package:path_provider/path_provider.dart';\nimport 'package:path/path.dart' as p;\n\nFuture<bool> dataMigration() async {\n  try {\n    if (Platform.isWindows) {\n      final String newDataPath = (await getApplicationSupportDirectory()).path;\n      final String oldDataPath =\n          p.normalize('$newDataPath/../../nini22p.iris/iris');\n      logger('newDataPath: $newDataPath');\n      logger('oldDataPath: $oldDataPath');\n      final bool newDataExist =\n          await File('$newDataPath/flutter_secure_storage.dat').exists();\n      final bool oldDataExist =\n          await File('$oldDataPath/flutter_secure_storage.dat').exists();\n      if (!newDataExist && oldDataExist) {\n        logger('Find old data in $oldDataPath');\n        final Directory oldDir = Directory(oldDataPath);\n        final Directory newDir = Directory(newDataPath);\n\n        if (await oldDir.exists()) {\n          if (!await newDir.exists()) {\n            await newDir.create(recursive: true);\n          }\n\n          await for (var entity in oldDir.list()) {\n            if (entity is File) {\n              final String newFilePath =\n                  p.join(newDir.path, p.basename(entity.path));\n              await entity.copy(newFilePath);\n              logger('Copied ${entity.path} to $newFilePath');\n            }\n          }\n          logger('Data migration completed');\n          return true;\n        }\n      }\n    }\n  } catch (e) {\n    return false;\n  }\n\n  return false;\n}\n"
  },
  {
    "path": "lib/utils/file_size_convert.dart",
    "content": "String fileSizeConvert(int fileSize) =>\n    (fileSize / 1024 / 1024).toStringAsFixed(2);\n"
  },
  {
    "path": "lib/utils/files_sort.dart",
    "content": "import 'package:iris/models/file.dart';\nimport 'package:iris/models/store/app_state.dart';\n\nList<FileItem> filesSort({\n  required List<FileItem> files,\n  SortBy sortBy = SortBy.name,\n  SortOrder sortOrder = SortOrder.asc,\n  bool folderFirst = true,\n}) {\n  final sortedFiles = files.toList();\n  sortedFiles.sort((a, b) {\n    if (folderFirst) {\n      if (a.isDir && !b.isDir) return -1;\n      if (!a.isDir && b.isDir) return 1;\n    }\n\n    int result;\n    switch (sortBy) {\n      case SortBy.name:\n        result = a.name.toLowerCase().compareTo(b.name.toLowerCase());\n        break;\n      case SortBy.size:\n        result = a.size.compareTo(b.size);\n        break;\n      case SortBy.lastModified:\n        result = (a.lastModified ?? DateTime(0))\n            .compareTo(b.lastModified ?? DateTime(0));\n        break;\n    }\n\n    return sortOrder == SortOrder.asc ? result : -result;\n  });\n  return sortedFiles;\n}\n"
  },
  {
    "path": "lib/utils/format_duration_to_minutes.dart",
    "content": "String formatDurationToMinutes(Duration duration) {\n  int totalMinutes = duration.inHours * 60 + duration.inMinutes.remainder(60);\n  String twoDigits(int n) => n.toString().padLeft(2, '0');\n  String twoDigitMinutes = twoDigits(totalMinutes);\n  String twoDigitSeconds = twoDigits(duration.inSeconds.remainder(60));\n  return \"$twoDigitMinutes:$twoDigitSeconds\";\n}\n"
  },
  {
    "path": "lib/utils/get_latest_release.dart",
    "content": "import 'dart:convert';\nimport 'dart:io';\nimport 'package:http/http.dart' as http;\nimport 'package:iris/utils/logger.dart';\nimport 'package:package_info_plus/package_info_plus.dart';\n\nclass Release {\n  final String version;\n  final String url;\n  final String downloadUrl;\n  final int size;\n  final String changeLog;\n\n  Release({\n    required this.version,\n    required this.url,\n    required this.downloadUrl,\n    required this.size,\n    required this.changeLog,\n  });\n}\n\nFuture<Release?> getLatestRelease() async {\n  String platform = '';\n\n  if (Platform.isWindows) {\n    platform = 'windows';\n  } else if (Platform.isAndroid) {\n    platform = 'android';\n  } else {\n    logger('Unsupported platform');\n    return null;\n  }\n\n  PackageInfo packageInfo = await PackageInfo.fromPlatform();\n\n  if (packageInfo.version.isNotEmpty) {\n    const api = 'https://api.github.com/repos/nini22P/iris/releases/latest';\n\n    try {\n      final response = await http.get(Uri.parse(api));\n\n      if (response.statusCode == 200) {\n        final data = json.decode(response.body);\n        final List<dynamic> assets = data['assets'];\n\n        final String version = data['tag_name'] ?? 'Unknown version';\n\n        final String url =\n            data['html_url'] ?? 'https://github.com/nini22P/iris/releases/';\n\n        final filtteredAssets = assets.where((assets) =>\n            assets['name'].toString().toLowerCase().contains(platform));\n\n        final downloadUrl = filtteredAssets.first['browser_download_url'];\n\n        final size = filtteredAssets.first['size'];\n\n        final String changeLog = data['body'];\n\n        final bool isUpdate = isVersionUpdated(packageInfo.version, version);\n\n        if (isUpdate) {\n          return Release(\n            version: version,\n            url: url,\n            downloadUrl: downloadUrl,\n            size: size,\n            changeLog: changeLog,\n          );\n        } else {\n          return null;\n        }\n      } else {\n        logger('Failed to load latest release: ${response.statusCode}');\n        return null;\n      }\n    } catch (e) {\n      logger('Error fetching latest release: $e');\n      return null;\n    }\n  } else {\n    return null;\n  }\n}\n\nbool isVersionUpdated(String currentVersion, String latestVersion) {\n  List<int> currentVersionParts =\n      currentVersion.replaceAll('v', '').split('.').map(int.parse).toList();\n  List<int> latestVersionParts =\n      latestVersion.replaceAll('v', '').split('.').map(int.parse).toList();\n\n  for (int i = 0; i < currentVersionParts.length; i++) {\n    if (i >= latestVersionParts.length ||\n        currentVersionParts[i] < latestVersionParts[i]) {\n      return true;\n    } else if (currentVersionParts[i] > latestVersionParts[i]) {\n      return false;\n    }\n  }\n\n  return false;\n}\n"
  },
  {
    "path": "lib/utils/get_localizations.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:iris/l10n/app_localizations.dart';\n\nAppLocalizations getLocalizations(BuildContext context) {\n  return AppLocalizations.of(context)!;\n}\n"
  },
  {
    "path": "lib/utils/get_shuffle_play_queue.dart",
    "content": "import 'dart:math';\nimport 'package:iris/models/file.dart';\n\nList<PlayQueueItem> getShufflePlayQueue(\n    List<PlayQueueItem> playQueue, int index) {\n  if (playQueue.isEmpty) return [];\n\n  final int seed = DateTime.now().millisecondsSinceEpoch;\n  final Random random = Random(seed);\n  final List<PlayQueueItem> shuffledList = [...playQueue];\n\n  final int currentItemIndex =\n      shuffledList.indexWhere((element) => element.index == index);\n\n  if (currentItemIndex == -1) {\n    return shuffledList;\n  }\n\n  final PlayQueueItem currentItem = shuffledList.removeAt(currentItemIndex);\n  for (int i = shuffledList.length - 1; i > 0; i--) {\n    final int j = random.nextInt(i + 1);\n    final temp = shuffledList[i];\n    shuffledList[i] = shuffledList[j];\n    shuffledList[j] = temp;\n  }\n\n  shuffledList.insert(0, currentItem);\n\n  return shuffledList;\n}\n"
  },
  {
    "path": "lib/utils/get_subtitle_map.dart",
    "content": "import 'package:iris/models/file.dart';\nimport 'package:path/path.dart' as path;\n\nMap<String, List<Subtitle>> getSubtitleMap<T>({\n  required List<T> files,\n  required String Function(T) getName,\n  required String Function(T) getUri,\n}) {\n  final subtitleExtensions = {'ass', 'srt', 'vtt', 'sub'};\n  final Map<String, List<Subtitle>> subtitleMap = {};\n\n  for (final file in files) {\n    final fileName = getName(file);\n    final fileExt =\n        path.extension(fileName).replaceFirst('.', '').toLowerCase();\n    if (subtitleExtensions.contains(fileExt)) {\n      final mediaBaseName =\n          path.basenameWithoutExtension(fileName).split('.').first;\n\n      final subBaseName = path.basenameWithoutExtension(fileName);\n      final regex = RegExp(r'^' + RegExp.escape(mediaBaseName) + r'\\.(.+?)$',\n          caseSensitive: false);\n      final match = regex.firstMatch(subBaseName);\n      final subTitleName = match?.group(1) ?? subBaseName;\n\n      final subtitle = Subtitle(\n        name: subTitleName,\n        uri: getUri(file),\n      );\n      subtitleMap.putIfAbsent(mediaBaseName, () => []).add(subtitle);\n    }\n  }\n  return subtitleMap;\n}\n"
  },
  {
    "path": "lib/utils/logger.dart",
    "content": "import 'dart:developer';\nimport 'package:flutter/foundation.dart';\n\nvoid logger(String message) {\n  if (kDebugMode) {\n    log(message);\n  }\n}\n"
  },
  {
    "path": "lib/utils/path.dart",
    "content": "import 'dart:io';\nimport 'package:path/path.dart' as p;\nimport 'package:path_provider/path_provider.dart';\n\nFuture<String> getExecutableDirPath() async {\n  String resolvedExecutablePath = Platform.resolvedExecutable;\n  return p.dirname(resolvedExecutablePath);\n}\n\nFuture<String> getTempPath() async {\n  final directory = await getTemporaryDirectory();\n  final String tempPath = p.join(directory.path, 'IRIS');\n  if (!Directory(tempPath).existsSync()) {\n    Directory(tempPath).createSync(recursive: true);\n  }\n  return tempPath;\n}\n"
  },
  {
    "path": "lib/utils/path_conv.dart",
    "content": "import 'package:iris/utils/logger.dart';\nimport 'package:path/path.dart' as p;\n\nList<String> pathConv(String path) {\n  try {\n    String normalizedPath = p.normalize(path.trim());\n\n    if (normalizedPath.isEmpty || normalizedPath == '.') {\n      return [];\n    }\n\n    if (normalizedPath == '/' || normalizedPath == '\\\\') {\n      return ['/'];\n    }\n\n    final List<String> result = normalizedPath\n        .replaceAll('\\\\', '/')\n        .split('/')\n        .where((element) => element.isNotEmpty)\n        .toList();\n\n    if (path.startsWith('\\\\\\\\')) {\n      return ['\\\\\\\\${result[0]}', ...result.sublist(1)];\n    }\n\n    if (path.startsWith('/')) {\n      return ['/', ...result];\n    }\n\n    return result;\n  } on FormatException catch (e) {\n    logger(\"Error decoding: $e\");\n    return [];\n  }\n}\n"
  },
  {
    "path": "lib/utils/platform.dart",
    "content": "import 'dart:io';\n\nfinal bool isDesktop =\n    Platform.isWindows || Platform.isLinux || Platform.isMacOS;\nfinal bool isWindows = Platform.isWindows;\nfinal bool isLinux = Platform.isLinux;\nfinal bool isMacOS = Platform.isMacOS;\nfinal bool isAndroid = Platform.isAndroid;\nfinal bool isIOS = Platform.isIOS;\n"
  },
  {
    "path": "lib/utils/request_storage_permission.dart",
    "content": "import 'dart:io';\nimport 'package:device_info_plus/device_info_plus.dart';\nimport 'package:iris/globals.dart' as globals;\nimport 'package:permission_handler/permission_handler.dart';\n\nFuture<void> requestStoragePermission() async {\n  if (!Platform.isAndroid) {\n    return;\n  }\n\n  if (globals.storagePermissionStatus != PermissionStatus.granted) {\n    if (await isAndroid11OrHigher()) {\n      globals.storagePermissionStatus =\n          await Permission.manageExternalStorage.request();\n    } else {\n      globals.storagePermissionStatus = await Permission.storage.request();\n      if (globals.storagePermissionStatus != PermissionStatus.granted) {\n        return await requestStoragePermission();\n      } else {\n        return;\n      }\n    }\n  }\n}\n\nFuture<bool> isAndroid11OrHigher() async {\n  DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();\n  AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo;\n  return androidInfo.version.sdkInt >= 30;\n}\n"
  },
  {
    "path": "lib/utils/url.dart",
    "content": "import 'package:url_launcher/url_launcher.dart';\n\nFuture<void> launchURL(String url) async {\n  if (!await launchUrl(Uri.parse(url))) {\n    throw Exception('Could not launch $url');\n  }\n}\n"
  },
  {
    "path": "lib/widgets/bottom_sheets/show_open_link_bottom_sheet.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:iris/models/file.dart';\nimport 'package:iris/store/use_app_store.dart';\nimport 'package:iris/store/use_play_queue_store.dart';\nimport 'package:iris/utils/get_localizations.dart';\n\nFuture<void> showOpenLinkBottomSheet(BuildContext context) async =>\n    await showModalBottomSheet<void>(\n      context: context,\n      isScrollControlled: true,\n      builder: (context) => SingleChildScrollView(\n        child: Padding(\n          padding:\n              EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),\n          child: const OpenLinkBottomSheet(),\n        ),\n      ),\n    );\n\nclass OpenLinkBottomSheet extends HookWidget {\n  const OpenLinkBottomSheet({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    final t = getLocalizations(context);\n    final url = useState('');\n\n    void play() {\n      if (url.value.isNotEmpty &&\n          RegExp(r'^(http://|https://)').hasMatch(url.value)) {\n        useAppStore().updateAutoPlay(true);\n        usePlayQueueStore().update(\n          playQueue: [\n            PlayQueueItem(\n              file: FileItem(\n                name: url.value,\n                uri: url.value,\n                type: ContentType.video,\n              ),\n              index: 0,\n            )\n          ],\n          index: 0,\n        );\n        Navigator.pop(context, 'OK');\n      }\n    }\n\n    return Padding(\n      padding: const EdgeInsets.all(16.0),\n      child: Column(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          Text(\n            t.open_link,\n            style: TextStyle(color: Theme.of(context).colorScheme.onSurface),\n            textAlign: TextAlign.center,\n          ),\n          const SizedBox(height: 16),\n          TextFormField(\n            autofocus: true,\n            initialValue: '',\n            onChanged: (value) => url.value = value,\n            keyboardType: TextInputType.url,\n            style: TextStyle(\n                color: Theme.of(context)\n                    .colorScheme\n                    .onSurfaceVariant\n                    .withValues(alpha: 0.87)),\n            decoration: InputDecoration(\n              hintText: 'https://example.com/xxx.mp4',\n              hintStyle: TextStyle(color: Theme.of(context).disabledColor),\n              border: OutlineInputBorder(),\n            ),\n            onFieldSubmitted: (value) {\n              if (value.isNotEmpty &&\n                  RegExp(r'^(http://|https://)').hasMatch(value)) {\n                play();\n              }\n            },\n          ),\n          const SizedBox(height: 16),\n          Row(\n            mainAxisAlignment: MainAxisAlignment.spaceBetween,\n            children: <Widget>[\n              TextButton(\n                onPressed: () => Navigator.pop(context, 'Cancel'),\n                child: Text(t.cancel),\n              ),\n              TextButton(\n                onPressed: url.value.isNotEmpty &&\n                        RegExp(r'^(http://|https://)').hasMatch(url.value)\n                    ? play\n                    : null,\n                child: Text(t.play),\n              ),\n            ],\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/widgets/card.dart",
    "content": "import 'dart:ui';\nimport 'package:flutter/material.dart';\n\nclass Card extends StatelessWidget {\n  const Card({\n    super.key,\n    required this.child,\n    this.padding,\n    this.borderRadius,\n    this.color,\n    this.border,\n  });\n\n  final Widget child;\n  final EdgeInsetsGeometry? padding;\n  final BorderRadius? borderRadius;\n  final Color? color;\n  final Border? border;\n\n  @override\n  Widget build(BuildContext context) {\n    final effectiveBorderRadius = borderRadius ?? BorderRadius.circular(16);\n    final effectiveBorder = border ??\n        Border.all(\n          color: Theme.of(context)\n              .colorScheme\n              .onSurfaceVariant\n              .withValues(alpha: 0.125),\n          width: 1,\n        );\n\n    return Stack(\n      children: [\n        ClipRRect(\n          borderRadius: effectiveBorderRadius,\n          child: BackdropFilter(\n            filter: ImageFilter.blur(sigmaX: 10, sigmaY: 10),\n            child: Container(\n              padding: padding ?? const EdgeInsets.all(0),\n              decoration: BoxDecoration(\n                borderRadius: effectiveBorderRadius,\n                color: color ??\n                    Theme.of(context)\n                        .colorScheme\n                        .surfaceContainer\n                        .withValues(alpha: 0.75),\n              ),\n              child: child,\n            ),\n          ),\n        ),\n        Positioned.fill(\n          child: IgnorePointer(\n            child: Container(\n              decoration: BoxDecoration(\n                color: Colors.transparent,\n                borderRadius: effectiveBorderRadius,\n                border: effectiveBorder,\n              ),\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/widgets/chip.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass Chip extends StatelessWidget {\n  final String text;\n  final bool primary;\n\n  const Chip({super.key, required this.text, this.primary = false});\n\n  @override\n  Widget build(BuildContext context) {\n    return Container(\n      height: 20,\n      decoration: BoxDecoration(\n        color: primary\n            ? Theme.of(context).colorScheme.inversePrimary\n            : Theme.of(context).colorScheme.surfaceContainerHighest,\n        borderRadius: BorderRadius.circular(8),\n      ),\n      padding: const EdgeInsets.fromLTRB(8, 0, 8, 0),\n      child: Center(\n        child: Text(\n          text,\n          textAlign: TextAlign.center,\n          style: const TextStyle(\n            fontSize: 12,\n            fontWeight: FontWeight.bold,\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/widgets/dialogs/show_folder_dialog.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:iris/models/storages/storage.dart';\nimport 'package:iris/store/use_storage_store.dart';\nimport 'package:iris/utils/get_localizations.dart';\nimport 'package:iris/utils/path_conv.dart';\nimport 'package:iris/utils/platform.dart';\nimport 'package:path/path.dart' as p;\n\nFuture<void> showFolderDialog(BuildContext context,\n        {LocalStorage? storage}) async =>\n    await showDialog<void>(\n        context: context,\n        builder: (BuildContext context) => LocalDialog(storage: storage));\n\nclass LocalDialog extends HookWidget {\n  const LocalDialog({\n    super.key,\n    this.storage,\n  });\n  final LocalStorage? storage;\n\n  @override\n  Widget build(BuildContext context) {\n    final t = getLocalizations(context);\n    final bool isEdit = storage != null &&\n        (useStorageStore().state.storages.contains(storage!));\n    final type = useState(storage?.type ?? StorageType.internal);\n    final name = useState(storage?.name ?? '');\n    final basePath = useState(storage?.basePath ?? []);\n\n    final isTested = useState(true);\n\n    void add() {\n      useStorageStore().addStorage(\n        LocalStorage(\n          type: type.value,\n          name: name.value,\n          basePath: basePath.value,\n        ),\n      );\n    }\n\n    void update() {\n      useStorageStore().updateStorage(\n        useStorageStore().state.storages.indexOf(storage! as Storage),\n        LocalStorage(\n          type: type.value,\n          name: name.value,\n          basePath: basePath.value,\n        ),\n      );\n    }\n\n    return AlertDialog(\n      title: Text(isEdit ? t.edit_folder : t.add_folder),\n      content: SingleChildScrollView(\n        child: Padding(\n          padding: const EdgeInsets.all(8.0),\n          child: Form(\n            child: Column(\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                TextFormField(\n                  decoration: InputDecoration(\n                    border: const OutlineInputBorder(),\n                    labelText: t.name,\n                  ),\n                  initialValue: name.value,\n                  onChanged: (value) => name.value = value.trim(),\n                ),\n                const SizedBox(height: 16.0),\n                TextFormField(\n                  decoration: InputDecoration(\n                    border: const OutlineInputBorder(),\n                    labelText: t.path,\n                  ),\n                  initialValue: p.normalize(basePath.value.join('/')),\n                  onChanged: (value) => basePath.value = pathConv(value),\n                  readOnly:\n                      isAndroid && basePath.value[0].startsWith('content://'),\n                ),\n                const SizedBox(height: 16.0),\n              ],\n            ),\n          ),\n        ),\n      ),\n      actions: <Widget>[\n        TextButton(\n          onPressed: () => Navigator.pop(context, 'Cancel'),\n          child: Text(t.cancel),\n        ),\n        TextButton(\n          onPressed: isTested.value\n              ? () {\n                  Navigator.pop(context, 'OK');\n                  isEdit ? update() : add();\n                }\n              : null,\n          child: Text(isEdit ? t.save : t.add),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/widgets/dialogs/show_ftp_dialog.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:iris/models/storages/ftp.dart';\nimport 'package:iris/models/storages/storage.dart';\nimport 'package:iris/store/use_storage_store.dart';\nimport 'package:iris/utils/get_localizations.dart';\nimport 'package:uuid/uuid.dart';\n\nFuture<void> showFTPDialog(BuildContext context, {FTPStorage? storage}) async =>\n    await showDialog<void>(\n      context: context,\n      builder: (BuildContext context) {\n        return FTPDialog(storage: storage);\n      },\n    );\n\nclass FTPDialog extends HookWidget {\n  const FTPDialog({\n    super.key,\n    this.storage,\n  });\n  final FTPStorage? storage;\n\n  @override\n  Widget build(BuildContext context) {\n    final t = getLocalizations(context);\n    final bool isEdit =\n        storage != null && (useStorageStore().state.storages.contains(storage));\n\n    final id = useMemoized(() => storage?.id ?? const Uuid().v4());\n    final name = useState(storage?.name ?? '');\n    final host = useState(storage?.host ?? '');\n    final basePath = useState(storage?.basePath ?? ['/']);\n    final username = useState(storage?.username ?? '');\n    final password = useState(storage?.password ?? '');\n\n    final isTested = useState(false);\n\n    final TextEditingController portController =\n        useTextEditingController(text: storage?.port ?? '21');\n\n    void add() {\n      useStorageStore().addStorage(\n        FTPStorage(\n          id: id,\n          name: name.value,\n          host: host.value,\n          basePath: basePath.value,\n          port: portController.text,\n          username: username.value,\n          password: password.value,\n        ),\n      );\n    }\n\n    void update() {\n      useStorageStore().updateStorage(\n        useStorageStore().state.storages.indexOf(storage as Storage),\n        FTPStorage(\n          id: id,\n          name: name.value,\n          host: host.value,\n          basePath: basePath.value,\n          port: portController.text,\n          username: username.value,\n          password: password.value,\n        ),\n      );\n    }\n\n    void testConnection() async {\n      final bool isConnected = await testFTP(FTPStorage(\n        id: id,\n        name: name.value,\n        host: host.value,\n        basePath: basePath.value,\n        port: portController.text,\n        username: username.value,\n        password: password.value,\n      ));\n      isTested.value = isConnected;\n    }\n\n    return AlertDialog(\n      title: Text(isEdit ? t.edit_ftp_storage : t.add_ftp_storage),\n      content: SingleChildScrollView(\n        child: Padding(\n          padding: const EdgeInsets.all(8.0),\n          child: Form(\n            child: Column(\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                TextFormField(\n                  decoration: InputDecoration(\n                    border: const OutlineInputBorder(),\n                    labelText: t.name,\n                  ),\n                  initialValue: name.value,\n                  onChanged: (value) {\n                    name.value = value.trim();\n                    isTested.value = false;\n                  },\n                ),\n                const SizedBox(height: 16.0),\n                TextFormField(\n                  decoration: InputDecoration(\n                    border: const OutlineInputBorder(),\n                    labelText: t.host,\n                  ),\n                  initialValue: host.value,\n                  onChanged: (value) {\n                    host.value = value.trim().split('//').last;\n                    isTested.value = false;\n                  },\n                ),\n                const SizedBox(height: 16.0),\n                TextFormField(\n                    decoration: InputDecoration(\n                      border: const OutlineInputBorder(),\n                      labelText: t.path,\n                    ),\n                    initialValue: basePath.value.join('/'),\n                    onChanged: (value) {\n                      final trimmedValue =\n                          value.trim().replaceAll(RegExp(r'^\\/+|\\/+$'), '');\n                      final finalPath = '/$trimmedValue';\n                      basePath.value = [finalPath];\n                      isTested.value = false;\n                    }),\n                const SizedBox(height: 16.0),\n                TextFormField(\n                  decoration: InputDecoration(\n                    border: const OutlineInputBorder(),\n                    labelText: t.port,\n                  ),\n                  controller: portController,\n                  keyboardType: TextInputType.number,\n                  inputFormatters: <TextInputFormatter>[\n                    FilteringTextInputFormatter.digitsOnly,\n                  ],\n                  onChanged: (value) {\n                    isTested.value = false;\n                  },\n                ),\n                const SizedBox(height: 16.0),\n                TextFormField(\n                  decoration: InputDecoration(\n                    border: const OutlineInputBorder(),\n                    labelText: t.username,\n                  ),\n                  initialValue: username.value,\n                  onChanged: (value) {\n                    username.value = value.trim();\n                    isTested.value = false;\n                  },\n                ),\n                const SizedBox(height: 16.0),\n                TextFormField(\n                  decoration: InputDecoration(\n                    border: const OutlineInputBorder(),\n                    labelText: t.password,\n                  ),\n                  initialValue: password.value,\n                  obscureText: true,\n                  onChanged: (value) {\n                    password.value = value.trim();\n                    isTested.value = false;\n                  },\n                ),\n                const SizedBox(height: 16.0),\n              ],\n            ),\n          ),\n        ),\n      ),\n      actions: <Widget>[\n        TextButton(\n          onPressed: () => Navigator.pop(context, 'Cancel'),\n          child: Text(t.cancel),\n        ),\n        TextButton(\n          onPressed: testConnection,\n          child: Text(t.test_connection),\n        ),\n        TextButton(\n          onPressed: isTested.value\n              ? () {\n                  Navigator.pop(context, 'OK');\n                  isEdit ? update() : add();\n                }\n              : null,\n          child: Text(isEdit ? t.save : t.add),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/widgets/dialogs/show_language_dialog.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:flutter_zustand/flutter_zustand.dart';\nimport 'package:iris/l10n/languages.dart';\nimport 'package:iris/store/use_app_store.dart';\nimport 'package:iris/utils/get_localizations.dart';\n\nFuture<void> showLanguageDialog(BuildContext context) async =>\n    await showDialog<void>(\n      context: context,\n      builder: (context) => const LanguageDialog(),\n    );\n\nclass LanguageDialog extends HookWidget {\n  const LanguageDialog({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    final t = getLocalizations(context);\n    final String language =\n        useAppStore().select(context, (state) => state.language);\n\n    void updateLanguage(String? newLanguage) {\n      if (newLanguage == null) return;\n      useAppStore().updateLanguage(newLanguage);\n      Navigator.pop(context);\n    }\n\n    final Map<String, String> languageOptions = {\n      'system': t.system,\n      ...languages,\n    };\n\n    return AlertDialog(\n      title: Text(t.select_language),\n      content: SingleChildScrollView(\n        child: RadioGroup<String>(\n          groupValue: language,\n          onChanged: updateLanguage,\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            children: languageOptions.entries.map((entry) {\n              final String langCode = entry.key;\n              final String langName = entry.value;\n\n              return ListTile(\n                title: Text(langName),\n                leading: Radio<String>(\n                  value: langCode,\n                ),\n                onTap: () => updateLanguage(langCode),\n                contentPadding: const EdgeInsets.only(left: 8),\n              );\n            }).toList(),\n          ),\n        ),\n      ),\n      actions: <Widget>[\n        TextButton(\n          onPressed: () => Navigator.pop(context),\n          child: Text(t.cancel),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/widgets/dialogs/show_open_link_dialog.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:iris/models/file.dart';\nimport 'package:iris/store/use_app_store.dart';\nimport 'package:iris/store/use_play_queue_store.dart';\nimport 'package:iris/utils/get_localizations.dart';\n\nFuture<void> showOpenLinkDialog(BuildContext context) async =>\n    await showDialog<void>(\n      context: context,\n      builder: (context) => const OpenLinkDialog(),\n    );\n\nclass OpenLinkDialog extends HookWidget {\n  const OpenLinkDialog({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    final t = getLocalizations(context);\n    final url = useState('');\n\n    void play() {\n      if (url.value.isNotEmpty &&\n          RegExp(r'^(http://|https://)').hasMatch(url.value)) {\n        useAppStore().updateAutoPlay(true);\n        usePlayQueueStore().update(\n          playQueue: [\n            PlayQueueItem(\n              file: FileItem(\n                name: url.value,\n                uri: url.value,\n                type: ContentType.video,\n              ),\n              index: 0,\n            )\n          ],\n          index: 0,\n        );\n        Navigator.pop(context, 'OK');\n      }\n    }\n\n    return AlertDialog(\n      // actionsPadding: const EdgeInsets.symmetric(horizontal: 16),\n      title: Text(t.open_link,\n          style: TextStyle(color: Theme.of(context).colorScheme.onSurface)),\n      content: ConstrainedBox(\n        constraints: BoxConstraints(\n          maxWidth: 600,\n        ),\n        child: SingleChildScrollView(\n          child: TextFormField(\n            autofocus: true,\n            initialValue: '',\n            onChanged: (value) => url.value = value,\n            keyboardType: TextInputType.url,\n            style: TextStyle(\n                color: Theme.of(context)\n                    .colorScheme\n                    .onSurfaceVariant\n                    .withValues(alpha: 0.87)),\n            decoration: InputDecoration(\n              hintText: 'https://example.com/xxx.mp4',\n              hintStyle: TextStyle(color: Theme.of(context).disabledColor),\n            ),\n            onFieldSubmitted: (value) {\n              if (value.isNotEmpty &&\n                  RegExp(r'^(http://|https://)').hasMatch(value)) {\n                play();\n              }\n            },\n          ),\n        ),\n      ),\n      actions: <Widget>[\n        TextButton(\n          onPressed: () => Navigator.pop(context, 'Cancel'),\n          child: Text(t.cancel),\n        ),\n        TextButton(\n          onPressed: url.value.isNotEmpty &&\n                  RegExp(r'^(http://|https://)').hasMatch(url.value)\n              ? play\n              : null,\n          child: Text(t.play),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/widgets/dialogs/show_orientation_dialog.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:flutter_zustand/flutter_zustand.dart';\nimport 'package:iris/models/store/app_state.dart';\nimport 'package:iris/store/use_app_store.dart';\nimport 'package:iris/utils/get_localizations.dart';\n\nFuture<void> showOrientationDialog(BuildContext context) async =>\n    await showDialog<void>(\n      context: context,\n      builder: (context) => const OrientationDialog(),\n    );\n\nclass OrientationDialog extends HookWidget {\n  const OrientationDialog({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    final t = getLocalizations(context);\n    final orientation =\n        useAppStore().select(context, (state) => state.orientation);\n\n    void updateOrientation(ScreenOrientation? newOrientation) {\n      if (newOrientation == null) return;\n      useAppStore().updateOrientation(newOrientation);\n      Navigator.pop(context);\n    }\n\n    final orientationMap = {\n      ScreenOrientation.device: t.device,\n      ScreenOrientation.landscape: t.landscape,\n      ScreenOrientation.portrait: t.portrait,\n    };\n\n    return AlertDialog(\n      title: Text(t.screen_orientation),\n      content: SingleChildScrollView(\n        child: RadioGroup<ScreenOrientation>(\n          groupValue: orientation,\n          onChanged: updateOrientation,\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            children: ScreenOrientation.values.map((e) {\n              return ListTile(\n                title: Text(orientationMap[e] ?? e.name),\n                leading: Radio<ScreenOrientation>(\n                  value: e,\n                ),\n                onTap: () => updateOrientation(e),\n              );\n            }).toList(),\n          ),\n        ),\n      ),\n      actions: <Widget>[\n        TextButton(\n          onPressed: () => Navigator.pop(context),\n          child: Text(t.cancel),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/widgets/dialogs/show_rate_dialog.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:flutter_zustand/flutter_zustand.dart';\nimport 'package:iris/globals.dart' show speedStops;\nimport 'package:iris/store/use_app_store.dart';\nimport 'package:iris/utils/get_localizations.dart';\n\nFuture<void> showRateDialog(BuildContext context) async =>\n    await showDialog<void>(\n      context: context,\n      builder: (context) => const RateDialog(),\n    );\n\nclass RateDialog extends HookWidget {\n  const RateDialog({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    final t = getLocalizations(context);\n    final rate = useAppStore().select(context, (state) => state.rate);\n\n    void updateRate(double? newRate) {\n      if (newRate == null) return;\n      useAppStore().updateRate(newRate);\n      Navigator.pop(context);\n    }\n\n    return AlertDialog(\n      title: Text(t.playback_speed),\n      content: SingleChildScrollView(\n        child: RadioGroup<double>(\n          groupValue: rate,\n          onChanged: updateRate,\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            children: speedStops.map((item) {\n              return ListTile(\n                title: Text('${item}X'),\n                leading: Radio<double>(\n                  value: item,\n                ),\n                onTap: () => updateRate(item),\n              );\n            }).toList(),\n          ),\n        ),\n      ),\n      actions: <Widget>[\n        TextButton(\n          onPressed: () => Navigator.pop(context),\n          child: Text(t.cancel),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/widgets/dialogs/show_release_dialog.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\nimport 'package:iris/utils/file_size_convert.dart';\nimport 'package:iris/utils/platform.dart';\nimport 'package:path/path.dart' as p;\nimport 'package:flutter/material.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:flutter_markdown/flutter_markdown.dart';\nimport 'package:iris/utils/get_latest_release.dart';\nimport 'package:iris/utils/get_localizations.dart';\nimport 'package:iris/utils/url.dart';\n\nbool isPortable() {\n  String resolvedExecutablePath = Platform.resolvedExecutable;\n  String path = p.dirname(resolvedExecutablePath);\n  String batFilePath = p.join(path, 'iris-updater.bat');\n  return File(batFilePath).existsSync();\n}\n\nFuture<void> showReleaseDialog(BuildContext context,\n        {required Release release}) async =>\n    await showDialog<void>(\n      context: context,\n      builder: (context) => ReleaseDialog(\n        release: release,\n      ),\n    );\n\nclass ReleaseDialog extends HookWidget {\n  const ReleaseDialog({super.key, required this.release});\n\n  final Release release;\n\n  @override\n  Widget build(BuildContext context) {\n    final t = getLocalizations(context);\n\n    final updateScriptIsExists = useState(false);\n\n    useEffect(() {\n      if (isWindows) {\n        updateScriptIsExists.value = isPortable();\n      }\n      return null;\n    }, []);\n\n    void update() async {\n      if (isWindows) {\n        String resolvedExecutablePath = Platform.resolvedExecutable;\n        String path = p.dirname(resolvedExecutablePath);\n        String batFilePath = p.join(path, 'iris-updater.bat');\n        // 执行 bat 文件\n        await Process.start(\n          'cmd.exe',\n          ['/c', batFilePath],\n          mode: ProcessStartMode.detached,\n          runInShell: true,\n        );\n        // 退出应用\n        exit(0);\n      }\n    }\n\n    Future<void> cancel() async {\n      if (context.mounted) {\n        Navigator.pop(context, 'Cancel');\n      }\n    }\n\n    return AlertDialog(\n      title: Text('${t.checked_new_version}: ${release.version}'),\n      content: ConstrainedBox(\n        constraints: BoxConstraints(\n          maxWidth: 600,\n        ),\n        child: SingleChildScrollView(\n          child: MarkdownBody(data: release.changeLog, shrinkWrap: true),\n        ),\n      ),\n      actions: <Widget>[\n        TextButton(\n          onPressed: cancel,\n          child: Text(t.cancel),\n        ),\n        TextButton(\n          onPressed: () => launchURL(release.url),\n          child: Text(t.releasePage),\n        ),\n        // Visibility(\n        //   visible: !isDesktop,\n        //   child: TextButton(\n        //     onPressed: () {\n        //       launchURL(release.url);\n        //       Navigator.pop(context, 'OK');\n        //     },\n        //     child: Text(t.download),\n        //   ),\n        // ),\n        Visibility(\n          visible: isDesktop && updateScriptIsExists.value,\n          child: TextButton(\n            onPressed: update,\n            child: Text(\n                '${t.download_and_update} (${fileSizeConvert(release.size)} MB)'),\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/widgets/dialogs/show_theme_mode_dialog.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:flutter_zustand/flutter_zustand.dart';\nimport 'package:iris/store/use_app_store.dart';\nimport 'package:iris/utils/get_localizations.dart';\n\nFuture<void> showThemeModeDialog(BuildContext context) async =>\n    await showDialog<void>(\n      context: context,\n      builder: (context) => const ThemeModeDialog(),\n    );\n\nclass ThemeModeDialog extends HookWidget {\n  const ThemeModeDialog({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    final t = getLocalizations(context);\n    final themeMode = useAppStore().select(context, (state) => state.themeMode);\n\n    void updateThemeMode(ThemeMode? newThemeMode) {\n      if (newThemeMode == null) return;\n      useAppStore().updateThemeMode(newThemeMode);\n      Navigator.pop(context);\n    }\n\n    final Map<String, ThemeMode> themeOptions = {\n      t.system: ThemeMode.system,\n      t.light: ThemeMode.light,\n      t.dark: ThemeMode.dark,\n    };\n\n    return AlertDialog(\n      title: Text(t.theme_mode),\n      content: SingleChildScrollView(\n        child: RadioGroup<ThemeMode>(\n          groupValue: themeMode,\n          onChanged: updateThemeMode,\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            children: themeOptions.entries.map((entry) {\n              final String label = entry.key;\n              final ThemeMode value = entry.value;\n\n              return ListTile(\n                title: Text(label),\n                leading: Radio<ThemeMode>(\n                  value: value,\n                ),\n                onTap: () => updateThemeMode(value),\n                contentPadding: const EdgeInsets.only(left: 8),\n              );\n            }).toList(),\n          ),\n        ),\n      ),\n      actions: <Widget>[\n        TextButton(\n          onPressed: () => Navigator.pop(context),\n          child: Text(t.cancel),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/widgets/dialogs/show_webdav_dialog.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:iris/models/storages/storage.dart';\nimport 'package:iris/models/storages/webdav.dart';\nimport 'package:iris/store/use_storage_store.dart';\nimport 'package:iris/utils/get_localizations.dart';\nimport 'package:uuid/uuid.dart';\n\nFuture<void> showWebDAVDialog(BuildContext context,\n        {WebDAVStorage? storage}) async =>\n    await showDialog<void>(\n      context: context,\n      builder: (BuildContext context) {\n        return WebDAVDialog(storage: storage);\n      },\n    );\n\nclass WebDAVDialog extends HookWidget {\n  const WebDAVDialog({\n    super.key,\n    this.storage,\n  });\n  final WebDAVStorage? storage;\n\n  @override\n  Widget build(BuildContext context) {\n    final t = getLocalizations(context);\n    final bool isEdit =\n        storage != null && (useStorageStore().state.storages.contains(storage));\n\n    final id = useMemoized(() => storage?.id ?? const Uuid().v4());\n    final name = useState(storage?.name ?? '');\n    final host = useState(storage?.host ?? '');\n    final basePath = useState(storage?.basePath ?? ['/']);\n    final username = useState(storage?.username ?? '');\n    final password = useState(storage?.password ?? '');\n    final https = useState(storage?.https ?? false);\n\n    final isTested = useState(false);\n\n    final TextEditingController portController =\n        useTextEditingController(text: storage?.port ?? '');\n\n    void add() {\n      useStorageStore().addStorage(\n        WebDAVStorage(\n          id: id,\n          name: name.value,\n          host: host.value,\n          basePath: basePath.value,\n          port: portController.text,\n          username: username.value,\n          password: password.value,\n          https: https.value,\n        ),\n      );\n    }\n\n    void update() {\n      useStorageStore().updateStorage(\n        useStorageStore().state.storages.indexOf(storage as Storage),\n        WebDAVStorage(\n          id: id,\n          name: name.value,\n          host: host.value,\n          basePath: basePath.value,\n          port: portController.text,\n          username: username.value,\n          password: password.value,\n          https: https.value,\n        ),\n      );\n    }\n\n    void testConnection() async {\n      final bool isConnected = await testWebDAV(WebDAVStorage(\n        id: id,\n        name: name.value,\n        host: host.value,\n        basePath: basePath.value,\n        port: portController.text,\n        username: username.value,\n        password: password.value,\n        https: https.value,\n      ));\n      isTested.value = isConnected;\n    }\n\n    return AlertDialog(\n      title: Text(isEdit ? t.edit_webdav_storage : t.add_webdav_storage),\n      content: SingleChildScrollView(\n        child: Padding(\n          padding: const EdgeInsets.all(8.0),\n          child: Form(\n            child: Column(\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                TextFormField(\n                  decoration: InputDecoration(\n                    border: const OutlineInputBorder(),\n                    labelText: t.name,\n                  ),\n                  initialValue: name.value,\n                  onChanged: (value) {\n                    name.value = value.trim();\n                    isTested.value = false;\n                  },\n                ),\n                const SizedBox(height: 16.0),\n                TextFormField(\n                  decoration: InputDecoration(\n                    border: const OutlineInputBorder(),\n                    labelText: t.host,\n                  ),\n                  initialValue: host.value,\n                  onChanged: (value) {\n                    host.value = value.trim().split('//').last;\n                    isTested.value = false;\n                  },\n                ),\n                const SizedBox(height: 16.0),\n                TextFormField(\n                    decoration: InputDecoration(\n                      border: const OutlineInputBorder(),\n                      labelText: t.path,\n                    ),\n                    initialValue: basePath.value.join('/'),\n                    onChanged: (value) {\n                      final trimmedValue =\n                          value.trim().replaceAll(RegExp(r'^\\/+|\\/+$'), '');\n                      final finalPath = '/$trimmedValue';\n                      basePath.value = [finalPath];\n                      isTested.value = false;\n                    }),\n                const SizedBox(height: 16.0),\n                Row(\n                  children: [\n                    Expanded(\n                      child: TextFormField(\n                        decoration: InputDecoration(\n                          border: const OutlineInputBorder(),\n                          labelText: t.port,\n                        ),\n                        controller: portController,\n                        keyboardType: TextInputType.number,\n                        inputFormatters: <TextInputFormatter>[\n                          FilteringTextInputFormatter.digitsOnly,\n                        ],\n                        onChanged: (value) {\n                          isTested.value = false;\n                          if (value == '443') {\n                            https.value = true;\n                          }\n                        },\n                      ),\n                    ),\n                    const SizedBox(width: 4),\n                    SizedBox(\n                      width: 96,\n                      child: ListTile(\n                        contentPadding: const EdgeInsets.fromLTRB(0, 0, 0, 0),\n                        visualDensity:\n                            const VisualDensity(horizontal: -4, vertical: 0),\n                        title: Row(\n                            mainAxisAlignment: MainAxisAlignment.center,\n                            crossAxisAlignment: CrossAxisAlignment.center,\n                            children: [\n                              const Text('https'),\n                              Focus(\n                                descendantsAreFocusable: false,\n                                canRequestFocus: false,\n                                child: Checkbox(\n                                  value: https.value,\n                                  onChanged: (_) {\n                                    isTested.value = false;\n                                    if (portController.text == '80' &&\n                                        https.value == false) {\n                                      portController.text = '443';\n                                    } else if (portController.text == '443' &&\n                                        https.value == true) {\n                                      portController.text = '80';\n                                    }\n                                    https.value = !https.value;\n                                  },\n                                ),\n                              ),\n                            ]),\n                        onTap: () {\n                          isTested.value = false;\n                          if (!https.value) {\n                            portController.text = '443';\n                          } else {\n                            portController.text = '80';\n                          }\n                          https.value = !https.value;\n                        },\n                      ),\n                    ),\n                  ],\n                ),\n                const SizedBox(height: 16.0),\n                TextFormField(\n                  decoration: InputDecoration(\n                    border: const OutlineInputBorder(),\n                    labelText: t.username,\n                  ),\n                  initialValue: username.value,\n                  onChanged: (value) {\n                    username.value = value.trim();\n                    isTested.value = false;\n                  },\n                ),\n                const SizedBox(height: 16.0),\n                TextFormField(\n                  decoration: InputDecoration(\n                    border: const OutlineInputBorder(),\n                    labelText: t.password,\n                  ),\n                  initialValue: password.value,\n                  obscureText: true,\n                  onChanged: (value) {\n                    password.value = value.trim();\n                    isTested.value = false;\n                  },\n                ),\n                const SizedBox(height: 16.0),\n              ],\n            ),\n          ),\n        ),\n      ),\n      actions: <Widget>[\n        TextButton(\n          onPressed: () => Navigator.pop(context, 'Cancel'),\n          child: Text(t.cancel),\n        ),\n        TextButton(\n          onPressed: testConnection,\n          child: Text(t.test_connection),\n        ),\n        TextButton(\n          onPressed: isTested.value\n              ? () {\n                  Navigator.pop(context, 'OK');\n                  isEdit ? update() : add();\n                }\n              : null,\n          child: Text(isEdit ? t.save : t.add),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/widgets/drag_area.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_zustand/flutter_zustand.dart';\nimport 'package:iris/store/use_player_ui_store.dart';\nimport 'package:iris/utils/platform.dart';\nimport 'package:window_manager/window_manager.dart';\n\nclass DragArea extends StatelessWidget {\n  const DragArea({\n    super.key,\n    required this.child,\n  });\n\n  final Widget child;\n  @override\n  Widget build(BuildContext context) {\n    final isFullScreen =\n        usePlayerUiStore().select(context, (state) => state.isFullScreen);\n\n    return GestureDetector(\n      onDoubleTap: () async {\n        if (!isDesktop) return;\n        if (isFullScreen) {\n          await usePlayerUiStore().updateFullScreen(false);\n        } else {\n          if (await windowManager.isMaximized()) {\n            await windowManager.unmaximize();\n          } else {\n            await windowManager.maximize();\n          }\n        }\n      },\n      onPanStart: (details) async {\n        if (isDesktop) {\n          windowManager.startDragging();\n        }\n      },\n      child: child,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/widgets/popup.dart",
    "content": "import 'dart:io';\nimport 'package:flutter/material.dart' hide Card;\nimport 'package:flutter/services.dart';\nimport 'package:iris/utils/platform.dart';\nimport 'package:iris/widgets/card.dart';\nimport 'package:window_manager/window_manager.dart';\n\nenum PopupDirection { left, right }\n\nFuture<void> showPopup({\n  required BuildContext context,\n  required Widget child,\n  required PopupDirection direction,\n}) async =>\n    await Navigator.of(context).push(Popup(child: child, direction: direction));\n\nFuture<void> replacePopup({\n  required BuildContext context,\n  required Widget child,\n  required PopupDirection direction,\n}) async =>\n    await Navigator.of(context)\n        .pushReplacement(Popup(child: child, direction: direction));\n\nclass Popup<T> extends PopupRoute<T> {\n  Popup({\n    required this.child,\n    required this.direction,\n  }) {\n    _focusNode = FocusNode();\n  }\n\n  final Widget child;\n  final PopupDirection direction;\n  late final FocusNode _focusNode;\n\n  bool _isPopping = false;\n\n  void _popOnce(BuildContext context) {\n    if (_isPopping) return;\n    _isPopping = true;\n    Navigator.of(context).pop();\n  }\n\n  @override\n  Color? get barrierColor => Colors.transparent;\n\n  @override\n  bool get barrierDismissible => false;\n\n  @override\n  String? get barrierLabel => 'Dismiss';\n\n  @override\n  Duration get transitionDuration => const Duration(milliseconds: 250);\n\n  @override\n  void dispose() {\n    _focusNode.dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget buildPage(BuildContext context, Animation<double> animation,\n      Animation<double> secondaryAnimation) {\n    return KeyboardListener(\n      focusNode: _focusNode,\n      autofocus: true,\n      onKeyEvent: (event) {\n        if (event.logicalKey == LogicalKeyboardKey.escape) {\n          _popOnce(context);\n        }\n      },\n      child: Stack(\n        children: [\n          Positioned.fill(\n            child: GestureDetector(\n              onPanStart: (details) {\n                if (Platform.isWindows ||\n                    Platform.isLinux ||\n                    Platform.isMacOS) {\n                  windowManager.startDragging();\n                }\n              },\n              onTap: () => _popOnce(context),\n            ),\n          ),\n          Align(\n            alignment: direction == PopupDirection.left\n                ? Alignment.bottomLeft\n                : Alignment.bottomRight,\n            child: AnimatedBuilder(\n              animation: animation,\n              builder: (context, child) {\n                return SlideTransition(\n                  position: Tween<Offset>(\n                    begin: direction == PopupDirection.left\n                        ? const Offset(-1.0, 0.0)\n                        : const Offset(1.0, 0.0),\n                    end: Offset.zero,\n                  ).animate(\n                    CurvedAnimation(\n                      parent: animation,\n                      curve: Curves.easeInOutCubicEmphasized,\n                    ),\n                  ),\n                  child: child,\n                );\n              },\n              child: Dismissible(\n                key: UniqueKey(),\n                direction: direction == PopupDirection.left\n                    ? DismissDirection.endToStart\n                    : DismissDirection.startToEnd,\n                onUpdate: (details) {\n                  if (details.previousReached) {\n                    _popOnce(context);\n                  }\n                },\n                child: LayoutBuilder(\n                  builder: (context, constraints) {\n                    final screenWidth = constraints.maxWidth;\n                    final screenHeight = constraints.maxHeight;\n                    final int size = screenWidth > 1200\n                        ? 3\n                        : screenWidth > 720\n                            ? 2\n                            : 1;\n\n                    return Padding(\n                      padding: EdgeInsets.only(\n                        bottom: 8,\n                        left: direction == PopupDirection.left ? 8 : 0,\n                        right: direction == PopupDirection.right ? 8 : 0,\n                      ),\n                      child: UnconstrainedBox(\n                        child: LimitedBox(\n                          maxWidth: screenWidth / size - 16,\n                          maxHeight:\n                              isDesktop ? screenHeight - 56 : screenHeight - 16,\n                          child: Card(\n                            child: Material(\n                              color: Colors.transparent,\n                              child: Column(\n                                mainAxisSize: MainAxisSize.min,\n                                children: [\n                                  Expanded(child: child),\n                                ],\n                              ),\n                            ),\n                          ),\n                        ),\n                      ),\n                    );\n                  },\n                ),\n              ),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/widgets/popups/history.dart",
    "content": "import 'dart:math';\n\nimport 'package:flutter/material.dart' hide Chip;\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:flutter_zustand/flutter_zustand.dart';\nimport 'package:iris/models/file.dart';\nimport 'package:iris/models/progress.dart';\nimport 'package:iris/models/storages/storage.dart';\nimport 'package:iris/store/use_app_store.dart';\nimport 'package:iris/store/use_history_store.dart';\nimport 'package:iris/store/use_play_queue_store.dart';\nimport 'package:iris/utils/file_size_convert.dart';\nimport 'package:iris/utils/get_localizations.dart';\nimport 'package:iris/widgets/chip.dart';\nimport 'package:scrollable_positioned_list/scrollable_positioned_list.dart';\n\nclass History extends HookWidget {\n  const History({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    final t = getLocalizations(context);\n    final Map<String, Progress> history =\n        useHistoryStore().select(context, (state) => state.history);\n\n    final List<MapEntry<String, Progress>> historyList = useMemoized(() {\n      final entries = history.entries.toList();\n      entries.sort((a, b) => b.value.dateTime.compareTo(a.value.dateTime));\n      return entries.sublist(0, min(entries.length, 100));\n    }, [history]);\n\n    Future<void> play(int index) async {\n      await useAppStore().updateAutoPlay(true);\n\n      final playQueue = historyList\n          .asMap()\n          .map((index, entry) => MapEntry(\n              index, PlayQueueItem(file: entry.value.file, index: index)))\n          .values\n          .toList();\n\n      usePlayQueueStore().update(playQueue: playQueue, index: index);\n    }\n\n    return Column(\n      children: [\n        Expanded(\n          child: Card(\n            color: Colors.transparent,\n            elevation: 0,\n            shape: RoundedRectangleBorder(\n              borderRadius: BorderRadius.circular(16),\n            ),\n            child: ScrollablePositionedList.builder(\n              itemCount: historyList.length,\n              itemBuilder: (context, index) => ListTile(\n                contentPadding: const EdgeInsets.fromLTRB(12, 0, 8, 0),\n                visualDensity:\n                    const VisualDensity(horizontal: -4, vertical: -4),\n                leading: Text(\n                  (index + 1).toString(),\n                  style: const TextStyle(\n                    fontSize: 14,\n                  ),\n                  textAlign: TextAlign.center,\n                ),\n                minLeadingWidth: 14,\n                title: Text(\n                  historyList[index].value.file.name,\n                  maxLines: 3,\n                  overflow: TextOverflow.ellipsis,\n                ),\n                subtitle: Row(\n                  children: [\n                    if (historyList[index].value.file.size > 0)\n                      Text(\n                          \"${fileSizeConvert(historyList[index].value.file.size)} MB\"),\n                    const Spacer(),\n                    () {\n                      final Progress? progress = useHistoryStore()\n                          .findById(historyList[index].value.file.getID());\n                      if (progress != null &&\n                          progress.file.type == ContentType.video) {\n                        if ((progress.duration.inMilliseconds -\n                                progress.position.inMilliseconds) <=\n                            5000) {\n                          return Chip(text: '100%');\n                        }\n                        final String progressString =\n                            (progress.position.inMilliseconds /\n                                    progress.duration.inMilliseconds *\n                                    100)\n                                .toStringAsFixed(0);\n                        return Chip(text: '$progressString %');\n                      } else {\n                        return const SizedBox();\n                      }\n                    }(),\n                    ...historyList[index]\n                        .value\n                        .file\n                        .subtitles\n                        .map((subtitle) =>\n                            subtitle.uri.split('.').last.toUpperCase())\n                        .toSet()\n                        .toList()\n                        .map(\n                          (subtitleType) => Row(\n                            mainAxisSize: MainAxisSize.min,\n                            children: [\n                              const SizedBox(width: 4),\n                              Chip(\n                                text: subtitleType,\n                                primary: true,\n                              ),\n                            ],\n                          ),\n                        ),\n                  ],\n                ),\n                trailing: PopupMenuButton<FileOptions>(\n                  clipBehavior: Clip.hardEdge,\n                  constraints: const BoxConstraints(minWidth: 200),\n                  onSelected: (value) async {\n                    switch (value) {\n                      case FileOptions.addToPlayQueue:\n                        usePlayQueueStore()\n                            .add([historyList[index].value.file]);\n                        break;\n                      case FileOptions.remove:\n                        useHistoryStore().remove(historyList[index].value);\n                        break;\n                      case FileOptions.openInFolder:\n                        await openInFolder(\n                            context, historyList[index].value.file);\n                        break;\n                    }\n                  },\n                  itemBuilder: (context) => [\n                    PopupMenuItem(\n                      value: FileOptions.addToPlayQueue,\n                      child: Text(t.add_to_play_queue),\n                    ),\n                    PopupMenuItem(\n                      value: FileOptions.remove,\n                      child: Text(t.remove),\n                    ),\n                    if (historyList[index].value.file.path.isNotEmpty)\n                      PopupMenuItem(\n                        value: FileOptions.openInFolder,\n                        child: Text(t.open_in_folder),\n                      ),\n                  ],\n                ),\n                onTap: () {\n                  play(index);\n                  Navigator.of(context).pop();\n                },\n              ),\n            ),\n          ),\n        ),\n        Divider(\n          color: Theme.of(context).colorScheme.primary.withValues(alpha: 0.25),\n          height: 0,\n        ),\n        Container(\n          padding: const EdgeInsets.fromLTRB(16, 4, 4, 4),\n          child: Row(\n            children: [\n              Text(\n                t.history,\n                style: const TextStyle(fontWeight: FontWeight.w500),\n              ),\n              const Spacer(),\n              IconButton(\n                tooltip: '${t.close} ( Escape )',\n                icon: const Icon(Icons.close_rounded),\n                onPressed: () => Navigator.of(context).pop(),\n              ),\n            ],\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/widgets/popups/play_queue.dart",
    "content": "import 'package:flutter/material.dart' hide Chip;\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:flutter_zustand/flutter_zustand.dart';\nimport 'package:iris/models/file.dart';\nimport 'package:iris/models/progress.dart';\nimport 'package:iris/models/storages/storage.dart';\nimport 'package:iris/store/use_app_store.dart';\nimport 'package:iris/store/use_history_store.dart';\nimport 'package:iris/store/use_play_queue_store.dart';\nimport 'package:iris/utils/file_size_convert.dart';\nimport 'package:iris/utils/get_localizations.dart';\nimport 'package:iris/widgets/chip.dart';\nimport 'package:scrollable_positioned_list/scrollable_positioned_list.dart';\n\nclass PlayQueue extends HookWidget {\n  const PlayQueue({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    final t = getLocalizations(context);\n    final playQueue =\n        usePlayQueueStore().select(context, (state) => state.playQueue);\n    final currentIndex =\n        usePlayQueueStore().select(context, (state) => state.currentIndex);\n\n    final int currentPlayIndex = useMemoized(\n        () => playQueue.indexWhere((element) => element.index == currentIndex),\n        [playQueue, currentIndex]);\n\n    final itemScrollController = useMemoized(() => ItemScrollController(), []);\n    final scrollOffsetController =\n        useMemoized(() => ScrollOffsetController(), []);\n    final itemPositionsListener =\n        useMemoized(() => ItemPositionsListener.create(), []);\n    final scrollOffsetListener =\n        useMemoized(() => ScrollOffsetListener.create(), []);\n\n    useEffect(() {\n      WidgetsBinding.instance.addPostFrameCallback((_) {\n        if (itemScrollController.isAttached && playQueue.isNotEmpty) {\n          itemScrollController.jumpTo(\n              index: currentPlayIndex - 3 < 0 ? 0 : currentPlayIndex - 1);\n        }\n      });\n      return;\n    }, []);\n\n    return Column(\n      children: [\n        Expanded(\n          child: Card(\n            color: Colors.transparent,\n            elevation: 0,\n            shape: RoundedRectangleBorder(\n              borderRadius: BorderRadius.circular(16),\n            ),\n            child: ScrollablePositionedList.builder(\n              itemCount: playQueue.length,\n              itemBuilder: (context, index) => ListTile(\n                autofocus: currentPlayIndex == index,\n                tileColor: currentPlayIndex == index\n                    ? Theme.of(context).hoverColor\n                    : null,\n                contentPadding: const EdgeInsets.fromLTRB(12, 0, 8, 0),\n                visualDensity:\n                    const VisualDensity(horizontal: -4, vertical: -4),\n                leading: Text(\n                  (index + 1).toString(),\n                  style: const TextStyle(\n                    fontSize: 14,\n                  ),\n                  textAlign: TextAlign.center,\n                ),\n                minLeadingWidth: 14,\n                title: Text(\n                  playQueue[index].file.name,\n                  maxLines: 3,\n                  overflow: TextOverflow.ellipsis,\n                  style: currentPlayIndex == index\n                      ? TextStyle(\n                          fontWeight: FontWeight.bold,\n                          color: Theme.of(context).colorScheme.primary,\n                        )\n                      : null,\n                ),\n                subtitle: Row(\n                  children: [\n                    if (playQueue[index].file.size > 0)\n                      Text(\"${fileSizeConvert(playQueue[index].file.size)} MB\",\n                          style: TextStyle(\n                              fontSize: 13,\n                              color: currentPlayIndex == index\n                                  ? Theme.of(context).colorScheme.primary\n                                  : null)),\n                    const Spacer(),\n                    () {\n                      final Progress? progress = useHistoryStore()\n                          .findById(playQueue[index].file.getID());\n                      if (progress != null &&\n                          progress.file.type == ContentType.video) {\n                        if ((progress.duration.inMilliseconds -\n                                progress.position.inMilliseconds) <=\n                            5000) {\n                          return Chip(text: '100%');\n                        }\n                        final String progressString =\n                            (progress.position.inMilliseconds /\n                                    progress.duration.inMilliseconds *\n                                    100)\n                                .toStringAsFixed(0);\n                        return Chip(text: '$progressString %');\n                      } else {\n                        return const SizedBox();\n                      }\n                    }(),\n                    ...playQueue[index]\n                        .file\n                        .subtitles\n                        .map((subtitle) =>\n                            subtitle.uri.split('.').last.toUpperCase())\n                        .toSet()\n                        .toList()\n                        .map(\n                          (subtitleType) => Row(\n                            mainAxisSize: MainAxisSize.min,\n                            children: [\n                              const SizedBox(width: 4),\n                              Chip(\n                                text: subtitleType,\n                                primary: true,\n                              ),\n                            ],\n                          ),\n                        ),\n                  ],\n                ),\n                trailing: PopupMenuButton<FileOptions>(\n                  clipBehavior: Clip.hardEdge,\n                  constraints: const BoxConstraints(minWidth: 200),\n                  onSelected: (value) async {\n                    switch (value) {\n                      case FileOptions.remove:\n                        usePlayQueueStore().remove(playQueue[index]);\n                        break;\n                      case FileOptions.openInFolder:\n                        await openInFolder(context, playQueue[index].file);\n                        break;\n                      default:\n                        break;\n                    }\n                  },\n                  itemBuilder: (context) => [\n                    PopupMenuItem(\n                      value: FileOptions.remove,\n                      child: Text(t.remove),\n                    ),\n                    if (playQueue[index].file.path.isNotEmpty)\n                      PopupMenuItem(\n                        value: FileOptions.openInFolder,\n                        child: Text(t.open_in_folder),\n                      ),\n                  ],\n                ),\n                onTap: () async {\n                  await useAppStore().updateAutoPlay(true);\n                  usePlayQueueStore()\n                      .updateCurrentIndex(playQueue[index].index);\n                  if (context.mounted) {\n                    Navigator.of(context).pop();\n                  }\n                },\n              ),\n              itemScrollController: itemScrollController,\n              scrollOffsetController: scrollOffsetController,\n              itemPositionsListener: itemPositionsListener,\n              scrollOffsetListener: scrollOffsetListener,\n            ),\n          ),\n        ),\n        Divider(\n          color: Theme.of(context).colorScheme.primary.withValues(alpha: 0.25),\n          height: 0,\n        ),\n        Container(\n          padding: const EdgeInsets.fromLTRB(16, 4, 4, 4),\n          child: Row(\n            children: [\n              Text(\n                t.play_queue,\n                style: const TextStyle(fontWeight: FontWeight.w500),\n              ),\n              const Spacer(),\n              IconButton(\n                tooltip: '${t.close} ( Escape )',\n                icon: const Icon(Icons.close_rounded),\n                onPressed: () => Navigator.of(context).pop(),\n              ),\n            ],\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/widgets/popups/settings/about.dart",
    "content": "import 'dart:io';\nimport 'package:iris/utils/platform.dart';\nimport 'package:path/path.dart' as p;\nimport 'package:flutter/material.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:iris/info.dart';\nimport 'package:iris/widgets/dialogs/show_release_dialog.dart';\nimport 'package:iris/utils/get_latest_release.dart';\nimport 'package:iris/utils/get_localizations.dart';\nimport 'package:iris/utils/url.dart';\nimport 'package:package_info_plus/package_info_plus.dart';\n\nbool isMsix() {\n  if (!isWindows) {\n    return false;\n  }\n  String resolvedExecutablePath = Platform.resolvedExecutable;\n  String path = p.dirname(resolvedExecutablePath);\n  String manifestPath = p.join(path, 'AppxManifest.xml');\n  return File(manifestPath).existsSync();\n}\n\nclass About extends HookWidget {\n  const About({super.key});\n\n  static const title = 'About';\n\n  @override\n  Widget build(BuildContext context) {\n    final t = getLocalizations(context);\n    final packageInfo = useState<PackageInfo?>(null);\n    final noNewVersion = useState(false);\n\n    useEffect(() {\n      void getPackageInfo() async =>\n          packageInfo.value = await PackageInfo.fromPlatform();\n\n      getPackageInfo();\n      return null;\n    }, []);\n\n    return SingleChildScrollView(\n      child: Column(\n        children: [\n          ListTile(\n            leading:\n                Image.asset('assets/images/logo.png', width: 24, height: 24),\n            title: const Text(INFO.title),\n            subtitle: Text(t.app_description),\n          ),\n          ListTile(\n            leading: const Icon(Icons.info_rounded),\n            title: Text(t.version),\n            subtitle: Text(\n                packageInfo.value != null ? packageInfo.value!.version : ''),\n            onTap: () => launchURL(\n                '${INFO.githubUrl}/releases/tag/v${packageInfo.value?.version}'),\n          ),\n          ListTile(\n              leading: const Icon(Icons.update_rounded),\n              title: Text(t.check_update),\n              subtitle: noNewVersion.value ? Text(t.no_new_version) : null,\n              onTap: () async {\n                if (isMsix()) {\n                  launchURL(\n                      'ms-windows-store://pdp/?ProductId=${INFO.msStoreId}');\n                  return;\n                }\n                noNewVersion.value = false;\n                final release = await getLatestRelease();\n                if (release != null && context.mounted) {\n                  showReleaseDialog(context, release: release);\n                } else {\n                  noNewVersion.value = true;\n                }\n              }),\n          ListTile(\n            leading: const Icon(Icons.code_rounded),\n            title: Text(t.source_code),\n            subtitle: const Text(INFO.githubUrl),\n            onTap: () => launchURL(INFO.githubUrl),\n          ),\n          ListTile(\n            leading: const Icon(Icons.person_rounded),\n            title: Text(t.author),\n            subtitle: const Text(INFO.author),\n            onTap: () => launchURL(INFO.authorUrl),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/widgets/popups/settings/dependencies.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:iris/oss_licenses.dart';\nimport 'package:iris/utils/url.dart';\n\nclass Dependencies extends HookWidget {\n  const Dependencies({super.key});\n\n  static const title = 'Libraries';\n\n  final dependencies = allDependencies;\n\n  @override\n  Widget build(BuildContext context) {\n    return ListView.builder(\n      padding: EdgeInsets.zero,\n      itemCount: dependencies.length,\n      itemBuilder: (context, index) => ListTile(\n        leading: const Icon(Icons.code_rounded),\n        title: Text(dependencies[index].name),\n        subtitle: Text(\n          dependencies[index].license ?? '',\n          maxLines: 1,\n          overflow: TextOverflow.ellipsis,\n        ),\n        onTap: () => showModalBottomSheet(\n          context: context,\n          // isScrollControlled: true,\n          enableDrag: true,\n          builder: (BuildContext context) {\n            return SingleChildScrollView(\n              child: Padding(\n                padding: const EdgeInsets.all(16),\n                child: Column(children: [\n                  Text(\n                    dependencies[index].name,\n                    style: TextStyle(\n                      fontSize: 20,\n                      fontWeight: FontWeight.bold,\n                      color: Theme.of(context).colorScheme.primary,\n                    ),\n                  ),\n                  const SizedBox(height: 16),\n                  TextButton(\n                    onPressed: () => launchURL(\n                      dependencies[index].homepage != null\n                          ? '${dependencies[index].homepage}'\n                          : '${dependencies[index].repository}',\n                    ),\n                    child: Text(\n                      dependencies[index].homepage != null\n                          ? '${dependencies[index].homepage}'\n                          : '${dependencies[index].repository}',\n                      style: TextStyle(\n                        color: Theme.of(context).colorScheme.primary,\n                        decoration: TextDecoration.underline,\n                      ),\n                    ),\n                  ),\n                  const SizedBox(height: 16),\n                  Text(dependencies[index].license ?? ''),\n                ]),\n              ),\n            );\n          },\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/widgets/popups/settings/general.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:flutter_zustand/flutter_zustand.dart';\nimport 'package:iris/l10n/languages.dart';\nimport 'package:iris/store/use_app_store.dart';\nimport 'package:iris/utils/get_localizations.dart';\nimport 'package:iris/widgets/dialogs/show_language_dialog.dart';\nimport 'package:iris/widgets/dialogs/show_theme_mode_dialog.dart';\n\nclass General extends HookWidget {\n  const General({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    final t = getLocalizations(context);\n\n    final language = useAppStore().select(context, (state) => state.language);\n    final themeMode = useAppStore().select(context, (state) => state.themeMode);\n\n    return SingleChildScrollView(\n      child: Column(\n        children: [\n          ListTile(\n            leading: const Icon(Icons.translate_rounded),\n            title: Text(t.language),\n            subtitle: Text(language == 'system'\n                ? t.system\n                : languages[language] ?? language),\n            onTap: () => showLanguageDialog(context),\n          ),\n          ListTile(\n            leading: Icon(themeMode == ThemeMode.light\n                ? Icons.light_mode_rounded\n                : themeMode == ThemeMode.dark\n                    ? Icons.dark_mode_rounded\n                    : Icons.contrast_rounded),\n            title: Text(t.theme_mode),\n            subtitle: Text(() {\n              switch (themeMode) {\n                case ThemeMode.system:\n                  return t.system;\n                case ThemeMode.light:\n                  return t.light;\n                case ThemeMode.dark:\n                  return t.dark;\n              }\n            }()),\n            onTap: () => showThemeModeDialog(context),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/widgets/popups/settings/play.dart",
    "content": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:flutter_zustand/flutter_zustand.dart';\nimport 'package:iris/models/store/app_state.dart';\nimport 'package:iris/widgets/dialogs/show_orientation_dialog.dart';\nimport 'package:iris/store/use_app_store.dart';\nimport 'package:iris/utils/get_localizations.dart';\nimport 'package:iris/utils/platform.dart';\n\nclass Play extends HookWidget {\n  const Play({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    final t = getLocalizations(context);\n\n    final autoResize =\n        useAppStore().select(context, (state) => state.autoResize);\n    final bool alwaysPlayFromBeginning =\n        useAppStore().select(context, (state) => state.alwaysPlayFromBeginning);\n    final playerBackend =\n        useAppStore().select(context, (state) => state.playerBackend);\n    final orientation =\n        useAppStore().select(context, (state) => state.orientation);\n\n    final orientationMap = {\n      ScreenOrientation.device: t.device,\n      ScreenOrientation.landscape: t.landscape,\n      ScreenOrientation.portrait: t.portrait,\n    };\n\n    return SingleChildScrollView(\n      child: Column(\n        children: [\n          ListTile(\n              leading: const Icon(Icons.settings_input_component_rounded),\n              title: Text(t.player_backend),\n              trailing: DropdownButton<PlayerBackend>(\n                borderRadius: BorderRadius.circular(12),\n                padding: const EdgeInsets.symmetric(horizontal: 8),\n                value: playerBackend,\n                onChanged: (value) {\n                  if (value != null) useAppStore().updatePlayerBackend(value);\n                },\n                items: [\n                  DropdownMenuItem<PlayerBackend>(\n                      value: PlayerBackend.mediaKit, child: Text('Media Kit')),\n                  DropdownMenuItem<PlayerBackend>(\n                      value: PlayerBackend.fvp, child: Text('FVP')),\n                ],\n              )),\n          Visibility(\n            visible: isDesktop,\n            child: ListTile(\n              leading: const Icon(Icons.aspect_ratio_rounded),\n              title: Text(t.auto_resize),\n              onTap: () => useAppStore().toggleAutoResize(),\n              trailing: Checkbox(\n                value: autoResize,\n                onChanged: (_) => useAppStore().toggleAutoResize(),\n              ),\n            ),\n          ),\n          ListTile(\n            leading: const Icon(Icons.restart_alt_rounded),\n            title: Text(t.always_play_from_beginning),\n            subtitle: Text(t.always_play_from_beginning_description),\n            onTap: () => useAppStore().toggleAlwaysPlayFromBeginning(),\n            trailing: Checkbox(\n              value: alwaysPlayFromBeginning,\n              onChanged: (_) => useAppStore().toggleAlwaysPlayFromBeginning(),\n            ),\n          ),\n          if (Platform.isAndroid || Platform.isIOS)\n            ListTile(\n              leading: const Icon(Icons.screen_rotation_rounded),\n              title: Text(t.screen_orientation),\n              subtitle: Text(orientationMap[orientation] ?? orientation.name),\n              onTap: () => showOrientationDialog(context),\n            )\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/widgets/popups/settings/settings.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:iris/widgets/popups/settings/about.dart';\nimport 'package:iris/widgets/popups/settings/general.dart';\nimport 'package:iris/widgets/popups/settings/dependencies.dart';\nimport 'package:iris/widgets/popups/settings/play.dart';\nimport 'package:iris/utils/get_localizations.dart';\n\nclass ITab {\n  final String title;\n  final Widget child;\n\n  const ITab({\n    required this.title,\n    required this.child,\n  });\n}\n\nclass Settings extends HookWidget {\n  const Settings({super.key});\n\n  static const title = 'Settings';\n\n  @override\n  Widget build(BuildContext context) {\n    final t = getLocalizations(context);\n\n    List<ITab> tabs = [\n      ITab(title: t.general, child: const General()),\n      ITab(title: t.play, child: const Play()),\n      ITab(title: t.about, child: const About()),\n      ITab(title: t.dependencies, child: const Dependencies()),\n    ];\n\n    final tabController = useTabController(initialLength: tabs.length);\n\n    return Column(\n      children: [\n        Expanded(\n          child: TabBarView(\n            controller: tabController,\n            children: tabs\n                .map((e) => Card(\n                      color: Colors.transparent,\n                      elevation: 0,\n                      shape: RoundedRectangleBorder(\n                        borderRadius: BorderRadius.circular(16),\n                      ),\n                      child: e.child,\n                    ))\n                .toList(),\n          ),\n        ),\n        Divider(\n          color: Theme.of(context).colorScheme.primary.withValues(alpha: 0.25),\n          height: 0,\n        ),\n        Container(\n          padding: EdgeInsets.zero,\n          child: Container(\n            padding: const EdgeInsets.fromLTRB(0, 0, 4, 0),\n            child: Row(\n              mainAxisAlignment: MainAxisAlignment.start,\n              children: [\n                TabBar(\n                    controller: tabController,\n                    isScrollable: true,\n                    tabAlignment: TabAlignment.start,\n                    dividerColor: Colors.transparent,\n                    tabs: tabs.map((e) => Tab(text: e.title)).toList()),\n                const Spacer(),\n                IconButton(\n                  tooltip: '${t.close} ( Escape )',\n                  icon: const Icon(Icons.close_rounded),\n                  onPressed: () => Navigator.of(context).pop(),\n                ),\n              ],\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/widgets/popups/storages/favorites.dart",
    "content": "import 'package:collection/collection.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:flutter_zustand/flutter_zustand.dart';\nimport 'package:iris/models/storages/local.dart';\nimport 'package:iris/models/storages/storage.dart';\nimport 'package:iris/store/use_storage_store.dart';\nimport 'package:iris/utils/get_localizations.dart';\nimport 'package:path/path.dart' as p;\n\nclass Favorites extends HookWidget {\n  const Favorites({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    final t = getLocalizations(context);\n    final favorites =\n        useStorageStore().select(context, (state) => state.favorites);\n\n    final localStoragesFuture =\n        useMemoized(() async => await getLocalStorages(context), []);\n    final localStorages = useFuture(localStoragesFuture).data ?? [];\n\n    return ListView.builder(\n      padding: EdgeInsets.zero,\n      itemCount: favorites.length,\n      itemBuilder: (context, index) => ListTile(\n        contentPadding: const EdgeInsets.fromLTRB(16, 0, 12, 0),\n        title: Text(favorites[index].path.last),\n        subtitle: () {\n          Storage? storage =\n              useStorageStore().findById(favorites[index].storageId);\n          if (storage == null && favorites[index].storageId == localStorageId) {\n            storage = localStorages.firstWhereOrNull(\n                (element) => element.basePath[0] == favorites[index].path[0]);\n          }\n          if (storage == null) return null;\n          if (storage is LocalStorage) {\n            final subtitle = p.normalize(favorites[index].path.join('/'));\n            if (favorites[index].path.last == subtitle) {\n              return null;\n            }\n            return Text(\n              subtitle,\n              maxLines: 1,\n              style: const TextStyle(overflow: TextOverflow.ellipsis),\n            );\n          } else if (storage is WebDAVStorage) {\n            return Text(\n                'http${storage.https ? 's' : ''}://${storage.host}${storage.port.isNotEmpty && storage.port != '80' && storage.port != '443' ? ':${storage.port}' : ''}${favorites[index].path.join('/')}');\n          } else if (storage is FTPStorage) {\n            return Text(\n                'ftp://${storage.username.isNotEmpty ? '${storage.username}@' : ''}${storage.host}:${storage.port}${favorites[index].path.join('/').replaceFirst('//', '/')}');\n          } else {\n            return null;\n          }\n        }(),\n        onTap: () {\n          Storage? storage =\n              useStorageStore().findById(favorites[index].storageId);\n          if (storage == null && favorites[index].storageId == localStorageId) {\n            storage = localStorages.firstWhereOrNull(\n                (element) => element.basePath[0] == favorites[index].path[0]);\n          }\n          if (storage == null) return;\n          useStorageStore().updateCurrentPath(favorites[index].path);\n          useStorageStore().updateCurrentStorage(storage);\n        },\n        trailing: PopupMenuButton<StorageOptions>(\n          tooltip: t.menu,\n          clipBehavior: Clip.hardEdge,\n          color: Theme.of(context).colorScheme.surface.withAlpha(250),\n          onSelected: (value) {\n            switch (value) {\n              case StorageOptions.remove:\n                useStorageStore().removeFavorite(favorites[index]);\n                break;\n              default:\n                break;\n            }\n          },\n          itemBuilder: (BuildContext context) {\n            return [\n              // PopupMenuItem(\n              //   value: StorageOptions.edit,\n              //   child: Text(t.edit),\n              // ),\n              PopupMenuItem(\n                value: StorageOptions.remove,\n                child: Text(t.remove),\n              ),\n            ];\n          },\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/widgets/popups/storages/files.dart",
    "content": "import 'dart:io';\nimport 'package:collection/collection.dart';\nimport 'package:flutter/material.dart' hide Chip;\nimport 'package:flutter_breadcrumb/flutter_breadcrumb.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:flutter_zustand/flutter_zustand.dart';\nimport 'package:iris/globals.dart' as globals;\nimport 'package:iris/models/file.dart';\nimport 'package:iris/models/progress.dart';\nimport 'package:iris/models/storages/storage.dart';\nimport 'package:iris/models/store/app_state.dart';\nimport 'package:iris/models/store/storage_state.dart';\nimport 'package:iris/store/use_app_store.dart';\nimport 'package:iris/store/use_history_store.dart';\nimport 'package:iris/store/use_play_queue_store.dart';\nimport 'package:iris/store/use_storage_store.dart';\nimport 'package:iris/utils/file_size_convert.dart';\nimport 'package:iris/utils/files_sort.dart';\nimport 'package:iris/utils/get_localizations.dart';\nimport 'package:iris/utils/request_storage_permission.dart';\nimport 'package:iris/widgets/chip.dart';\nimport 'package:scrollable_positioned_list/scrollable_positioned_list.dart';\nimport 'package:permission_handler/permission_handler.dart';\n\nclass Files extends HookWidget {\n  const Files({super.key, required this.storage});\n\n  final Storage storage;\n\n  @override\n  Widget build(BuildContext context) {\n    final t = getLocalizations(context);\n\n    final refreshState = useState(false);\n    void refresh() => refreshState.value = !refreshState.value;\n\n    final sortBy = useAppStore().select(context, (state) => state.sortBy);\n    final sortOrder = useAppStore().select(context, (state) => state.sortOrder);\n    final folderFirst =\n        useAppStore().select(context, (state) => state.folderFirst);\n\n    final favorites =\n        useStorageStore().select(context, (state) => state.favorites);\n    final currentPath =\n        useStorageStore().select(context, (state) => state.currentPath);\n\n    final currentFavorite = useMemoized(\n        () => favorites.firstWhereOrNull((favorite) =>\n            favorite.storageId == storage.id && favorite.path == currentPath),\n        [favorites, currentPath]);\n\n    useEffect(() {\n      if (currentPath.isEmpty) {\n        useStorageStore().updateCurrentPath(storage.basePath);\n      }\n      return null;\n    }, []);\n\n    final getFiles = useMemoized(\n        () async => await storage.getFiles(currentPath),\n        [currentPath, refreshState.value]);\n\n    final result = useFuture(getFiles);\n    final isLoading = useMemoized(\n        () => result.connectionState == ConnectionState.waiting,\n        [result.connectionState]);\n    final isError = result.error != null;\n\n    final filteredFiles = useMemoized(\n        () => (result.data ?? [])\n            .where((file) =>\n                [ContentType.video, ContentType.audio].contains(file.type) ||\n                file.isDir)\n            .toList(),\n        [result.data]);\n\n    final files = useMemoized(\n        () => filesSort(\n              files: filteredFiles,\n              sortBy: sortBy,\n              sortOrder: sortOrder,\n              folderFirst: folderFirst,\n            ),\n        [filteredFiles, sortBy, sortOrder, folderFirst]);\n\n    final itemScrollController = useMemoized(() => ItemScrollController(), []);\n    final scrollOffsetController =\n        useMemoized(() => ScrollOffsetController(), []);\n    final itemPositionsListener =\n        useMemoized(() => ItemPositionsListener.create(), []);\n    final scrollOffsetListener =\n        useMemoized(() => ScrollOffsetListener.create(), []);\n\n    void play(List<FileItem> files, int index) async {\n      final clickedFile = files[index];\n      final List<FileItem> filteredFiles = files\n          .where((file) =>\n              [ContentType.video, ContentType.audio].contains(file.type))\n          .toList();\n\n      final List<PlayQueueItem> playQueue = filteredFiles\n          .asMap()\n          .entries\n          .map((entry) => PlayQueueItem(file: entry.value, index: entry.key))\n          .toList();\n      final newIndex = filteredFiles.indexOf(clickedFile);\n\n      await useAppStore().updateAutoPlay(true);\n      await useAppStore().updateShuffle(false);\n      await usePlayQueueStore().update(playQueue: playQueue, index: newIndex);\n    }\n\n    void back() {\n      if (currentPath.length > storage.basePath.length) {\n        useStorageStore()\n            .updateCurrentPath(currentPath.sublist(0, currentPath.length - 1));\n      } else {\n        useStorageStore().updateCurrentStorage(null);\n        useStorageStore().updateCurrentPath([]);\n      }\n    }\n\n    return Column(\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: [\n        Expanded(\n          child: Platform.isAndroid &&\n                  globals.storagePermissionStatus != PermissionStatus.granted &&\n                  storage is LocalStorage\n              ? Center(\n                  child: ElevatedButton(\n                      onPressed: () async {\n                        await requestStoragePermission();\n                        refresh();\n                      },\n                      child: Text(t.grant_storage_permission)),\n                )\n              : isLoading\n                  ? const Center(child: CircularProgressIndicator())\n                  : isError\n                      ? Center(child: Text(t.unable_to_fetch_files))\n                      : files.isEmpty\n                          ? const Center()\n                          : Card(\n                              color: Colors.transparent,\n                              elevation: 0,\n                              shape: RoundedRectangleBorder(\n                                borderRadius: BorderRadius.circular(16),\n                              ),\n                              child: ScrollablePositionedList.builder(\n                                itemScrollController: itemScrollController,\n                                scrollOffsetController: scrollOffsetController,\n                                itemPositionsListener: itemPositionsListener,\n                                scrollOffsetListener: scrollOffsetListener,\n                                itemCount: files.length,\n                                itemBuilder: (context, index) => ListTile(\n                                  contentPadding:\n                                      const EdgeInsets.fromLTRB(16, 0, 8, 0),\n                                  visualDensity: const VisualDensity(\n                                      horizontal: 0, vertical: -4),\n                                  leading: () {\n                                    if (files[index].isDir == true &&\n                                        files[index].name.isNotEmpty) {\n                                      return const Icon(Icons.folder_rounded);\n                                    }\n                                    switch (files[index].type) {\n                                      case ContentType.video:\n                                        return const Icon(Icons.movie_rounded);\n                                      case ContentType.audio:\n                                        return const Icon(\n                                            Icons.audiotrack_rounded);\n                                      case ContentType.image:\n                                        return const Icon(Icons.image_rounded);\n                                      case ContentType.other:\n                                        return const Icon(\n                                            Icons.file_copy_rounded);\n                                    }\n                                  }(),\n                                  title: Text(\n                                    files[index].name,\n                                    maxLines: 3,\n                                    overflow: TextOverflow.ellipsis,\n                                  ),\n                                  subtitle: Row(\n                                    mainAxisSize: MainAxisSize.min,\n                                    textBaseline: TextBaseline.ideographic,\n                                    children: [\n                                      if (files[index].size != 0)\n                                        Text(\n                                          \"${fileSizeConvert(files[index].size)} MB\",\n                                          style: const TextStyle(\n                                            fontSize: 13,\n                                          ),\n                                        ),\n                                      if (files[index].size != 0)\n                                        const SizedBox(width: 8),\n                                      if (files[index].lastModified != null)\n                                        Expanded(\n                                          child: Text(\n                                            files[index]\n                                                .lastModified\n                                                .toString()\n                                                .split('.')[0],\n                                            style: TextStyle(\n                                              fontSize: 13,\n                                              color: Theme.of(context)\n                                                  .colorScheme\n                                                  .onSurfaceVariant\n                                                  .withValues(alpha: 0.8),\n                                              fontWeight: FontWeight.w400,\n                                              overflow: TextOverflow.ellipsis,\n                                            ),\n                                          ),\n                                        ),\n                                      if (files[index].size != 0)\n                                        const SizedBox(width: 8),\n                                      () {\n                                        final Progress? progress =\n                                            useHistoryStore()\n                                                .findById(files[index].getID());\n                                        if (progress != null &&\n                                            progress.file.type ==\n                                                ContentType.video) {\n                                          if ((progress\n                                                      .duration.inMilliseconds -\n                                                  progress.position\n                                                      .inMilliseconds) <=\n                                              5000) {\n                                            return Chip(text: '100%');\n                                          }\n                                          final String progressString =\n                                              (progress.position\n                                                          .inMilliseconds /\n                                                      progress.duration\n                                                          .inMilliseconds *\n                                                      100)\n                                                  .toStringAsFixed(0);\n                                          return Chip(\n                                              text: '$progressString %');\n                                        } else {\n                                          return const SizedBox();\n                                        }\n                                      }(),\n                                      ...files[index]\n                                          .subtitles\n                                          .map((subtitle) => subtitle.uri\n                                              .split('.')\n                                              .last\n                                              .toUpperCase())\n                                          .toSet()\n                                          .toList()\n                                          .map(\n                                            (subtitleType) => Row(\n                                              mainAxisSize: MainAxisSize.min,\n                                              children: [\n                                                const SizedBox(width: 4),\n                                                Chip(\n                                                  text: subtitleType,\n                                                  primary: true,\n                                                ),\n                                              ],\n                                            ),\n                                          ),\n                                    ],\n                                  ),\n                                  trailing: files[index].type ==\n                                              ContentType.video ||\n                                          files[index].type == ContentType.audio\n                                      ? PopupMenuButton<FileOptions>(\n                                          clipBehavior: Clip.hardEdge,\n                                          constraints: const BoxConstraints(\n                                              minWidth: 200),\n                                          onSelected: (value) async {\n                                            switch (value) {\n                                              case FileOptions.addToPlayQueue:\n                                                usePlayQueueStore()\n                                                    .add([files[index]]);\n                                                break;\n                                              default:\n                                                break;\n                                            }\n                                          },\n                                          itemBuilder: (context) => [\n                                            PopupMenuItem(\n                                              value: FileOptions.addToPlayQueue,\n                                              child: Text(t.add_to_play_queue),\n                                            ),\n                                          ],\n                                        )\n                                      : null,\n                                  onTap: () {\n                                    if (files[index].isDir == true &&\n                                        files[index].name.isNotEmpty) {\n                                      useStorageStore().updateCurrentPath(\n                                          [...currentPath, files[index].name]);\n                                    } else {\n                                      if (files[index].type ==\n                                              ContentType.video ||\n                                          files[index].type ==\n                                              ContentType.audio) {\n                                        play(files, index);\n                                        Navigator.pop(context);\n                                      }\n                                    }\n                                  },\n                                ),\n                              ),\n                            ),\n        ),\n        Container(\n          padding: const EdgeInsets.fromLTRB(8, 4, 8, 4),\n          child: BreadCrumb.builder(\n            itemCount: currentPath.length,\n            overflow: Platform.isAndroid || Platform.isIOS\n                ? ScrollableOverflow(reverse: true)\n                : const WrapOverflow(),\n            builder: (index) {\n              return BreadCrumbItem(\n                content: TextButton(\n                  child: Text([\n                    storage.basePath.length > 1\n                        ? currentPath.first\n                        : storage.name,\n                    ...currentPath.sublist(1),\n                  ][index]),\n                  onPressed: () {\n                    useStorageStore()\n                        .updateCurrentPath(currentPath.sublist(0, index + 1));\n                  },\n                ),\n              );\n            },\n            divider: Icon(\n              Icons.chevron_right_rounded,\n              color:\n                  Theme.of(context).colorScheme.onSurfaceVariant.withAlpha(222),\n            ),\n          ),\n        ),\n        Divider(\n          color: Theme.of(context).colorScheme.primary.withValues(alpha: 0.25),\n          height: 0,\n        ),\n        Container(\n          padding: const EdgeInsets.fromLTRB(4, 4, 4, 4),\n          child: Row(\n            children: [\n              IconButton(\n                tooltip: t.back,\n                icon: const Icon(Icons.arrow_back_rounded),\n                onPressed: back,\n              ),\n              IconButton(\n                tooltip: t.home,\n                icon: const Icon(Icons.home_rounded),\n                onPressed: () {\n                  useStorageStore().updateCurrentStorage(null);\n                  useStorageStore().updateCurrentPath([]);\n                },\n              ),\n              IconButton(\n                tooltip: t.refresh,\n                icon: const Icon(Icons.refresh),\n                onPressed: refresh,\n              ),\n              PopupMenuButton(\n                tooltip: t.sort,\n                icon: const Icon(Icons.sort_rounded),\n                clipBehavior: Clip.hardEdge,\n                constraints: const BoxConstraints(minWidth: 200),\n                itemBuilder: (context) => [\n                  PopupMenuItem(\n                    child: ListTile(\n                      mouseCursor: SystemMouseCursors.click,\n                      title: Text(t.name),\n                      trailing: sortBy == SortBy.name\n                          ? Icon(sortOrder == SortOrder.asc\n                              ? Icons.arrow_upward_rounded\n                              : Icons.arrow_downward_rounded)\n                          : null,\n                    ),\n                    onTap: () {\n                      useAppStore().updateSortBy(SortBy.name);\n                      useAppStore().updateSortOrder(\n                          sortOrder == SortOrder.desc || sortBy != SortBy.name\n                              ? SortOrder.asc\n                              : SortOrder.desc);\n                    },\n                  ),\n                  PopupMenuItem(\n                    child: ListTile(\n                      mouseCursor: SystemMouseCursors.click,\n                      title: Text(t.size),\n                      trailing: sortBy == SortBy.size\n                          ? Icon(sortOrder == SortOrder.asc\n                              ? Icons.arrow_upward_rounded\n                              : Icons.arrow_downward_rounded)\n                          : null,\n                    ),\n                    onTap: () {\n                      useAppStore().updateSortBy(SortBy.size);\n                      useAppStore().updateSortOrder(\n                          sortOrder == SortOrder.asc || sortBy != SortBy.size\n                              ? SortOrder.desc\n                              : SortOrder.asc);\n                    },\n                  ),\n                  PopupMenuItem(\n                    child: ListTile(\n                      mouseCursor: SystemMouseCursors.click,\n                      title: Text(t.last_modified),\n                      trailing: sortBy == SortBy.lastModified\n                          ? Icon(sortOrder == SortOrder.asc\n                              ? Icons.arrow_upward_rounded\n                              : Icons.arrow_downward_rounded)\n                          : null,\n                    ),\n                    onTap: () {\n                      useAppStore().updateSortBy(SortBy.lastModified);\n                      useAppStore().updateSortOrder(\n                          sortOrder == SortOrder.asc ||\n                                  sortBy != SortBy.lastModified\n                              ? SortOrder.desc\n                              : SortOrder.asc);\n                    },\n                  ),\n                  PopupMenuItem(\n                    child: ListTile(\n                      mouseCursor: SystemMouseCursors.click,\n                      title: Text(t.folder_first),\n                      trailing: Checkbox(\n                          value: folderFirst,\n                          onChanged: (_) {\n                            useAppStore().updateFolderFirst(!folderFirst);\n                            Navigator.pop(context);\n                          }),\n                    ),\n                    onTap: () => useAppStore().updateFolderFirst(!folderFirst),\n                  ),\n                ],\n              ),\n              IconButton(\n                tooltip: currentFavorite != null\n                    ? t.remove_favorite\n                    : t.add_favorite,\n                icon: Icon(currentFavorite != null\n                    ? Icons.star_rounded\n                    : Icons.star_outline_rounded),\n                onPressed: () {\n                  if (currentFavorite != null) {\n                    useStorageStore().removeFavorite(currentFavorite);\n                  } else {\n                    useStorageStore().addFavorite(\n                      Favorite(storageId: storage.id, path: currentPath),\n                    );\n                  }\n                },\n              ),\n              const SizedBox(width: 8),\n              Expanded(\n                child: Text(\n                  currentPath.length > 1\n                      ? currentPath.last\n                      : storage.basePath.length > 1\n                          ? currentPath.first\n                          : storage.name,\n                  maxLines: 1,\n                  style: const TextStyle(\n                    fontWeight: FontWeight.w500,\n                    overflow: TextOverflow.ellipsis,\n                  ),\n                ),\n              ),\n              const SizedBox(width: 4),\n              IconButton(\n                tooltip: '${t.close} ( Escape )',\n                icon: const Icon(Icons.close_rounded),\n                onPressed: () => Navigator.of(context).pop(),\n              ),\n            ],\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/widgets/popups/storages/storages.dart",
    "content": "import 'package:file_picker/file_picker.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:flutter_zustand/flutter_zustand.dart';\nimport 'package:iris/models/storages/storage.dart';\nimport 'package:iris/widgets/popups/storages/favorites.dart';\nimport 'package:iris/widgets/popups/storages/files.dart';\nimport 'package:iris/store/use_storage_store.dart';\nimport 'package:iris/utils/get_localizations.dart';\nimport 'package:iris/utils/path_conv.dart';\nimport 'package:iris/widgets/dialogs/show_folder_dialog.dart';\nimport 'package:iris/widgets/dialogs/show_ftp_dialog.dart';\nimport 'package:iris/widgets/dialogs/show_webdav_dialog.dart';\nimport 'package:iris/widgets/popups/storages/storages_list.dart';\nimport 'package:iris/utils/platform.dart';\nimport 'package:saf_util/saf_util.dart';\n\nclass ITab {\n  final String title;\n  final Widget child;\n\n  const ITab({\n    required this.title,\n    required this.child,\n  });\n}\n\nclass Storages extends HookWidget {\n  const Storages({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    final t = getLocalizations(context);\n    final currentStorage =\n        useStorageStore().select(context, (state) => state.currentStorage);\n\n    List<ITab> tabs = [\n      ITab(title: t.storage, child: const StoragesList()),\n      ITab(title: t.favorites, child: const Favorites()),\n    ];\n\n    final tabController = useTabController(initialLength: tabs.length);\n\n    return currentStorage != null\n        ? Files(storage: currentStorage)\n        : Column(\n            children: [\n              Expanded(\n                child: TabBarView(\n                  controller: tabController,\n                  children: tabs\n                      .map((tab) => Card(\n                          color: Colors.transparent,\n                          elevation: 0,\n                          shape: RoundedRectangleBorder(\n                            borderRadius: BorderRadius.circular(16),\n                          ),\n                          child: tab.child))\n                      .toList(),\n                ),\n              ),\n              Divider(\n                color: Theme.of(context)\n                    .colorScheme\n                    .primary\n                    .withValues(alpha: 0.25),\n                height: 0,\n              ),\n              Container(\n                padding: const EdgeInsets.fromLTRB(0, 0, 4, 0),\n                child: Row(\n                  mainAxisAlignment: MainAxisAlignment.end,\n                  children: [\n                    Expanded(\n                      child: TabBar(\n                        controller: tabController,\n                        isScrollable: true,\n                        tabAlignment: TabAlignment.start,\n                        dividerColor: Colors.transparent,\n                        tabs: tabs.map((tab) => Tab(text: tab.title)).toList(),\n                      ),\n                    ),\n                    PopupMenuButton<StorageType>(\n                      tooltip: t.add_storage,\n                      icon: const Icon(Icons.add_rounded),\n                      iconColor: Theme.of(context).colorScheme.onSurfaceVariant,\n                      clipBehavior: Clip.hardEdge,\n                      color:\n                          Theme.of(context).colorScheme.surface.withAlpha(250),\n                      onSelected: (StorageType value) {\n                        switch (value) {\n                          case StorageType.internal:\n                          case StorageType.network:\n                          case StorageType.usb:\n                          case StorageType.sdcard:\n                            () async {\n                              if (isAndroid) {\n                                final dir = await SafUtil().pickDirectory(\n                                  persistablePermission: true,\n                                );\n                                if (dir != null && context.mounted) {\n                                  showFolderDialog(\n                                    context,\n                                    storage: LocalStorage(\n                                      type: value,\n                                      name: dir.name,\n                                      basePath: [dir.uri],\n                                    ),\n                                  );\n                                }\n                              } else {\n                                String? selectedDirectory = await FilePicker\n                                    .platform\n                                    .getDirectoryPath();\n\n                                if (selectedDirectory != null &&\n                                    context.mounted) {\n                                  showFolderDialog(\n                                    context,\n                                    storage: LocalStorage(\n                                      type: value,\n                                      name: pathConv(selectedDirectory).last,\n                                      basePath: pathConv(selectedDirectory),\n                                    ),\n                                  );\n                                }\n                              }\n                            }();\n                            break;\n                          case StorageType.webdav:\n                            showWebDAVDialog(context);\n                            break;\n                          case StorageType.ftp:\n                            showFTPDialog(context);\n                            break;\n                          case StorageType.none:\n                            break;\n                        }\n                      },\n                      itemBuilder: (BuildContext context) {\n                        return [\n                          PopupMenuItem<StorageType>(\n                            value: StorageType.internal,\n                            child: Text(t.folder),\n                          ),\n                          const PopupMenuItem<StorageType>(\n                            value: StorageType.webdav,\n                            child: Text('WebDAV'),\n                          ),\n                          PopupMenuItem<StorageType>(\n                            value: StorageType.ftp,\n                            child: Text('FTP'),\n                          ),\n                        ];\n                      },\n                    ),\n                    IconButton(\n                      tooltip: '${t.close} ( Escape )',\n                      icon: const Icon(Icons.close_rounded),\n                      onPressed: () => Navigator.of(context).pop(),\n                    ),\n                  ],\n                ),\n              ),\n            ],\n          );\n  }\n}\n"
  },
  {
    "path": "lib/widgets/popups/storages/storages_list.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:flutter_zustand/flutter_zustand.dart';\nimport 'package:iris/models/storages/local.dart';\nimport 'package:iris/models/storages/storage.dart';\nimport 'package:iris/widgets/dialogs/show_folder_dialog.dart';\nimport 'package:iris/store/use_storage_store.dart';\nimport 'package:iris/utils/get_localizations.dart';\nimport 'package:iris/widgets/dialogs/show_ftp_dialog.dart';\nimport 'package:iris/widgets/dialogs/show_webdav_dialog.dart';\nimport 'package:path/path.dart' as p;\n\nclass StoragesList extends HookWidget {\n  const StoragesList({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    final t = getLocalizations(context);\n\n    final localStoragesFuture =\n        useMemoized(() async => await getLocalStorages(context), []);\n    final localStorages = useFuture(localStoragesFuture).data ?? [];\n\n    final storages =\n        useStorageStore().select(context, (state) => state.storages);\n\n    final allStorages = useMemoized(\n        () => [\n              ...localStorages,\n              ...storages,\n            ],\n        [localStorages, storages]);\n\n    return ListView.builder(\n      padding: EdgeInsets.zero,\n      itemCount: allStorages.length,\n      itemBuilder: (context, index) => ListTile(\n        contentPadding: const EdgeInsets.fromLTRB(16, 0, 12, 0),\n        title: Text(allStorages[index].name),\n        subtitle:\n            allStorages[index].name.contains(allStorages[index].basePath[0])\n                ? null\n                : () {\n                    String? subtitle;\n\n                    switch (allStorages[index].type) {\n                      case StorageType.internal:\n                      case StorageType.network:\n                      case StorageType.usb:\n                      case StorageType.sdcard:\n                        subtitle =\n                            p.normalize(allStorages[index].basePath.join('/'));\n                        break;\n                      case StorageType.webdav:\n                        final storage = allStorages[index] as WebDAVStorage;\n                        subtitle =\n                            'http${storage.https ? 's' : ''}://${storage.host}${storage.port.isNotEmpty && storage.port != '80' && storage.port != '443' ? ':${storage.port}' : ''}${storage.basePath.join('/')}';\n                        break;\n                      case StorageType.ftp:\n                        final storage = allStorages[index] as FTPStorage;\n                        subtitle =\n                            'ftp://${storage.username.isNotEmpty ? '${storage.username}@' : ''}${storage.host}:${storage.port}${storage.basePath.join('/')}';\n                        break;\n                      case StorageType.none:\n                        break;\n                    }\n\n                    return subtitle == null\n                        ? null\n                        : Text(\n                            subtitle,\n                            overflow: TextOverflow.ellipsis,\n                          );\n                  }(),\n        onTap: () {\n          useStorageStore().updateCurrentPath(allStorages[index].basePath);\n          useStorageStore().updateCurrentStorage(allStorages[index]);\n        },\n        trailing: localStorages.contains(allStorages[index])\n            ? null\n            : PopupMenuButton<StorageOptions>(\n                tooltip: t.menu,\n                clipBehavior: Clip.hardEdge,\n                color: Theme.of(context).colorScheme.surface.withAlpha(250),\n                onSelected: (value) {\n                  switch (value) {\n                    case StorageOptions.edit:\n                      switch (allStorages[index].type) {\n                        case StorageType.internal:\n                        case StorageType.network:\n                        case StorageType.usb:\n                        case StorageType.sdcard:\n                          showFolderDialog(context,\n                              storage: allStorages[index] as LocalStorage);\n                          break;\n                        case StorageType.webdav:\n                          showWebDAVDialog(context,\n                              storage: allStorages[index] as WebDAVStorage);\n                          break;\n                        case StorageType.ftp:\n                          showFTPDialog(context,\n                              storage: allStorages[index] as FTPStorage);\n                          break;\n                        case StorageType.none:\n                          break;\n                      }\n                      break;\n                    case StorageOptions.remove:\n                      useStorageStore().removeStorage(allStorages[index]);\n                      break;\n                  }\n                },\n                itemBuilder: (BuildContext context) {\n                  return [\n                    PopupMenuItem(\n                      value: StorageOptions.edit,\n                      child: Text(t.edit),\n                    ),\n                    PopupMenuItem(\n                      value: StorageOptions.remove,\n                      child: Text(t.remove),\n                    ),\n                  ];\n                },\n              ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/widgets/popups/track/audio_track_list.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:fvp/fvp.dart';\nimport 'package:iris/models/player.dart';\nimport 'package:iris/utils/get_localizations.dart';\nimport 'package:iris/utils/logger.dart';\nimport 'package:media_kit/media_kit.dart';\nimport 'package:provider/provider.dart';\n\nclass AudioTrackList extends HookWidget {\n  const AudioTrackList({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    final t = getLocalizations(context);\n\n    final player = context.read<MediaPlayer>();\n\n    final focusNode = useFocusNode();\n\n    useEffect(() {\n      focusNode.requestFocus();\n      return () => focusNode.unfocus();\n    }, []);\n\n    if (player is MediaKitPlayer) {\n      return ListView(\n        children: [\n          ...player.audios.map(\n            (audio) => ListTile(\n              focusNode: player.audio == audio ? focusNode : null,\n              title: Text(\n                audio == AudioTrack.auto()\n                    ? t.auto\n                    : audio == AudioTrack.no()\n                        ? t.off\n                        : audio.title ?? audio.language ?? audio.id,\n                style: player.audio == audio\n                    ? TextStyle(\n                        fontWeight: FontWeight.bold,\n                        color: Theme.of(context).colorScheme.primary,\n                      )\n                    : TextStyle(\n                        color: Theme.of(context).colorScheme.onSurfaceVariant,\n                      ),\n              ),\n              tileColor:\n                  player.audio == audio ? Theme.of(context).hoverColor : null,\n              onTap: () {\n                logger(\n                    'Set audio track: ${audio.title ?? audio.language ?? audio.id}');\n                player.player.setAudioTrack(audio);\n                Navigator.of(context).pop();\n              },\n            ),\n          ),\n        ],\n      );\n    }\n\n    if (player is FvpPlayer) {\n      final audios = player.controller.getMediaInfo()?.audio ?? [];\n      final activeAudioTracks = player.controller.getActiveAudioTracks() ?? [];\n      return ListView(\n        children: [\n          ListTile(\n            focusNode: activeAudioTracks.isEmpty ? focusNode : null,\n            title: Text(\n              t.off,\n              style: activeAudioTracks.isEmpty\n                  ? TextStyle(\n                      fontWeight: FontWeight.bold,\n                      color: Theme.of(context).colorScheme.primary,\n                    )\n                  : TextStyle(\n                      color: Theme.of(context).colorScheme.onSurfaceVariant,\n                    ),\n            ),\n            tileColor:\n                activeAudioTracks.isEmpty ? Theme.of(context).hoverColor : null,\n            onTap: () {\n              logger('Set audio track: ${t.off}');\n              player.controller.setAudioTracks([]);\n              Navigator.of(context).pop();\n            },\n          ),\n          ...audios.map(\n            (audio) => ListTile(\n              focusNode: activeAudioTracks.contains(audios.indexOf(audio))\n                  ? focusNode\n                  : null,\n              title: Text(\n                audio.metadata['title'] ??\n                    audio.metadata['language'] ??\n                    audios.indexOf(audio).toString(),\n                style: activeAudioTracks.contains(audios.indexOf(audio))\n                    ? TextStyle(\n                        fontWeight: FontWeight.bold,\n                        color: Theme.of(context).colorScheme.primary,\n                      )\n                    : TextStyle(\n                        color: Theme.of(context).colorScheme.onSurfaceVariant,\n                      ),\n              ),\n              tileColor: activeAudioTracks.contains(audios.indexOf(audio))\n                  ? Theme.of(context).hoverColor\n                  : null,\n              onTap: () {\n                logger(\n                    'Set audio track: ${audio.metadata['title'] ?? audio.metadata['language'] ?? audios.indexOf(audio).toString()}');\n                player.controller.setAudioTracks([audios.indexOf(audio)]);\n                Navigator.of(context).pop();\n              },\n            ),\n          ),\n        ],\n      );\n    }\n\n    return Container();\n  }\n}\n"
  },
  {
    "path": "lib/widgets/popups/track/subtitle_and_audio_track.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:iris/widgets/popups/track/audio_track_list.dart';\nimport 'package:iris/widgets/popups/track/subtitle_list.dart';\nimport 'package:iris/utils/get_localizations.dart';\n\nclass ITab {\n  final String title;\n  final Widget child;\n\n  const ITab({\n    required this.title,\n    required this.child,\n  });\n}\n\nclass SubtitleAndAudioTrack extends HookWidget {\n  const SubtitleAndAudioTrack({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    final t = getLocalizations(context);\n\n    List<ITab> tabs = [\n      ITab(title: t.subtitle, child: SubtitleList()),\n      ITab(title: t.audio_track, child: AudioTrackList()),\n    ];\n\n    final tabController = useTabController(initialLength: tabs.length);\n\n    return Column(\n      mainAxisSize: MainAxisSize.min,\n      children: [\n        Expanded(\n          child: TabBarView(\n            controller: tabController,\n            children: tabs\n                .map((e) => Card(\n                      color: Colors.transparent,\n                      elevation: 0,\n                      shape: RoundedRectangleBorder(\n                        borderRadius: BorderRadius.circular(16),\n                      ),\n                      child: e.child,\n                    ))\n                .toList(),\n          ),\n        ),\n        Divider(\n          color: Theme.of(context).colorScheme.primary.withValues(alpha: 0.25),\n          height: 0,\n        ),\n        Container(\n          padding: EdgeInsets.zero,\n          child: Container(\n            padding: const EdgeInsets.fromLTRB(0, 0, 4, 0),\n            child: Row(\n              mainAxisAlignment: MainAxisAlignment.start,\n              children: [\n                TabBar(\n                    controller: tabController,\n                    isScrollable: true,\n                    tabAlignment: TabAlignment.start,\n                    dividerColor: Colors.transparent,\n                    tabs: tabs.map((tab) => Tab(text: tab.title)).toList()),\n                const Spacer(),\n                IconButton(\n                  tooltip: '${t.close} ( Escape )',\n                  icon: const Icon(Icons.close_rounded),\n                  onPressed: () => Navigator.of(context).pop(),\n                ),\n              ],\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/widgets/popups/track/subtitle_list.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_hooks/flutter_hooks.dart';\nimport 'package:flutter_zustand/flutter_zustand.dart';\nimport 'package:fvp/fvp.dart';\nimport 'package:iris/models/file.dart';\nimport 'package:iris/models/player.dart';\nimport 'package:iris/models/storages/storage.dart';\nimport 'package:iris/store/use_play_queue_store.dart';\nimport 'package:iris/utils/get_localizations.dart';\nimport 'package:iris/utils/logger.dart';\nimport 'package:media_kit/media_kit.dart';\nimport 'package:media_stream/media_stream.dart';\nimport 'package:provider/provider.dart';\n\nclass SubtitleList extends HookWidget {\n  const SubtitleList({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    final t = getLocalizations(context);\n    final focusNode = useFocusNode();\n\n    final player = context.watch<MediaPlayer>();\n\n    final playQueue =\n        usePlayQueueStore().select(context, (state) => state.playQueue);\n    final currentIndex =\n        usePlayQueueStore().select(context, (state) => state.currentIndex);\n\n    final int currentPlayIndex = useMemoized(\n        () => playQueue.indexWhere((element) => element.index == currentIndex),\n        [playQueue, currentIndex]);\n\n    final file = useMemoized(\n        () => playQueue.isEmpty || currentPlayIndex < 0\n            ? null\n            : playQueue[currentPlayIndex].file,\n        [playQueue, currentPlayIndex]);\n\n    useEffect(() {\n      focusNode.requestFocus();\n      return focusNode.unfocus;\n    }, []);\n\n    if (player is MediaKitPlayer) {\n      final activeSubtitle = context.select<MediaPlayer, SubtitleTrack>(\n          (p) => p is MediaKitPlayer ? p.subtitle : SubtitleTrack.no());\n      final subtitles = context.select<MediaPlayer, List<SubtitleTrack>>(\n          (p) => p is MediaKitPlayer ? p.subtitles : []);\n      final externalSubtitles = context.select<MediaPlayer, List<Subtitle>>(\n          (p) => p is MediaKitPlayer ? p.externalSubtitles : []);\n\n      return ListView(\n        children: [\n          ...subtitles.map((subtitle) {\n            final bool isActive = activeSubtitle == subtitle;\n            return ListTile(\n              focusNode: isActive ? focusNode : null,\n              title: Text(\n                subtitle == SubtitleTrack.no()\n                    ? t.off\n                    : subtitle.title ?? subtitle.language ?? subtitle.id,\n                style: isActive\n                    ? TextStyle(\n                        fontWeight: FontWeight.bold,\n                        color: Theme.of(context).colorScheme.primary)\n                    : TextStyle(\n                        color: Theme.of(context).colorScheme.onSurfaceVariant),\n              ),\n              tileColor: isActive ? Theme.of(context).hoverColor : null,\n              onTap: () {\n                logger('Set subtitle: ${subtitle.id}');\n                player.player.setSubtitleTrack(subtitle);\n                Navigator.of(context).pop();\n              },\n            );\n          }),\n          ...externalSubtitles.map((subtitle) {\n            return ListTile(\n              title: Text(subtitle.name,\n                  style: TextStyle(\n                      color: Theme.of(context).colorScheme.onSurfaceVariant)),\n              onTap: () {\n                logger('Set external subtitle: $subtitle');\n                final mediaStream = MediaStream();\n                final uri = file?.storageType == StorageType.ftp\n                    ? '${mediaStream.url}/${subtitle.uri}'\n                    : subtitle.uri;\n                player.player.setSubtitleTrack(\n                    SubtitleTrack.uri(uri, title: subtitle.name));\n                Navigator.of(context).pop();\n              },\n            );\n          }),\n        ],\n      );\n    }\n\n    if (player is FvpPlayer) {\n      final activeSubtitles = useListenableSelector(player.controller,\n          () => player.controller.getActiveSubtitleTracks() ?? []);\n      final externalSubtitleIndex = useValueListenable(player.externalSubtitle);\n\n      final subtitles = player.controller.getMediaInfo()?.subtitle ?? [];\n      final externalSubtitles = player.externalSubtitles;\n\n      return ListView(\n        children: [\n          ListTile(\n            selected: externalSubtitleIndex == null && activeSubtitles.isEmpty,\n            focusNode: externalSubtitleIndex == null && activeSubtitles.isEmpty\n                ? focusNode\n                : null,\n            title: Text(t.off),\n            onTap: () {\n              logger('Set subtitle: ${t.off}');\n              player.externalSubtitle.value = null;\n              player.controller.setSubtitleTracks([]);\n              Navigator.of(context).pop();\n            },\n          ),\n          ...subtitles.map((subtitle) {\n            final int index = subtitles.indexOf(subtitle);\n            final bool isActive = externalSubtitleIndex == null &&\n                activeSubtitles.contains(index);\n            return ListTile(\n              selected: isActive,\n              focusNode: isActive ? focusNode : null,\n              title: Text(subtitle.metadata['title'] ??\n                  subtitle.metadata['language'] ??\n                  subtitle.index.toString()),\n              onTap: () {\n                player.externalSubtitle.value = null;\n                player.controller.setSubtitleTracks([index]);\n                Navigator.of(context).pop();\n              },\n            );\n          }),\n          ...externalSubtitles.map((subtitle) {\n            final int index = externalSubtitles.indexOf(subtitle);\n            final bool isActive = externalSubtitleIndex == index;\n            return ListTile(\n              selected: isActive,\n              focusNode: isActive ? focusNode : null,\n              title: Text(subtitle.name),\n              onTap: () {\n                player.externalSubtitle.value = index;\n                Navigator.of(context).pop();\n              },\n            );\n          }),\n        ],\n      );\n    }\n\n    return Container();\n  }\n}\n"
  },
  {
    "path": "linux/.gitignore",
    "content": "flutter/ephemeral\n"
  },
  {
    "path": "linux/CMakeLists.txt",
    "content": "# Project-level configuration.\ncmake_minimum_required(VERSION 3.10)\nproject(runner LANGUAGES CXX)\n\n# The name of the executable created for the application. Change this to change\n# the on-disk name of your application.\nset(BINARY_NAME \"iris\")\n# The unique GTK application identifier for this application. See:\n# https://wiki.gnome.org/HowDoI/ChooseApplicationID\nset(APPLICATION_ID \"nini22p.iris\")\n\n# Explicitly opt in to modern CMake behaviors to avoid warnings with recent\n# versions of CMake.\ncmake_policy(SET CMP0063 NEW)\n\n# Load bundled libraries from the lib/ directory relative to the binary.\nset(CMAKE_INSTALL_RPATH \"$ORIGIN/lib\")\n\n# Root filesystem for cross-building.\nif(FLUTTER_TARGET_PLATFORM_SYSROOT)\n  set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT})\n  set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})\n  set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)\n  set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)\n  set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)\n  set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)\nendif()\n\n# Define build configuration options.\nif(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)\n  set(CMAKE_BUILD_TYPE \"Debug\" CACHE\n    STRING \"Flutter build mode\" FORCE)\n  set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS\n    \"Debug\" \"Profile\" \"Release\")\nendif()\n\n# Compilation settings that should be applied to most targets.\n#\n# Be cautious about adding new options here, as plugins use this function by\n# default. In most cases, you should add new options to specific targets instead\n# of modifying this function.\nfunction(APPLY_STANDARD_SETTINGS TARGET)\n  target_compile_features(${TARGET} PUBLIC cxx_std_14)\n  target_compile_options(${TARGET} PRIVATE -Wall -Werror)\n  target_compile_options(${TARGET} PRIVATE \"$<$<NOT:$<CONFIG:Debug>>:-O3>\")\n  target_compile_definitions(${TARGET} PRIVATE \"$<$<NOT:$<CONFIG:Debug>>:NDEBUG>\")\nendfunction()\n\n# Flutter library and tool build rules.\nset(FLUTTER_MANAGED_DIR \"${CMAKE_CURRENT_SOURCE_DIR}/flutter\")\nadd_subdirectory(${FLUTTER_MANAGED_DIR})\n\n# System-level dependencies.\nfind_package(PkgConfig REQUIRED)\npkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0)\n\nadd_definitions(-DAPPLICATION_ID=\"${APPLICATION_ID}\")\n\n# Define the application target. To change its name, change BINARY_NAME above,\n# not the value here, or `flutter run` will no longer work.\n#\n# Any new source files that you add to the application should be added here.\nadd_executable(${BINARY_NAME}\n  \"main.cc\"\n  \"my_application.cc\"\n  \"${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc\"\n)\n\n# Apply the standard set of build settings. This can be removed for applications\n# that need different build settings.\napply_standard_settings(${BINARY_NAME})\n\n# Add dependency libraries. Add any application-specific dependencies here.\ntarget_link_libraries(${BINARY_NAME} PRIVATE flutter)\ntarget_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK)\n\n# Run the Flutter tool portions of the build. This must not be removed.\nadd_dependencies(${BINARY_NAME} flutter_assemble)\n\n# Only the install-generated bundle's copy of the executable will launch\n# correctly, since the resources must in the right relative locations. To avoid\n# people trying to run the unbundled copy, put it in a subdirectory instead of\n# the default top-level location.\nset_target_properties(${BINARY_NAME}\n  PROPERTIES\n  RUNTIME_OUTPUT_DIRECTORY \"${CMAKE_BINARY_DIR}/intermediates_do_not_run\"\n)\n\n\n# Generated plugin build rules, which manage building the plugins and adding\n# them to the application.\ninclude(flutter/generated_plugins.cmake)\n\n\n# === Installation ===\n# By default, \"installing\" just makes a relocatable bundle in the build\n# directory.\nset(BUILD_BUNDLE_DIR \"${PROJECT_BINARY_DIR}/bundle\")\nif(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)\n  set(CMAKE_INSTALL_PREFIX \"${BUILD_BUNDLE_DIR}\" CACHE PATH \"...\" FORCE)\nendif()\n\n# Start with a clean build bundle directory every time.\ninstall(CODE \"\n  file(REMOVE_RECURSE \\\"${BUILD_BUNDLE_DIR}/\\\")\n  \" COMPONENT Runtime)\n\nset(INSTALL_BUNDLE_DATA_DIR \"${CMAKE_INSTALL_PREFIX}/data\")\nset(INSTALL_BUNDLE_LIB_DIR \"${CMAKE_INSTALL_PREFIX}/lib\")\n\ninstall(TARGETS ${BINARY_NAME} RUNTIME DESTINATION \"${CMAKE_INSTALL_PREFIX}\"\n  COMPONENT Runtime)\n\ninstall(FILES \"${FLUTTER_ICU_DATA_FILE}\" DESTINATION \"${INSTALL_BUNDLE_DATA_DIR}\"\n  COMPONENT Runtime)\n\ninstall(FILES \"${FLUTTER_LIBRARY}\" DESTINATION \"${INSTALL_BUNDLE_LIB_DIR}\"\n  COMPONENT Runtime)\n\nforeach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES})\n  install(FILES \"${bundled_library}\"\n    DESTINATION \"${INSTALL_BUNDLE_LIB_DIR}\"\n    COMPONENT Runtime)\nendforeach(bundled_library)\n\n# Copy the native assets provided by the build.dart from all packages.\nset(NATIVE_ASSETS_DIR \"${PROJECT_BUILD_DIR}native_assets/linux/\")\ninstall(DIRECTORY \"${NATIVE_ASSETS_DIR}\"\n   DESTINATION \"${INSTALL_BUNDLE_LIB_DIR}\"\n   COMPONENT Runtime)\n\n# Fully re-copy the assets directory on each build to avoid having stale files\n# from a previous install.\nset(FLUTTER_ASSET_DIR_NAME \"flutter_assets\")\ninstall(CODE \"\n  file(REMOVE_RECURSE \\\"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\\\")\n  \" COMPONENT Runtime)\ninstall(DIRECTORY \"${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}\"\n  DESTINATION \"${INSTALL_BUNDLE_DATA_DIR}\" COMPONENT Runtime)\n\n# Install the AOT library on non-Debug builds only.\nif(NOT CMAKE_BUILD_TYPE MATCHES \"Debug\")\n  install(FILES \"${AOT_LIBRARY}\" DESTINATION \"${INSTALL_BUNDLE_LIB_DIR}\"\n    COMPONENT Runtime)\nendif()\n"
  },
  {
    "path": "linux/flutter/CMakeLists.txt",
    "content": "# This file controls Flutter-level build steps. It should not be edited.\ncmake_minimum_required(VERSION 3.10)\n\nset(EPHEMERAL_DIR \"${CMAKE_CURRENT_SOURCE_DIR}/ephemeral\")\n\n# Configuration provided via flutter tool.\ninclude(${EPHEMERAL_DIR}/generated_config.cmake)\n\n# TODO: Move the rest of this into files in ephemeral. See\n# https://github.com/flutter/flutter/issues/57146.\n\n# Serves the same purpose as list(TRANSFORM ... PREPEND ...),\n# which isn't available in 3.10.\nfunction(list_prepend LIST_NAME PREFIX)\n    set(NEW_LIST \"\")\n    foreach(element ${${LIST_NAME}})\n        list(APPEND NEW_LIST \"${PREFIX}${element}\")\n    endforeach(element)\n    set(${LIST_NAME} \"${NEW_LIST}\" PARENT_SCOPE)\nendfunction()\n\n# === Flutter Library ===\n# System-level dependencies.\nfind_package(PkgConfig REQUIRED)\npkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0)\npkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0)\npkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0)\n\nset(FLUTTER_LIBRARY \"${EPHEMERAL_DIR}/libflutter_linux_gtk.so\")\n\n# Published to parent scope for install step.\nset(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE)\nset(FLUTTER_ICU_DATA_FILE \"${EPHEMERAL_DIR}/icudtl.dat\" PARENT_SCOPE)\nset(PROJECT_BUILD_DIR \"${PROJECT_DIR}/build/\" PARENT_SCOPE)\nset(AOT_LIBRARY \"${PROJECT_DIR}/build/lib/libapp.so\" PARENT_SCOPE)\n\nlist(APPEND FLUTTER_LIBRARY_HEADERS\n  \"fl_basic_message_channel.h\"\n  \"fl_binary_codec.h\"\n  \"fl_binary_messenger.h\"\n  \"fl_dart_project.h\"\n  \"fl_engine.h\"\n  \"fl_json_message_codec.h\"\n  \"fl_json_method_codec.h\"\n  \"fl_message_codec.h\"\n  \"fl_method_call.h\"\n  \"fl_method_channel.h\"\n  \"fl_method_codec.h\"\n  \"fl_method_response.h\"\n  \"fl_plugin_registrar.h\"\n  \"fl_plugin_registry.h\"\n  \"fl_standard_message_codec.h\"\n  \"fl_standard_method_codec.h\"\n  \"fl_string_codec.h\"\n  \"fl_value.h\"\n  \"fl_view.h\"\n  \"flutter_linux.h\"\n)\nlist_prepend(FLUTTER_LIBRARY_HEADERS \"${EPHEMERAL_DIR}/flutter_linux/\")\nadd_library(flutter INTERFACE)\ntarget_include_directories(flutter INTERFACE\n  \"${EPHEMERAL_DIR}\"\n)\ntarget_link_libraries(flutter INTERFACE \"${FLUTTER_LIBRARY}\")\ntarget_link_libraries(flutter INTERFACE\n  PkgConfig::GTK\n  PkgConfig::GLIB\n  PkgConfig::GIO\n)\nadd_dependencies(flutter flutter_assemble)\n\n# === Flutter tool backend ===\n# _phony_ is a non-existent file to force this command to run every time,\n# since currently there's no way to get a full input/output list from the\n# flutter tool.\nadd_custom_command(\n  OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS}\n    ${CMAKE_CURRENT_BINARY_DIR}/_phony_\n  COMMAND ${CMAKE_COMMAND} -E env\n    ${FLUTTER_TOOL_ENVIRONMENT}\n    \"${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh\"\n      ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE}\n  VERBATIM\n)\nadd_custom_target(flutter_assemble DEPENDS\n  \"${FLUTTER_LIBRARY}\"\n  ${FLUTTER_LIBRARY_HEADERS}\n)\n"
  },
  {
    "path": "linux/flutter/generated_plugin_registrant.cc",
    "content": "//\n//  Generated file. Do not edit.\n//\n\n// clang-format off\n\n#include \"generated_plugin_registrant.h\"\n\n#include <desktop_drop/desktop_drop_plugin.h>\n#include <dynamic_color/dynamic_color_plugin.h>\n#include <flutter_secure_storage_linux/flutter_secure_storage_linux_plugin.h>\n#include <flutter_volume_controller/flutter_volume_controller_plugin.h>\n#include <fvp/fvp_plugin.h>\n#include <gtk/gtk_plugin.h>\n#include <media_kit_libs_linux/media_kit_libs_linux_plugin.h>\n#include <media_kit_video/media_kit_video_plugin.h>\n#include <screen_retriever_linux/screen_retriever_linux_plugin.h>\n#include <url_launcher_linux/url_launcher_plugin.h>\n#include <volume_controller/volume_controller_plugin.h>\n#include <window_manager/window_manager_plugin.h>\n#include <window_size/window_size_plugin.h>\n\nvoid fl_register_plugins(FlPluginRegistry* registry) {\n  g_autoptr(FlPluginRegistrar) desktop_drop_registrar =\n      fl_plugin_registry_get_registrar_for_plugin(registry, \"DesktopDropPlugin\");\n  desktop_drop_plugin_register_with_registrar(desktop_drop_registrar);\n  g_autoptr(FlPluginRegistrar) dynamic_color_registrar =\n      fl_plugin_registry_get_registrar_for_plugin(registry, \"DynamicColorPlugin\");\n  dynamic_color_plugin_register_with_registrar(dynamic_color_registrar);\n  g_autoptr(FlPluginRegistrar) flutter_secure_storage_linux_registrar =\n      fl_plugin_registry_get_registrar_for_plugin(registry, \"FlutterSecureStorageLinuxPlugin\");\n  flutter_secure_storage_linux_plugin_register_with_registrar(flutter_secure_storage_linux_registrar);\n  g_autoptr(FlPluginRegistrar) flutter_volume_controller_registrar =\n      fl_plugin_registry_get_registrar_for_plugin(registry, \"FlutterVolumeControllerPlugin\");\n  flutter_volume_controller_plugin_register_with_registrar(flutter_volume_controller_registrar);\n  g_autoptr(FlPluginRegistrar) fvp_registrar =\n      fl_plugin_registry_get_registrar_for_plugin(registry, \"FvpPlugin\");\n  fvp_plugin_register_with_registrar(fvp_registrar);\n  g_autoptr(FlPluginRegistrar) gtk_registrar =\n      fl_plugin_registry_get_registrar_for_plugin(registry, \"GtkPlugin\");\n  gtk_plugin_register_with_registrar(gtk_registrar);\n  g_autoptr(FlPluginRegistrar) media_kit_libs_linux_registrar =\n      fl_plugin_registry_get_registrar_for_plugin(registry, \"MediaKitLibsLinuxPlugin\");\n  media_kit_libs_linux_plugin_register_with_registrar(media_kit_libs_linux_registrar);\n  g_autoptr(FlPluginRegistrar) media_kit_video_registrar =\n      fl_plugin_registry_get_registrar_for_plugin(registry, \"MediaKitVideoPlugin\");\n  media_kit_video_plugin_register_with_registrar(media_kit_video_registrar);\n  g_autoptr(FlPluginRegistrar) screen_retriever_linux_registrar =\n      fl_plugin_registry_get_registrar_for_plugin(registry, \"ScreenRetrieverLinuxPlugin\");\n  screen_retriever_linux_plugin_register_with_registrar(screen_retriever_linux_registrar);\n  g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar =\n      fl_plugin_registry_get_registrar_for_plugin(registry, \"UrlLauncherPlugin\");\n  url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar);\n  g_autoptr(FlPluginRegistrar) volume_controller_registrar =\n      fl_plugin_registry_get_registrar_for_plugin(registry, \"VolumeControllerPlugin\");\n  volume_controller_plugin_register_with_registrar(volume_controller_registrar);\n  g_autoptr(FlPluginRegistrar) window_manager_registrar =\n      fl_plugin_registry_get_registrar_for_plugin(registry, \"WindowManagerPlugin\");\n  window_manager_plugin_register_with_registrar(window_manager_registrar);\n  g_autoptr(FlPluginRegistrar) window_size_registrar =\n      fl_plugin_registry_get_registrar_for_plugin(registry, \"WindowSizePlugin\");\n  window_size_plugin_register_with_registrar(window_size_registrar);\n}\n"
  },
  {
    "path": "linux/flutter/generated_plugin_registrant.h",
    "content": "//\n//  Generated file. Do not edit.\n//\n\n// clang-format off\n\n#ifndef GENERATED_PLUGIN_REGISTRANT_\n#define GENERATED_PLUGIN_REGISTRANT_\n\n#include <flutter_linux/flutter_linux.h>\n\n// Registers Flutter plugins.\nvoid fl_register_plugins(FlPluginRegistry* registry);\n\n#endif  // GENERATED_PLUGIN_REGISTRANT_\n"
  },
  {
    "path": "linux/flutter/generated_plugins.cmake",
    "content": "#\n# Generated file, do not edit.\n#\n\nlist(APPEND FLUTTER_PLUGIN_LIST\n  desktop_drop\n  dynamic_color\n  flutter_secure_storage_linux\n  flutter_volume_controller\n  fvp\n  gtk\n  media_kit_libs_linux\n  media_kit_video\n  screen_retriever_linux\n  url_launcher_linux\n  volume_controller\n  window_manager\n  window_size\n)\n\nlist(APPEND FLUTTER_FFI_PLUGIN_LIST\n)\n\nset(PLUGIN_BUNDLED_LIBRARIES)\n\nforeach(plugin ${FLUTTER_PLUGIN_LIST})\n  add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin})\n  target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin)\n  list(APPEND PLUGIN_BUNDLED_LIBRARIES $<TARGET_FILE:${plugin}_plugin>)\n  list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})\nendforeach(plugin)\n\nforeach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST})\n  add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin})\n  list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries})\nendforeach(ffi_plugin)\n"
  },
  {
    "path": "linux/main.cc",
    "content": "#include \"my_application.h\"\n\nint main(int argc, char** argv) {\n  g_autoptr(MyApplication) app = my_application_new();\n  return g_application_run(G_APPLICATION(app), argc, argv);\n}\n"
  },
  {
    "path": "linux/my_application.cc",
    "content": "#include \"my_application.h\"\n\n#include <flutter_linux/flutter_linux.h>\n#ifdef GDK_WINDOWING_X11\n#include <gdk/gdkx.h>\n#endif\n\n#include \"flutter/generated_plugin_registrant.h\"\n\nstruct _MyApplication {\n  GtkApplication parent_instance;\n  char** dart_entrypoint_arguments;\n};\n\nG_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION)\n\n// Implements GApplication::activate.\nstatic void my_application_activate(GApplication* application) {\n  MyApplication* self = MY_APPLICATION(application);\n  GtkWindow* window =\n      GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application)));\n\n  // Use a header bar when running in GNOME as this is the common style used\n  // by applications and is the setup most users will be using (e.g. Ubuntu\n  // desktop).\n  // If running on X and not using GNOME then just use a traditional title bar\n  // in case the window manager does more exotic layout, e.g. tiling.\n  // If running on Wayland assume the header bar will work (may need changing\n  // if future cases occur).\n  gboolean use_header_bar = TRUE;\n#ifdef GDK_WINDOWING_X11\n  GdkScreen* screen = gtk_window_get_screen(window);\n  if (GDK_IS_X11_SCREEN(screen)) {\n    const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen);\n    if (g_strcmp0(wm_name, \"GNOME Shell\") != 0) {\n      use_header_bar = FALSE;\n    }\n  }\n#endif\n  if (use_header_bar) {\n    GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new());\n    gtk_widget_show(GTK_WIDGET(header_bar));\n    gtk_header_bar_set_title(header_bar, \"IRIS\");\n    gtk_header_bar_set_show_close_button(header_bar, TRUE);\n    gtk_window_set_titlebar(window, GTK_WIDGET(header_bar));\n  } else {\n    gtk_window_set_title(window, \"IRIS\");\n  }\n\n  gtk_window_set_default_size(window, 1280, 720);\n  gtk_widget_show(GTK_WIDGET(window));\n\n  g_autoptr(FlDartProject) project = fl_dart_project_new();\n  fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments);\n\n  FlView* view = fl_view_new(project);\n  gtk_widget_show(GTK_WIDGET(view));\n  gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view));\n\n  fl_register_plugins(FL_PLUGIN_REGISTRY(view));\n\n  gtk_widget_grab_focus(GTK_WIDGET(view));\n}\n\n// Implements GApplication::local_command_line.\nstatic gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) {\n  MyApplication* self = MY_APPLICATION(application);\n  // Strip out the first argument as it is the binary name.\n  self->dart_entrypoint_arguments = g_strdupv(*arguments + 1);\n\n  g_autoptr(GError) error = nullptr;\n  if (!g_application_register(application, nullptr, &error)) {\n     g_warning(\"Failed to register: %s\", error->message);\n     *exit_status = 1;\n     return TRUE;\n  }\n\n  g_application_activate(application);\n  *exit_status = 0;\n\n  return TRUE;\n}\n\n// Implements GApplication::startup.\nstatic void my_application_startup(GApplication* application) {\n  //MyApplication* self = MY_APPLICATION(object);\n\n  // Perform any actions required at application startup.\n\n  G_APPLICATION_CLASS(my_application_parent_class)->startup(application);\n}\n\n// Implements GApplication::shutdown.\nstatic void my_application_shutdown(GApplication* application) {\n  //MyApplication* self = MY_APPLICATION(object);\n\n  // Perform any actions required at application shutdown.\n\n  G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application);\n}\n\n// Implements GObject::dispose.\nstatic void my_application_dispose(GObject* object) {\n  MyApplication* self = MY_APPLICATION(object);\n  g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev);\n  G_OBJECT_CLASS(my_application_parent_class)->dispose(object);\n}\n\nstatic void my_application_class_init(MyApplicationClass* klass) {\n  G_APPLICATION_CLASS(klass)->activate = my_application_activate;\n  G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line;\n  G_APPLICATION_CLASS(klass)->startup = my_application_startup;\n  G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown;\n  G_OBJECT_CLASS(klass)->dispose = my_application_dispose;\n}\n\nstatic void my_application_init(MyApplication* self) {}\n\nMyApplication* my_application_new() {\n  return MY_APPLICATION(g_object_new(my_application_get_type(),\n                                     \"application-id\", APPLICATION_ID,\n                                     \"flags\", G_APPLICATION_NON_UNIQUE,\n                                     nullptr));\n}\n"
  },
  {
    "path": "linux/my_application.h",
    "content": "#ifndef FLUTTER_MY_APPLICATION_H_\n#define FLUTTER_MY_APPLICATION_H_\n\n#include <gtk/gtk.h>\n\nG_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION,\n                     GtkApplication)\n\n/**\n * my_application_new:\n *\n * Creates a new Flutter-based application.\n *\n * Returns: a new #MyApplication.\n */\nMyApplication* my_application_new();\n\n#endif  // FLUTTER_MY_APPLICATION_H_\n"
  },
  {
    "path": "macos/.gitignore",
    "content": "# Flutter-related\n**/Flutter/ephemeral/\n**/Pods/\n\n# Xcode-related\n**/dgph\n**/xcuserdata/\n"
  },
  {
    "path": "macos/Flutter/Flutter-Debug.xcconfig",
    "content": "#include \"ephemeral/Flutter-Generated.xcconfig\"\n"
  },
  {
    "path": "macos/Flutter/Flutter-Release.xcconfig",
    "content": "#include \"ephemeral/Flutter-Generated.xcconfig\"\n"
  },
  {
    "path": "macos/Flutter/GeneratedPluginRegistrant.swift",
    "content": "//\n//  Generated file. Do not edit.\n//\n\nimport FlutterMacOS\nimport Foundation\n\nimport app_links\nimport desktop_drop\nimport device_info_plus\nimport disks_desktop\nimport dynamic_color\nimport file_picker\nimport flutter_secure_storage_macos\nimport flutter_volume_controller\nimport fvp\nimport media_kit_libs_macos_video\nimport media_kit_video\nimport package_info_plus\nimport path_provider_foundation\nimport screen_brightness_macos\nimport screen_retriever_macos\nimport url_launcher_macos\nimport video_player_avfoundation\nimport volume_controller\nimport wakelock_plus\nimport window_manager\nimport window_size\n\nfunc RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {\n  AppLinksMacosPlugin.register(with: registry.registrar(forPlugin: \"AppLinksMacosPlugin\"))\n  DesktopDropPlugin.register(with: registry.registrar(forPlugin: \"DesktopDropPlugin\"))\n  DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: \"DeviceInfoPlusMacosPlugin\"))\n  DisksDesktopPlugin.register(with: registry.registrar(forPlugin: \"DisksDesktopPlugin\"))\n  DynamicColorPlugin.register(with: registry.registrar(forPlugin: \"DynamicColorPlugin\"))\n  FilePickerPlugin.register(with: registry.registrar(forPlugin: \"FilePickerPlugin\"))\n  FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: \"FlutterSecureStoragePlugin\"))\n  FlutterVolumeControllerPlugin.register(with: registry.registrar(forPlugin: \"FlutterVolumeControllerPlugin\"))\n  FvpPlugin.register(with: registry.registrar(forPlugin: \"FvpPlugin\"))\n  MediaKitLibsMacosVideoPlugin.register(with: registry.registrar(forPlugin: \"MediaKitLibsMacosVideoPlugin\"))\n  MediaKitVideoPlugin.register(with: registry.registrar(forPlugin: \"MediaKitVideoPlugin\"))\n  FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: \"FPPPackageInfoPlusPlugin\"))\n  PathProviderPlugin.register(with: registry.registrar(forPlugin: \"PathProviderPlugin\"))\n  ScreenBrightnessMacosPlugin.register(with: registry.registrar(forPlugin: \"ScreenBrightnessMacosPlugin\"))\n  ScreenRetrieverMacosPlugin.register(with: registry.registrar(forPlugin: \"ScreenRetrieverMacosPlugin\"))\n  UrlLauncherPlugin.register(with: registry.registrar(forPlugin: \"UrlLauncherPlugin\"))\n  FVPVideoPlayerPlugin.register(with: registry.registrar(forPlugin: \"FVPVideoPlayerPlugin\"))\n  VolumeControllerPlugin.register(with: registry.registrar(forPlugin: \"VolumeControllerPlugin\"))\n  WakelockPlusMacosPlugin.register(with: registry.registrar(forPlugin: \"WakelockPlusMacosPlugin\"))\n  WindowManagerPlugin.register(with: registry.registrar(forPlugin: \"WindowManagerPlugin\"))\n  WindowSizePlugin.register(with: registry.registrar(forPlugin: \"WindowSizePlugin\"))\n}\n"
  },
  {
    "path": "macos/Runner/AppDelegate.swift",
    "content": "import Cocoa\nimport FlutterMacOS\n\n@main\nclass AppDelegate: FlutterAppDelegate {\n  override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {\n    return true\n  }\n}\n"
  },
  {
    "path": "macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"size\" : \"16x16\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"app_icon_16.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"16x16\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"app_icon_32.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"32x32\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"app_icon_32.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"32x32\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"app_icon_64.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"128x128\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"app_icon_128.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"128x128\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"app_icon_256.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"256x256\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"app_icon_256.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"256x256\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"app_icon_512.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"512x512\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"app_icon_512.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"512x512\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"app_icon_1024.png\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "macos/Runner/Base.lproj/MainMenu.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"14490.70\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"14490.70\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"NSApplication\">\n            <connections>\n                <outlet property=\"delegate\" destination=\"Voe-Tx-rLC\" id=\"GzC-gU-4Uq\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <customObject id=\"Voe-Tx-rLC\" customClass=\"AppDelegate\" customModule=\"Runner\" customModuleProvider=\"target\">\n            <connections>\n                <outlet property=\"applicationMenu\" destination=\"uQy-DD-JDr\" id=\"XBo-yE-nKs\"/>\n                <outlet property=\"mainFlutterWindow\" destination=\"QvC-M9-y7g\" id=\"gIp-Ho-8D9\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"YLy-65-1bz\" customClass=\"NSFontManager\"/>\n        <menu title=\"Main Menu\" systemMenu=\"main\" id=\"AYu-sK-qS6\">\n            <items>\n                <menuItem title=\"APP_NAME\" id=\"1Xt-HY-uBw\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"APP_NAME\" systemMenu=\"apple\" id=\"uQy-DD-JDr\">\n                        <items>\n                            <menuItem title=\"About APP_NAME\" id=\"5kV-Vb-QxS\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"orderFrontStandardAboutPanel:\" target=\"-1\" id=\"Exp-CZ-Vem\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"VOq-y0-SEH\"/>\n                            <menuItem title=\"Preferences…\" keyEquivalent=\",\" id=\"BOF-NM-1cW\"/>\n                            <menuItem isSeparatorItem=\"YES\" id=\"wFC-TO-SCJ\"/>\n                            <menuItem title=\"Services\" id=\"NMo-om-nkz\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Services\" systemMenu=\"services\" id=\"hz9-B4-Xy5\"/>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"4je-JR-u6R\"/>\n                            <menuItem title=\"Hide APP_NAME\" keyEquivalent=\"h\" id=\"Olw-nP-bQN\">\n                                <connections>\n                                    <action selector=\"hide:\" target=\"-1\" id=\"PnN-Uc-m68\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Hide Others\" keyEquivalent=\"h\" id=\"Vdr-fp-XzO\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"hideOtherApplications:\" target=\"-1\" id=\"VT4-aY-XCT\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Show All\" id=\"Kd2-mp-pUS\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"unhideAllApplications:\" target=\"-1\" id=\"Dhg-Le-xox\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"kCx-OE-vgT\"/>\n                            <menuItem title=\"Quit APP_NAME\" keyEquivalent=\"q\" id=\"4sb-4s-VLi\">\n                                <connections>\n                                    <action selector=\"terminate:\" target=\"-1\" id=\"Te7-pn-YzF\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"Edit\" id=\"5QF-Oa-p0T\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"Edit\" id=\"W48-6f-4Dl\">\n                        <items>\n                            <menuItem title=\"Undo\" keyEquivalent=\"z\" id=\"dRJ-4n-Yzg\">\n                                <connections>\n                                    <action selector=\"undo:\" target=\"-1\" id=\"M6e-cu-g7V\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Redo\" keyEquivalent=\"Z\" id=\"6dh-zS-Vam\">\n                                <connections>\n                                    <action selector=\"redo:\" target=\"-1\" id=\"oIA-Rs-6OD\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"WRV-NI-Exz\"/>\n                            <menuItem title=\"Cut\" keyEquivalent=\"x\" id=\"uRl-iY-unG\">\n                                <connections>\n                                    <action selector=\"cut:\" target=\"-1\" id=\"YJe-68-I9s\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Copy\" keyEquivalent=\"c\" id=\"x3v-GG-iWU\">\n                                <connections>\n                                    <action selector=\"copy:\" target=\"-1\" id=\"G1f-GL-Joy\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Paste\" keyEquivalent=\"v\" id=\"gVA-U4-sdL\">\n                                <connections>\n                                    <action selector=\"paste:\" target=\"-1\" id=\"UvS-8e-Qdg\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Paste and Match Style\" keyEquivalent=\"V\" id=\"WeT-3V-zwk\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"pasteAsPlainText:\" target=\"-1\" id=\"cEh-KX-wJQ\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Delete\" id=\"pa3-QI-u2k\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"delete:\" target=\"-1\" id=\"0Mk-Ml-PaM\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Select All\" keyEquivalent=\"a\" id=\"Ruw-6m-B2m\">\n                                <connections>\n                                    <action selector=\"selectAll:\" target=\"-1\" id=\"VNm-Mi-diN\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"uyl-h8-XO2\"/>\n                            <menuItem title=\"Find\" id=\"4EN-yA-p0u\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Find\" id=\"1b7-l0-nxx\">\n                                    <items>\n                                        <menuItem title=\"Find…\" tag=\"1\" keyEquivalent=\"f\" id=\"Xz5-n4-O0W\">\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"cD7-Qs-BN4\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Find and Replace…\" tag=\"12\" keyEquivalent=\"f\" id=\"YEy-JH-Tfz\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"WD3-Gg-5AJ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Find Next\" tag=\"2\" keyEquivalent=\"g\" id=\"q09-fT-Sye\">\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"NDo-RZ-v9R\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Find Previous\" tag=\"3\" keyEquivalent=\"G\" id=\"OwM-mh-QMV\">\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"HOh-sY-3ay\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Use Selection for Find\" tag=\"7\" keyEquivalent=\"e\" id=\"buJ-ug-pKt\">\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"U76-nv-p5D\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Jump to Selection\" keyEquivalent=\"j\" id=\"S0p-oC-mLd\">\n                                            <connections>\n                                                <action selector=\"centerSelectionInVisibleArea:\" target=\"-1\" id=\"IOG-6D-g5B\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Spelling and Grammar\" id=\"Dv1-io-Yv7\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Spelling\" id=\"3IN-sU-3Bg\">\n                                    <items>\n                                        <menuItem title=\"Show Spelling and Grammar\" keyEquivalent=\":\" id=\"HFo-cy-zxI\">\n                                            <connections>\n                                                <action selector=\"showGuessPanel:\" target=\"-1\" id=\"vFj-Ks-hy3\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Check Document Now\" keyEquivalent=\";\" id=\"hz2-CU-CR7\">\n                                            <connections>\n                                                <action selector=\"checkSpelling:\" target=\"-1\" id=\"fz7-VC-reM\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"bNw-od-mp5\"/>\n                                        <menuItem title=\"Check Spelling While Typing\" id=\"rbD-Rh-wIN\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleContinuousSpellChecking:\" target=\"-1\" id=\"7w6-Qz-0kB\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Check Grammar With Spelling\" id=\"mK6-2p-4JG\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleGrammarChecking:\" target=\"-1\" id=\"muD-Qn-j4w\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Correct Spelling Automatically\" id=\"78Y-hA-62v\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticSpellingCorrection:\" target=\"-1\" id=\"2lM-Qi-WAP\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Substitutions\" id=\"9ic-FL-obx\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Substitutions\" id=\"FeM-D8-WVr\">\n                                    <items>\n                                        <menuItem title=\"Show Substitutions\" id=\"z6F-FW-3nz\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"orderFrontSubstitutionsPanel:\" target=\"-1\" id=\"oku-mr-iSq\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"gPx-C9-uUO\"/>\n                                        <menuItem title=\"Smart Copy/Paste\" id=\"9yt-4B-nSM\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleSmartInsertDelete:\" target=\"-1\" id=\"3IJ-Se-DZD\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Smart Quotes\" id=\"hQb-2v-fYv\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticQuoteSubstitution:\" target=\"-1\" id=\"ptq-xd-QOA\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Smart Dashes\" id=\"rgM-f4-ycn\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticDashSubstitution:\" target=\"-1\" id=\"oCt-pO-9gS\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Smart Links\" id=\"cwL-P1-jid\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticLinkDetection:\" target=\"-1\" id=\"Gip-E3-Fov\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Data Detectors\" id=\"tRr-pd-1PS\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticDataDetection:\" target=\"-1\" id=\"R1I-Nq-Kbl\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Text Replacement\" id=\"HFQ-gK-NFA\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticTextReplacement:\" target=\"-1\" id=\"DvP-Fe-Py6\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Transformations\" id=\"2oI-Rn-ZJC\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Transformations\" id=\"c8a-y6-VQd\">\n                                    <items>\n                                        <menuItem title=\"Make Upper Case\" id=\"vmV-6d-7jI\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"uppercaseWord:\" target=\"-1\" id=\"sPh-Tk-edu\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Make Lower Case\" id=\"d9M-CD-aMd\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"lowercaseWord:\" target=\"-1\" id=\"iUZ-b5-hil\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Capitalize\" id=\"UEZ-Bs-lqG\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"capitalizeWord:\" target=\"-1\" id=\"26H-TL-nsh\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Speech\" id=\"xrE-MZ-jX0\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Speech\" id=\"3rS-ZA-NoH\">\n                                    <items>\n                                        <menuItem title=\"Start Speaking\" id=\"Ynk-f8-cLZ\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"startSpeaking:\" target=\"-1\" id=\"654-Ng-kyl\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Stop Speaking\" id=\"Oyz-dy-DGm\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"stopSpeaking:\" target=\"-1\" id=\"dX8-6p-jy9\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"View\" id=\"H8h-7b-M4v\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"View\" id=\"HyV-fh-RgO\">\n                        <items>\n                            <menuItem title=\"Enter Full Screen\" keyEquivalent=\"f\" id=\"4J7-dP-txa\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"toggleFullScreen:\" target=\"-1\" id=\"dU3-MA-1Rq\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"Window\" id=\"aUF-d1-5bR\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"Window\" systemMenu=\"window\" id=\"Td7-aD-5lo\">\n                        <items>\n                            <menuItem title=\"Minimize\" keyEquivalent=\"m\" id=\"OY7-WF-poV\">\n                                <connections>\n                                    <action selector=\"performMiniaturize:\" target=\"-1\" id=\"VwT-WD-YPe\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Zoom\" id=\"R4o-n2-Eq4\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"performZoom:\" target=\"-1\" id=\"DIl-cC-cCs\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"eu3-7i-yIM\"/>\n                            <menuItem title=\"Bring All to Front\" id=\"LE2-aR-0XJ\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"arrangeInFront:\" target=\"-1\" id=\"DRN-fu-gQh\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"Help\" id=\"EPT-qC-fAb\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"Help\" systemMenu=\"help\" id=\"rJ0-wn-3NY\"/>\n                </menuItem>\n            </items>\n            <point key=\"canvasLocation\" x=\"142\" y=\"-258\"/>\n        </menu>\n        <window title=\"APP_NAME\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" releasedWhenClosed=\"NO\" animationBehavior=\"default\" id=\"QvC-M9-y7g\" customClass=\"MainFlutterWindow\" customModule=\"Runner\" customModuleProvider=\"target\">\n            <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\" miniaturizable=\"YES\" resizable=\"YES\"/>\n            <rect key=\"contentRect\" x=\"335\" y=\"390\" width=\"800\" height=\"600\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"2560\" height=\"1577\"/>\n            <view key=\"contentView\" wantsLayer=\"YES\" id=\"EiT-Mj-1SZ\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"800\" height=\"600\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n            </view>\n        </window>\n    </objects>\n</document>\n"
  },
  {
    "path": "macos/Runner/Configs/AppInfo.xcconfig",
    "content": "// Application-level settings for the Runner target.\n//\n// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the\n// future. If not, the values below would default to using the project name when this becomes a\n// 'flutter create' template.\n\n// The application's name. By default this is also the title of the Flutter window.\nPRODUCT_NAME = iris\n\n// The application's bundle identifier\nPRODUCT_BUNDLE_IDENTIFIER = nini22p.iris\n\n// The copyright displayed in application information\nPRODUCT_COPYRIGHT = Copyright © 2024 nini22P. All rights reserved.\n"
  },
  {
    "path": "macos/Runner/Configs/Debug.xcconfig",
    "content": "#include \"../../Flutter/Flutter-Debug.xcconfig\"\n#include \"Warnings.xcconfig\"\n"
  },
  {
    "path": "macos/Runner/Configs/Release.xcconfig",
    "content": "#include \"../../Flutter/Flutter-Release.xcconfig\"\n#include \"Warnings.xcconfig\"\n"
  },
  {
    "path": "macos/Runner/Configs/Warnings.xcconfig",
    "content": "WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings\nGCC_WARN_UNDECLARED_SELECTOR = YES\nCLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES\nCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE\nCLANG_WARN__DUPLICATE_METHOD_MATCH = YES\nCLANG_WARN_PRAGMA_PACK = YES\nCLANG_WARN_STRICT_PROTOTYPES = YES\nCLANG_WARN_COMMA = YES\nGCC_WARN_STRICT_SELECTOR_MATCH = YES\nCLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES\nCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES\nGCC_WARN_SHADOW = YES\nCLANG_WARN_UNREACHABLE_CODE = YES\n"
  },
  {
    "path": "macos/Runner/DebugProfile.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>com.apple.security.app-sandbox</key>\n\t<true/>\n\t<key>com.apple.security.cs.allow-jit</key>\n\t<true/>\n\t<key>com.apple.security.network.server</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "macos/Runner/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIconFile</key>\n\t<string></string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>$(FLUTTER_BUILD_NAME)</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(FLUTTER_BUILD_NUMBER)</string>\n\t<key>LSMinimumSystemVersion</key>\n\t<string>$(MACOSX_DEPLOYMENT_TARGET)</string>\n\t<key>NSHumanReadableCopyright</key>\n\t<string>$(PRODUCT_COPYRIGHT)</string>\n\t<key>NSMainNibFile</key>\n\t<string>MainMenu</string>\n\t<key>NSPrincipalClass</key>\n\t<string>NSApplication</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "macos/Runner/MainFlutterWindow.swift",
    "content": "import Cocoa\nimport FlutterMacOS\n\nclass MainFlutterWindow: NSWindow {\n  override func awakeFromNib() {\n    let flutterViewController = FlutterViewController()\n    let windowFrame = self.frame\n    self.contentViewController = flutterViewController\n    self.setFrame(windowFrame, display: true)\n\n    RegisterGeneratedPlugins(registry: flutterViewController)\n\n    super.awakeFromNib()\n  }\n}\n"
  },
  {
    "path": "macos/Runner/Release.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>com.apple.security.app-sandbox</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "macos/Runner.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXAggregateTarget section */\n\t\t33CC111A2044C6BA0003C045 /* Flutter Assemble */ = {\n\t\t\tisa = PBXAggregateTarget;\n\t\t\tbuildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget \"Flutter Assemble\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t33CC111E2044C6BF0003C045 /* ShellScript */,\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"Flutter Assemble\";\n\t\t\tproductName = FLX;\n\t\t};\n/* End PBXAggregateTarget section */\n\n/* Begin PBXBuildFile section */\n\t\t331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; };\n\t\t335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; };\n\t\t33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; };\n\t\t33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; };\n\t\t33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; };\n\t\t33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 33CC10E52044A3C60003C045 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 33CC10EC2044A3C60003C045;\n\t\t\tremoteInfo = Runner;\n\t\t};\n\t\t33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 33CC10E52044A3C60003C045 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 33CC111A2044C6BA0003C045;\n\t\t\tremoteInfo = FLX;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t33CC110E2044A8840003C045 /* Bundle Framework */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tname = \"Bundle Framework\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = \"<group>\"; };\n\t\t333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = \"<group>\"; };\n\t\t335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = \"<group>\"; };\n\t\t33CC10ED2044A3C60003C045 /* iris.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"iris.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = \"<group>\"; };\n\t\t33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = \"<group>\"; };\n\t\t33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = \"<group>\"; };\n\t\t33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = \"Flutter-Debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = \"Flutter-Release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = \"Flutter-Generated.xcconfig\"; path = \"ephemeral/Flutter-Generated.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = \"<group>\"; };\n\t\t33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = \"<group>\"; };\n\t\t33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = \"<group>\"; };\n\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = \"<group>\"; };\n\t\t9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t331C80D2294CF70F00263BE5 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t33CC10EA2044A3C60003C045 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t331C80D6294CF71000263BE5 /* RunnerTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t331C80D7294CF71000263BE5 /* RunnerTests.swift */,\n\t\t\t);\n\t\t\tpath = RunnerTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t33BA886A226E78AF003329D5 /* Configs */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t33E5194F232828860026EE4D /* AppInfo.xcconfig */,\n\t\t\t\t9740EEB21CF90195004384FC /* Debug.xcconfig */,\n\t\t\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */,\n\t\t\t\t333000ED22D3DE5D00554162 /* Warnings.xcconfig */,\n\t\t\t);\n\t\t\tpath = Configs;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t33CC10E42044A3C60003C045 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t33FAB671232836740065AC1E /* Runner */,\n\t\t\t\t33CEB47122A05771004F2AC0 /* Flutter */,\n\t\t\t\t331C80D6294CF71000263BE5 /* RunnerTests */,\n\t\t\t\t33CC10EE2044A3C60003C045 /* Products */,\n\t\t\t\tD73912EC22F37F3D000D13A0 /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t33CC10EE2044A3C60003C045 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t33CC10ED2044A3C60003C045 /* iris.app */,\n\t\t\t\t331C80D5294CF71000263BE5 /* RunnerTests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t33CC11242044D66E0003C045 /* Resources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t33CC10F22044A3C60003C045 /* Assets.xcassets */,\n\t\t\t\t33CC10F42044A3C60003C045 /* MainMenu.xib */,\n\t\t\t\t33CC10F72044A3C60003C045 /* Info.plist */,\n\t\t\t);\n\t\t\tname = Resources;\n\t\t\tpath = ..;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t33CEB47122A05771004F2AC0 /* Flutter */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */,\n\t\t\t\t33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */,\n\t\t\t\t33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */,\n\t\t\t\t33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */,\n\t\t\t);\n\t\t\tpath = Flutter;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t33FAB671232836740065AC1E /* Runner */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t33CC10F02044A3C60003C045 /* AppDelegate.swift */,\n\t\t\t\t33CC11122044BFA00003C045 /* MainFlutterWindow.swift */,\n\t\t\t\t33E51913231747F40026EE4D /* DebugProfile.entitlements */,\n\t\t\t\t33E51914231749380026EE4D /* Release.entitlements */,\n\t\t\t\t33CC11242044D66E0003C045 /* Resources */,\n\t\t\t\t33BA886A226E78AF003329D5 /* Configs */,\n\t\t\t);\n\t\t\tpath = Runner;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD73912EC22F37F3D000D13A0 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t331C80D4294CF70F00263BE5 /* RunnerTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget \"RunnerTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t331C80D1294CF70F00263BE5 /* Sources */,\n\t\t\t\t331C80D2294CF70F00263BE5 /* Frameworks */,\n\t\t\t\t331C80D3294CF70F00263BE5 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t331C80DA294CF71000263BE5 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = RunnerTests;\n\t\t\tproductName = RunnerTests;\n\t\t\tproductReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n\t\t33CC10EC2044A3C60003C045 /* Runner */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget \"Runner\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t33CC10E92044A3C60003C045 /* Sources */,\n\t\t\t\t33CC10EA2044A3C60003C045 /* Frameworks */,\n\t\t\t\t33CC10EB2044A3C60003C045 /* Resources */,\n\t\t\t\t33CC110E2044A8840003C045 /* Bundle Framework */,\n\t\t\t\t3399D490228B24CF009A79C7 /* ShellScript */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t33CC11202044C79F0003C045 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = Runner;\n\t\t\tproductName = Runner;\n\t\t\tproductReference = 33CC10ED2044A3C60003C045 /* iris.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t33CC10E52044A3C60003C045 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tBuildIndependentTargetsInParallel = YES;\n\t\t\t\tLastSwiftUpdateCheck = 0920;\n\t\t\t\tLastUpgradeCheck = 1510;\n\t\t\t\tORGANIZATIONNAME = \"\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t331C80D4294CF70F00263BE5 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 14.0;\n\t\t\t\t\t\tTestTargetID = 33CC10EC2044A3C60003C045;\n\t\t\t\t\t};\n\t\t\t\t\t33CC10EC2044A3C60003C045 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 9.2;\n\t\t\t\t\t\tLastSwiftMigration = 1100;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t\tSystemCapabilities = {\n\t\t\t\t\t\t\tcom.apple.Sandbox = {\n\t\t\t\t\t\t\t\tenabled = 1;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t};\n\t\t\t\t\t};\n\t\t\t\t\t33CC111A2044C6BA0003C045 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 9.2;\n\t\t\t\t\t\tProvisioningStyle = Manual;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject \"Runner\" */;\n\t\t\tcompatibilityVersion = \"Xcode 9.3\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 33CC10E42044A3C60003C045;\n\t\t\tproductRefGroup = 33CC10EE2044A3C60003C045 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t33CC10EC2044A3C60003C045 /* Runner */,\n\t\t\t\t331C80D4294CF70F00263BE5 /* RunnerTests */,\n\t\t\t\t33CC111A2044C6BA0003C045 /* Flutter Assemble */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t331C80D3294CF70F00263BE5 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t33CC10EB2044A3C60003C045 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */,\n\t\t\t\t33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t3399D490228B24CF009A79C7 /* ShellScript */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\talwaysOutOfDate = 1;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\toutputFileListPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"echo \\\"$PRODUCT_NAME.app\\\" > \\\"$PROJECT_DIR\\\"/Flutter/ephemeral/.app_filename && \\\"$FLUTTER_ROOT\\\"/packages/flutter_tools/bin/macos_assemble.sh embed\\n\";\n\t\t};\n\t\t33CC111E2044C6BF0003C045 /* ShellScript */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t\tFlutter/ephemeral/FlutterInputs.xcfilelist,\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\tFlutter/ephemeral/tripwire,\n\t\t\t);\n\t\t\toutputFileListPaths = (\n\t\t\t\tFlutter/ephemeral/FlutterOutputs.xcfilelist,\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"$FLUTTER_ROOT\\\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t331C80D1294CF70F00263BE5 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t33CC10E92044A3C60003C045 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */,\n\t\t\t\t33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */,\n\t\t\t\t335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t331C80DA294CF71000263BE5 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 33CC10EC2044A3C60003C045 /* Runner */;\n\t\t\ttargetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */;\n\t\t};\n\t\t33CC11202044C79F0003C045 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 33CC111A2044C6BA0003C045 /* Flutter Assemble */;\n\t\t\ttargetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t33CC10F42044A3C60003C045 /* MainMenu.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t33CC10F52044A3C60003C045 /* Base */,\n\t\t\t);\n\t\t\tname = MainMenu.xib;\n\t\t\tpath = Runner;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t331C80DB294CF71000263BE5 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = nini22p.iris.RunnerTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/iris.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/iris\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t331C80DC294CF71000263BE5 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = nini22p.iris.RunnerTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/iris.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/iris\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t331C80DD294CF71000263BE5 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = nini22p.iris.RunnerTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/iris.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/iris\";\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t338D0CE9231458BD00FA5F75 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.14;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t338D0CEA231458BD00FA5F75 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t338D0CEB231458BD00FA5F75 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t33CC10F92044A3C60003C045 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.14;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t33CC10FA2044A3C60003C045 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.14;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t33CC10FC2044A3C60003C045 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t33CC10FD2044A3C60003C045 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t33CC111C2044C6BA0003C045 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t33CC111D2044C6BA0003C045 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget \"RunnerTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t331C80DB294CF71000263BE5 /* Debug */,\n\t\t\t\t331C80DC294CF71000263BE5 /* Release */,\n\t\t\t\t331C80DD294CF71000263BE5 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t33CC10E82044A3C60003C045 /* Build configuration list for PBXProject \"Runner\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t33CC10F92044A3C60003C045 /* Debug */,\n\t\t\t\t33CC10FA2044A3C60003C045 /* Release */,\n\t\t\t\t338D0CE9231458BD00FA5F75 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget \"Runner\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t33CC10FC2044A3C60003C045 /* Debug */,\n\t\t\t\t33CC10FD2044A3C60003C045 /* Release */,\n\t\t\t\t338D0CEA231458BD00FA5F75 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget \"Flutter Assemble\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t33CC111C2044C6BA0003C045 /* Debug */,\n\t\t\t\t33CC111D2044C6BA0003C045 /* Release */,\n\t\t\t\t338D0CEB231458BD00FA5F75 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 33CC10E52044A3C60003C045 /* Project object */;\n}\n"
  },
  {
    "path": "macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1510\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"33CC10EC2044A3C60003C045\"\n               BuildableName = \"iris.app\"\n               BlueprintName = \"Runner\"\n               ReferencedContainer = \"container:Runner.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"33CC10EC2044A3C60003C045\"\n            BuildableName = \"iris.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <Testables>\n         <TestableReference\n            skipped = \"NO\"\n            parallelizable = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"331C80D4294CF70F00263BE5\"\n               BuildableName = \"RunnerTests.xctest\"\n               BlueprintName = \"RunnerTests\"\n               ReferencedContainer = \"container:Runner.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"33CC10EC2044A3C60003C045\"\n            BuildableName = \"iris.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Profile\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"33CC10EC2044A3C60003C045\"\n            BuildableName = \"iris.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "macos/Runner.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Runner.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "macos/RunnerTests/RunnerTests.swift",
    "content": "import Cocoa\nimport FlutterMacOS\nimport XCTest\n\nclass RunnerTests: XCTestCase {\n\n  func testExample() {\n    // If you add code to the Runner application, consider adding tests here.\n    // See https://developer.apple.com/documentation/xctest for more information about using XCTest.\n  }\n\n}\n"
  },
  {
    "path": "pubspec.yaml",
    "content": "name: iris\ndescription: A lightweight video player\npublish_to: none\nversion: 1.5.2+3\n\nenvironment:\n  sdk: ^3.5.4\n\ndependencies:\n  flutter:\n    sdk: flutter\n  cupertino_icons: ^1.0.8\n  flutter_localizations:\n    sdk: flutter\n  intl: any\n  file_picker: ^10.3.3\n  flutter_breadcrumb: ^1.0.1\n  flutter_hooks: ^0.21.3+1\n  flutter_secure_storage: ^8.1.0\n  flutter_zustand: ^0.0.5\n  media_kit: ^1.2.0\n  media_kit_video: ^1.3.0\n  media_kit_libs_video: ^1.0.6\n  path: ^1.9.1\n  path_provider: ^2.1.5\n  package_info_plus: ^9.0.0\n  provider: ^6.1.5\n  webdav_client: ^1.2.2\n  window_manager: ^0.5.1\n  url_launcher: ^6.3.2\n  scrollable_positioned_list: ^0.3.8\n  google_fonts: ^6.3.1\n  dynamic_color: ^1.8.1\n  window_size: ^0.1.0\n  uuid: ^4.5.1\n  flutter_markdown: ^0.7.7+1\n  http: ^1.5.0\n  collection: ^1.19.1\n  json_annotation: ^4.9.0\n  freezed_annotation: ^3.1.0\n  disks_desktop: ^1.0.1\n  android_x_storage: ^1.0.2\n  permission_handler: ^12.0.1\n  desktop_drop: ^0.6.1\n  app_links: ^6.4.1\n  device_info_plus: ^12.1.0\n  saf_util: ^0.11.0\n  screen_brightness: ^2.1.7\n  flutter_volume_controller: ^1.3.3\n  fvp: ^0.34.0\n  video_player: ^2.10.0\n  wakelock_plus: ^1.4.0\n  popover: ^0.3.1\n  pure_ftp: ^0.7.5\n  drives_windows:\n    git:\n      url: https://github.com/nini22P/drives_windows\n      ref: main\n  media_stream:\n    git:\n      url: https://github.com/nini22P/media_stream\n      ref: main\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n  flutter_lints: ^6.0.0\n  dart_pubspec_licenses: ^3.0.9\n  build_runner: ^2.8.0\n  freezed: ^3.2.3\n  json_serializable: ^6.11.1\n  msix: ^3.16.12\n  # flutter_hooks_lint: ^1.4.0\n  # custom_lint: ^0.8.1\n\nflutter:\n  generate: true\n  uses-material-design: true\n  assets:\n    - assets/images/\n\nmsix_config:\n  display_name: IRIS player\n  identity_name: 22P.IRISplayer\n  publisher_display_name: 22P\n  publisher: CN=9740B6B2-E777-4F52-8ECD-C4A577A73010\n  msix_version: 1.5.2.0\n  logo_path: assets/images/logo.png\n  trim_logo: false\n  languages: en-us, zh-cn\n  execution_alias: iris\n  file_extension: .aac, .aiff, .alac, .amr, .ape, .caf, .cda, .dsd, .dts, .flac, .m4a, .midi, .mp3, .mpc, .oga, .ogg, .opus, .raw, .spx, .tak, .tta, .wav, .wma, .wv, .3gp, .amv, .asf, .avi, .divx, .dpx, .drc, .dv, .f4v, .flv, .h264, .h265, .hevc, .m2ts, .m4p, .m4v, .mkv, .mng, .mov, .mp2, .mp4, .mpe, .mpeg, .mpg, .mpv, .mts, .mxf, .nsv, .ogv, .qt, .rm, .rmvb, .ts, .vob, .webm, .wmv, .yuv"
  },
  {
    "path": "test/widget_test.dart",
    "content": "// This is a basic Flutter widget test.\n//\n// To perform an interaction with a widget in your test, use the WidgetTester\n// utility in the flutter_test package. For example, you can send tap and scroll\n// gestures. You can also use WidgetTester to find child widgets in the widget\n// tree, read text, and verify that the values of widget properties are correct.\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nimport 'package:iris/main.dart';\n\nvoid main() {\n  testWidgets('Counter increments smoke test', (WidgetTester tester) async {\n    // Build our app and trigger a frame.\n    await tester.pumpWidget(const MyApp());\n\n    // Verify that our counter starts at 0.\n    expect(find.text('0'), findsOneWidget);\n    expect(find.text('1'), findsNothing);\n\n    // Tap the '+' icon and trigger a frame.\n    await tester.tap(find.byIcon(Icons.add_rounded));\n    await tester.pump();\n\n    // Verify that our counter has incremented.\n    expect(find.text('0'), findsNothing);\n    expect(find.text('1'), findsOneWidget);\n  });\n}\n"
  },
  {
    "path": "windows/.gitignore",
    "content": "flutter/ephemeral/\n\n# Visual Studio user-specific files.\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# Visual Studio build-related files.\nx64/\nx86/\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!*.[Cc]ache/\n"
  },
  {
    "path": "windows/CMakeLists.txt",
    "content": "# Project-level configuration.\ncmake_minimum_required(VERSION 3.14)\nproject(iris LANGUAGES CXX)\n\n# The name of the executable created for the application. Change this to change\n# the on-disk name of your application.\nset(BINARY_NAME \"iris\")\n\n# Explicitly opt in to modern CMake behaviors to avoid warnings with recent\n# versions of CMake.\ncmake_policy(VERSION 3.14...3.25)\n\n# Define build configuration option.\nget_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)\nif(IS_MULTICONFIG)\n  set(CMAKE_CONFIGURATION_TYPES \"Debug;Profile;Release\"\n    CACHE STRING \"\" FORCE)\nelse()\n  if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)\n    set(CMAKE_BUILD_TYPE \"Debug\" CACHE\n      STRING \"Flutter build mode\" FORCE)\n    set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS\n      \"Debug\" \"Profile\" \"Release\")\n  endif()\nendif()\n# Define settings for the Profile build mode.\nset(CMAKE_EXE_LINKER_FLAGS_PROFILE \"${CMAKE_EXE_LINKER_FLAGS_RELEASE}\")\nset(CMAKE_SHARED_LINKER_FLAGS_PROFILE \"${CMAKE_SHARED_LINKER_FLAGS_RELEASE}\")\nset(CMAKE_C_FLAGS_PROFILE \"${CMAKE_C_FLAGS_RELEASE}\")\nset(CMAKE_CXX_FLAGS_PROFILE \"${CMAKE_CXX_FLAGS_RELEASE}\")\n\n# Use Unicode for all projects.\nadd_definitions(-DUNICODE -D_UNICODE)\n\n# Compilation settings that should be applied to most targets.\n#\n# Be cautious about adding new options here, as plugins use this function by\n# default. In most cases, you should add new options to specific targets instead\n# of modifying this function.\nfunction(APPLY_STANDARD_SETTINGS TARGET)\n  target_compile_features(${TARGET} PUBLIC cxx_std_17)\n  target_compile_options(${TARGET} PRIVATE /W4 /WX /wd\"4100\")\n  target_compile_options(${TARGET} PRIVATE /EHsc)\n  target_compile_definitions(${TARGET} PRIVATE \"_HAS_EXCEPTIONS=0\")\n  target_compile_definitions(${TARGET} PRIVATE \"$<$<CONFIG:Debug>:_DEBUG>\")\nendfunction()\n\n# Flutter library and tool build rules.\nset(FLUTTER_MANAGED_DIR \"${CMAKE_CURRENT_SOURCE_DIR}/flutter\")\nadd_subdirectory(${FLUTTER_MANAGED_DIR})\n\n# Application build; see runner/CMakeLists.txt.\nadd_subdirectory(\"runner\")\n\n\n# Generated plugin build rules, which manage building the plugins and adding\n# them to the application.\ninclude(flutter/generated_plugins.cmake)\n\n\n# === Installation ===\n# Support files are copied into place next to the executable, so that it can\n# run in place. This is done instead of making a separate bundle (as on Linux)\n# so that building and running from within Visual Studio will work.\nset(BUILD_BUNDLE_DIR \"$<TARGET_FILE_DIR:${BINARY_NAME}>\")\n# Make the \"install\" step default, as it's required to run.\nset(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1)\nif(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)\n  set(CMAKE_INSTALL_PREFIX \"${BUILD_BUNDLE_DIR}\" CACHE PATH \"...\" FORCE)\nendif()\n\nset(INSTALL_BUNDLE_DATA_DIR \"${CMAKE_INSTALL_PREFIX}/data\")\nset(INSTALL_BUNDLE_LIB_DIR \"${CMAKE_INSTALL_PREFIX}\")\n\ninstall(TARGETS ${BINARY_NAME} RUNTIME DESTINATION \"${CMAKE_INSTALL_PREFIX}\"\n  COMPONENT Runtime)\n\ninstall(FILES \"${FLUTTER_ICU_DATA_FILE}\" DESTINATION \"${INSTALL_BUNDLE_DATA_DIR}\"\n  COMPONENT Runtime)\n\ninstall(FILES \"${FLUTTER_LIBRARY}\" DESTINATION \"${INSTALL_BUNDLE_LIB_DIR}\"\n  COMPONENT Runtime)\n\nif(PLUGIN_BUNDLED_LIBRARIES)\n  install(FILES \"${PLUGIN_BUNDLED_LIBRARIES}\"\n    DESTINATION \"${INSTALL_BUNDLE_LIB_DIR}\"\n    COMPONENT Runtime)\nendif()\n\n# Copy the native assets provided by the build.dart from all packages.\nset(NATIVE_ASSETS_DIR \"${PROJECT_BUILD_DIR}native_assets/windows/\")\ninstall(DIRECTORY \"${NATIVE_ASSETS_DIR}\"\n   DESTINATION \"${INSTALL_BUNDLE_LIB_DIR}\"\n   COMPONENT Runtime)\n\n# Fully re-copy the assets directory on each build to avoid having stale files\n# from a previous install.\nset(FLUTTER_ASSET_DIR_NAME \"flutter_assets\")\ninstall(CODE \"\n  file(REMOVE_RECURSE \\\"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\\\")\n  \" COMPONENT Runtime)\ninstall(DIRECTORY \"${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}\"\n  DESTINATION \"${INSTALL_BUNDLE_DATA_DIR}\" COMPONENT Runtime)\n\n# Install the AOT library on non-Debug builds only.\ninstall(FILES \"${AOT_LIBRARY}\" DESTINATION \"${INSTALL_BUNDLE_DATA_DIR}\"\n  CONFIGURATIONS Profile;Release\n  COMPONENT Runtime)\n\n# Install iris-updater.bat\ninstall(FILES \"${CMAKE_SOURCE_DIR}/iris-updater.bat\" DESTINATION \"${INSTALL_BUNDLE_LIB_DIR}\" COMPONENT Runtime)\n"
  },
  {
    "path": "windows/flutter/CMakeLists.txt",
    "content": "# This file controls Flutter-level build steps. It should not be edited.\ncmake_minimum_required(VERSION 3.14)\n\nset(EPHEMERAL_DIR \"${CMAKE_CURRENT_SOURCE_DIR}/ephemeral\")\n\n# Configuration provided via flutter tool.\ninclude(${EPHEMERAL_DIR}/generated_config.cmake)\n\n# TODO: Move the rest of this into files in ephemeral. See\n# https://github.com/flutter/flutter/issues/57146.\nset(WRAPPER_ROOT \"${EPHEMERAL_DIR}/cpp_client_wrapper\")\n\n# Set fallback configurations for older versions of the flutter tool.\nif (NOT DEFINED FLUTTER_TARGET_PLATFORM)\n  set(FLUTTER_TARGET_PLATFORM \"windows-x64\")\nendif()\n\n# === Flutter Library ===\nset(FLUTTER_LIBRARY \"${EPHEMERAL_DIR}/flutter_windows.dll\")\n\n# Published to parent scope for install step.\nset(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE)\nset(FLUTTER_ICU_DATA_FILE \"${EPHEMERAL_DIR}/icudtl.dat\" PARENT_SCOPE)\nset(PROJECT_BUILD_DIR \"${PROJECT_DIR}/build/\" PARENT_SCOPE)\nset(AOT_LIBRARY \"${PROJECT_DIR}/build/windows/app.so\" PARENT_SCOPE)\n\nlist(APPEND FLUTTER_LIBRARY_HEADERS\n  \"flutter_export.h\"\n  \"flutter_windows.h\"\n  \"flutter_messenger.h\"\n  \"flutter_plugin_registrar.h\"\n  \"flutter_texture_registrar.h\"\n)\nlist(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND \"${EPHEMERAL_DIR}/\")\nadd_library(flutter INTERFACE)\ntarget_include_directories(flutter INTERFACE\n  \"${EPHEMERAL_DIR}\"\n)\ntarget_link_libraries(flutter INTERFACE \"${FLUTTER_LIBRARY}.lib\")\nadd_dependencies(flutter flutter_assemble)\n\n# === Wrapper ===\nlist(APPEND CPP_WRAPPER_SOURCES_CORE\n  \"core_implementations.cc\"\n  \"standard_codec.cc\"\n)\nlist(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND \"${WRAPPER_ROOT}/\")\nlist(APPEND CPP_WRAPPER_SOURCES_PLUGIN\n  \"plugin_registrar.cc\"\n)\nlist(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND \"${WRAPPER_ROOT}/\")\nlist(APPEND CPP_WRAPPER_SOURCES_APP\n  \"flutter_engine.cc\"\n  \"flutter_view_controller.cc\"\n)\nlist(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND \"${WRAPPER_ROOT}/\")\n\n# Wrapper sources needed for a plugin.\nadd_library(flutter_wrapper_plugin STATIC\n  ${CPP_WRAPPER_SOURCES_CORE}\n  ${CPP_WRAPPER_SOURCES_PLUGIN}\n)\napply_standard_settings(flutter_wrapper_plugin)\nset_target_properties(flutter_wrapper_plugin PROPERTIES\n  POSITION_INDEPENDENT_CODE ON)\nset_target_properties(flutter_wrapper_plugin PROPERTIES\n  CXX_VISIBILITY_PRESET hidden)\ntarget_link_libraries(flutter_wrapper_plugin PUBLIC flutter)\ntarget_include_directories(flutter_wrapper_plugin PUBLIC\n  \"${WRAPPER_ROOT}/include\"\n)\nadd_dependencies(flutter_wrapper_plugin flutter_assemble)\n\n# Wrapper sources needed for the runner.\nadd_library(flutter_wrapper_app STATIC\n  ${CPP_WRAPPER_SOURCES_CORE}\n  ${CPP_WRAPPER_SOURCES_APP}\n)\napply_standard_settings(flutter_wrapper_app)\ntarget_link_libraries(flutter_wrapper_app PUBLIC flutter)\ntarget_include_directories(flutter_wrapper_app PUBLIC\n  \"${WRAPPER_ROOT}/include\"\n)\nadd_dependencies(flutter_wrapper_app flutter_assemble)\n\n# === Flutter tool backend ===\n# _phony_ is a non-existent file to force this command to run every time,\n# since currently there's no way to get a full input/output list from the\n# flutter tool.\nset(PHONY_OUTPUT \"${CMAKE_CURRENT_BINARY_DIR}/_phony_\")\nset_source_files_properties(\"${PHONY_OUTPUT}\" PROPERTIES SYMBOLIC TRUE)\nadd_custom_command(\n  OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS}\n    ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN}\n    ${CPP_WRAPPER_SOURCES_APP}\n    ${PHONY_OUTPUT}\n  COMMAND ${CMAKE_COMMAND} -E env\n    ${FLUTTER_TOOL_ENVIRONMENT}\n    \"${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat\"\n      ${FLUTTER_TARGET_PLATFORM} $<CONFIG>\n  VERBATIM\n)\nadd_custom_target(flutter_assemble DEPENDS\n  \"${FLUTTER_LIBRARY}\"\n  ${FLUTTER_LIBRARY_HEADERS}\n  ${CPP_WRAPPER_SOURCES_CORE}\n  ${CPP_WRAPPER_SOURCES_PLUGIN}\n  ${CPP_WRAPPER_SOURCES_APP}\n)\n"
  },
  {
    "path": "windows/flutter/generated_plugin_registrant.cc",
    "content": "//\n//  Generated file. Do not edit.\n//\n\n// clang-format off\n\n#include \"generated_plugin_registrant.h\"\n\n#include <app_links/app_links_plugin_c_api.h>\n#include <desktop_drop/desktop_drop_plugin.h>\n#include <disks_desktop/disks_desktop_plugin.h>\n#include <dynamic_color/dynamic_color_plugin_c_api.h>\n#include <flutter_secure_storage_windows/flutter_secure_storage_windows_plugin.h>\n#include <flutter_volume_controller/flutter_volume_controller_plugin_c_api.h>\n#include <fvp/fvp_plugin_c_api.h>\n#include <media_kit_libs_windows_video/media_kit_libs_windows_video_plugin_c_api.h>\n#include <media_kit_video/media_kit_video_plugin_c_api.h>\n#include <permission_handler_windows/permission_handler_windows_plugin.h>\n#include <screen_brightness_windows/screen_brightness_windows_plugin.h>\n#include <screen_retriever_windows/screen_retriever_windows_plugin_c_api.h>\n#include <url_launcher_windows/url_launcher_windows.h>\n#include <volume_controller/volume_controller_plugin_c_api.h>\n#include <window_manager/window_manager_plugin.h>\n#include <window_size/window_size_plugin.h>\n\nvoid RegisterPlugins(flutter::PluginRegistry* registry) {\n  AppLinksPluginCApiRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"AppLinksPluginCApi\"));\n  DesktopDropPluginRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"DesktopDropPlugin\"));\n  DisksDesktopPluginRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"DisksDesktopPlugin\"));\n  DynamicColorPluginCApiRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"DynamicColorPluginCApi\"));\n  FlutterSecureStorageWindowsPluginRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"FlutterSecureStorageWindowsPlugin\"));\n  FlutterVolumeControllerPluginCApiRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"FlutterVolumeControllerPluginCApi\"));\n  FvpPluginCApiRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"FvpPluginCApi\"));\n  MediaKitLibsWindowsVideoPluginCApiRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"MediaKitLibsWindowsVideoPluginCApi\"));\n  MediaKitVideoPluginCApiRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"MediaKitVideoPluginCApi\"));\n  PermissionHandlerWindowsPluginRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"PermissionHandlerWindowsPlugin\"));\n  ScreenBrightnessWindowsPluginRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"ScreenBrightnessWindowsPlugin\"));\n  ScreenRetrieverWindowsPluginCApiRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"ScreenRetrieverWindowsPluginCApi\"));\n  UrlLauncherWindowsRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"UrlLauncherWindows\"));\n  VolumeControllerPluginCApiRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"VolumeControllerPluginCApi\"));\n  WindowManagerPluginRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"WindowManagerPlugin\"));\n  WindowSizePluginRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"WindowSizePlugin\"));\n}\n"
  },
  {
    "path": "windows/flutter/generated_plugin_registrant.h",
    "content": "//\n//  Generated file. Do not edit.\n//\n\n// clang-format off\n\n#ifndef GENERATED_PLUGIN_REGISTRANT_\n#define GENERATED_PLUGIN_REGISTRANT_\n\n#include <flutter/plugin_registry.h>\n\n// Registers Flutter plugins.\nvoid RegisterPlugins(flutter::PluginRegistry* registry);\n\n#endif  // GENERATED_PLUGIN_REGISTRANT_\n"
  },
  {
    "path": "windows/flutter/generated_plugins.cmake",
    "content": "#\n# Generated file, do not edit.\n#\n\nlist(APPEND FLUTTER_PLUGIN_LIST\n  app_links\n  desktop_drop\n  disks_desktop\n  dynamic_color\n  flutter_secure_storage_windows\n  flutter_volume_controller\n  fvp\n  media_kit_libs_windows_video\n  media_kit_video\n  permission_handler_windows\n  screen_brightness_windows\n  screen_retriever_windows\n  url_launcher_windows\n  volume_controller\n  window_manager\n  window_size\n)\n\nlist(APPEND FLUTTER_FFI_PLUGIN_LIST\n)\n\nset(PLUGIN_BUNDLED_LIBRARIES)\n\nforeach(plugin ${FLUTTER_PLUGIN_LIST})\n  add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin})\n  target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin)\n  list(APPEND PLUGIN_BUNDLED_LIBRARIES $<TARGET_FILE:${plugin}_plugin>)\n  list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})\nendforeach(plugin)\n\nforeach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST})\n  add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin})\n  list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries})\nendforeach(ffi_plugin)\n"
  },
  {
    "path": "windows/inno-languages/ChineseSimplified.isl",
    "content": "﻿; *** Inno Setup version 6.4.0+ Chinese Simplified messages ***\n;\n; To download user-contributed translations of this file, go to:\n;   https://jrsoftware.org/files/istrans/\n;\n; Note: When translating this text, do not add periods (.) to the end of\n; messages that didn't have them already, because on those messages Inno\n; Setup adds the periods automatically (appending a period would result in\n; two periods being displayed).\n;\n; Maintained by Zhenghan Yang\n; Email: 847320916@QQ.com\n; Translation based on network resource\n; The latest Translation is on https://github.com/kira-96/Inno-Setup-Chinese-Simplified-Translation\n;\n\n[LangOptions]\n; The following three entries are very important. Be sure to read and \n; understand the '[LangOptions] section' topic in the help file.\nLanguageName=简体中文\n; If Language Name display incorrect, uncomment next line\n; LanguageName=<7B80><4F53><4E2D><6587>\n; About LanguageID, to reference link:\n; https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/a9eac961-e77d-41a6-90a5-ce1a8b0cdb9c\nLanguageID=$0804\n; About CodePage, to reference link:\n; https://docs.microsoft.com/en-us/windows/win32/intl/code-page-identifiers\nLanguageCodePage=936\n; If the language you are translating to requires special font faces or\n; sizes, uncomment any of the following entries and change them accordingly.\n;DialogFontName=\n;DialogFontSize=8\n;WelcomeFontName=Verdana\n;WelcomeFontSize=12\n;TitleFontName=Arial\n;TitleFontSize=29\n;CopyrightFontName=Arial\n;CopyrightFontSize=8\n\n[Messages]\n\n; *** 应用程序标题\nSetupAppTitle=安装\nSetupWindowTitle=安装 - %1\nUninstallAppTitle=卸载\nUninstallAppFullTitle=%1 卸载\n\n; *** Misc. common\nInformationTitle=信息\nConfirmTitle=确认\nErrorTitle=错误\n\n; *** SetupLdr messages\nSetupLdrStartupMessage=现在将安装 %1。您想要继续吗？\nLdrCannotCreateTemp=无法创建临时文件。安装程序已中止\nLdrCannotExecTemp=无法执行临时目录中的文件。安装程序已中止\nHelpTextNote=\n\n; *** 启动错误消息\nLastErrorMessage=%1。%n%n错误 %2: %3\nSetupFileMissing=安装目录中缺少文件 %1。请修正这个问题或者获取程序的新副本。\nSetupFileCorrupt=安装文件已损坏。请获取程序的新副本。\nSetupFileCorruptOrWrongVer=安装文件已损坏，或是与这个安装程序的版本不兼容。请修正这个问题或获取新的程序副本。\nInvalidParameter=无效的命令行参数：%n%n%1\nSetupAlreadyRunning=安装程序正在运行。\nWindowsVersionNotSupported=此程序不支持当前计算机运行的 Windows 版本。\nWindowsServicePackRequired=此程序需要 %1 服务包 %2 或更高版本。\nNotOnThisPlatform=此程序不能在 %1 上运行。\nOnlyOnThisPlatform=此程序只能在 %1 上运行。\nOnlyOnTheseArchitectures=此程序只能安装到为下列处理器架构设计的 Windows 版本中：%n%n%1\nWinVersionTooLowError=此程序需要 %1 版本 %2 或更高。\nWinVersionTooHighError=此程序不能安装于 %1 版本 %2 或更高。\nAdminPrivilegesRequired=在安装此程序时您必须以管理员身份登录。\nPowerUserPrivilegesRequired=在安装此程序时您必须以管理员身份或有权限的用户组身份登录。\nSetupAppRunningError=安装程序发现 %1 当前正在运行。%n%n请先关闭正在运行的程序，然后点击“确定”继续，或点击“取消”退出。\nUninstallAppRunningError=卸载程序发现 %1 当前正在运行。%n%n请先关闭正在运行的程序，然后点击“确定”继续，或点击“取消”退出。\n\n; *** 启动问题\nPrivilegesRequiredOverrideTitle=选择安装程序模式\nPrivilegesRequiredOverrideInstruction=选择安装模式\nPrivilegesRequiredOverrideText1=%1 可以为所有用户安装(需要管理员权限)，或仅为您安装。\nPrivilegesRequiredOverrideText2=%1 只能为您安装，或为所有用户安装(需要管理员权限)。\nPrivilegesRequiredOverrideAllUsers=为所有用户安装(&A)\nPrivilegesRequiredOverrideAllUsersRecommended=为所有用户安装(&A) (建议选项)\nPrivilegesRequiredOverrideCurrentUser=只为我安装(&M)\nPrivilegesRequiredOverrideCurrentUserRecommended=只为我安装(&M) (建议选项)\n\n; *** 其他错误\nErrorCreatingDir=安装程序无法创建目录“%1”\nErrorTooManyFilesInDir=无法在目录“%1”中创建文件，因为里面包含太多文件\n\n; *** 安装程序公共消息\nExitSetupTitle=退出安装程序\nExitSetupMessage=安装程序尚未完成。如果现在退出，将不会安装该程序。%n%n您之后可以再次运行安装程序完成安装。%n%n现在退出安装程序吗？\nAboutSetupMenuItem=关于安装程序(&A)...\nAboutSetupTitle=关于安装程序\nAboutSetupMessage=%1 版本 %2%n%3%n%n%1 主页：%n%4\nAboutSetupNote=\nTranslatorNote=简体中文翻译由Kira(847320916@qq.com)维护。项目地址：https://github.com/kira-96/Inno-Setup-Chinese-Simplified-Translation\n\n; *** 按钮\nButtonBack=< 上一步(&B)\nButtonNext=下一步(&N) >\nButtonInstall=安装(&I)\nButtonOK=确定\nButtonCancel=取消\nButtonYes=是(&Y)\nButtonYesToAll=全是(&A)\nButtonNo=否(&N)\nButtonNoToAll=全否(&O)\nButtonFinish=完成(&F)\nButtonBrowse=浏览(&B)...\nButtonWizardBrowse=浏览(&R)...\nButtonNewFolder=新建文件夹(&M)\n\n; *** “选择语言”对话框消息\nSelectLanguageTitle=选择安装语言\nSelectLanguageLabel=选择安装时使用的语言。\n\n; *** 公共向导文字\nClickNext=点击“下一步”继续，或点击“取消”退出安装程序。\nBeveledLabel=\nBrowseDialogTitle=浏览文件夹\nBrowseDialogLabel=在下面的列表中选择一个文件夹，然后点击“确定”。\nNewFolderName=新建文件夹\n\n; *** “欢迎”向导页\nWelcomeLabel1=欢迎使用 [name] 安装向导\nWelcomeLabel2=现在将安装 [name/ver] 到您的电脑中。%n%n建议您在继续安装前关闭所有其他应用程序。\n\n; *** “密码”向导页\nWizardPassword=密码\nPasswordLabel1=这个安装程序有密码保护。\nPasswordLabel3=请输入密码，然后点击“下一步”继续。密码区分大小写。\nPasswordEditLabel=密码(&P)：\nIncorrectPassword=您输入的密码不正确，请重新输入。\n\n; *** “许可协议”向导页\nWizardLicense=许可协议\nLicenseLabel=请在继续安装前阅读以下重要信息。\nLicenseLabel3=请仔细阅读下列许可协议。在继续安装前您必须同意这些协议条款。\nLicenseAccepted=我同意此协议(&A)\nLicenseNotAccepted=我不同意此协议(&D)\n\n; *** “信息”向导页\nWizardInfoBefore=信息\nInfoBeforeLabel=请在继续安装前阅读以下重要信息。\nInfoBeforeClickLabel=准备好继续安装后，点击“下一步”。\nWizardInfoAfter=信息\nInfoAfterLabel=请在继续安装前阅读以下重要信息。\nInfoAfterClickLabel=准备好继续安装后，点击“下一步”。\n\n; *** “用户信息”向导页\nWizardUserInfo=用户信息\nUserInfoDesc=请输入您的信息。\nUserInfoName=用户名(&U)：\nUserInfoOrg=组织(&O)：\nUserInfoSerial=序列号(&S)：\nUserInfoNameRequired=您必须输入用户名。\n\n; *** “选择目标目录”向导页\nWizardSelectDir=选择目标位置\nSelectDirDesc=您想将 [name] 安装在哪里？\nSelectDirLabel3=安装程序将安装 [name] 到下面的文件夹中。\nSelectDirBrowseLabel=点击“下一步”继续。如果您想选择其他文件夹，点击“浏览”。\nDiskSpaceGBLabel=至少需要有 [gb] GB 的可用磁盘空间。\nDiskSpaceMBLabel=至少需要有 [mb] MB 的可用磁盘空间。\nCannotInstallToNetworkDrive=安装程序无法安装到一个网络驱动器。\nCannotInstallToUNCPath=安装程序无法安装到一个 UNC 路径。\nInvalidPath=您必须输入一个带驱动器卷标的完整路径，例如：%n%nC:\\APP%n%n或UNC路径：%n%n\\\\server\\share\nInvalidDrive=您选定的驱动器或 UNC 共享不存在或不能访问。请选择其他位置。\nDiskSpaceWarningTitle=磁盘空间不足\nDiskSpaceWarning=安装程序至少需要 %1 KB 的可用空间才能安装，但选定驱动器只有 %2 KB 的可用空间。%n%n您一定要继续吗？\nDirNameTooLong=文件夹名称或路径太长。\nInvalidDirName=文件夹名称无效。\nBadDirName32=文件夹名称不能包含下列任何字符：%n%n%1\nDirExistsTitle=文件夹已存在\nDirExists=文件夹：%n%n%1%n%n已经存在。您一定要安装到这个文件夹中吗？\nDirDoesntExistTitle=文件夹不存在\nDirDoesntExist=文件夹：%n%n%1%n%n不存在。您想要创建此文件夹吗？\n\n; *** “选择组件”向导页\nWizardSelectComponents=选择组件\nSelectComponentsDesc=您想安装哪些程序组件？\nSelectComponentsLabel2=选中您想安装的组件；取消您不想安装的组件。然后点击“下一步”继续。\nFullInstallation=完全安装\n; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language)\nCompactInstallation=简洁安装\nCustomInstallation=自定义安装\nNoUninstallWarningTitle=组件已存在\nNoUninstallWarning=安装程序检测到下列组件已安装在您的电脑中：%n%n%1%n%n取消选中这些组件不会卸载它们。%n%n确定要继续吗？\nComponentSize1=%1 KB\nComponentSize2=%1 MB\nComponentsDiskSpaceGBLabel=当前选择的组件需要至少 [gb] GB 的磁盘空间。\nComponentsDiskSpaceMBLabel=当前选择的组件需要至少 [mb] MB 的磁盘空间。\n\n; *** “选择附加任务”向导页\nWizardSelectTasks=选择附加任务\nSelectTasksDesc=您想要安装程序执行哪些附加任务？\nSelectTasksLabel2=选择您想要安装程序在安装 [name] 时执行的附加任务，然后点击“下一步”。\n\n; *** “选择开始菜单文件夹”向导页\nWizardSelectProgramGroup=选择开始菜单文件夹\nSelectStartMenuFolderDesc=安装程序应该在哪里放置程序的快捷方式？\nSelectStartMenuFolderLabel3=安装程序将在下列“开始”菜单文件夹中创建程序的快捷方式。\nSelectStartMenuFolderBrowseLabel=点击“下一步”继续。如果您想选择其他文件夹，点击“浏览”。\nMustEnterGroupName=您必须输入一个文件夹名。\nGroupNameTooLong=文件夹名或路径太长。\nInvalidGroupName=无效的文件夹名字。\nBadGroupName=文件夹名不能包含下列任何字符：%n%n%1\nNoProgramGroupCheck2=不创建开始菜单文件夹(&D)\n\n; *** “准备安装”向导页\nWizardReady=准备安装\nReadyLabel1=安装程序准备就绪，现在可以开始安装 [name] 到您的电脑。\nReadyLabel2a=点击“安装”继续此安装程序。如果您想重新考虑或修改任何设置，点击“上一步”。\nReadyLabel2b=点击“安装”继续此安装程序。\nReadyMemoUserInfo=用户信息：\nReadyMemoDir=目标位置：\nReadyMemoType=安装类型：\nReadyMemoComponents=已选择组件：\nReadyMemoGroup=开始菜单文件夹：\nReadyMemoTasks=附加任务：\n\n; *** TExtractionWizardPage wizard page and Extract7ZipArchive\nExtractionLabel=正在提取附加文件...\nButtonStopExtraction=停止提取(&S)\nStopExtraction=您确定要停止提取吗？\nErrorExtractionAborted=提取已中止\nErrorExtractionFailed=提取失败：%1\n\n; *** TDownloadWizardPage wizard page and DownloadTemporaryFile\nDownloadingLabel=正在下载附加文件...\nButtonStopDownload=停止下载(&S)\nStopDownload=您确定要停止下载吗？\nErrorDownloadAborted=下载已中止\nErrorDownloadFailed=下载失败：%1 %2\nErrorDownloadSizeFailed=获取下载大小失败：%1 %2\nErrorFileHash1=校验文件哈希失败：%1\nErrorFileHash2=无效的文件哈希：预期 %1，实际 %2\nErrorProgress=无效的进度：%1 / %2\nErrorFileSize=文件大小错误：预期 %1，实际 %2\n\n; *** “正在准备安装”向导页\nWizardPreparing=正在准备安装\nPreparingDesc=安装程序正在准备安装 [name] 到您的电脑。\nPreviousInstallNotCompleted=先前的程序安装或卸载未完成，您需要重启您的电脑以完成。%n%n在重启电脑后，再次运行安装程序以完成 [name] 的安装。\nCannotContinue=安装程序不能继续。请点击“取消”退出。\nApplicationsFound=以下应用程序正在使用将由安装程序更新的文件。建议您允许安装程序自动关闭这些应用程序。\nApplicationsFound2=以下应用程序正在使用将由安装程序更新的文件。建议您允许安装程序自动关闭这些应用程序。安装完成后，安装程序将尝试重新启动这些应用程序。\nCloseApplications=自动关闭应用程序(&A)\nDontCloseApplications=不要关闭应用程序(&D)\nErrorCloseApplications=安装程序无法自动关闭所有应用程序。建议您在继续之前，关闭所有在使用需要由安装程序更新的文件的应用程序。\nPrepareToInstallNeedsRestart=安装程序必须重启您的计算机。计算机重启后，请再次运行安装程序以完成 [name] 的安装。%n%n是否立即重新启动？\n\n; *** “正在安装”向导页\nWizardInstalling=正在安装\nInstallingLabel=安装程序正在安装 [name] 到您的电脑，请稍候。\n\n; *** “安装完成”向导页\nFinishedHeadingLabel=[name] 安装完成\nFinishedLabelNoIcons=安装程序已在您的电脑中安装了 [name]。\nFinishedLabel=安装程序已在您的电脑中安装了 [name]。您可以通过已安装的快捷方式运行此应用程序。\nClickFinish=点击“完成”退出安装程序。\nFinishedRestartLabel=为完成 [name] 的安装，安装程序必须重新启动您的电脑。要立即重启吗？\nFinishedRestartMessage=为完成 [name] 的安装，安装程序必须重新启动您的电脑。%n%n要立即重启吗？\nShowReadmeCheck=是，我想查阅自述文件\nYesRadio=是，立即重启电脑(&Y)\nNoRadio=否，稍后重启电脑(&N)\n; used for example as 'Run MyProg.exe'\nRunEntryExec=运行 %1\n; used for example as 'View Readme.txt'\nRunEntryShellExec=查阅 %1\n\n; *** “安装程序需要下一张磁盘”提示\nChangeDiskTitle=安装程序需要下一张磁盘\nSelectDiskLabel2=请插入磁盘 %1 并点击“确定”。%n%n如果这个磁盘中的文件可以在下列文件夹之外的文件夹中找到，请输入正确的路径或点击“浏览”。\nPathLabel=路径(&P)：\nFileNotInDir2=“%2”中找不到文件“%1”。请插入正确的磁盘或选择其他文件夹。\nSelectDirectoryLabel=请指定下一张磁盘的位置。\n\n; *** 安装状态消息\nSetupAborted=安装程序未完成安装。%n%n请修正这个问题并重新运行安装程序。\nAbortRetryIgnoreSelectAction=选择操作\nAbortRetryIgnoreRetry=重试(&T)\nAbortRetryIgnoreIgnore=忽略错误并继续(&I)\nAbortRetryIgnoreCancel=关闭安装程序\n\n; *** 安装状态消息\nStatusClosingApplications=正在关闭应用程序...\nStatusCreateDirs=正在创建目录...\nStatusExtractFiles=正在解压缩文件...\nStatusCreateIcons=正在创建快捷方式...\nStatusCreateIniEntries=正在创建 INI 条目...\nStatusCreateRegistryEntries=正在创建注册表条目...\nStatusRegisterFiles=正在注册文件...\nStatusSavingUninstall=正在保存卸载信息...\nStatusRunProgram=正在完成安装...\nStatusRestartingApplications=正在重启应用程序...\nStatusRollback=正在撤销更改...\n\n; *** 其他错误\nErrorInternal2=内部错误：%1\nErrorFunctionFailedNoCode=%1 失败\nErrorFunctionFailed=%1 失败；错误代码 %2\nErrorFunctionFailedWithMessage=%1 失败；错误代码 %2.%n%3\nErrorExecutingProgram=无法执行文件：%n%1\n\n; *** 注册表错误\nErrorRegOpenKey=打开注册表项时出错：%n%1\\%2\nErrorRegCreateKey=创建注册表项时出错：%n%1\\%2\nErrorRegWriteKey=写入注册表项时出错：%n%1\\%2\n\n; *** INI 错误\nErrorIniEntry=在文件“%1”中创建 INI 条目时出错。\n\n; *** 文件复制错误\nFileAbortRetryIgnoreSkipNotRecommended=跳过此文件(&S) (不推荐)\nFileAbortRetryIgnoreIgnoreNotRecommended=忽略错误并继续(&I) (不推荐)\nSourceIsCorrupted=源文件已损坏\nSourceDoesntExist=源文件“%1”不存在\nExistingFileReadOnly2=无法替换现有文件，它是只读的。\nExistingFileReadOnlyRetry=移除只读属性并重试(&R)\nExistingFileReadOnlyKeepExisting=保留现有文件(&K)\nErrorReadingExistingDest=尝试读取现有文件时出错：\nFileExistsSelectAction=选择操作\nFileExists2=文件已经存在。\nFileExistsOverwriteExisting=覆盖已存在的文件(&O)\nFileExistsKeepExisting=保留现有的文件(&K)\nFileExistsOverwriteOrKeepAll=为所有冲突文件执行此操作(&D)\nExistingFileNewerSelectAction=选择操作\nExistingFileNewer2=现有的文件比安装程序将要安装的文件还要新。\nExistingFileNewerOverwriteExisting=覆盖已存在的文件(&O)\nExistingFileNewerKeepExisting=保留现有的文件(&K) (推荐)\nExistingFileNewerOverwriteOrKeepAll=为所有冲突文件执行此操作(&D)\nErrorChangingAttr=尝试更改下列现有文件的属性时出错：\nErrorCreatingTemp=尝试在目标目录创建文件时出错：\nErrorReadingSource=尝试读取下列源文件时出错：\nErrorCopying=尝试复制下列文件时出错：\nErrorReplacingExistingFile=尝试替换现有文件时出错：\nErrorRestartReplace=重启并替换失败：\nErrorRenamingTemp=尝试重命名下列目标目录中的一个文件时出错：\nErrorRegisterServer=无法注册 DLL/OCX：%1\nErrorRegSvr32Failed=RegSvr32 失败；退出代码 %1\nErrorRegisterTypeLib=无法注册类库：%1\n\n; *** 卸载显示名字标记\n; used for example as 'My Program (32-bit)'\nUninstallDisplayNameMark=%1 (%2)\n; used for example as 'My Program (32-bit, All users)'\nUninstallDisplayNameMarks=%1 (%2, %3)\nUninstallDisplayNameMark32Bit=32 位\nUninstallDisplayNameMark64Bit=64 位\nUninstallDisplayNameMarkAllUsers=所有用户\nUninstallDisplayNameMarkCurrentUser=当前用户\n\n; *** 安装后错误\nErrorOpeningReadme=尝试打开自述文件时出错。\nErrorRestartingComputer=安装程序无法重启电脑，请手动重启。\n\n; *** 卸载消息\nUninstallNotFound=文件“%1”不存在。无法卸载。\nUninstallOpenError=文件“%1”不能被打开。无法卸载。\nUninstallUnsupportedVer=此版本的卸载程序无法识别卸载日志文件“%1”的格式。无法卸载\nUninstallUnknownEntry=卸载日志中遇到一个未知条目 (%1)\nConfirmUninstall=您确认要完全移除 %1 及其所有组件吗？\nUninstallOnlyOnWin64=仅允许在 64 位 Windows 中卸载此程序。\nOnlyAdminCanUninstall=仅使用管理员权限的用户能完成此卸载。\nUninstallStatusLabel=正在从您的电脑中移除 %1，请稍候。\nUninstalledAll=已顺利从您的电脑中移除 %1。\nUninstalledMost=%1 卸载完成。%n%n有部分内容未能被删除，但您可以手动删除它们。\nUninstalledAndNeedsRestart=为完成 %1 的卸载，需要重启您的电脑。%n%n立即重启电脑吗？\nUninstallDataCorrupted=文件“%1”已损坏。无法卸载\n\n; *** 卸载状态消息\nConfirmDeleteSharedFileTitle=删除共享的文件吗？\nConfirmDeleteSharedFile2=系统表示下列共享的文件已不有其他程序使用。您希望卸载程序删除这些共享的文件吗？%n%n如果删除这些文件，但仍有程序在使用这些文件，则这些程序可能出现异常。如果您不能确定，请选择“否”，在系统中保留这些文件以免引发问题。\nSharedFileNameLabel=文件名：\nSharedFileLocationLabel=位置：\nWizardUninstalling=卸载状态\nStatusUninstalling=正在卸载 %1...\n\n; *** Shutdown block reasons\nShutdownBlockReasonInstallingApp=正在安装 %1。\nShutdownBlockReasonUninstallingApp=正在卸载 %1。\n\n; The custom messages below aren't used by Setup itself, but if you make\n; use of them in your scripts, you'll want to translate them.\n\n[CustomMessages]\n\nNameAndVersion=%1 版本 %2\nAdditionalIcons=附加快捷方式：\nCreateDesktopIcon=创建桌面快捷方式(&D)\nCreateQuickLaunchIcon=创建快速启动栏快捷方式(&Q)\nProgramOnTheWeb=%1 网站\nUninstallProgram=卸载 %1\nLaunchProgram=运行 %1\nAssocFileExtension=将 %2 文件扩展名与 %1 建立关联(&A)\nAssocingFileExtension=正在将 %2 文件扩展名与 %1 建立关联...\nAutoStartProgramGroupDescription=启动：\nAutoStartProgram=自动启动 %1\nAddonHostProgramNotFound=您选择的文件夹中无法找到 %1。%n%n您要继续吗？\n\nCloseRunningAppToContinueUninstall=%1 当前正在运行。需要先将其关闭才能继续卸载。是否立即关闭？"
  },
  {
    "path": "windows/inno-languages/English.isl",
    "content": "﻿; *** Inno Setup version 6.4.0+ English messages ***\n;\n; To download user-contributed translations of this file, go to:\n;   https://jrsoftware.org/files/istrans/\n;\n; Note: When translating this text, do not add periods (.) to the end of\n; messages that didn't have them already, because on those messages Inno\n; Setup adds the periods automatically (appending a period would result in\n; two periods being displayed).\n\n[LangOptions]\n; The following three entries are very important. Be sure to read and \n; understand the '[LangOptions] section' topic in the help file.\nLanguageName=English\nLanguageID=$0409\nLanguageCodePage=0\n; If the language you are translating to requires special font faces or\n; sizes, uncomment any of the following entries and change them accordingly.\n;DialogFontName=\n;DialogFontSize=8\n;WelcomeFontName=Verdana\n;WelcomeFontSize=12\n;TitleFontName=Arial\n;TitleFontSize=29\n;CopyrightFontName=Arial\n;CopyrightFontSize=8\n\n[Messages]\n\n; *** Application titles\nSetupAppTitle=Setup\nSetupWindowTitle=Setup - %1\nUninstallAppTitle=Uninstall\nUninstallAppFullTitle=%1 Uninstall\n\n; *** Misc. common\nInformationTitle=Information\nConfirmTitle=Confirm\nErrorTitle=Error\n\n; *** SetupLdr messages\nSetupLdrStartupMessage=This will install %1. Do you wish to continue?\nLdrCannotCreateTemp=Unable to create a temporary file. Setup aborted\nLdrCannotExecTemp=Unable to execute file in the temporary directory. Setup aborted\nHelpTextNote=\n\n; *** Startup error messages\nLastErrorMessage=%1.%n%nError %2: %3\nSetupFileMissing=The file %1 is missing from the installation directory. Please correct the problem or obtain a new copy of the program.\nSetupFileCorrupt=The setup files are corrupted. Please obtain a new copy of the program.\nSetupFileCorruptOrWrongVer=The setup files are corrupted, or are incompatible with this version of Setup. Please correct the problem or obtain a new copy of the program.\nInvalidParameter=An invalid parameter was passed on the command line:%n%n%1\nSetupAlreadyRunning=Setup is already running.\nWindowsVersionNotSupported=This program does not support the version of Windows your computer is running.\nWindowsServicePackRequired=This program requires %1 Service Pack %2 or later.\nNotOnThisPlatform=This program will not run on %1.\nOnlyOnThisPlatform=This program must be run on %1.\nOnlyOnTheseArchitectures=This program can only be installed on versions of Windows designed for the following processor architectures:%n%n%1\nWinVersionTooLowError=This program requires %1 version %2 or later.\nWinVersionTooHighError=This program cannot be installed on %1 version %2 or later.\nAdminPrivilegesRequired=You must be logged in as an administrator when installing this program.\nPowerUserPrivilegesRequired=You must be logged in as an administrator or as a member of the Power Users group when installing this program.\nSetupAppRunningError=Setup has detected that %1 is currently running.%n%nPlease close all instances of it now, then click OK to continue, or Cancel to exit.\nUninstallAppRunningError=Uninstall has detected that %1 is currently running.%n%nPlease close all instances of it now, then click OK to continue, or Cancel to exit.\n\n; *** Startup questions\nPrivilegesRequiredOverrideTitle=Select Setup Install Mode\nPrivilegesRequiredOverrideInstruction=Select install mode\nPrivilegesRequiredOverrideText1=%1 can be installed for all users (requires administrative privileges), or for you only.\nPrivilegesRequiredOverrideText2=%1 can be installed for you only, or for all users (requires administrative privileges).\nPrivilegesRequiredOverrideAllUsers=Install for &all users\nPrivilegesRequiredOverrideAllUsersRecommended=Install for &all users (recommended)\nPrivilegesRequiredOverrideCurrentUser=Install for &me only\nPrivilegesRequiredOverrideCurrentUserRecommended=Install for &me only (recommended)\n\n; *** Misc. errors\nErrorCreatingDir=Setup was unable to create the directory \"%1\"\nErrorTooManyFilesInDir=Unable to create a file in the directory \"%1\" because it contains too many files\n\n; *** Setup common messages\nExitSetupTitle=Exit Setup\nExitSetupMessage=Setup is not complete. If you exit now, the program will not be installed.%n%nYou may run Setup again at another time to complete the installation.%n%nExit Setup?\nAboutSetupMenuItem=&About Setup...\nAboutSetupTitle=About Setup\nAboutSetupMessage=%1 version %2%n%3%n%n%1 home page:%n%4\nAboutSetupNote=\nTranslatorNote=\n\n; *** Buttons\nButtonBack=< &Back\nButtonNext=&Next >\nButtonInstall=&Install\nButtonOK=OK\nButtonCancel=Cancel\nButtonYes=&Yes\nButtonYesToAll=Yes to &All\nButtonNo=&No\nButtonNoToAll=N&o to All\nButtonFinish=&Finish\nButtonBrowse=&Browse...\nButtonWizardBrowse=B&rowse...\nButtonNewFolder=&Make New Folder\n\n; *** \"Select Language\" dialog messages\nSelectLanguageTitle=Select Setup Language\nSelectLanguageLabel=Select the language to use during the installation.\n\n; *** Common wizard text\nClickNext=Click Next to continue, or Cancel to exit Setup.\nBeveledLabel=\nBrowseDialogTitle=Browse For Folder\nBrowseDialogLabel=Select a folder in the list below, then click OK.\nNewFolderName=New Folder\n\n; *** \"Welcome\" wizard page\nWelcomeLabel1=Welcome to the [name] Setup Wizard\nWelcomeLabel2=This will install [name/ver] on your computer.%n%nIt is recommended that you close all other applications before continuing.\n\n; *** \"Password\" wizard page\nWizardPassword=Password\nPasswordLabel1=This installation is password protected.\nPasswordLabel3=Please provide the password, then click Next to continue. Passwords are case-sensitive.\nPasswordEditLabel=&Password:\nIncorrectPassword=The password you entered is not correct. Please try again.\n\n; *** \"License Agreement\" wizard page\nWizardLicense=License Agreement\nLicenseLabel=Please read the following important information before continuing.\nLicenseLabel3=Please read the following License Agreement. You must accept the terms of this agreement before continuing with the installation.\nLicenseAccepted=I &accept the agreement\nLicenseNotAccepted=I &do not accept the agreement\n\n; *** \"Information\" wizard pages\nWizardInfoBefore=Information\nInfoBeforeLabel=Please read the following important information before continuing.\nInfoBeforeClickLabel=When you are ready to continue with Setup, click Next.\nWizardInfoAfter=Information\nInfoAfterLabel=Please read the following important information before continuing.\nInfoAfterClickLabel=When you are ready to continue with Setup, click Next.\n\n; *** \"User Information\" wizard page\nWizardUserInfo=User Information\nUserInfoDesc=Please enter your information.\nUserInfoName=&User Name:\nUserInfoOrg=&Organization:\nUserInfoSerial=&Serial Number:\nUserInfoNameRequired=You must enter a name.\n\n; *** \"Select Destination Location\" wizard page\nWizardSelectDir=Select Destination Location\nSelectDirDesc=Where should [name] be installed?\nSelectDirLabel3=Setup will install [name] into the following folder.\nSelectDirBrowseLabel=To continue, click Next. If you would like to select a different folder, click Browse.\nDiskSpaceGBLabel=At least [gb] GB of free disk space is required.\nDiskSpaceMBLabel=At least [mb] MB of free disk space is required.\nCannotInstallToNetworkDrive=Setup cannot install to a network drive.\nCannotInstallToUNCPath=Setup cannot install to a UNC path.\nInvalidPath=You must enter a full path with drive letter; for example:%n%nC:\\APP%n%nor a UNC path in the form:%n%n\\\\server\\share\nInvalidDrive=The drive or UNC share you selected does not exist or is not accessible. Please select another.\nDiskSpaceWarningTitle=Not Enough Disk Space\nDiskSpaceWarning=Setup requires at least %1 KB of free space to install, but the selected drive only has %2 KB available.%n%nDo you want to continue anyway?\nDirNameTooLong=The folder name or path is too long.\nInvalidDirName=The folder name is not valid.\nBadDirName32=Folder names cannot include any of the following characters:%n%n%1\nDirExistsTitle=Folder Exists\nDirExists=The folder:%n%n%1%n%nalready exists. Would you like to install to that folder anyway?\nDirDoesntExistTitle=Folder Does Not Exist\nDirDoesntExist=The folder:%n%n%1%n%ndoes not exist. Would you like the folder to be created?\n\n; *** \"Select Components\" wizard page\nWizardSelectComponents=Select Components\nSelectComponentsDesc=Which components should be installed?\nSelectComponentsLabel2=Select the components you want to install; clear the components you do not want to install. Click Next when you are ready to continue.\nFullInstallation=Full installation\n; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language)\nCompactInstallation=Compact installation\nCustomInstallation=Custom installation\nNoUninstallWarningTitle=Components Exist\nNoUninstallWarning=Setup has detected that the following components are already installed on your computer:%n%n%1%n%nDeselecting these components will not uninstall them.%n%nWould you like to continue anyway?\nComponentSize1=%1 KB\nComponentSize2=%1 MB\nComponentsDiskSpaceGBLabel=Current selection requires at least [gb] GB of disk space.\nComponentsDiskSpaceMBLabel=Current selection requires at least [mb] MB of disk space.\n\n; *** \"Select Additional Tasks\" wizard page\nWizardSelectTasks=Select Additional Tasks\nSelectTasksDesc=Which additional tasks should be performed?\nSelectTasksLabel2=Select the additional tasks you would like Setup to perform while installing [name], then click Next.\n\n; *** \"Select Start Menu Folder\" wizard page\nWizardSelectProgramGroup=Select Start Menu Folder\nSelectStartMenuFolderDesc=Where should Setup place the program's shortcuts?\nSelectStartMenuFolderLabel3=Setup will create the program's shortcuts in the following Start Menu folder.\nSelectStartMenuFolderBrowseLabel=To continue, click Next. If you would like to select a different folder, click Browse.\nMustEnterGroupName=You must enter a folder name.\nGroupNameTooLong=The folder name or path is too long.\nInvalidGroupName=The folder name is not valid.\nBadGroupName=The folder name cannot include any of the following characters:%n%n%1\nNoProgramGroupCheck2=&Don't create a Start Menu folder\n\n; *** \"Ready to Install\" wizard page\nWizardReady=Ready to Install\nReadyLabel1=Setup is now ready to begin installing [name] on your computer.\nReadyLabel2a=Click Install to continue with the installation, or click Back if you want to review or change any settings.\nReadyLabel2b=Click Install to continue with the installation.\nReadyMemoUserInfo=User information:\nReadyMemoDir=Destination location:\nReadyMemoType=Setup type:\nReadyMemoComponents=Selected components:\nReadyMemoGroup=Start Menu folder:\nReadyMemoTasks=Additional tasks:\n\n; *** TDownloadWizardPage wizard page and DownloadTemporaryFile\nDownloadingLabel=Downloading additional files...\nButtonStopDownload=&Stop download\nStopDownload=Are you sure you want to stop the download?\nErrorDownloadAborted=Download aborted\nErrorDownloadFailed=Download failed: %1 %2\nErrorDownloadSizeFailed=Getting size failed: %1 %2\nErrorFileHash1=File hash failed: %1\nErrorFileHash2=Invalid file hash: expected %1, found %2\nErrorProgress=Invalid progress: %1 of %2\nErrorFileSize=Invalid file size: expected %1, found %2\n\n; *** TExtractionWizardPage wizard page and Extract7ZipArchive\nExtractionLabel=Extracting additional files...\nButtonStopExtraction=&Stop extraction\nStopExtraction=Are you sure you want to stop the extraction?\nErrorExtractionAborted=Extraction aborted\nErrorExtractionFailed=Extraction failed: %1\n\n; *** \"Preparing to Install\" wizard page\nWizardPreparing=Preparing to Install\nPreparingDesc=Setup is preparing to install [name] on your computer.\nPreviousInstallNotCompleted=The installation/removal of a previous program was not completed. You will need to restart your computer to complete that installation.%n%nAfter restarting your computer, run Setup again to complete the installation of [name].\nCannotContinue=Setup cannot continue. Please click Cancel to exit.\nApplicationsFound=The following applications are using files that need to be updated by Setup. It is recommended that you allow Setup to automatically close these applications.\nApplicationsFound2=The following applications are using files that need to be updated by Setup. It is recommended that you allow Setup to automatically close these applications. After the installation has completed, Setup will attempt to restart the applications.\nCloseApplications=&Automatically close the applications\nDontCloseApplications=&Do not close the applications\nErrorCloseApplications=Setup was unable to automatically close all applications. It is recommended that you close all applications using files that need to be updated by Setup before continuing.\nPrepareToInstallNeedsRestart=Setup must restart your computer. After restarting your computer, run Setup again to complete the installation of [name].%n%nWould you like to restart now?\n\n; *** \"Installing\" wizard page\nWizardInstalling=Installing\nInstallingLabel=Please wait while Setup installs [name] on your computer.\n\n; *** \"Setup Completed\" wizard page\nFinishedHeadingLabel=Completing the [name] Setup Wizard\nFinishedLabelNoIcons=Setup has finished installing [name] on your computer.\nFinishedLabel=Setup has finished installing [name] on your computer. The application may be launched by selecting the installed shortcuts.\nClickFinish=Click Finish to exit Setup.\nFinishedRestartLabel=To complete the installation of [name], Setup must restart your computer. Would you like to restart now?\nFinishedRestartMessage=To complete the installation of [name], Setup must restart your computer.%n%nWould you like to restart now?\nShowReadmeCheck=Yes, I would like to view the README file\nYesRadio=&Yes, restart the computer now\nNoRadio=&No, I will restart the computer later\n; used for example as 'Run MyProg.exe'\nRunEntryExec=Run %1\n; used for example as 'View Readme.txt'\nRunEntryShellExec=View %1\n\n; *** \"Setup Needs the Next Disk\" stuff\nChangeDiskTitle=Setup Needs the Next Disk\nSelectDiskLabel2=Please insert Disk %1 and click OK.%n%nIf the files on this disk can be found in a folder other than the one displayed below, enter the correct path or click Browse.\nPathLabel=&Path:\nFileNotInDir2=The file \"%1\" could not be located in \"%2\". Please insert the correct disk or select another folder.\nSelectDirectoryLabel=Please specify the location of the next disk.\n\n; *** Installation phase messages\nSetupAborted=Setup was not completed.%n%nPlease correct the problem and run Setup again.\nAbortRetryIgnoreSelectAction=Select action\nAbortRetryIgnoreRetry=&Try again\nAbortRetryIgnoreIgnore=&Ignore the error and continue\nAbortRetryIgnoreCancel=Cancel installation\n\n; *** Installation status messages\nStatusClosingApplications=Closing applications...\nStatusCreateDirs=Creating directories...\nStatusExtractFiles=Extracting files...\nStatusCreateIcons=Creating shortcuts...\nStatusCreateIniEntries=Creating INI entries...\nStatusCreateRegistryEntries=Creating registry entries...\nStatusRegisterFiles=Registering files...\nStatusSavingUninstall=Saving uninstall information...\nStatusRunProgram=Finishing installation...\nStatusRestartingApplications=Restarting applications...\nStatusRollback=Rolling back changes...\n\n; *** Misc. errors\nErrorInternal2=Internal error: %1\nErrorFunctionFailedNoCode=%1 failed\nErrorFunctionFailed=%1 failed; code %2\nErrorFunctionFailedWithMessage=%1 failed; code %2.%n%3\nErrorExecutingProgram=Unable to execute file:%n%1\n\n; *** Registry errors\nErrorRegOpenKey=Error opening registry key:%n%1\\%2\nErrorRegCreateKey=Error creating registry key:%n%1\\%2\nErrorRegWriteKey=Error writing to registry key:%n%1\\%2\n\n; *** INI errors\nErrorIniEntry=Error creating INI entry in file \"%1\".\n\n; *** File copying errors\nFileAbortRetryIgnoreSkipNotRecommended=&Skip this file (not recommended)\nFileAbortRetryIgnoreIgnoreNotRecommended=&Ignore the error and continue (not recommended)\nSourceIsCorrupted=The source file is corrupted\nSourceDoesntExist=The source file \"%1\" does not exist\nExistingFileReadOnly2=The existing file could not be replaced because it is marked read-only.\nExistingFileReadOnlyRetry=&Remove the read-only attribute and try again\nExistingFileReadOnlyKeepExisting=&Keep the existing file\nErrorReadingExistingDest=An error occurred while trying to read the existing file:\nFileExistsSelectAction=Select action\nFileExists2=The file already exists.\nFileExistsOverwriteExisting=&Overwrite the existing file\nFileExistsKeepExisting=&Keep the existing file\nFileExistsOverwriteOrKeepAll=&Do this for the next conflicts\nExistingFileNewerSelectAction=Select action\nExistingFileNewer2=The existing file is newer than the one Setup is trying to install.\nExistingFileNewerOverwriteExisting=&Overwrite the existing file\nExistingFileNewerKeepExisting=&Keep the existing file (recommended)\nExistingFileNewerOverwriteOrKeepAll=&Do this for the next conflicts\nErrorChangingAttr=An error occurred while trying to change the attributes of the existing file:\nErrorCreatingTemp=An error occurred while trying to create a file in the destination directory:\nErrorReadingSource=An error occurred while trying to read the source file:\nErrorCopying=An error occurred while trying to copy a file:\nErrorReplacingExistingFile=An error occurred while trying to replace the existing file:\nErrorRestartReplace=RestartReplace failed:\nErrorRenamingTemp=An error occurred while trying to rename a file in the destination directory:\nErrorRegisterServer=Unable to register the DLL/OCX: %1\nErrorRegSvr32Failed=RegSvr32 failed with exit code %1\nErrorRegisterTypeLib=Unable to register the type library: %1\n\n; *** Uninstall display name markings\n; used for example as 'My Program (32-bit)'\nUninstallDisplayNameMark=%1 (%2)\n; used for example as 'My Program (32-bit, All users)'\nUninstallDisplayNameMarks=%1 (%2, %3)\nUninstallDisplayNameMark32Bit=32-bit\nUninstallDisplayNameMark64Bit=64-bit\nUninstallDisplayNameMarkAllUsers=All users\nUninstallDisplayNameMarkCurrentUser=Current user\n\n; *** Post-installation errors\nErrorOpeningReadme=An error occurred while trying to open the README file.\nErrorRestartingComputer=Setup was unable to restart the computer. Please do this manually.\n\n; *** Uninstaller messages\nUninstallNotFound=File \"%1\" does not exist. Cannot uninstall.\nUninstallOpenError=File \"%1\" could not be opened. Cannot uninstall\nUninstallUnsupportedVer=The uninstall log file \"%1\" is in a format not recognized by this version of the uninstaller. Cannot uninstall\nUninstallUnknownEntry=An unknown entry (%1) was encountered in the uninstall log\nConfirmUninstall=Are you sure you want to completely remove %1 and all of its components?\nUninstallOnlyOnWin64=This installation can only be uninstalled on 64-bit Windows.\nOnlyAdminCanUninstall=This installation can only be uninstalled by a user with administrative privileges.\nUninstallStatusLabel=Please wait while %1 is removed from your computer.\nUninstalledAll=%1 was successfully removed from your computer.\nUninstalledMost=%1 uninstall complete.%n%nSome elements could not be removed. These can be removed manually.\nUninstalledAndNeedsRestart=To complete the uninstallation of %1, your computer must be restarted.%n%nWould you like to restart now?\nUninstallDataCorrupted=\"%1\" file is corrupted. Cannot uninstall\n\n; *** Uninstallation phase messages\nConfirmDeleteSharedFileTitle=Remove Shared File?\nConfirmDeleteSharedFile2=The system indicates that the following shared file is no longer in use by any programs. Would you like for Uninstall to remove this shared file?%n%nIf any programs are still using this file and it is removed, those programs may not function properly. If you are unsure, choose No. Leaving the file on your system will not cause any harm.\nSharedFileNameLabel=File name:\nSharedFileLocationLabel=Location:\nWizardUninstalling=Uninstall Status\nStatusUninstalling=Uninstalling %1...\n\n; *** Shutdown block reasons\nShutdownBlockReasonInstallingApp=Installing %1.\nShutdownBlockReasonUninstallingApp=Uninstalling %1.\n\n; The custom messages below aren't used by Setup itself, but if you make\n; use of them in your scripts, you'll want to translate them.\n\n[CustomMessages]\n\nNameAndVersion=%1 version %2\nAdditionalIcons=Additional shortcuts:\nCreateDesktopIcon=Create a &desktop shortcut\nCreateQuickLaunchIcon=Create a &Quick Launch shortcut\nProgramOnTheWeb=%1 on the Web\nUninstallProgram=Uninstall %1\nLaunchProgram=Launch %1\nAssocFileExtension=&Associate %1 with the %2 file extension\nAssocingFileExtension=Associating %1 with the %2 file extension...\nAutoStartProgramGroupDescription=Startup:\nAutoStartProgram=Automatically start %1\nAddonHostProgramNotFound=%1 could not be located in the folder you selected.%n%nDo you want to continue anyway?\n\nCloseRunningAppToContinueUninstall=%1 is currently running. It needs to be closed before the uninstallation can continue. Do you want to close now?\n"
  },
  {
    "path": "windows/iris-updater.bat",
    "content": "@echo off\ntitle IRIS Updater\nsetlocal enabledelayedexpansion\n\nset \"api_url=https://api.github.com/repos/nini22P/iris/releases/latest\"\nset \"download_folder=%~dp0temps\"\n\n:: Try to delete the download folder if it exists\nif exist \"%download_folder%\" (\n    rd /s /q \"%download_folder%\"\n)\n\n:: Create download folder\nmkdir \"%download_folder%\"\n\necho Fetching latest release from GitHub...\n\n:: Fetch JSON data using curl\npowershell -Command \"try { Invoke-WebRequest -Uri '%api_url%' -UseBasicParsing | Select-Object -ExpandProperty Content | Out-File -Encoding UTF8 '%download_folder%\\release.json' } catch { Write-Host 'Error fetching release info: ' $_.Exception.Message; exit 1 }\"\n\nif not exist \"%download_folder%\\release.json\" (\n    echo Error: Could not fetch release data. Please check your internet connection.\n    goto :end\n)\n\nfor /f \"delims=\" %%a in ('powershell -command \"try { Get-Content '%download_folder%\\release.json' | ConvertFrom-Json | Select-Object -ExpandProperty tag_name } catch { Write-Host 'Error parsing JSON: ' $_.Exception.Message; exit 1 }\"') do (\n    set \"version_tag=%%a\"\n    if defined version_tag (\n        goto :version_found\n    )\n)\n\necho Error: Could not extract version tag from release info.\ngoto :end\n\n:version_found\n\nset \"download_url=https://github.com/nini22P/iris/releases/latest/download/IRIS-windows.zip\"\nset \"zip_file=%download_folder%\\IRIS-windows.zip\"\nset \"extract_folder=%download_folder%\"\n\ntitle Download IRIS !version_tag!\n\nwhere curl >nul 2>nul\nif %errorlevel% equ 0 (\n    echo Download IRIS !version_tag!\n    curl -L -o \"%zip_file%\" \"%download_url%\"\n    if %errorlevel% neq 0 (\n        echo Error downloading file with curl.\n        exit /b 1\n    )\n) else (\n    echo Download IRIS !version_tag!\n    powershell -Command \"try { Invoke-WebRequest -Uri '%download_url%' -OutFile '%zip_file%' } catch { Write-Host 'Error downloading file: ' $_.Exception.Message; exit 1 }\"\n)\n\nif not exist \"%zip_file%\" (\n    echo Error: Failed to download IRIS-windows.zip.\n    goto :end\n)\n\necho Extracting IRIS-windows.zip...\npowershell -Command \"try { Add-Type -Assembly 'System.IO.Compression.FileSystem'; [System.IO.Compression.ZipFile]::ExtractToDirectory('%zip_file%', '%extract_folder%'); } catch { Write-Host 'Error extracting zip: ' $_.Exception.Message; exit 1 }\"\n\n:: Check if IRIS folder exists before moving\nif not exist \"%extract_folder%\\IRIS\" (\n    echo Error: \"IRIS\" folder not found within the extracted files.\n    goto :cleanup\n)\n\necho Starting file move and cleanup...\n:: Start a new cmd window to perform move and cleanup, then current bat will close\nstart cmd /c \"timeout /t 2 /nobreak && xcopy temps\\IRIS\\* .\\ /E /I /Y && rd /s /q temps && start iris\"\n\n:cleanup\nexit\n\n:end\nendlocal\n"
  },
  {
    "path": "windows/runner/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.14)\nproject(runner LANGUAGES CXX)\n\n# Define the application target. To change its name, change BINARY_NAME in the\n# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer\n# work.\n#\n# Any new source files that you add to the application should be added here.\nadd_executable(${BINARY_NAME} WIN32\n  \"flutter_window.cpp\"\n  \"main.cpp\"\n  \"utils.cpp\"\n  \"win32_window.cpp\"\n  \"${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc\"\n  \"Runner.rc\"\n  \"runner.exe.manifest\"\n)\n\n# Apply the standard set of build settings. This can be removed for applications\n# that need different build settings.\napply_standard_settings(${BINARY_NAME})\n\n# Add preprocessor definitions for the build version.\ntarget_compile_definitions(${BINARY_NAME} PRIVATE \"FLUTTER_VERSION=\\\"${FLUTTER_VERSION}\\\"\")\ntarget_compile_definitions(${BINARY_NAME} PRIVATE \"FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}\")\ntarget_compile_definitions(${BINARY_NAME} PRIVATE \"FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}\")\ntarget_compile_definitions(${BINARY_NAME} PRIVATE \"FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}\")\ntarget_compile_definitions(${BINARY_NAME} PRIVATE \"FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}\")\n\n# Disable Windows macros that collide with C++ standard library functions.\ntarget_compile_definitions(${BINARY_NAME} PRIVATE \"NOMINMAX\")\n\n# Add dependency libraries and include directories. Add any application-specific\n# dependencies here.\ntarget_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app)\ntarget_link_libraries(${BINARY_NAME} PRIVATE \"dwmapi.lib\")\ntarget_include_directories(${BINARY_NAME} PRIVATE \"${CMAKE_SOURCE_DIR}\")\n\n# Run the Flutter tool portions of the build. This must not be removed.\nadd_dependencies(${BINARY_NAME} flutter_assemble)\n"
  },
  {
    "path": "windows/runner/Runner.rc",
    "content": "// Microsoft Visual C++ generated resource script.\n//\n#pragma code_page(65001)\n#include \"resource.h\"\n\n#define APSTUDIO_READONLY_SYMBOLS\n/////////////////////////////////////////////////////////////////////////////\n//\n// Generated from the TEXTINCLUDE 2 resource.\n//\n#include \"winres.h\"\n\n/////////////////////////////////////////////////////////////////////////////\n#undef APSTUDIO_READONLY_SYMBOLS\n\n/////////////////////////////////////////////////////////////////////////////\n// English (United States) resources\n\n#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\nLANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US\n\n#ifdef APSTUDIO_INVOKED\n/////////////////////////////////////////////////////////////////////////////\n//\n// TEXTINCLUDE\n//\n\n1 TEXTINCLUDE\nBEGIN\n    \"resource.h\\0\"\nEND\n\n2 TEXTINCLUDE\nBEGIN\n    \"#include \"\"winres.h\"\"\\r\\n\"\n    \"\\0\"\nEND\n\n3 TEXTINCLUDE\nBEGIN\n    \"\\r\\n\"\n    \"\\0\"\nEND\n\n#endif    // APSTUDIO_INVOKED\n\n\n/////////////////////////////////////////////////////////////////////////////\n//\n// Icon\n//\n\n// Icon with lowest ID value placed first to ensure application icon\n// remains consistent on all systems.\nIDI_APP_ICON            ICON                    \"resources\\\\app_icon.ico\"\n\n\n/////////////////////////////////////////////////////////////////////////////\n//\n// Version\n//\n\n#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD)\n#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD\n#else\n#define VERSION_AS_NUMBER 1,0,0,0\n#endif\n\n#if defined(FLUTTER_VERSION)\n#define VERSION_AS_STRING FLUTTER_VERSION\n#else\n#define VERSION_AS_STRING \"1.0.0\"\n#endif\n\nVS_VERSION_INFO VERSIONINFO\n FILEVERSION VERSION_AS_NUMBER\n PRODUCTVERSION VERSION_AS_NUMBER\n FILEFLAGSMASK VS_FFI_FILEFLAGSMASK\n#ifdef _DEBUG\n FILEFLAGS VS_FF_DEBUG\n#else\n FILEFLAGS 0x0L\n#endif\n FILEOS VOS__WINDOWS32\n FILETYPE VFT_APP\n FILESUBTYPE 0x0L\nBEGIN\n    BLOCK \"StringFileInfo\"\n    BEGIN\n        BLOCK \"040904e4\"\n        BEGIN\n            VALUE \"CompanyName\", \"nini22P\" \"\\0\"\n            VALUE \"FileDescription\", \"iris\" \"\\0\"\n            VALUE \"FileVersion\", VERSION_AS_STRING \"\\0\"\n            VALUE \"InternalName\", \"iris\" \"\\0\"\n            VALUE \"LegalCopyright\", \"Copyright (C) 2024 nini22P. All rights reserved.\" \"\\0\"\n            VALUE \"OriginalFilename\", \"iris.exe\" \"\\0\"\n            VALUE \"ProductName\", \"iris\" \"\\0\"\n            VALUE \"ProductVersion\", VERSION_AS_STRING \"\\0\"\n        END\n    END\n    BLOCK \"VarFileInfo\"\n    BEGIN\n        VALUE \"Translation\", 0x409, 1252\n    END\nEND\n\n#endif    // English (United States) resources\n/////////////////////////////////////////////////////////////////////////////\n\n\n\n#ifndef APSTUDIO_INVOKED\n/////////////////////////////////////////////////////////////////////////////\n//\n// Generated from the TEXTINCLUDE 3 resource.\n//\n\n\n/////////////////////////////////////////////////////////////////////////////\n#endif    // not APSTUDIO_INVOKED\n"
  },
  {
    "path": "windows/runner/flutter_window.cpp",
    "content": "#include \"flutter_window.h\"\n\n#include <optional>\n\n#include \"flutter/generated_plugin_registrant.h\"\n\nFlutterWindow::FlutterWindow(const flutter::DartProject& project)\n    : project_(project) {}\n\nFlutterWindow::~FlutterWindow() {}\n\nbool FlutterWindow::OnCreate() {\n  if (!Win32Window::OnCreate()) {\n    return false;\n  }\n\n  RECT frame = GetClientArea();\n\n  // The size here must match the window dimensions to avoid unnecessary surface\n  // creation / destruction in the startup path.\n  flutter_controller_ = std::make_unique<flutter::FlutterViewController>(\n      frame.right - frame.left, frame.bottom - frame.top, project_);\n  // Ensure that basic setup of the controller was successful.\n  if (!flutter_controller_->engine() || !flutter_controller_->view()) {\n    return false;\n  }\n  RegisterPlugins(flutter_controller_->engine());\n  SetChildContent(flutter_controller_->view()->GetNativeWindow());\n\n  flutter_controller_->engine()->SetNextFrameCallback([&]() {\n    this->Show();\n  });\n\n  // Flutter can complete the first frame before the \"show window\" callback is\n  // registered. The following call ensures a frame is pending to ensure the\n  // window is shown. It is a no-op if the first frame hasn't completed yet.\n  flutter_controller_->ForceRedraw();\n\n  return true;\n}\n\nvoid FlutterWindow::OnDestroy() {\n  if (flutter_controller_) {\n    flutter_controller_ = nullptr;\n  }\n\n  Win32Window::OnDestroy();\n}\n\nLRESULT\nFlutterWindow::MessageHandler(HWND hwnd, UINT const message,\n                              WPARAM const wparam,\n                              LPARAM const lparam) noexcept {\n  // Give Flutter, including plugins, an opportunity to handle window messages.\n  if (flutter_controller_) {\n    std::optional<LRESULT> result =\n        flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam,\n                                                      lparam);\n    if (result) {\n      return *result;\n    }\n  }\n\n  switch (message) {\n    case WM_FONTCHANGE:\n      flutter_controller_->engine()->ReloadSystemFonts();\n      break;\n  }\n\n  return Win32Window::MessageHandler(hwnd, message, wparam, lparam);\n}\n"
  },
  {
    "path": "windows/runner/flutter_window.h",
    "content": "#ifndef RUNNER_FLUTTER_WINDOW_H_\n#define RUNNER_FLUTTER_WINDOW_H_\n\n#include <flutter/dart_project.h>\n#include <flutter/flutter_view_controller.h>\n\n#include <memory>\n\n#include \"win32_window.h\"\n\n// A window that does nothing but host a Flutter view.\nclass FlutterWindow : public Win32Window {\n public:\n  // Creates a new FlutterWindow hosting a Flutter view running |project|.\n  explicit FlutterWindow(const flutter::DartProject& project);\n  virtual ~FlutterWindow();\n\n protected:\n  // Win32Window:\n  bool OnCreate() override;\n  void OnDestroy() override;\n  LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam,\n                         LPARAM const lparam) noexcept override;\n\n private:\n  // The project to run.\n  flutter::DartProject project_;\n\n  // The Flutter instance hosted by this window.\n  std::unique_ptr<flutter::FlutterViewController> flutter_controller_;\n};\n\n#endif  // RUNNER_FLUTTER_WINDOW_H_\n"
  },
  {
    "path": "windows/runner/main.cpp",
    "content": "#include <flutter/dart_project.h>\n#include <flutter/flutter_view_controller.h>\n#include <windows.h>\n\n#include \"flutter_window.h\"\n#include \"utils.h\"\n\nint APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,\n                      _In_ wchar_t *command_line, _In_ int show_command) {\n  // Attach to console when present (e.g., 'flutter run') or create a\n  // new console when running with a debugger.\n  if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) {\n    CreateAndAttachConsole();\n  }\n\n  // Initialize COM, so that it is available for use in the library and/or\n  // plugins.\n  ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);\n\n  flutter::DartProject project(L\"data\");\n\n  std::vector<std::string> command_line_arguments =\n      GetCommandLineArguments();\n\n  project.set_dart_entrypoint_arguments(std::move(command_line_arguments));\n\n  FlutterWindow window(project);\n  Win32Window::Point origin(10, 10);\n  Win32Window::Size size(1280, 720);\n  if (!window.Create(L\"IRIS\", origin, size)) {\n    return EXIT_FAILURE;\n  }\n  window.SetQuitOnClose(true);\n\n  ::MSG msg;\n  while (::GetMessage(&msg, nullptr, 0, 0)) {\n    ::TranslateMessage(&msg);\n    ::DispatchMessage(&msg);\n  }\n\n  ::CoUninitialize();\n  return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "windows/runner/resource.h",
    "content": "//{{NO_DEPENDENCIES}}\n// Microsoft Visual C++ generated include file.\n// Used by Runner.rc\n//\n#define IDI_APP_ICON                    101\n\n// Next default values for new objects\n//\n#ifdef APSTUDIO_INVOKED\n#ifndef APSTUDIO_READONLY_SYMBOLS\n#define _APS_NEXT_RESOURCE_VALUE        102\n#define _APS_NEXT_COMMAND_VALUE         40001\n#define _APS_NEXT_CONTROL_VALUE         1001\n#define _APS_NEXT_SYMED_VALUE           101\n#endif\n#endif\n"
  },
  {
    "path": "windows/runner/runner.exe.manifest",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" manifestVersion=\"1.0\">\n  <application xmlns=\"urn:schemas-microsoft-com:asm.v3\">\n    <windowsSettings>\n      <dpiAwareness xmlns=\"http://schemas.microsoft.com/SMI/2016/WindowsSettings\">PerMonitorV2</dpiAwareness>\n    </windowsSettings>\n  </application>\n  <compatibility xmlns=\"urn:schemas-microsoft-com:compatibility.v1\">\n    <application>\n      <!-- Windows 10 and Windows 11 -->\n      <supportedOS Id=\"{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}\"/>\n    </application>\n  </compatibility>\n</assembly>\n"
  },
  {
    "path": "windows/runner/utils.cpp",
    "content": "#include \"utils.h\"\n\n#include <flutter_windows.h>\n#include <io.h>\n#include <stdio.h>\n#include <windows.h>\n\n#include <iostream>\n\nvoid CreateAndAttachConsole() {\n  if (::AllocConsole()) {\n    FILE *unused;\n    if (freopen_s(&unused, \"CONOUT$\", \"w\", stdout)) {\n      _dup2(_fileno(stdout), 1);\n    }\n    if (freopen_s(&unused, \"CONOUT$\", \"w\", stderr)) {\n      _dup2(_fileno(stdout), 2);\n    }\n    std::ios::sync_with_stdio();\n    FlutterDesktopResyncOutputStreams();\n  }\n}\n\nstd::vector<std::string> GetCommandLineArguments() {\n  // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use.\n  int argc;\n  wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc);\n  if (argv == nullptr) {\n    return std::vector<std::string>();\n  }\n\n  std::vector<std::string> command_line_arguments;\n\n  // Skip the first argument as it's the binary name.\n  for (int i = 1; i < argc; i++) {\n    command_line_arguments.push_back(Utf8FromUtf16(argv[i]));\n  }\n\n  ::LocalFree(argv);\n\n  return command_line_arguments;\n}\n\nstd::string Utf8FromUtf16(const wchar_t* utf16_string) {\n  if (utf16_string == nullptr) {\n    return std::string();\n  }\n  unsigned int target_length = ::WideCharToMultiByte(\n      CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string,\n      -1, nullptr, 0, nullptr, nullptr)\n    -1; // remove the trailing null character\n  int input_length = (int)wcslen(utf16_string);\n  std::string utf8_string;\n  if (target_length == 0 || target_length > utf8_string.max_size()) {\n    return utf8_string;\n  }\n  utf8_string.resize(target_length);\n  int converted_length = ::WideCharToMultiByte(\n      CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string,\n      input_length, utf8_string.data(), target_length, nullptr, nullptr);\n  if (converted_length == 0) {\n    return std::string();\n  }\n  return utf8_string;\n}\n"
  },
  {
    "path": "windows/runner/utils.h",
    "content": "#ifndef RUNNER_UTILS_H_\n#define RUNNER_UTILS_H_\n\n#include <string>\n#include <vector>\n\n// Creates a console for the process, and redirects stdout and stderr to\n// it for both the runner and the Flutter library.\nvoid CreateAndAttachConsole();\n\n// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string\n// encoded in UTF-8. Returns an empty std::string on failure.\nstd::string Utf8FromUtf16(const wchar_t* utf16_string);\n\n// Gets the command line arguments passed in as a std::vector<std::string>,\n// encoded in UTF-8. Returns an empty std::vector<std::string> on failure.\nstd::vector<std::string> GetCommandLineArguments();\n\n#endif  // RUNNER_UTILS_H_\n"
  },
  {
    "path": "windows/runner/win32_window.cpp",
    "content": "#include \"win32_window.h\"\n\n#include <dwmapi.h>\n#include <flutter_windows.h>\n\n#include \"resource.h\"\n\nnamespace {\n\n/// Window attribute that enables dark mode window decorations.\n///\n/// Redefined in case the developer's machine has a Windows SDK older than\n/// version 10.0.22000.0.\n/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute\n#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE\n#define DWMWA_USE_IMMERSIVE_DARK_MODE 20\n#endif\n\nconstexpr const wchar_t kWindowClassName[] = L\"FLUTTER_RUNNER_WIN32_WINDOW\";\n\n/// Registry key for app theme preference.\n///\n/// A value of 0 indicates apps should use dark mode. A non-zero or missing\n/// value indicates apps should use light mode.\nconstexpr const wchar_t kGetPreferredBrightnessRegKey[] =\n  L\"Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Themes\\\\Personalize\";\nconstexpr const wchar_t kGetPreferredBrightnessRegValue[] = L\"AppsUseLightTheme\";\n\n// The number of Win32Window objects that currently exist.\nstatic int g_active_window_count = 0;\n\nusing EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd);\n\n// Scale helper to convert logical scaler values to physical using passed in\n// scale factor\nint Scale(int source, double scale_factor) {\n  return static_cast<int>(source * scale_factor);\n}\n\n// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module.\n// This API is only needed for PerMonitor V1 awareness mode.\nvoid EnableFullDpiSupportIfAvailable(HWND hwnd) {\n  HMODULE user32_module = LoadLibraryA(\"User32.dll\");\n  if (!user32_module) {\n    return;\n  }\n  auto enable_non_client_dpi_scaling =\n      reinterpret_cast<EnableNonClientDpiScaling*>(\n          GetProcAddress(user32_module, \"EnableNonClientDpiScaling\"));\n  if (enable_non_client_dpi_scaling != nullptr) {\n    enable_non_client_dpi_scaling(hwnd);\n  }\n  FreeLibrary(user32_module);\n}\n\n}  // namespace\n\n// Manages the Win32Window's window class registration.\nclass WindowClassRegistrar {\n public:\n  ~WindowClassRegistrar() = default;\n\n  // Returns the singleton registrar instance.\n  static WindowClassRegistrar* GetInstance() {\n    if (!instance_) {\n      instance_ = new WindowClassRegistrar();\n    }\n    return instance_;\n  }\n\n  // Returns the name of the window class, registering the class if it hasn't\n  // previously been registered.\n  const wchar_t* GetWindowClass();\n\n  // Unregisters the window class. Should only be called if there are no\n  // instances of the window.\n  void UnregisterWindowClass();\n\n private:\n  WindowClassRegistrar() = default;\n\n  static WindowClassRegistrar* instance_;\n\n  bool class_registered_ = false;\n};\n\nWindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr;\n\nconst wchar_t* WindowClassRegistrar::GetWindowClass() {\n  if (!class_registered_) {\n    WNDCLASS window_class{};\n    window_class.hCursor = LoadCursor(nullptr, IDC_ARROW);\n    window_class.lpszClassName = kWindowClassName;\n    window_class.style = CS_HREDRAW | CS_VREDRAW;\n    window_class.cbClsExtra = 0;\n    window_class.cbWndExtra = 0;\n    window_class.hInstance = GetModuleHandle(nullptr);\n    window_class.hIcon =\n        LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON));\n    window_class.hbrBackground = 0;\n    window_class.lpszMenuName = nullptr;\n    window_class.lpfnWndProc = Win32Window::WndProc;\n    RegisterClass(&window_class);\n    class_registered_ = true;\n  }\n  return kWindowClassName;\n}\n\nvoid WindowClassRegistrar::UnregisterWindowClass() {\n  UnregisterClass(kWindowClassName, nullptr);\n  class_registered_ = false;\n}\n\nWin32Window::Win32Window() {\n  ++g_active_window_count;\n}\n\nWin32Window::~Win32Window() {\n  --g_active_window_count;\n  Destroy();\n}\n\nbool Win32Window::Create(const std::wstring& title,\n                         const Point& origin,\n                         const Size& size) {\n  Destroy();\n\n  const wchar_t* window_class =\n      WindowClassRegistrar::GetInstance()->GetWindowClass();\n\n  const POINT target_point = {static_cast<LONG>(origin.x),\n                              static_cast<LONG>(origin.y)};\n  HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST);\n  UINT dpi = FlutterDesktopGetDpiForMonitor(monitor);\n  double scale_factor = dpi / 96.0;\n\n  HWND window = CreateWindow(\n      window_class, title.c_str(), WS_OVERLAPPEDWINDOW,\n      Scale(origin.x, scale_factor), Scale(origin.y, scale_factor),\n      Scale(size.width, scale_factor), Scale(size.height, scale_factor),\n      nullptr, nullptr, GetModuleHandle(nullptr), this);\n\n  if (!window) {\n    return false;\n  }\n\n  UpdateTheme(window);\n\n  return OnCreate();\n}\n\nbool Win32Window::Show() {\n  return ShowWindow(window_handle_, SW_SHOWNORMAL);\n}\n\n// static\nLRESULT CALLBACK Win32Window::WndProc(HWND const window,\n                                      UINT const message,\n                                      WPARAM const wparam,\n                                      LPARAM const lparam) noexcept {\n  if (message == WM_NCCREATE) {\n    auto window_struct = reinterpret_cast<CREATESTRUCT*>(lparam);\n    SetWindowLongPtr(window, GWLP_USERDATA,\n                     reinterpret_cast<LONG_PTR>(window_struct->lpCreateParams));\n\n    auto that = static_cast<Win32Window*>(window_struct->lpCreateParams);\n    EnableFullDpiSupportIfAvailable(window);\n    that->window_handle_ = window;\n  } else if (Win32Window* that = GetThisFromHandle(window)) {\n    return that->MessageHandler(window, message, wparam, lparam);\n  }\n\n  return DefWindowProc(window, message, wparam, lparam);\n}\n\nLRESULT\nWin32Window::MessageHandler(HWND hwnd,\n                            UINT const message,\n                            WPARAM const wparam,\n                            LPARAM const lparam) noexcept {\n  switch (message) {\n    case WM_DESTROY:\n      window_handle_ = nullptr;\n      Destroy();\n      if (quit_on_close_) {\n        PostQuitMessage(0);\n      }\n      return 0;\n\n    case WM_DPICHANGED: {\n      auto newRectSize = reinterpret_cast<RECT*>(lparam);\n      LONG newWidth = newRectSize->right - newRectSize->left;\n      LONG newHeight = newRectSize->bottom - newRectSize->top;\n\n      SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth,\n                   newHeight, SWP_NOZORDER | SWP_NOACTIVATE);\n\n      return 0;\n    }\n    case WM_SIZE: {\n      RECT rect = GetClientArea();\n      if (child_content_ != nullptr) {\n        // Size and position the child window.\n        MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left,\n                   rect.bottom - rect.top, TRUE);\n      }\n      return 0;\n    }\n\n    case WM_ACTIVATE:\n      if (child_content_ != nullptr) {\n        SetFocus(child_content_);\n      }\n      return 0;\n\n    case WM_DWMCOLORIZATIONCOLORCHANGED:\n      UpdateTheme(hwnd);\n      return 0;\n  }\n\n  return DefWindowProc(window_handle_, message, wparam, lparam);\n}\n\nvoid Win32Window::Destroy() {\n  OnDestroy();\n\n  if (window_handle_) {\n    DestroyWindow(window_handle_);\n    window_handle_ = nullptr;\n  }\n  if (g_active_window_count == 0) {\n    WindowClassRegistrar::GetInstance()->UnregisterWindowClass();\n  }\n}\n\nWin32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept {\n  return reinterpret_cast<Win32Window*>(\n      GetWindowLongPtr(window, GWLP_USERDATA));\n}\n\nvoid Win32Window::SetChildContent(HWND content) {\n  child_content_ = content;\n  SetParent(content, window_handle_);\n  RECT frame = GetClientArea();\n\n  MoveWindow(content, frame.left, frame.top, frame.right - frame.left,\n             frame.bottom - frame.top, true);\n\n  SetFocus(child_content_);\n}\n\nRECT Win32Window::GetClientArea() {\n  RECT frame;\n  GetClientRect(window_handle_, &frame);\n  return frame;\n}\n\nHWND Win32Window::GetHandle() {\n  return window_handle_;\n}\n\nvoid Win32Window::SetQuitOnClose(bool quit_on_close) {\n  quit_on_close_ = quit_on_close;\n}\n\nbool Win32Window::OnCreate() {\n  // No-op; provided for subclasses.\n  return true;\n}\n\nvoid Win32Window::OnDestroy() {\n  // No-op; provided for subclasses.\n}\n\nvoid Win32Window::UpdateTheme(HWND const window) {\n  DWORD light_mode;\n  DWORD light_mode_size = sizeof(light_mode);\n  LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey,\n                               kGetPreferredBrightnessRegValue,\n                               RRF_RT_REG_DWORD, nullptr, &light_mode,\n                               &light_mode_size);\n\n  if (result == ERROR_SUCCESS) {\n    BOOL enable_dark_mode = light_mode == 0;\n    DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE,\n                          &enable_dark_mode, sizeof(enable_dark_mode));\n  }\n}\n"
  },
  {
    "path": "windows/runner/win32_window.h",
    "content": "#ifndef RUNNER_WIN32_WINDOW_H_\n#define RUNNER_WIN32_WINDOW_H_\n\n#include <windows.h>\n\n#include <functional>\n#include <memory>\n#include <string>\n\n// A class abstraction for a high DPI-aware Win32 Window. Intended to be\n// inherited from by classes that wish to specialize with custom\n// rendering and input handling\nclass Win32Window {\n public:\n  struct Point {\n    unsigned int x;\n    unsigned int y;\n    Point(unsigned int x, unsigned int y) : x(x), y(y) {}\n  };\n\n  struct Size {\n    unsigned int width;\n    unsigned int height;\n    Size(unsigned int width, unsigned int height)\n        : width(width), height(height) {}\n  };\n\n  Win32Window();\n  virtual ~Win32Window();\n\n  // Creates a win32 window with |title| that is positioned and sized using\n  // |origin| and |size|. New windows are created on the default monitor. Window\n  // sizes are specified to the OS in physical pixels, hence to ensure a\n  // consistent size this function will scale the inputted width and height as\n  // as appropriate for the default monitor. The window is invisible until\n  // |Show| is called. Returns true if the window was created successfully.\n  bool Create(const std::wstring& title, const Point& origin, const Size& size);\n\n  // Show the current window. Returns true if the window was successfully shown.\n  bool Show();\n\n  // Release OS resources associated with window.\n  void Destroy();\n\n  // Inserts |content| into the window tree.\n  void SetChildContent(HWND content);\n\n  // Returns the backing Window handle to enable clients to set icon and other\n  // window properties. Returns nullptr if the window has been destroyed.\n  HWND GetHandle();\n\n  // If true, closing this window will quit the application.\n  void SetQuitOnClose(bool quit_on_close);\n\n  // Return a RECT representing the bounds of the current client area.\n  RECT GetClientArea();\n\n protected:\n  // Processes and route salient window messages for mouse handling,\n  // size change and DPI. Delegates handling of these to member overloads that\n  // inheriting classes can handle.\n  virtual LRESULT MessageHandler(HWND window,\n                                 UINT const message,\n                                 WPARAM const wparam,\n                                 LPARAM const lparam) noexcept;\n\n  // Called when CreateAndShow is called, allowing subclass window-related\n  // setup. Subclasses should return false if setup fails.\n  virtual bool OnCreate();\n\n  // Called when Destroy is called.\n  virtual void OnDestroy();\n\n private:\n  friend class WindowClassRegistrar;\n\n  // OS callback called by message pump. Handles the WM_NCCREATE message which\n  // is passed when the non-client area is being created and enables automatic\n  // non-client DPI scaling so that the non-client area automatically\n  // responds to changes in DPI. All other messages are handled by\n  // MessageHandler.\n  static LRESULT CALLBACK WndProc(HWND const window,\n                                  UINT const message,\n                                  WPARAM const wparam,\n                                  LPARAM const lparam) noexcept;\n\n  // Retrieves a class instance pointer for |window|\n  static Win32Window* GetThisFromHandle(HWND const window) noexcept;\n\n  // Update the window frame's theme to match the system theme.\n  static void UpdateTheme(HWND const window);\n\n  bool quit_on_close_ = false;\n\n  // window handle for top level window.\n  HWND window_handle_ = nullptr;\n\n  // window handle for hosted content.\n  HWND child_content_ = nullptr;\n};\n\n#endif  // RUNNER_WIN32_WINDOW_H_\n"
  }
]